Salome HOME
Processing instruction is defined now in getScenarioInfo using document types mappings.
[tools/siman.git] / Workspace / Siman-Common / src / org / splat / service / ScenarioServiceImpl.java
index 464eff57440108fcbfc1ddab8534fe110a243ce4..705b534d17d9ec978a689894cac6c004bbd9137a 100644 (file)
 package org.splat.service;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Iterator;
 import java.util.List;
 
 import org.apache.log4j.Logger;
+import org.splat.dal.bo.kernel.Relation;
 import org.splat.dal.bo.kernel.User;
+import org.splat.dal.bo.som.ConvertsRelation;
+import org.splat.dal.bo.som.File;
 import org.splat.dal.bo.som.KnowledgeElement;
 import org.splat.dal.bo.som.KnowledgeElementType;
 import org.splat.dal.bo.som.Publication;
@@ -30,8 +34,12 @@ import org.splat.dal.dao.som.StudyDAO;
 import org.splat.kernel.InvalidPropertyException;
 import org.splat.kernel.MissedPropertyException;
 import org.splat.kernel.MultiplyDefinedException;
+import org.splat.service.dto.DocumentDTO;
+import org.splat.service.dto.StepDTO;
 import org.splat.service.technical.IndexService;
+import org.splat.service.technical.ProjectSettingsService;
 import org.splat.som.Step;
+import org.splat.util.BeanHelper;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -44,7 +52,7 @@ public class ScenarioServiceImpl implements ScenarioService {
        /**
         * Logger for this class.
         */
-       protected final static Logger logger = Logger
+       protected final static Logger LOG = Logger
                        .getLogger(ScenarioServiceImpl.class);
 
        /**
@@ -106,6 +114,11 @@ public class ScenarioServiceImpl implements ScenarioService {
         */
        private SimulationContextService _simulationContextService;
 
+       /**
+        * Injected project service.
+        */
+       private ProjectSettingsService _projectSettings;
+
        /**
         * Get the projectElementService.
         * 
@@ -122,7 +135,7 @@ public class ScenarioServiceImpl implements ScenarioService {
         *            the projectElementService to set
         */
        public void setProjectElementService(
-                       ProjectElementService projectElementService) {
+                       final ProjectElementService projectElementService) {
                _projectElementService = projectElementService;
        }
 
@@ -141,7 +154,8 @@ public class ScenarioServiceImpl implements ScenarioService {
         * @param publicationService
         *            the publicationService to set
         */
-       public void setPublicationService(PublicationService publicationService) {
+       public void setPublicationService(
+                       final PublicationService publicationService) {
                _publicationService = publicationService;
        }
 
@@ -160,10 +174,78 @@ public class ScenarioServiceImpl implements ScenarioService {
         * @param stepService
         *            the stepService to set
         */
-       public void setStepService(StepService stepService) {
+       public void setStepService(final StepService stepService) {
                _stepService = stepService;
        }
 
+       /**
+        * {@inheritDoc}
+        * 
+        * @see org.splat.service.ScenarioService#getScenarioInfo(long)
+        */
+       @Transactional
+       public List<StepDTO> getScenarioInfo(final long scenarioId) {
+               List<StepDTO> res = new ArrayList<StepDTO>();
+               // Get the scenario from the database by id
+               Scenario scen = getScenarioDAO().get(scenarioId);
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("Scenario[" + scenarioId + "]: Number of publications: "
+                                       + scen.getDocums().size());
+               }
+               // Get activities of the scenario
+               Step[] steps = getProjectElementService().getSteps(scen);
+               StepDTO stepDTO;
+               DocumentDTO docDTO;
+               String docType, fileFormat;
+               String processing;
+               boolean doImport;
+               // For each activity create a step DTO and add it to the result list
+               for (Step step : steps) {
+                       stepDTO = BeanHelper.copyBean(step.getStep(), StepDTO.class);
+                       res.add(stepDTO);
+                       if (LOG.isDebugEnabled()) {
+                               LOG.debug("Step[" + stepDTO.getNumber()
+                                               + "]: Number of documents: "
+                                               + step.getDocuments().size());
+                       }
+                       // For each publication of the activity create a document DTO.
+                       // Each file is considered as a source file.
+                       for (Publication tag : step.getDocuments()) {
+                               docDTO = stepDTO.addDoc(tag.value().getIndex(), tag.value()
+                                               .getTitle());
+                               char aState = tag.getIsnew();
+                               docType = tag.value().getType().getName();
+                               // For each file of the document create a file DTO
+                               // Process source file of the document
+                               fileFormat = tag.value().getFile().getFormat();
+                               doImport = getProjectSettings().doImport(docType, fileFormat);
+                               if (doImport && (!tag.isOutdated())) {
+                                       processing = "file-import";
+                               } else {
+                                       processing = "file-download";
+                               }
+                               docDTO.addFile(tag.value().getFile().getRelativePath(), aState,
+                                               processing, false);
+                               // Process all exported files
+                               for (Relation rel : tag.value().getRelations(
+                                               ConvertsRelation.class)) {
+                                       File aFile = ((ConvertsRelation) rel).getTo();
+                                       fileFormat = aFile.getFormat();
+                                       doImport = getProjectSettings().doImport(docType,
+                                                       fileFormat);
+                                       if (doImport && (!tag.isOutdated())) {
+                                               processing = "file-import";
+                                       } else {
+                                               processing = "file-download";
+                                       }
+                                       docDTO.addFile(aFile.getRelativePath(), aState, processing,
+                                                       false);
+                               }
+                       }
+               }
+               return res;
+       }
+
        /**
         * Create a new study with one scenario and "product" simulation context.
         * 
@@ -182,9 +264,11 @@ public class ScenarioServiceImpl implements ScenarioService {
         *             if some property occurs several times
         */
        @Transactional
-       public Study createStudy(Study.Properties sprop, Scenario.Properties oprop,
-                       SimulationContext.Properties cprop) throws MissedPropertyException,
-                       InvalidPropertyException, MultiplyDefinedException {
+       public Study createStudy(final Study.Properties sprop,
+                       final Scenario.Properties oprop,
+                       final SimulationContext.Properties cprop)
+                       throws MissedPropertyException, InvalidPropertyException,
+                       MultiplyDefinedException {
                Study study = getStudyService().createStudy(sprop);
                addScenario(study, oprop);
                if (cprop.getIndex() == 0) { // Input of new project context
@@ -206,14 +290,15 @@ public class ScenarioServiceImpl implements ScenarioService {
         *      org.splat.dal.bo.som.KnowledgeElement.Properties)
         */
        @Transactional
-       public KnowledgeElement addKnowledgeElement(Scenario aScenarioDTO,
-                       KnowledgeElement.Properties kprop) throws MissedPropertyException,
-                       InvalidPropertyException, MultiplyDefinedException {
+       public KnowledgeElement addKnowledgeElement(final Scenario aScenarioDTO,
+                       final KnowledgeElement.Properties kprop)
+                       throws MissedPropertyException, InvalidPropertyException,
+                       MultiplyDefinedException {
                KnowledgeElement kelm = null;
                try {
                        long aScenarioId = aScenarioDTO.getIndex();
-                       if (logger.isDebugEnabled()) {
-                               logger.debug("Add a knowledge element to the scenario #"
+                       if (LOG.isDebugEnabled()) {
+                               LOG.debug("Add a knowledge element to the scenario #"
                                                + aScenarioId);
                        }
                        // Get the persistent scenario.
@@ -232,14 +317,19 @@ public class ScenarioServiceImpl implements ScenarioService {
                        } else if (aScenarioDTO.getKnowledgeElementsList() != null) { // If null, knowl will be initialized when needed
                                aScenarioDTO.getKnowledgeElementsList().add(kelm);
                        }
+
+                       // Load the workflow for the parent study to take into account
+                       // all study actors durng reindexing.
+                       getStudyService().loadWorkflow(aScenario.getOwnerStudy());
+
                        // Update the lucene index of knowledge elements.
                        getIndexService().add(kelm);
-                       if (logger.isDebugEnabled()) {
-                               logger.debug("A knowledge element #" + kelm.getIndex()
+                       if (LOG.isDebugEnabled()) {
+                               LOG.debug("A knowledge element #" + kelm.getIndex()
                                                + " is added to the scenario #" + aScenario.getIndex());
                        }
                } catch (IOException error) {
-                       logger.error("Unable to index the knowedge element '"
+                       LOG.error("Unable to index the knowedge element '"
                                        + kelm.getIndex() + "', reason:", error);
                        kelm = null;
                }
@@ -255,13 +345,13 @@ public class ScenarioServiceImpl implements ScenarioService {
         * @return true if updating succeeded
         */
        @Transactional
-       private boolean update(Scenario aScenario) {
+       private boolean update(final Scenario aScenario) {
                boolean isOk = false;
                try {
                        getScenarioDAO().update(aScenario); // Update of relational base
                        isOk = true;
                } catch (Exception error) {
-                       logger.error("Unable to re-index the knowledge element '"
+                       LOG.error("Unable to re-index the knowledge element '"
                                        + aScenario.getIndex() + "', reason:", error);
                }
                return isOk;
@@ -272,7 +362,7 @@ public class ScenarioServiceImpl implements ScenarioService {
         * 
         * @see org.splat.service.ScenarioService#checkin(org.splat.dal.bo.som.Scenario)
         */
-       public void checkin(Scenario aScenario) {
+       public void checkin(final Scenario aScenario) {
                aScenario.setUser(null);
                aScenario.setLastModificationDate(Calendar.getInstance().getTime());
                getScenarioDAO().update(aScenario);
@@ -283,9 +373,10 @@ public class ScenarioServiceImpl implements ScenarioService {
         * 
         * @see org.splat.service.ScenarioService#checkout(org.splat.dal.bo.som.Scenario, org.splat.dal.bo.kernel.User)
         */
-       public boolean checkout(Scenario aScenario, User user) {
-               if (!getStudyService().isStaffedBy(aScenario.getOwnerStudy(), user))
+       public boolean checkout(final Scenario aScenario, final User user) {
+               if (!getStudyService().isStaffedBy(aScenario.getOwnerStudy(), user)) {
                        return false;
+               }
 
                aScenario.setUser(user);
                aScenario.setLastModificationDate(Calendar.getInstance().getTime());
@@ -298,14 +389,15 @@ public class ScenarioServiceImpl implements ScenarioService {
         * 
         * @see org.splat.service.ScenarioService#copyContentsUpTo(org.splat.dal.bo.som.Scenario, org.splat.som.Step)
         */
-       public void copyContentsUpTo(Scenario scenario, Step lastep) {
+       public void copyContentsUpTo(final Scenario scenario, final Step lastep) {
                Scenario base = (Scenario) lastep.getOwner();
                Step[] from = getProjectElementService().getSteps(base);
                Step[] to = getProjectElementService().getSteps(scenario);
                for (int i = 0; i < from.length; i++) {
                        Step step = from[i];
-                       if (step.getNumber() > lastep.getNumber())
+                       if (step.getNumber() > lastep.getNumber()) {
                                break;
+                       }
 
                        List<Publication> docs = step.getAllDocuments();
                        for (Iterator<Publication> j = docs.iterator(); j.hasNext();) {
@@ -326,7 +418,7 @@ public class ScenarioServiceImpl implements ScenarioService {
         * 
         * @see org.splat.service.ScenarioService#isEmpty(org.splat.dal.bo.som.Scenario)
         */
-       public boolean isEmpty(Scenario scenario) {
+       public boolean isEmpty(final Scenario scenario) {
                Step[] mystep = getProjectElementService().getSteps(scenario);
                boolean isEmp = true;
                for (int i = 0; i < mystep.length; i++) {
@@ -342,14 +434,16 @@ public class ScenarioServiceImpl implements ScenarioService {
         * @param scenario
         * @return
         */
-       public boolean isFinished(Scenario scenario) {
+       public boolean isFinished(final Scenario scenario) {
                Step[] mystep = getProjectElementService().getSteps(scenario);
                boolean notempty = false; // If this is empty, this is not finished
                for (int i = 0; i < mystep.length; i++) {
-                       if (!mystep[i].isStarted())
+                       if (!mystep[i].isStarted()) {
                                continue;
-                       if (!mystep[i].isFinished())
+                       }
+                       if (!mystep[i].isFinished()) {
                                return false;
+                       }
                        notempty = true;
                }
                return notempty;
@@ -361,15 +455,17 @@ public class ScenarioServiceImpl implements ScenarioService {
         * @see org.splat.service.StudyService#addScenario(org.splat.dal.bo.som.Study, org.splat.dal.bo.som.Scenario.Properties)
         */
        @Transactional
-       public Scenario addScenario(Study aStudy, Scenario.Properties sprop)
-                       throws MissedPropertyException, InvalidPropertyException,
-                       MultiplyDefinedException {
-               if (sprop.getManager() == null)
+       public Scenario addScenario(final Study aStudy,
+                       final Scenario.Properties sprop) throws MissedPropertyException,
+                       InvalidPropertyException, MultiplyDefinedException {
+               if (sprop.getManager() == null) {
                        sprop.setManager(aStudy.getAuthor());
+               }
 
                Scenario scenario = new Scenario(sprop.setOwnerStudy(aStudy));
-               if (sprop.getBaseStep() != null)
+               if (sprop.getBaseStep() != null) {
                        copyContentsUpTo(scenario, sprop.getBaseStep());
+               }
                Scenario previous = sprop.getInsertAfter();
 
                if (previous == null) {
@@ -404,11 +500,12 @@ public class ScenarioServiceImpl implements ScenarioService {
         *            the knowledge element to remove
         * @return true if removal succeeded
         */
-       public boolean removeKnowledgeElement(Scenario scenario,
-                       KnowledgeElement kelm) {
+       public boolean removeKnowledgeElement(final Scenario scenario,
+                       final KnowledgeElement kelm) {
                KnowledgeElement torem = scenario.getKnowledgeElement(kelm.getIndex());
-               if (torem == null)
+               if (torem == null) {
                        return false;
+               }
                boolean done = scenario.getKnowledgeElements().remove(torem);
                if (done) {
                        // Update of my transient data
@@ -416,8 +513,9 @@ public class ScenarioServiceImpl implements ScenarioService {
                        // RKV: List<KnowledgeElement> kelms = scenario.getKnowledgeByType().get(
                        // RKV: kelm.getType().getIndex());
                        // RKV: kelms.remove(torem);
-                       if (scenario.getKnowledgeElementsList() != null)
+                       if (scenario.getKnowledgeElementsList() != null) {
                                scenario.getKnowledgeElementsList().remove(torem);
+                       }
                        getScenarioDAO().update(scenario);
                        // TODO: If the owner study is not private, remove the knowledge from the Lucene index
                        return true;
@@ -441,7 +539,8 @@ public class ScenarioServiceImpl implements ScenarioService {
         * @param knowledgeElementDAO
         *            the knowledgeElementDAO to set
         */
-       public void setKnowledgeElementDAO(KnowledgeElementDAO knowledgeElementDAO) {
+       public void setKnowledgeElementDAO(
+                       final KnowledgeElementDAO knowledgeElementDAO) {
                _knowledgeElementDAO = knowledgeElementDAO;
        }
 
@@ -460,7 +559,7 @@ public class ScenarioServiceImpl implements ScenarioService {
         * @param indexService
         *            the indexService to set
         */
-       public void setIndexService(IndexService indexService) {
+       public void setIndexService(final IndexService indexService) {
                _indexService = indexService;
        }
 
@@ -479,7 +578,7 @@ public class ScenarioServiceImpl implements ScenarioService {
         * @param scenarioDAO
         *            the scenarioDAO to set
         */
-       public void setScenarioDAO(ScenarioDAO scenarioDAO) {
+       public void setScenarioDAO(final ScenarioDAO scenarioDAO) {
                _scenarioDAO = scenarioDAO;
        }
 
@@ -498,7 +597,7 @@ public class ScenarioServiceImpl implements ScenarioService {
         * @param studyDAO
         *            the studyDAO to set
         */
-       public void setStudyDAO(StudyDAO studyDAO) {
+       public void setStudyDAO(final StudyDAO studyDAO) {
                _studyDAO = studyDAO;
        }
 
@@ -518,7 +617,7 @@ public class ScenarioServiceImpl implements ScenarioService {
         *            the knowledgeElementTypeService to set
         */
        public void setKnowledgeElementTypeService(
-                       KnowledgeElementTypeService knowledgeElementTypeService) {
+                       final KnowledgeElementTypeService knowledgeElementTypeService) {
                _knowledgeElementTypeService = knowledgeElementTypeService;
        }
 
@@ -537,7 +636,7 @@ public class ScenarioServiceImpl implements ScenarioService {
         * @param studyService
         *            the studyService to set
         */
-       public void setStudyService(StudyService studyService) {
+       public void setStudyService(final StudyService studyService) {
                _studyService = studyService;
        }
 
@@ -556,7 +655,7 @@ public class ScenarioServiceImpl implements ScenarioService {
         * @param userService
         *            the userService to set
         */
-       public void setUserService(UserService userService) {
+       public void setUserService(final UserService userService) {
                _userService = userService;
        }
 
@@ -575,7 +674,7 @@ public class ScenarioServiceImpl implements ScenarioService {
         * @param userDAO
         *            the userDAO to set
         */
-       public void setUserDAO(UserDAO userDAO) {
+       public void setUserDAO(final UserDAO userDAO) {
                _userDAO = userDAO;
        }
 
@@ -595,7 +694,7 @@ public class ScenarioServiceImpl implements ScenarioService {
         *            the knowledgeElementTypeDAO to set
         */
        public void setKnowledgeElementTypeDAO(
-                       KnowledgeElementTypeDAO knowledgeElementTypeDAO) {
+                       final KnowledgeElementTypeDAO knowledgeElementTypeDAO) {
                _knowledgeElementTypeDAO = knowledgeElementTypeDAO;
        }
 
@@ -615,8 +714,28 @@ public class ScenarioServiceImpl implements ScenarioService {
         *            the simulationContextService to set
         */
        public void setSimulationContextService(
-                       SimulationContextService simulationContextService) {
+                       final SimulationContextService simulationContextService) {
                _simulationContextService = simulationContextService;
        }
 
+       /**
+        * Get project settings.
+        * 
+        * @return Project settings service
+        */
+       private ProjectSettingsService getProjectSettings() {
+               return _projectSettings;
+       }
+
+       /**
+        * Set project settings service.
+        * 
+        * @param projectSettingsService
+        *            project settings service
+        */
+       public void setProjectSettings(
+                       final ProjectSettingsService projectSettingsService) {
+               _projectSettings = projectSettingsService;
+       }
+
 }