Salome HOME
The draft of the "Copy from existing study" action is added. The YACS step is introdu...
[tools/siman.git] / Workspace / Siman-Common / src / org / splat / service / ScenarioServiceImpl.java
index b47c01fdbe777e04c5ee0c2fca4c9791eb3a1570..9340c5c31d35a2e236e859ffeb660b36c0dc1186 100644 (file)
@@ -19,8 +19,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Projections;
 import org.hibernate.criterion.Restrictions;
+import org.hibernate.transform.Transformers;
 import org.splat.common.properties.MessageKeyEnum;
 import org.splat.dal.bo.kernel.Relation;
 import org.splat.dal.bo.kernel.Role;
@@ -32,6 +35,7 @@ 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.ProgressState;
+import org.splat.dal.bo.som.ProjectElement;
 import org.splat.dal.bo.som.Publication;
 import org.splat.dal.bo.som.Scenario;
 import org.splat.dal.bo.som.SimulationContext;
@@ -39,6 +43,7 @@ import org.splat.dal.bo.som.SimulationContextType;
 import org.splat.dal.bo.som.Study;
 import org.splat.dal.bo.som.UsedByRelation;
 import org.splat.dal.bo.som.UsesRelation;
+import org.splat.dal.bo.som.ValidationCycle;
 import org.splat.dal.bo.som.Document.Properties;
 import org.splat.dal.dao.kernel.RoleDAO;
 import org.splat.dal.dao.kernel.UserDAO;
@@ -46,6 +51,8 @@ import org.splat.dal.dao.som.KnowledgeElementDAO;
 import org.splat.dal.dao.som.KnowledgeElementTypeDAO;
 import org.splat.dal.dao.som.ScenarioDAO;
 import org.splat.dal.dao.som.StudyDAO;
+import org.splat.dal.dao.som.ValidationCycleDAO;
+import org.splat.exception.InvalidParameterException;
 import org.splat.i18n.I18nUtils;
 import org.splat.kernel.InvalidPropertyException;
 import org.splat.kernel.MismatchException;
@@ -55,11 +62,14 @@ import org.splat.kernel.NotApplicableException;
 import org.splat.log.AppLogger;
 import org.splat.service.dto.DocumentDTO;
 import org.splat.service.dto.FileDTO;
+import org.splat.service.dto.ScenarioDTO;
 import org.splat.service.dto.StepDTO;
 import org.splat.service.technical.IndexService;
 import org.splat.service.technical.ProjectSettingsService;
+import org.splat.service.technical.StepsConfigService;
 import org.splat.som.Step;
 import org.splat.util.BeanHelper;
+import org.splat.util.IOUtils;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -75,6 +85,10 @@ public class ScenarioServiceImpl implements ScenarioService {
        public final static AppLogger LOG = AppLogger
                        .getLogger(ScenarioServiceImpl.class);
 
+       /**
+        * " to " literal.
+        */
+       private static final String TO = " to ";
        /**
         * Injected index service.
         */
@@ -154,6 +168,16 @@ public class ScenarioServiceImpl implements ScenarioService {
         */
        private DocumentTypeService _documentTypeService;
 
+       /**
+        * Injected validation cycle DAO.
+        */
+       private ValidationCycleDAO _validationCycleDAO;
+
+       /**
+        * Injected project settings service.
+        */
+       private StepsConfigService _stepsConfigService;
+
        /**
         * Get the projectElementService.
         * 
@@ -213,6 +237,216 @@ public class ScenarioServiceImpl implements ScenarioService {
                _stepService = stepService;
        }
 
+       /**
+        * {@inheritDoc}
+        * 
+        * @see org.splat.service.ScenarioService#getStudyScenarios(java.lang.Long)
+        */
+       @Override
+       @Transactional(readOnly = true)
+       public List<ScenarioDTO> getStudyScenarios(final Long studyId) {
+               DetachedCriteria query = DetachedCriteria
+                               .forClass(Scenario.class, "scen")
+                               .add(Restrictions.eq("owner.rid", studyId))
+                               .setProjection(
+                                               Projections.projectionList().add(
+                                                               Projections.property("scen.title"), "title")
+                                                               .add(Projections.property("scen.rid"), "index"))
+                               .setResultTransformer(
+                                               Transformers.aliasToBean(ScenarioDTO.class));
+               return getScenarioDAO().getFilteredDTOList(query);
+       }
+
+       /**
+        * {@inheritDoc}
+        * 
+        * @see org.splat.service.ScenarioService#copyStudyContent(long, long, int, long)
+        */
+       @Override
+       @Transactional
+       public void copyStudyContent(final long fromStudyId, final long fromScenId,
+                       final int finalStepNum, final long toStudyId)
+                       throws InvalidParameterException, MissedPropertyException,
+                       InvalidPropertyException, MultiplyDefinedException,
+                       NotApplicableException, IOException {
+               Study fromStudy = getStudyService().selectStudy(fromStudyId);
+               if (fromStudy == null) {
+                       throw new InvalidParameterException(MessageKeyEnum.STD_000002
+                                       .toString(), String.valueOf(fromStudyId));
+               }
+               Scenario fromScen = null;
+               for (Scenario scen : fromStudy.getScenariiList()) {
+                       if (scen.getIndex() == fromScenId) {
+                               fromScen = scen;
+                       }
+               }
+
+               Study toStudy = getStudyService().selectStudy(toStudyId);
+               if (toStudy == null) {
+                       throw new InvalidParameterException(MessageKeyEnum.STD_000002
+                                       .toString(), String.valueOf(toStudy));
+               }
+
+               // Check if the step is applied to a scenario and scenario is defined
+               if (fromScen == null
+                               && getStepsConfigService().stepInvolves(finalStepNum,
+                                               Scenario.class)) {
+                       throw new InvalidParameterException(MessageKeyEnum.SCN_000006
+                                       .toString(), String.valueOf(fromScenId));
+               }
+
+               // Copy validation cycles
+               for (ValidationCycle fromCycle : fromStudy.getValidationCycles()
+                               .values()) {
+                       ValidationCycle cycle = new ValidationCycle(toStudy, fromCycle);
+                       getValidationCycleDAO().create(cycle);
+                       toStudy.addRelation(cycle.getContext());
+                       toStudy.getValidationCycles().put(
+                                       cycle.getDocumentType().getName(), cycle); // Replaces the cycle if exists as default,
+               }
+
+               // Copy content of the study up to the given step
+               Map<Publication, Publication> oldToNewPub = new HashMap<Publication, Publication>();
+               copyDocs(fromStudy, toStudy, finalStepNum, oldToNewPub);
+               if (fromScen != null) {
+                       copyDocs(fromScen, toStudy.getScenariiList().get(0), finalStepNum,
+                                       oldToNewPub);
+               }
+               copyDependencies(fromStudy, finalStepNum, oldToNewPub);
+               if (fromScen != null) {
+                       copyDependencies(fromScen, finalStepNum, oldToNewPub);
+               }
+       }
+
+       /**
+        * Copy dependencies between documents from the given project element up to <BR>
+        * the given step according to the given map of old publications to new publications.
+        * 
+        * @param from
+        *            the source project element
+        * @param finalStepNum
+        *            the final step for copy processing
+        * @param oldToNewPub
+        *            the old to new publications map
+        */
+       private void copyDependencies(final ProjectElement from,
+                       final int finalStepNum,
+                       final Map<Publication, Publication> oldToNewPub) {
+               // Copy dependencies between copied documents
+               for (Publication pub : from.getDocums()) {
+                       // If the document in the step before the final one
+                       if (pub.value().getStep() <= finalStepNum) {
+                               Publication newPub = oldToNewPub.get(pub);
+                               for (Publication used : pub.getRelations(UsesRelation.class)) {
+                                       newPub.addDependency(oldToNewPub.get(used));
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Copy documents with dependencies up to the given step.
+        * 
+        * @param from
+        *            the source project element
+        * @param to
+        *            the destination project element
+        * @param finalStepNum
+        *            the final step for copy process
+        * @param oldToNewPub2
+        * @throws MissedPropertyException
+        *             if document creation is failed
+        * @throws InvalidPropertyException
+        *             if document creation is failed
+        * @throws MultiplyDefinedException
+        *             if document creation is failed
+        * @throws IOException
+        *             if document file creation is failed
+        * @throws NotApplicableException
+        *             if document state is not applicable
+        * @param oldToNewPub
+        *            the old to new publications map
+        * 
+        */
+       private void copyDocs(final ProjectElement from, final ProjectElement to,
+                       final int finalStepNum,
+                       final Map<Publication, Publication> oldToNewPub)
+                       throws MissedPropertyException, InvalidPropertyException,
+                       MultiplyDefinedException, NotApplicableException, IOException {
+               Map<Integer, Step> steps = getProjectElementService().getStepsMap(to);
+               // Copy publications without old versions and relations to not copied steps documents
+               for (Publication pub : from.getDocums()) {
+                       // If the document in the step before the final one
+                       if (pub.value().getStep() <= finalStepNum) {
+                               // Copy the document
+                               oldToNewPub.put(pub, createDoc(pub.value(), steps.get(pub
+                                               .value().getStep())));
+                       }
+               }
+       }
+
+       /**
+        * Create a copy of the given document and publish it in the given step.
+        * 
+        * @param fromDoc
+        *            the source document
+        * @param step
+        *            the destination step
+        * @return the created publication
+        * @throws MissedPropertyException
+        *             if document creation is failed
+        * @throws InvalidPropertyException
+        *             if document creation is failed
+        * @throws MultiplyDefinedException
+        *             if document creation is failed
+        * @throws IOException
+        *             if document file creation is failed
+        * @throws NotApplicableException
+        *             if document state is not applicable
+        */
+       private Publication createDoc(final Document fromDoc, final Step step)
+                       throws MissedPropertyException, InvalidPropertyException,
+                       MultiplyDefinedException, IOException, NotApplicableException {
+
+               java.io.File upfile = fromDoc.getSourceFile().asFile();
+               // Creation of the document
+               Document.Properties dprop = new Document.Properties().setName(
+                               fromDoc.getTitle()).setType(fromDoc.getType()).setFormat(
+                               fromDoc.getFormat()).setAuthor(fromDoc.getAuthor());
+               dprop.setLocalPath(upfile.getPath());
+               Publication addoc = getStepService().createDocument(step, dprop);
+               copyFile(upfile, addoc.getSourceFile());
+               getPublicationService().saveAs(addoc, fromDoc.getProgressState());
+
+               // Copy attached files
+               for (Relation rel : addoc.value().getRelations(ConvertsRelation.class)) {
+                       File attach = ((ConvertsRelation) rel).getTo();
+                       ConvertsRelation export = getPublicationService().attach(addoc,
+                                       attach.getFormat());
+                       copyFile(attach.asFile(), export.getTo());
+               }
+               return addoc;
+       }
+
+       /**
+        * Copy a file. Print info message.
+        * 
+        * @param upfile
+        *            the source file.
+        * @param targetFile
+        *            the target file
+        * @throws IOException
+        *             if failed
+        */
+       private void copyFile(final java.io.File upfile, final File targetFile)
+                       throws IOException {
+               if (LOG.isInfoEnabled()) {
+                       LOG.info("Copy " + upfile.getAbsolutePath() + TO
+                                       + targetFile.asFile().getPath());
+               }
+               IOUtils.copy(upfile, targetFile.asFile());
+       }
+
        /**
         * {@inheritDoc}
         * 
@@ -366,8 +600,9 @@ public class ScenarioServiceImpl implements ScenarioService {
                return study;
        }
 
-       /** 
+       /**
         * {@inheritDoc}
+        * 
         * @see org.splat.service.ScenarioService#assignStudyContext(java.lang.Long, java.lang.String, java.lang.String)
         */
        @Transactional
@@ -759,7 +994,7 @@ public class ScenarioServiceImpl implements ScenarioService {
                                ConvertsRelation export = getPublicationService().attach(pub,
                                                fileFormat);
                                if (LOG.isDebugEnabled()) {
-                                       LOG.debug("Moving " + upfile.getName() + " to "
+                                       LOG.debug("Moving " + upfile.getName() + TO
                                                        + export.getTo().asFile().getPath());
                                }
                                upfile.renameTo(export.getTo().asFile());
@@ -803,7 +1038,7 @@ public class ScenarioServiceImpl implements ScenarioService {
                        } else {
                                throw new IOException(
                                                "Can't delete the existing destination file to move file from "
-                                                               + upfile.getAbsolutePath() + " to "
+                                                               + upfile.getAbsolutePath() + TO
                                                                + updir.getAbsolutePath());
                        }
                }
@@ -813,8 +1048,7 @@ public class ScenarioServiceImpl implements ScenarioService {
                        getPublicationService().saveAs(newPub, ProgressState.inWORK); // May throw FileNotFound if rename was not done
                } else {
                        throw new IOException("Can't move file from "
-                                       + upfile.getAbsolutePath() + " to "
-                                       + updir.getAbsolutePath());
+                                       + upfile.getAbsolutePath() + TO + updir.getAbsolutePath());
                }
        }
 
@@ -1366,4 +1600,44 @@ public class ScenarioServiceImpl implements ScenarioService {
                _simulationContextTypeService = simulationContextTypeService;
        }
 
+       /**
+        * Get the validationCycleDAO.
+        * 
+        * @return the validationCycleDAO
+        */
+       public ValidationCycleDAO getValidationCycleDAO() {
+               return _validationCycleDAO;
+       }
+
+       /**
+        * Set the validationCycleDAO.
+        * 
+        * @param validationCycleDAO
+        *            the validationCycleDAO to set
+        */
+       public void setValidationCycleDAO(
+                       final ValidationCycleDAO validationCycleDAO) {
+               _validationCycleDAO = validationCycleDAO;
+       }
+
+       /**
+        * Get steps config.
+        * 
+        * @return steps config service
+        */
+       private StepsConfigService getStepsConfigService() {
+               return _stepsConfigService;
+       }
+
+       /**
+        * Set steps config service.
+        * 
+        * @param stepsConfigService
+        *            steps config service
+        */
+       public void setStepsConfigService(
+                       final StepsConfigService stepsConfigService) {
+               _stepsConfigService = stepsConfigService;
+       }
+
 }