001/*
002 *  Copyright 2019 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.ametys.odf.ose.export.impl;
017
018import java.util.ArrayList;
019import java.util.HashSet;
020import java.util.List;
021import java.util.Set;
022
023import org.apache.avalon.framework.service.ServiceException;
024import org.apache.avalon.framework.service.ServiceManager;
025import org.apache.avalon.framework.service.Serviceable;
026
027import org.ametys.odf.ODFHelper;
028import org.ametys.odf.ProgramItem;
029import org.ametys.odf.course.Course;
030import org.ametys.odf.ose.db.ParameterizableQuery;
031import org.ametys.odf.ose.export.AbstractOSEExport;
032import org.ametys.odf.ose.export.OSEConstants;
033import org.ametys.odf.ose.export.impl.odf.CourseExporter;
034import org.ametys.odf.ose.export.impl.odf.HierarchyExporter;
035import org.ametys.odf.ose.export.impl.odf.ProgramPartExporter;
036import org.ametys.odf.ose.export.impl.odf.StepExporter;
037import org.ametys.odf.ose.export.impl.odf.db.CheminPedagogiqueHelper;
038import org.ametys.odf.ose.export.impl.odf.db.EffectifsHelper;
039import org.ametys.odf.ose.export.impl.odf.db.ElementPedagogiqueHelper;
040import org.ametys.odf.ose.export.impl.odf.db.EtapeHelper;
041import org.ametys.odf.ose.export.impl.odf.db.LienHelper;
042import org.ametys.odf.ose.export.impl.odf.db.NoeudHelper;
043import org.ametys.odf.ose.export.impl.odf.db.ScenarioHelper;
044import org.ametys.odf.ose.export.impl.odf.db.ScenarioLienHelper;
045import org.ametys.odf.ose.export.impl.odf.db.ScenarioNoeudHelper;
046import org.ametys.odf.ose.export.impl.odf.db.TypeInterventionEPHelper;
047import org.ametys.odf.ose.export.impl.odf.db.VolumeHoraireEnsHelper;
048import org.ametys.odf.program.AbstractProgramPart;
049import org.ametys.odf.program.Container;
050
051/**
052 * This exports ODF values to the OSE database by SRC_* views.
053 */
054public class ODFExport extends AbstractOSEExport implements Serviceable
055{
056    /** The exporter of steps */
057    protected StepExporter _stepExporter;
058    /** The exporter of courses */
059    protected CourseExporter _courseExporter;
060    /** The exporter of program elements */
061    protected ProgramPartExporter _programElementExporter;
062    /** The exporter of hierarchy */
063    protected HierarchyExporter _hierarchyExporter;
064    /** The ODF helper */
065    protected ODFHelper _odfHelper;
066    
067    @Override
068    public void service(ServiceManager manager) throws ServiceException
069    {
070        _stepExporter = (StepExporter) manager.lookup(StepExporter.ROLE);
071        _courseExporter = (CourseExporter) manager.lookup(CourseExporter.ROLE);
072        _programElementExporter = (ProgramPartExporter) manager.lookup(ProgramPartExporter.ROLE);
073        _hierarchyExporter = (HierarchyExporter) manager.lookup(HierarchyExporter.ROLE);
074        _odfHelper = (ODFHelper) manager.lookup(ODFHelper.ROLE);
075    }
076    
077    @Override
078    public List<ParameterizableQuery> initializeDb()
079    {
080        List<ParameterizableQuery> queries = new ArrayList<>();
081        queries.addAll(EtapeHelper.initialize());
082        queries.addAll(ElementPedagogiqueHelper.initialize());
083        queries.addAll(EffectifsHelper.initialize());
084        queries.addAll(VolumeHoraireEnsHelper.initialize());
085        queries.addAll(CheminPedagogiqueHelper.initialize());
086        queries.addAll(TypeInterventionEPHelper.initialize());
087        queries.addAll(NoeudHelper.initialize());
088        queries.addAll(LienHelper.initialize());
089        queries.addAll(ScenarioHelper.initialize());
090        queries.addAll(ScenarioNoeudHelper.initialize());
091        queries.addAll(ScenarioLienHelper.initialize());
092        return queries;
093    }
094    
095    @Override
096    protected List<ParameterizableQuery> _populate(String ametysCatalog, Long oseCatalog)
097    {
098        List<ParameterizableQuery> queries = new ArrayList<>();
099        queries.addAll(_deleteOldData());
100        queries.addAll(new Populator(oseCatalog).exportSteps(ametysCatalog));
101        return queries;
102    }
103    
104    private List<ParameterizableQuery> _deleteOldData()
105    {
106        List<ParameterizableQuery> queries = new ArrayList<>();
107        queries.add(ScenarioLienHelper.deleteFrom());
108        queries.add(ScenarioNoeudHelper.deleteFrom());
109        queries.add(LienHelper.deleteFrom());
110        queries.add(NoeudHelper.deleteFrom());
111        queries.add(TypeInterventionEPHelper.deleteFrom());
112        queries.add(CheminPedagogiqueHelper.deleteFrom());
113        queries.add(VolumeHoraireEnsHelper.deleteFrom());
114        queries.add(EffectifsHelper.deleteFrom());
115        queries.add(ElementPedagogiqueHelper.deleteFrom());
116        queries.add(EtapeHelper.deleteFrom());
117        return queries;
118    }
119    
120    private class Populator
121    {
122        private Set<String> _exportedObjectIds = new HashSet<>();
123        private Long _oseCatalog;
124        
125        Populator(Long oseCatalog)
126        {
127            this._oseCatalog = oseCatalog;
128        }
129        
130        List<ParameterizableQuery> exportSteps(String ametysCatalog)
131        {
132            List<ParameterizableQuery> queries = new ArrayList<>();
133            for (Container step : _stepExporter.getStepsToExport(ametysCatalog))
134            {
135                if (_exportedObjectIds.add(step.getId()))
136                {
137                    queries.addAll(_stepExporter.getQueries(step, _oseCatalog));
138                    queries.addAll(_exportChildren(step));
139                }
140            }
141            return queries;
142        }
143        
144        private List<ParameterizableQuery> _exportChildren(ProgramItem programItem)
145        {
146            List<ParameterizableQuery> queries = new ArrayList<>();
147            for (ProgramItem child : _odfHelper.getChildProgramItems(programItem))
148            {
149                if (_exportedObjectIds.add(child.getId()))
150                {
151                    if (child instanceof Course)
152                    {
153                        queries.addAll(_exportCourse((Course) child));
154                    }
155                    else
156                    {
157                        // SubProgram, Container or CourseList
158                        queries.addAll(_exportProgramPart((AbstractProgramPart) child));
159                    }
160                    queries.addAll(_hierarchyExporter.getQueries(programItem, child));
161                }
162            }
163            return queries;
164        }
165    
166        private List<ParameterizableQuery> _exportProgramPart(AbstractProgramPart programPart)
167        {
168            List<ParameterizableQuery> queries = new ArrayList<>();
169            if (!programPart.hasDefinition(OSEConstants.NO_OSE_EXPORT_ATTRIBUTE_NAME) || !programPart.getValue(OSEConstants.NO_OSE_EXPORT_ATTRIBUTE_NAME, true, false))
170            {
171                queries.addAll(_programElementExporter.getQueries(programPart, _oseCatalog));
172                queries.addAll(_exportChildren(programPart));
173            }
174            return queries;
175        }
176        
177        private List<ParameterizableQuery> _exportCourse(Course course)
178        {
179            List<ParameterizableQuery> queries = new ArrayList<>();
180            if (!course.getValue(OSEConstants.NO_OSE_EXPORT_ATTRIBUTE_NAME, true, false))
181            {
182                queries.addAll(_courseExporter.getQueries(course, _oseCatalog));
183                queries.addAll(_exportChildren(course));
184            }
185            return queries;
186        }
187    }
188}
189