Salome HOME
Fix for mantis #0022093: To exclude the "In-Draft" state from drop-down list during...
[tools/siman.git] / Workspace / Siman / src / org / splat / simer / ImportDocumentAction.java
index e792383e87ba737259755bb42a02a66c067516ea..a3a4de2ebebe77981383781d4ed671de829bfc4f 100644 (file)
@@ -4,279 +4,443 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Arrays;
+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.User;
+import org.splat.dal.bo.kernel.User;
+import org.splat.dal.bo.som.Document;
+import org.splat.dal.bo.som.DocumentType;
+import org.splat.dal.bo.som.ProgressState;
+import org.splat.dal.bo.som.Publication;
+import org.splat.dal.bo.som.ValidationCycle;
+import org.splat.dal.bo.som.ValidationStep;
 import org.splat.manox.Reader;
 import org.splat.manox.Toolbox;
-import org.splat.som.Database;
-import org.splat.som.Document;
-import org.splat.som.ProgressState;
-import org.splat.som.ProjectSettings;
-import org.splat.som.Publication;
-import org.splat.som.DocumentType;
+import org.splat.service.DocumentService;
+import org.splat.service.DocumentTypeService;
 import org.splat.som.Revision;
 import org.splat.som.Step;
+import org.splat.wapp.Constants;
 
+/**
+ * Action for adding a document into a study step.
+ */
+public class ImportDocumentAction extends BaseUploadDocumentAction {
 
-public class ImportDocumentAction extends UploadBaseNextAction {
-
-    private List<DocumentType> doctypes = null;
-    private int                doctype  = 0;
-    private String             docref   = null;   // Reference extracted from the imported file, if exist
-    private String             docver   = "";     // Version number extracted from the imported file, if exist
-    private String             date     = "";     // Date extracted from the imported file, if exist
-
-       private static final long  serialVersionUID = 2587822564883588556L;
-
-//  ==============================================================================================================================
-//  Action methods
-//  ==============================================================================================================================
-
-    public String doInitialize () {
-//  -----------------------------
-      Session      connex  = Database.getSession();
-         Transaction  transax = connex.beginTransaction();
-      User         user    = getConnectedUser();
-         File         updir   = Database.getDownloadDirectory(user);
-         File         upfile  = new File(updir.getPath() + "/" + filename);
-      String[]     table   = filename.split("\\x2E");
-      String       filext  = table[table.length-1].toLowerCase();
-         
-         mystudy     = getOpenStudy();
-         Step   step = mystudy.getSelectedStep();
-         doctypes    = step.getValidDocumentTypes();
-      deftype     = ApplicationSettings.getDefaultDocumentType(step, filext);
-         defuses     = new Vector<Document>();
-         state       = ProgressState.inWORK;
-
-         Reader tool = Toolbox.getReader(upfile);
-         if (tool != null) {
-               String  fileref  = tool.extractProperty("reference");
-               String  filever  = tool.extractProperty("version");          // Property kept even if the file is not referenced
-               String  filetype = tool.extractProperty("type");             // Property kept even if the file is not referenced
-               for (Iterator<DocumentType> i=doctypes.iterator(); i.hasNext(); ) {
-             DocumentType type = i.next();
-          if (!type.getName().equals(filetype)) continue;
-          deftype = type;
-          doctype = type.getIndex();                                 // Disables the document type field
-          break;
-           }
-               if (fileref != null) {
-          Document  slot = Database.selectDocument(fileref, new Revision().toString());
-          if (slot == null) {
-            setErrorCode("reference.undefined");
-            return ERROR;
-          }
-          else {
-               if (!slot.isUndefined()) {
-              setErrorCode("reference.duplicate");
-              return ERROR;
-               }
-               docref  = fileref;             // Disables document name and state fields
-               deftype = slot.getType();      // Just in case
-            doctype = deftype.getIndex();  // Disables the document type field
-          }
-               }
-               if (filever != null) try {
-          Revision.Format get     = new Revision.Format(ProjectSettings.getRevisionPattern());          
-          Revision        version = get.parse(filever);
-          if ( version.isNull() ) throw new ParseException(filever, filever.length()-1);
-          if (!version.isMinor()) state = ProgressState.inCHECK;
-          docver  = version.toString();
-        } catch (ParseException e) {
-          setErrorCode("format.version");
-          return ERROR;
-        }
-       docname = tool.extractProperty("title");               // Property kept even if the file is not referenced
-       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;
-          }
-       } else date = "";
-         } else
-      if (filext.equals("pdf")) state = ProgressState.EXTERN;  //TODO: Should external extensions be configurable ?
-         if (docname == null) {
-           docname = table[0];
-           for (int i=1; i<table.length-1; i++) docname = docname + "." + table[i];
-         }
-         if (deftype != null) setupDefaultUses(deftype);
-
-         DocumentType[]          types   = doctypes.toArray( new DocumentType[doctypes.size()] );
-         DocumentTypeComparator  compare = new DocumentTypeComparator();
-         Arrays.sort(types, compare);
-         doctypes = Arrays.asList(types);
-
-      transax.commit();
-      return SUCCESS;
-    }
-    
-    public String doImport () {
-//  -------------------------
-      if (action  == ToDo.cancel) return "cancel";
-      if (doctype == 0 ) {
-        setErrorCode("import.type");
-       return ERROR;
-      }
-      Session      connex  = Database.getSession();
-         Transaction  transax = connex.beginTransaction();
-      try {
-//      Getting user inputs
-                      mystudy = getOpenStudy();
-        User          user    = getConnectedUser();
-        Step          step    = mystudy.getSelectedStep();
-           DocumentType  type    = Document.selectType(doctype);
-       File          updir   = Database.getDownloadDirectory(user);
-       File          upfile  = new File(updir.getPath() + "/" + filename);
-        String[]      table   = filename.split("\\x2E");
-
-//      Creation of the document
-        Document.Properties dprop = new Document.Properties();
-        Publication         addoc;
-
-        if (docref.length() == 0) {     // Importation of a foreign document
-//TODO:   Extract property of supported documents (DOCX, ODT...)
-          addoc = step.createDocument(dprop.setName(docname).setType(type).setFormat(table[table.length-1]).setAuthor(user));
-          updir = addoc.getSourceFile().asFile();
-                 if (logger.isInfoEnabled()) logger.info("Moving \"" + upfile.getName() + "\" to \"" + updir.getPath() + "\".");
-          upfile.renameTo(updir);
-          try {
-            addoc.saveAs(state);        // May throw FileNotFound if rename was not done
-          } catch (FileNotFoundException saverror) {
-               Thread.sleep(1000);
-            logger.info("Waiting for the file.");
-            upfile.renameTo(updir);
-            addoc.saveAs(state);        // Forget it if throw again FileNotFound
-          }
-        }
-        else {                          // Importation of a previously created template-based document
-          if (date.length() > 0) {
-            ResourceBundle   locale = ResourceBundle.getBundle("som", ApplicationSettings.getCurrentLocale());
-            SimpleDateFormat get    = new SimpleDateFormat(locale.getString("date.format"));            
-            dprop.setDate(get.parse(date));
-          }
-          addoc = step.assignDocument(dprop.setReference(docref).setName(docname));
-          updir = addoc.getSourceFile().asFile();
-          if (logger.isInfoEnabled()) logger.info("Moving \"" + upfile.getName() + "\" to \"" + updir.getPath() + "\".");
-          upfile.renameTo(updir);
-          try {
-            if (docver.length() > 0) addoc.saveAs(new Revision(docver));
-            else                     addoc.saveAs(state);
-          } catch (FileNotFoundException saverror) {
-               Thread.sleep(1000);
-            logger.info("Waiting for the file.");
-            upfile.renameTo(updir);
-            if (docver.length() > 0) addoc.saveAs(new Revision(docver));
-            else                     addoc.saveAs(state);
-          }
-          mystudy.updateSimulationContexts();  // In case of simulation contexts extracted from the imported document
-        }
-//      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);
-            addoc.addDependency(used);
-          }
-        }
-//      Creation of derived the document formats
-//      Document   ndoc = addoc.value();
-//      Converter  send = ApplicationSettings.getConverter(ndoc.getType(), ndoc.getFormat());
-//
-//      if (send != null) send.converts(addoc);     // Asynchronous process
-        transax.commit();
-
-        mystudy.add(addoc);                         // Updates the presentation
-        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()) {  // Probably useless test
-//      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;
-    }
-
-//  ==============================================================================================================================
-//  Getters and setters
-//  ==============================================================================================================================
-
-    public String getDocumentDate () {
-//  --------------------------------
-      return date;
-    }
-    public List<DocumentType> getDocumentTypes () {
-//  ---------------------------------------------
-      return doctypes;
-    }
-    public int getDocumentType () {
-//  -----------------------------
-      return doctype;
-    }
-    public String getReference () {
-//  -----------------------------
-      return docref;
-    }
-    public String getVersion () {
-//  ---------------------------
-      return docver;
-    }
-
-    public void setDocumentDate (String date) {
-//  -----------------------------------------
-      this.date = date;
-    }
-    public void setDocumentName (String name) {
-//  -----------------------------------------
-      this.docname = name;   // Name entered by the user if enabled
-    }
-    public void setDocumentTitle (String name) {           // Called even if DocumentName is enabled
-//  -----------------------------------------
-      if (this.docname == null) this.docname = name;
-    }
-    public void setDocumentType (String value) {
-//  ------------------------------------------
-      this.doctype = Integer.valueOf(value);
-    }
-    public void setDefaultDocumentState (String state) {   // Called even if DocumentState is enabled
-//  --------------------------------------------------
-      if (this.state == null) this.state = ProgressState.valueOf(state);
-    }
-    public void setDefaultDocumentType (String value) {   // Called even if DocumentType is enabled
-//  --------------------------------------------------
-      if (this.doctype == 0) this.doctype = Integer.valueOf(value);
-    }
-    public void setReference (String value) {
-//  ---------------------------------------
-      this.docref = value;
-    }
-    public void setVersion (String value) {
-//  -------------------------------------
-      this.docver = value;
-    }
+       /**
+        * Serial version ID.
+        */
+       private static final long serialVersionUID = 2587822564883588556L;
+
+       /**
+        * Sorted list of document types for the selected study step.
+        */
+       private transient List<DocumentType> _documentTypes = null;
+       /**
+        * Sorted list of document types for the selected study step.
+        */
+       private transient final List<Boolean> _reviewable = new ArrayList<Boolean>();
+       /**
+        * The selected document type.
+        */
+       private long _documentType = 0;
+       /**
+        * Reference extracted from the imported file, if exist.
+        */
+       private String _reference = null;
+       /**
+        * Injected document service.
+        */
+       private DocumentService _documentService;
+       /**
+        * Injected document type service.
+        */
+       private DocumentTypeService _documentTypeService;
+
+       /**
+        * Initialize the operation.
+        * 
+        * @return SUCCESS in success, otherwise - ERROR
+        */
+       public String doInitialize() {
+
+               File upfile = commonInitialize(Constants.FALSE);
+               String[] table = _fileName.split("\\x2E");
+               String filext = table[table.length - 1].toLowerCase();
+
+               _mystudy = getOpenStudy();
+               Step step = _mystudy.getSelectedStep();
+               _documentTypes = getStepService().getValidDocumentTypes(step);
+               // Set the document type by default
+               _deftype = getApplicationSettings().getDefaultDocumentType(step, filext);
+               if (_deftype != null) {
+                       setDefaultDocumentType(_deftype.getIndex());
+               }
+               _defuses = new ArrayList<Document>();
+               _state = ProgressState.inWORK;
+
+               String res = ERROR;
+               if (extractProperties(upfile, filext)) {
+                       if (_docname == null) {
+                               _docname = table[0];
+                               for (int i = 1; i < table.length - 1; i++) {
+                                       _docname = _docname + "." + table[i];
+                               }
+                       }
+                       if (_deftype != null) {
+                               setupDefaultUses(_deftype);
+                       }
+
+                       DocumentType[] types = _documentTypes
+                                       .toArray(new DocumentType[_documentTypes.size()]);
+                       DocumentTypeComparator compare = new DocumentTypeComparator();
+                       Arrays.sort(types, compare);
+                       _documentTypes = Arrays.asList(types);
+                       res = SUCCESS;
+               }
+
+               // Initialize isReviewable: if a type has review state or not
+               ValidationCycle cycle;
+               boolean hasReview;
+               for (DocumentType dtype : _documentTypes) {
+                       cycle = getStudyService().getValidationCycleOf(
+                                       _mystudy.getMystudy(), dtype);
+                       hasReview = (cycle != null) && cycle.enables(ValidationStep.REVIEW);
+                       _reviewable.add(hasReview);
+               }
+               return res;
+       }
+
+       /**
+        * Extract properties from the uploaded file.
+        * 
+        * @param upfile
+        *            the file to parse
+        * @param filext
+        *            the file extension
+        * @return true if succeeded, false if error
+        */
+       private boolean extractProperties(final File upfile, final String filext) {
+               boolean isOk = true;
+               Reader tool = Toolbox.getReader(upfile);
+               if (tool == null) {
+                       if ("pdf".equals(filext)) {
+                               _state = ProgressState.EXTERN; // TODO: Should external extensions be configurable ?
+                       }
+               } else {
+                       String fileref = tool.extractProperty("reference");
+                       String filever = tool.extractProperty("version"); // Property kept even if the file is not referenced
+                       String filetype = tool.extractProperty("type"); // Property kept even if the file is not referenced
+                       for (Iterator<DocumentType> i = _documentTypes.iterator(); i
+                                       .hasNext();) {
+                               DocumentType type = i.next();
+                               if (type.getName().equals(filetype)) {
+                                       _deftype = type;
+                                       _documentType = type.getIndex(); // Disables the document type field
+                                       break;
+                               }
+                       }
+                       if (fileref != null) {
+                               isOk = findTypeByDocRef(fileref);
+                       }
+                       if (isOk) {
+                               if (filever != null) {
+                                       try {
+                                               Revision.Format get = new Revision.Format(
+                                                               getProjectSettings().getRevisionPattern());
+                                               Revision version = get.parse(filever);
+                                               if (version.isNull()) {
+                                                       throw new ParseException(filever,
+                                                                       filever.length() - 1);
+                                               }
+                                               if (!version.isMinor()) {
+                                                       _state = ProgressState.inCHECK;
+                                               }
+                                               setVersion(version.toString());
+                                       } catch (ParseException e) {
+                                               setErrorCode("message.error.format.version");
+                                               isOk = false;
+                                       }
+                               }
+                               if (isOk) {
+                                       _docname = tool.extractProperty("title"); // Property kept even if the file is not referenced
+                                       isOk = extractDate(tool);
+                               }
+                       }
+               }
+               return isOk;
+       }
+
+       /**
+        * Find document type by document reference.
+        * 
+        * @param fileref
+        *            the document reference
+        * @return true if succeeded, false if error
+        */
+       private boolean findTypeByDocRef(final String fileref) {
+               boolean isOk = true;
+               Document slot = getDocumentService().selectDocument(fileref,
+                               new Revision().toString());
+               if (slot == null) {
+                       setError("message.error.reference.undefined");
+                       isOk = false;
+               } else {
+                       if (slot.isUndefined()) {
+                               _reference = fileref; // Disables document name and state fields
+                               _deftype = slot.getType(); // Just in case
+                               _documentType = _deftype.getIndex(); // Disables the document type field
+                       } else {
+                               setError("message.error.reference.duplicate");
+                               isOk = false;
+                       }
+               }
+               return isOk;
+       }
+
+       /**
+        * Perform import of a document.
+        * 
+        * @return SUCCESS if ok, "cancel" - if canceled, ERROR - if error
+        */
+       public String doImport() {
+               String res = ERROR;
+
+               initializationScreenContext(Constants.STUDY_MENU, Constants.STUDY_MENU,
+                               Constants.TRUE);
+
+               if (_action == ToDo.cancel) {
+                       res = "cancel";
+               } else if (_documentType == 0) {
+                       setErrorCode("message.error.import.type");
+
+                       initializationFullScreenContext(Constants.STUDY_MENU,
+                                       Constants.STUDY_MENU, Constants.TRUE, Constants.NONE,
+                                       Constants.STUDY_MENU);
+               } else {
+                       try {
+                               // Getting user inputs
+                               _mystudy = getOpenStudy();
+                               User user = getConnectedUser();
+                               Step step = _mystudy.getSelectedStep();
+                               Date aDate = null;
+                               if (getDocumentDate().length() > 0) {
+                                       ResourceBundle locale = ResourceBundle.getBundle("som",
+                                                       getApplicationSettings().getCurrentLocale());
+                                       SimpleDateFormat get = new SimpleDateFormat(locale
+                                                       .getString("date.format"), getApplicationSettings()
+                                                       .getCurrentLocale());
+                                       aDate = get.parse(getDocumentDate());
+                               }
+                               // Creation of uses relations
+                               List<Long> uses = new ArrayList<Long>();
+                               if (_docuses != null) {
+                                       String[] list = _docuses.split(",");
+                                       for (int i = 0; i < list.length; i++) {
+                                               uses.add(Long.valueOf(list[i].trim()));
+                                       }
+                               }
+                               if (LOG.isDebugEnabled()) {
+                                       LOG
+                                                       .debug("Document to be imported uses documents with following ids:");
+                                       for (Long usesId : uses) {
+                                               LOG.debug("#" + usesId);
+                                       }
+                               }
+                               Publication addoc = getPublicationService().createDoc(
+                                               _mystudy.getIndex(), step, _documentType,
+                                               user.getIndex(), _fileName, _docname, _state, _reference,
+                                               getVersion(), aDate, uses);
+
+                               if (_reference.length() > 0) { // Importation of a not foreign document
+                                       _mystudy.updateSimulationContexts(); // In case of simulation contexts extracted from the imported document
+                               }
+
+                               // Creation of derived the document formats
+                               // Document ndoc = addoc.value();
+                               // Converter send = getApplicationSettings().getConverter(ndoc.getType(), ndoc.getFormat());
+                               //
+                               // if (send != null) send.converts(addoc); // Asynchronous process
+
+                               _mystudy.add(addoc); // Updates the presentation
+                               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");
+                       }
+
+                       if (!SUCCESS.equals(res)) {
+                               initializationFullScreenContext(Constants.STUDY_MENU,
+                                               Constants.STUDY_MENU, Constants.TRUE, Constants.NONE,
+                                               Constants.STUDY_MENU);
+                       }
+               }
+
+               return res;
+       }
+
+       // ==============================================================================================================================
+       // Getters and setters
+       // ==============================================================================================================================
+
+       /**
+        * Get sorted list of document types valid for the selected study step.
+        * 
+        * @return sorted list of document types
+        */
+       public List<DocumentType> getDocumentTypes() {
+               return _documentTypes;
+       }
+
+       /**
+        * Get document type id.
+        * 
+        * @return document type id
+        */
+       public long getDocumentType() {
+               return _documentType;
+       }
+
+       /**
+        * Get reference extracted from the imported file, if exist.
+        * 
+        * @return the document reference
+        */
+       public String getReference() {
+               return _reference;
+       }
+
+       /**
+        * Set document name entered by the user if enabled.
+        * 
+        * @param name
+        *            the document name
+        */
+       public void setDocumentName(final String name) {
+               this._docname = name; // Name entered by the user if enabled
+       }
+
+       /**
+        * Set the default title if no title was defined.
+        * 
+        * @param name
+        *            the default document title
+        */
+       public void setDocumentTitle(final String name) { // Called even if DocumentName is enabled
+               if (this._docname == null) {
+                       this._docname = name;
+               }
+       }
+
+       /**
+        * Set document type id.
+        * 
+        * @param value
+        *            the id as string
+        */
+       public void setDocumentType(final Long value) {
+               this._documentType = value;
+       }
+
+       /**
+        * Set the default state if no state was selected.
+        * 
+        * @param state
+        *            the default state
+        */
+       public void setDefaultDocumentState(final String state) { // Called even if DocumentState is enabled
+               if (this._state == null) {
+                       this._state = ProgressState.valueOf(state);
+               }
+       }
+
+       /**
+        * Set the default type if no type was selected.
+        * 
+        * @param value
+        *            the default document type id
+        */
+       public void setDefaultDocumentType(final Long value) { // Called even if DocumentType is enabled
+               if (this._documentType == 0) {
+                       this._documentType = value;
+               }
+       }
+
+       /**
+        * Set document reference extracted from the imported file, if exist.
+        * 
+        * @param value
+        *            the reference
+        */
+       public void setReference(final String value) {
+               this._reference = value;
+       }
+
+       /**
+        * Get the documentService.
+        * 
+        * @return the documentService
+        */
+       public DocumentService getDocumentService() {
+               return _documentService;
+       }
+
+       /**
+        * Set the documentService.
+        * 
+        * @param documentService
+        *            the documentService to set
+        */
+       public void setDocumentService(final DocumentService documentService) {
+               _documentService = documentService;
+       }
+
+       /**
+        * Get the documentTypeService.
+        * 
+        * @return the documentTypeService
+        */
+       public DocumentTypeService getDocumentTypeService() {
+               return _documentTypeService;
+       }
+
+       /**
+        * Set the documentTypeService.
+        * 
+        * @param documentTypeService
+        *            the documentTypeService to set
+        */
+       public void setDocumentTypeService(
+                       final DocumentTypeService documentTypeService) {
+               _documentTypeService = documentTypeService;
+       }
+
+       /**
+        * Get sorted list of available document states.
+        * 
+        * @return the documentStates
+        */
+       public List<ProgressState> getDocumentStates() {
+               List<ProgressState> states = new ArrayList<ProgressState>();
+               states.add(ProgressState.inWORK);
+               states.add(ProgressState.inDRAFT);
+               states.add(ProgressState.EXTERN);
+               return states;
+       }
+
+       /**
+        * Get the isReviewable.
+        * 
+        * @return the isReviewable
+        */
+       public List<Boolean> getReviewable() {
+               return _reviewable;
+       }
 }
\ No newline at end of file