X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=Workspace%2FSiman%2Fsrc%2Forg%2Fsplat%2Fsimer%2FImportDocumentAction.java;h=ed307e2ce165b5d59030d58c0df6e3de9a8c0312;hb=92211fb733030a36267ccc496d9ed508a4f2b7fa;hp=b565afbd382a845b549d7ece165e16b80291285f;hpb=4219c15be3b42f18424b12d1b52d97ece0ed70ef;p=tools%2Fsiman.git diff --git a/Workspace/Siman/src/org/splat/simer/ImportDocumentAction.java b/Workspace/Siman/src/org/splat/simer/ImportDocumentAction.java index b565afb..ed307e2 100644 --- a/Workspace/Siman/src/org/splat/simer/ImportDocumentAction.java +++ b/Workspace/Siman/src/org/splat/simer/ImportDocumentAction.java @@ -2,377 +2,463 @@ package org.splat.simer; 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.Iterator; +import java.util.Date; 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.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.DocumentType; import org.splat.dal.bo.som.ProgressState; -import org.splat.service.PublicationService; -import org.splat.service.StepService; -import org.splat.service.technical.ProjectSettingsService; import org.splat.dal.bo.som.Publication; -import org.splat.dal.bo.som.DocumentType; +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.service.DocumentService; +import org.splat.service.DocumentTypeService; import org.splat.som.Revision; import org.splat.som.Step; +import org.splat.wapp.Constants; -public class ImportDocumentAction extends UploadBaseNextAction { - - private List 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 ProjectSettingsService _projectSettingsService; - private PublicationService _publicationService; - private StepService _stepService; +/** + * Action for adding a document into a study step. + */ +public class ImportDocumentAction extends BaseUploadDocumentAction { + /** + * Serial version ID. + */ private static final long serialVersionUID = 2587822564883588556L; - // ============================================================================================================================== - // Action methods - // ============================================================================================================================== + /** + * Sorted list of document types for the selected study step. + */ + private transient List _documentTypes = null; + /** + * Sorted list of document types for the selected study step. + */ + private transient final List _reviewable = new ArrayList(); + /** + * 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; + /** + * Update uses documents list if chosen new type of import document. + * @return SUCCESS + */ + public final String updateUsesList() { + _mystudy = getOpenStudy(); + _defuses = new ArrayList(); + _deftype = getDocumentTypeService().selectType( + (int) _documentType); + if (_deftype != null) { + setupDefaultUses(_deftype); + } + return SUCCESS; + } + + /** + * Initialize the operation. + * + * @return SUCCESS in success, otherwise - ERROR + */ 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(); - state = ProgressState.inWORK; + File upfile = commonInitialize(Constants.FALSE); + String[] table = _fileName.split("\\x2E"); + String filext = table[table.length - 1].toLowerCase(); - 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 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 + _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(); + _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 (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; - 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 = _documentTypes + .toArray(new DocumentType[_documentTypes.size()]); + DocumentTypeComparator compare = new DocumentTypeComparator(); + Arrays.sort(types, compare); + _documentTypes = Arrays.asList(types); + res = SUCCESS; } - 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); + // 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; + } - transax.commit(); - return SUCCESS; + /** + * 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 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; } - public String doImport() { - // ------------------------- - if (action == ToDo.cancel) - return "cancel"; - if (doctype == 0) { - setErrorCode("import.type"); - return ERROR; + /** + * 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; + } } - 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 = getStepService().createDocument(step, 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 { - getPublicationService().saveAs(addoc, 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(addoc, state); // Forget it if throw again FileNotFound - } - } else { // Importation of a previously created template-based document - if (date.length() > 0) { + 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 (_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(); + _mystudy.updateCurrentStep(); //update current step + User user = getConnectedUser(); + Step step = _mystudy.getSelectedStep(); + Date aDate = null; + if (getDocumentDate().length() > 0) { ResourceBundle locale = ResourceBundle.getBundle("som", - ApplicationSettings.getCurrentLocale()); - SimpleDateFormat get = new SimpleDateFormat( - locale.getString("date.format")); - dprop.setDate(get.parse(date)); + getApplicationSettings().getCurrentLocale()); + SimpleDateFormat get = new SimpleDateFormat(locale + .getString("date.format"), getApplicationSettings() + .getCurrentLocale()); + aDate = get.parse(getDocumentDate()); } - addoc = getStepService().assignDocument(step, 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) - getPublicationService().saveAs(addoc, - new Revision(docver)); - else - getPublicationService().saveAs(addoc, state); - } catch (FileNotFoundException saverror) { - Thread.sleep(1000); - logger.info("Waiting for the file."); - upfile.renameTo(updir); - if (docver.length() > 0) - getPublicationService().saveAs(addoc, - new Revision(docver)); - else - getPublicationService().saveAs(addoc, state); + // Creation of uses relations + List uses = new ArrayList(); + if (_docuses != null) { + String[] list = _docuses.split(","); + for (int i = 0; i < list.length; i++) { + uses.add(Long.valueOf(list[i].trim())); + } } - 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); + 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 + + if (uses.isEmpty()) { + _mystudy.add(addoc); // Updates the presentation + } else { + // Re-opening (refreshing) the currently open study + refreshStudy(); } + 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"); } - // 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); + + if (!SUCCESS.equals(res)) { + initializationFullScreenContext(Constants.STUDY_MENU, + Constants.STUDY_MENU, Constants.TRUE, Constants.NONE, + Constants.STUDY_MENU); } } - return ERROR; + + return res; } // ============================================================================================================================== // Getters and setters // ============================================================================================================================== - public String getDocumentDate() { - // -------------------------------- - return date; - } - + /** + * Get sorted list of document types valid for the selected study step. + * + * @return sorted list of document types + */ public List getDocumentTypes() { - // --------------------------------------------- - return doctypes; + return _documentTypes; } - public int getDocumentType() { - // ----------------------------- - return doctype; + /** + * 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 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 + return _reference; } - public void setDocumentTitle(String name) { // Called even if DocumentName is enabled - // ----------------------------------------- - if (this.docname == null) - this.docname = name; + /** + * 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 } - public void setDocumentType(String value) { - // ------------------------------------------ - this.doctype = Integer.valueOf(value); + /** + * 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; + } } - public void setDefaultDocumentState(String state) { // Called even if DocumentState is enabled - // -------------------------------------------------- - if (this.state == null) - this.state = ProgressState.valueOf(state); + /** + * Set document type id. + * + * @param value + * the id as string + */ + public void setDocumentType(final Long value) { + this._documentType = value; } - public void setDefaultDocumentType(String value) { // Called even if DocumentType is enabled - // -------------------------------------------------- - if (this.doctype == 0) - this.doctype = Integer.valueOf(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); + } } - public void setReference(String value) { - // --------------------------------------- - this.docref = value; + /** + * 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; + } } - public void setVersion(String value) { - // ------------------------------------- - this.docver = 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 project settings. + * Get the documentService. * - * @return Project settings service + * @return the documentService */ - private ProjectSettingsService getProjectSettings() { - return _projectSettingsService; + public DocumentService getDocumentService() { + return _documentService; } /** - * Set project settings service. + * Set the documentService. * - * @param projectSettingsService - * project settings service + * @param documentService + * the documentService to set */ - public void setProjectSettings(ProjectSettingsService projectSettingsService) { - _projectSettingsService = projectSettingsService; + public void setDocumentService(final DocumentService documentService) { + _documentService = documentService; } /** - * Get the publicationService. + * Get the documentTypeService. * - * @return the publicationService + * @return the documentTypeService */ - public PublicationService getPublicationService() { - return _publicationService; + public DocumentTypeService getDocumentTypeService() { + return _documentTypeService; } /** - * Set the publicationService. + * Set the documentTypeService. * - * @param publicationService - * the publicationService to set + * @param documentTypeService + * the documentTypeService to set */ - public void setPublicationService(PublicationService publicationService) { - _publicationService = publicationService; + public void setDocumentTypeService( + final DocumentTypeService documentTypeService) { + _documentTypeService = documentTypeService; } /** - * Get the stepService. - * @return the stepService + * Get sorted list of available document states. + * + * @return the documentStates */ - public StepService getStepService() { - return _stepService; + public List getDocumentStates() { + List states = new ArrayList(); + states.add(ProgressState.inWORK); + states.add(ProgressState.inDRAFT); + states.add(ProgressState.EXTERN); + return states; } /** - * Set the stepService. - * @param stepService the stepService to set + * Get the isReviewable. + * + * @return the isReviewable */ - public void setStepService(StepService stepService) { - _stepService = stepService; + public List getReviewable() { + return _reviewable; } -} \ No newline at end of file +}