Salome HOME
Rename the scenario functionality is implemented
[tools/siman.git] / Workspace / Siman / src / org / splat / simer / VersionDocumentAction.java
index 529d48aa84a351f007dd0819f2bff18ac769d3ff..66778f3c936bb4a7bc3a463d2924b997497d8e3b 100644 (file)
@@ -4,86 +4,101 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.HashSet;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 import java.util.ResourceBundle;
-import java.util.Vector;
 
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.splat.kernel.InvalidPropertyException;
 import org.splat.dal.bo.kernel.Relation;
 import org.splat.dal.bo.kernel.User;
-import org.splat.manox.Reader;
-import org.splat.manox.Toolbox;
-import org.splat.dal.dao.som.Database;
 import org.splat.dal.bo.som.Document;
 import org.splat.dal.bo.som.ProgressState;
+import org.splat.dal.bo.som.Publication;
+import org.splat.dal.bo.som.UsedByRelation;
+import org.splat.dal.bo.som.UsesRelation;
+import org.splat.kernel.InvalidPropertyException;
+import org.splat.manox.Reader;
+import org.splat.manox.Toolbox;
 import org.splat.service.PublicationService;
 import org.splat.service.StepService;
 import org.splat.service.technical.ProjectSettingsService;
 import org.splat.service.technical.RepositoryService;
-import org.splat.dal.bo.som.Publication;
 import org.splat.som.Revision;
 import org.splat.som.Step;
-import org.splat.dal.bo.som.UsedByRelation;
-import org.splat.dal.bo.som.UsesRelation;
+import org.splat.wapp.Constants;
 
+/**
+ * Action for creating a new version of a document.
+ */
 public class VersionDocumentAction extends UploadBaseNextAction {
 
-       private String index = null; // Versioned document index
-       private List<Publication> usedby = null;
-       private String docusedby = null;
-       private String summary = null; // Summary of changes in the new version
-       private String docver = ""; // Version number extracted from the imported file, if exist
-       private String date = ""; // Date extracted from the imported file, if exist
-       private ProjectSettingsService _projectSettingsService;
-       private PublicationService _publicationService;
-       private StepService _stepService;
        /**
-        * Injected repository service.
+        * Serial version ID.
         */
-       private RepositoryService _repositoryService;
+       private static final long serialVersionUID = -5702264003232132168L;
+
        /**
-        * Value of the menu property. 
-        * It can be: none, create, open, study, knowledge, sysadmin, help.
+        * Versioned document index.
         */
-       private String _menuProperty;
-       
+       private String _index = null;
        /**
-        * Value of the title bar property. 
-        * It can be: study, knowledge.
+        * List of publications which use the selected document.
         */
-       private String _titleProperty;
-       
+       private transient List<Publication> _usedby = null;
        /**
-        * Property that indicates whether the current open study is editable or not.
-        * On the screen it looks like pen on the status icon, pop-up menu also can be called.
-        * It is necessary for correct building the title bar.
+        * List of selected impacted documents ids.
         */
-       private String _editDisabledProperty = "false";
-
+       private transient long[] _docusedby = null;
        /**
-        * Serial version ID.
+        * Summary of changes in the new version.
         */
-       private static final long serialVersionUID = -5702264003232132168L;
+       private String _description = null;
+       /**
+        * Version number extracted from the imported file, if exist.
+        */
+       private String _version = "";
+       /**
+        * Date extracted from the imported file, if exist.
+        */
+       private String _date = "";
+       /**
+        * Injected project settings service.
+        */
+       private ProjectSettingsService _projectSettings;
+       /**
+        * Injected publication service.
+        */
+       private PublicationService _publicationService;
+       /**
+        * Injected step service.
+        */
+       private StepService _stepService;
+       /**
+        * Injected repository service.
+        */
+       private RepositoryService _repositoryService;
 
        // ==============================================================================================================================
        // Action methods
        // ==============================================================================================================================
 
+       /**
+        * Initialize the action form.
+        * 
+        * @return SUCCESS if succeeded, ERROR if uploaded file is XML and we can't extract properties from it
+        */
        public String doInitialize() {
-               // -----------------------------
-               
-               setMenuProperty("study");
-               setTitleProperty("study");
-               setEditDisabledProperty("true");
-        initializationScreenContext(_menuProperty, _titleProperty, _editDisabledProperty);
-           
-               Session connex = Database.getCurSession();
-               Transaction transax = connex.beginTransaction();
+
+               if ("true".equals(getWriteAccess())) {
+                       setToolProperty(Constants.STUDY_MENU);
+               } else {
+                       setToolProperty(Constants.NONE);
+               }
+               initializationFullScreenContext(Constants.STUDY_MENU,
+                               Constants.STUDY_MENU, Constants.TRUE, getToolProperty(),
+                               Constants.STUDY_MENU);
+
                User user = getConnectedUser();
                File updir = getRepositoryService().getDownloadDirectory(user);
                File upfile = new File(updir.getPath() + "/" + filename);
@@ -91,183 +106,154 @@ public class VersionDocumentAction extends UploadBaseNextAction {
                mystudy = getOpenStudy();
 
                Publication tag = mystudy.getSelectedStep().getDocument(
-                               Integer.valueOf(index));
+                               Integer.valueOf(_index));
                Document doc = tag.value();
                deftype = doc.getType();
                docname = doc.getTitle();
-               defuses = new Vector<Document>();
-               usedby = new Vector<Publication>();
+               defuses = new ArrayList<Document>();
+               _usedby = new ArrayList<Publication>();
+
+               String res = SUCCESS;
+               if (extractProperties(upfile, doc)) {
+                       setupDefaultUses(deftype);
+                       // Add additional documents used by the current version
+                       List<Relation> uses = doc.getRelations(UsesRelation.class);
+                       for (Iterator<Relation> i = uses.iterator(); i.hasNext();) {
+                               Document used = (Document) i.next().getTo();
+                               if (!defuses.contains(used)) {
+                                       defuses.add(used);
+                               }
+                       }
+                       // Setup dependencies
+                       _usedby.addAll(tag.getRelations(UsedByRelation.class));
+               } else {
+                       if (!(Constants.NONE.equals(getToolProperty()))) {
+                               initializationFullScreenContext(Constants.STUDY_MENU,
+                                               Constants.STUDY_MENU, Constants.TRUE, Constants.NONE,
+                                               Constants.STUDY_MENU);
+                       }
+                       res = ERROR;
+               }
+               return res;
+       }
 
+       /**
+        * Try to extract properties from the uploaded file if it is XML.
+        * 
+        * @param upfile
+        *            the file to parse
+        * @param doc
+        *            the document to version
+        * @return true if succeeded or if the file is not XML, otherwise return false
+        */
+       private boolean extractProperties(final File upfile, final Document doc) {
+               boolean res = true;
                Reader tool = Toolbox.getReader(upfile);
                if (tool != null) {
                        String fileref = tool.extractProperty("reference");
                        String filever = tool.extractProperty("version");
-                       if (fileref != null && !doc.getReference().equals(fileref)) {
-                               setErrorCode("reference.mismatch");
-                               return ERROR;
-                       }
-                       if (filever != null)
-                               try {
-                                       Revision.Format get = new Revision.Format(
-                                                       getProjectSettings().getRevisionPattern());
-                                       Revision newver = get.parse(filever);
-                                       Revision oldver = new Revision(doc.getVersion());
-                                       if (!newver.isGraterThan(oldver))
-                                               throw new InvalidPropertyException("version");
-                                       if (newver.isMinor())
-                                               state = ProgressState.inWORK;
-                                       else
-                                               state = ProgressState.inDRAFT;
-                                       docver = newver.toString();
-                               } catch (Exception e) {
-                                       setErrorCode("version.mismatch");
-                                       return ERROR;
+                       if (fileref == null || doc.getReference().equals(fileref)) {
+                               if (filever != null) {
+                                       try {
+                                               Revision.Format get = new Revision.Format(
+                                                               getProjectSettings().getRevisionPattern());
+                                               Revision newver = get.parse(filever);
+                                               Revision oldver = new Revision(doc.getVersion());
+                                               if (!newver.isGraterThan(oldver)) {
+                                                       throw new InvalidPropertyException("version");
+                                               }
+                                               if (newver.isMinor()) {
+                                                       state = ProgressState.inWORK;
+                                               } else {
+                                                       state = ProgressState.inDRAFT;
+                                               }
+                                               _version = newver.toString();
+                                       } catch (Exception e) {
+                                               setErrorCode("message.error.version.mismatch");
+                                               res = false;
+                                       }
                                }
-                       summary = tool.extractProperty("history");
-                       date = tool.extractProperty("date");
-                       if (date != null) {
-                               ResourceBundle locale = ResourceBundle.getBundle("som",
-                                               ApplicationSettings.getCurrentLocale());
-                               SimpleDateFormat check = new SimpleDateFormat(
-                                               locale.getString("date.format"));
-                               try {
-                                       check.parse(date);
-                               } catch (ParseException e) {
-                                       setErrorCode("format.date");
-                                       return ERROR;
+                               if (res) {
+                                       _description = tool.extractProperty("history");
+                                       _date = tool.extractProperty("date");
+                                       if (_date == null) {
+                                               _date = "";
+                                       } else {
+                                               ResourceBundle locale = ResourceBundle.getBundle("som",
+                                                               getApplicationSettings().getCurrentLocale());
+                                               SimpleDateFormat check = new SimpleDateFormat(locale
+                                                               .getString("date.format"));
+                                               try {
+                                                       check.parse(_date);
+                                               } catch (ParseException e) {
+                                                       setErrorCode("message.error.format.date");
+                                                       res = false;
+                                               }
+                                       }
                                }
-                       } else
-                               date = "";
-               }
-               setupDefaultUses(deftype);
-               // Add additional documents used by the current version
-               List<Relation> uses = doc.getRelations(UsesRelation.class);
-               for (Iterator<Relation> i = uses.iterator(); i.hasNext();) {
-                       Document used = (Document) i.next().getTo();
-                       if (!defuses.contains(used))
-                               defuses.add(used);
-               }
-               // Setup dependencies
-               List<Publication> relist = tag.getRelations(UsedByRelation.class);
-               for (Iterator<Publication> i = relist.iterator(); i.hasNext();) {
-                       usedby.add(i.next());
+                       } else {
+                               setErrorCode("message.error.reference.mismatch");
+                               res = false;
+                       }
                }
-               transax.commit();
-               return SUCCESS;
+               return res;
        }
 
+       /**
+        * Create a new version of the selected document.
+        * 
+        * @return SUCCESS - if succeeded, "cancel" - if canceled, ERROR - if failed
+        */
        public String doVersion() {
-               // -------------------------
-               setMenuProperty("study");
-               setTitleProperty("study");
-               setEditDisabledProperty("true");
-        initializationScreenContext(_menuProperty, _titleProperty, _editDisabledProperty);
-           
-               if (action == ToDo.cancel)
-                       return "cancel";
-
-               Session connex = Database.getCurSession();
-               Transaction transax = connex.beginTransaction();
-               try {
-                       // Getting user inputs
-                       mystudy = getOpenStudy();
-                       User user = getConnectedUser();
-                       Step step = mystudy.getSelectedStep();
-                       File updir = getRepositoryService().getDownloadDirectory(user);
-                       File upfile = new File(updir.getPath() + "/" + filename);
-
-                       // Versioning of the document
-                       Document.Properties dprop = new Document.Properties();
-                       Publication current = step.getDocument(Integer.valueOf(index));
-                       Publication next;
-
-                       if (docver.length() == 0) { // Importation of a foreign document
-                               next = getStepService().versionDocument(step, current, dprop.setAuthor(user)
-                                               .setDescription(summary));
-                               updir = next.getSourceFile().asFile();
-                               if (logger.isInfoEnabled())
-                                       logger.info("Moving \"" + upfile.getName() + "\" to \""
-                                                       + updir.getPath() + "\".");
-                               upfile.renameTo(updir);
-                               try {
-                                       getPublicationService().saveAs(next, state); // May throw FileNotFound if rename was not done
-                               } catch (FileNotFoundException saverror) {
-                                       Thread.sleep(1000);
-                                       logger.info("Waiting for the file.");
-                                       upfile.renameTo(updir);
-                                       getPublicationService().saveAs(next, state); // Forget it if throw again FileNotFound
-                               }
-                       } else {
-                               if (date.length() > 0) {
+               String res = ERROR;
+               initializationScreenContext(Constants.STUDY_MENU, Constants.STUDY_MENU,
+                               Constants.TRUE);
+
+               if (action == ToDo.cancel) {
+                       res = "cancel";
+               } else {
+
+                       try {
+                               // Getting user inputs
+                               mystudy = getOpenStudy();
+                               User user = getConnectedUser();
+                               Step step = mystudy.getSelectedStep();
+                               Date aDate = null;
+                               if (_date.length() > 0) {
                                        ResourceBundle locale = ResourceBundle.getBundle("som",
-                                                       ApplicationSettings.getCurrentLocale());
-                                       SimpleDateFormat get = new SimpleDateFormat(
-                                                       locale.getString("date.format"));
-                                       dprop.setDate(get.parse(date));
-                               }
-                               next = getStepService().versionDocument(step, current, dprop.setAuthor(user)
-                                               .setDescription(summary));
-                               updir = next.getSourceFile().asFile();
-                               if (logger.isInfoEnabled())
-                                       logger.info("Moving \"" + upfile.getName() + "\" to \""
-                                                       + updir.getPath() + "\".");
-                               upfile.renameTo(updir);
-                               try {
-                                       getPublicationService().saveAs(next, new Revision(docver));
-                               } catch (FileNotFoundException saverror) {
-                                       Thread.sleep(1000);
-                                       logger.info("Waiting for the file.");
-                                       upfile.renameTo(updir);
-                                       getPublicationService().saveAs(next, state);
+                                                       getApplicationSettings().getCurrentLocale());
+                                       SimpleDateFormat get = new SimpleDateFormat(locale
+                                                       .getString("date.format"));
+                                       aDate = get.parse(_date);
                                }
-                       }
-                       // TODO: Remove current document details from the contents of open study
-
-                       // Creation of uses relations
-                       if (docuses != null) {
-                               String[] list = docuses.split(",");
-                               for (int i = 0; i < list.length; i++) {
-                                       Integer index = Integer.valueOf(list[i].trim());
-                                       Publication used = getPublication(index);
-                                       next.addDependency(used);
+
+                               String[] listDocuses = null;
+                               if (docuses != null) {
+                                       listDocuses = docuses.split(",");
                                }
+                               getPublicationService().versionDocument(step, user, filename,
+                                               Integer.valueOf(_index), _version, _description, state,
+                                               aDate, listDocuses, _docusedby);
+
+                               // Update of the open study
+                               mystudy.setSelection(mystudy.getSelection()); // Rebuilds the presentation
+                               // TODO: Look is an optimization is possible (for example by updating the presentation of versioned document)
+
+                               res = SUCCESS;
+                       } catch (FileNotFoundException error) {
+                               LOG.error("Reason:", error);
+                               setErrorCode("message.error.import.file");
+                       } catch (Exception error) {
+                               LOG.error("Reason:", error);
+                               setErrorCode("message.error.internal");
                        }
-                       // Outdating impacted document
-                       HashSet<Integer> compatible = new HashSet<Integer>();
-                       if (docusedby != null) {
-                               String[] list = docusedby.split(",");
-                               for (int i = 0; i < list.length; i++)
-                                       compatible.add(Integer.valueOf(list[i].trim()));
-                       }
-                       List<Publication> relist = current
-                                       .getRelations(UsedByRelation.class);
-                       for (Iterator<Publication> i = relist.iterator(); i.hasNext();) {
-                               Publication using = i.next();
-                               if (!compatible.contains(using.getIndex()))
-                                       getPublicationService().outdate(using);
+                       if (!SUCCESS.equals(res)) {
+                               initializationFullScreenContext(Constants.STUDY_MENU,
+                                               Constants.STUDY_MENU, Constants.TRUE, Constants.NONE,
+                                               Constants.STUDY_MENU);
                        }
-                       // Update of the open study
-                       mystudy.setSelection(mystudy.getSelection()); // Rebuilds the presentation
-                       // TODO: Look is an optimization is possible (for example by updating the presentation of versioned document)
-
-                       transax.commit();
-                       return SUCCESS;
-               } catch (FileNotFoundException error) {
-                       logger.error("Reason:", error);
-                       setErrorCode("import.file");
-               } catch (Exception error) {
-                       logger.error("Reason:", error);
-                       setErrorCode("internal");
                }
-               if (transax != null && transax.isActive()) {
-                       // Second try-catch as the rollback could fail as well
-                       try {
-                               transax.rollback();
-                       } catch (HibernateException backerror) {
-                               logger.debug("Error rolling back transaction", backerror);
-                       }
-               }
-               return ERROR;
+               return res;
        }
 
        // ==============================================================================================================================
@@ -275,59 +261,49 @@ public class VersionDocumentAction extends UploadBaseNextAction {
        // ==============================================================================================================================
 
        public String getDate() {
-               // ------------------------
-               return date;
+               return _date;
        }
 
        public List<Publication> getDependencies() {
-               // -------------------------------------------
-               return usedby;
+               return _usedby;
        }
 
        public String getDescription() {
-               // -------------------------------
-               return summary;
+               return _description;
        }
 
        public String getIndex() {
-               // -------------------------
-               return index;
+               return _index;
        }
 
        public String getVersion() {
-               // ---------------------------
-               return docver;
+               return _version;
        }
 
-       public void setDate(String date) {
-               // ---------------------------------
-               this.date = date;
+       public void setDate(final String date) {
+               this._date = date;
        }
 
-       public void setDefaultDescription(String summary) {
-               // --------------------------------------------------
-               if (this.summary == null)
-                       this.summary = summary;
+       public void setDefaultDescription(final String summary) {
+               if (this._description == null) {
+                       this._description = summary;
+               }
        }
 
-       public void setDescription(String summary) {
-               // -------------------------------------------
-               this.summary = summary;
+       public void setDescription(final String summary) {
+               this._description = summary;
        }
 
-       public void setIndex(String index) {
-               // -----------------------------------
-               this.index = index;
+       public void setIndex(final String index) {
+               this._index = index;
        }
 
-       public void setUsedBy(String list) {
-               // -----------------------------------
-               this.docusedby = list;
+       public void setUsedBy(final long[] list) {
+               this._docusedby = list;
        }
 
-       public void setVersion(String value) {
-               // -------------------------------------
-               this.docver = value;
+       public void setVersion(final String value) {
+               this._version = value;
        }
 
        /**
@@ -336,7 +312,7 @@ public class VersionDocumentAction extends UploadBaseNextAction {
         * @return Project settings service
         */
        private ProjectSettingsService getProjectSettings() {
-               return _projectSettingsService;
+               return _projectSettings;
        }
 
        /**
@@ -345,8 +321,9 @@ public class VersionDocumentAction extends UploadBaseNextAction {
         * @param projectSettingsService
         *            project settings service
         */
-       public void setProjectSettings(ProjectSettingsService projectSettingsService) {
-               _projectSettingsService = projectSettingsService;
+       public void setProjectSettings(
+                       final ProjectSettingsService projectSettingsService) {
+               _projectSettings = projectSettingsService;
        }
 
        /**
@@ -364,12 +341,14 @@ public class VersionDocumentAction extends UploadBaseNextAction {
         * @param publicationService
         *            the publicationService to set
         */
-       public void setPublicationService(PublicationService publicationService) {
+       public void setPublicationService(
+                       final PublicationService publicationService) {
                _publicationService = publicationService;
        }
 
        /**
         * Get the stepService.
+        * 
         * @return the stepService
         */
        public StepService getStepService() {
@@ -378,14 +357,17 @@ public class VersionDocumentAction extends UploadBaseNextAction {
 
        /**
         * Set the stepService.
-        * @param stepService the stepService to set
+        * 
+        * @param stepService
+        *            the stepService to set
         */
-       public void setStepService(StepService stepService) {
+       public void setStepService(final StepService stepService) {
                _stepService = stepService;
        }
 
        /**
         * Get the repositoryService.
+        * 
         * @return the repositoryService
         */
        public RepositoryService getRepositoryService() {
@@ -394,57 +376,11 @@ public class VersionDocumentAction extends UploadBaseNextAction {
 
        /**
         * Set the repositoryService.
-        * @param repositoryService the repositoryService to set
+        * 
+        * @param repositoryService
+        *            the repositoryService to set
         */
-       public void setRepositoryService(RepositoryService repositoryService) {
+       public void setRepositoryService(final RepositoryService repositoryService) {
                _repositoryService = repositoryService;
        }
-       
-       /**
-        * Get the menuProperty.
-        * @return the menuProperty
-        */
-       public String getMenuProperty() {
-               return _menuProperty;
-       }
-
-       /**
-        * Set the menuProperty.
-        * @param menuProperty the menuProperty to set
-        */
-       public void setMenuProperty(String menuProperty) {
-               this._menuProperty = menuProperty;
-       }
-       
-       /**
-        * Get the _titleProperty.
-        * @return the _titleProperty
-        */
-       public String getTitleProperty() {
-               return _titleProperty;
-       }
-
-       /**
-        * Set the _titleProperty.
-        * @param _titleProperty the titleProperty to set
-        */
-       public void setTitleProperty(String titleProperty) {
-               _titleProperty = titleProperty;
-       }
-
-       /**
-        * Get the _editDisabledProperty.
-        * @return the _editDisabledProperty
-        */
-       public String getEditDisabledProperty() {
-               return _editDisabledProperty;
-       }
-
-       /**
-        * Set the _editDisabledProperty.
-        * @param _editDisabledProperty the _editDisabledProperty to set
-        */
-       public void setEditDisabledProperty(String _editDisabledProperty) {
-               this._editDisabledProperty = _editDisabledProperty;
-       }
 }
\ No newline at end of file