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.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.service.DocumentService;
import org.splat.service.DocumentTypeService;
-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.dal.bo.som.DocumentType;
import org.splat.som.Revision;
import org.splat.som.Step;
+import org.splat.wapp.Constants;
-public class ImportDocumentAction extends UploadBaseNextAction {
+/**
+ * Action for adding a document into a study step.
+ */
+public class ImportDocumentAction extends BaseUploadDocumentAction {
/**
* Serial version ID.
*/
private static final long serialVersionUID = 2587822564883588556L;
- private List<DocumentType> doctypes = null;
- private long 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
/**
- * Injected project settings service.
+ * Sorted list of document types for the selected study step.
*/
- private ProjectSettingsService _projectSettingsService;
+ private transient List<DocumentType> _documentTypes = null;
/**
- * Injected publication service.
+ * Sorted list of document types for the selected study step.
*/
- private PublicationService _publicationService;
+ private transient final List<Boolean> _reviewable = new ArrayList<Boolean>();
/**
- * Injected step service.
+ * The selected document type.
*/
- private StepService _stepService;
+ private long _documentType = 0;
+ /**
+ * Reference extracted from the imported file, if exist.
+ */
+ private String _reference = null;
/**
* Injected document service.
*/
* Injected document type service.
*/
private DocumentTypeService _documentTypeService;
+
/**
- * Injected repository service.
+ * Update uses documents list if chosen new type of import document.
+ * @return SUCCESS
*/
- private RepositoryService _repositoryService;
-
- // ==============================================================================================================================
- // Action methods
- // ==============================================================================================================================
+ public final String updateUsesList() {
+ _mystudy = getOpenStudy();
+ _defuses = new ArrayList<Document>();
+ _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.getCurSession();
- Transaction transax = connex.beginTransaction();
- User user = getConnectedUser();
- File updir = getRepositoryService().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 = getStepService().getValidDocumentTypes(step);
- deftype = ApplicationSettings.getDefaultDocumentType(step, filext);
- defuses = new Vector<Document>();
- 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<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 = getDocumentService().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<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 (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<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() {
- // -------------------------
- if (action == ToDo.cancel)
- return "cancel";
- if (doctype == 0) {
- setErrorCode("import.type");
- return ERROR;
- }
- Session connex = Database.getCurSession();
- Transaction transax = connex.beginTransaction();
- try {
- // Getting user inputs
- mystudy = getOpenStudy();
- User user = getConnectedUser();
- Step step = mystudy.getSelectedStep();
- DocumentType type = getDocumentTypeService().selectType((int)doctype);
- File updir = getRepositoryService().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) {
+ 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<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()));
+ }
}
- 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<DocumentType> getDocumentTypes() {
- // ---------------------------------------------
- return doctypes;
+ return _documentTypes;
}
+ /**
+ * Get document type id.
+ *
+ * @return document type id
+ */
public long getDocumentType() {
- // -----------------------------
- return doctype;
+ 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
- }
-
- 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;
+ return _reference;
}
/**
- * Get project settings.
+ * Set document name entered by the user if enabled.
*
- * @return Project settings service
+ * @param name
+ * the document name
*/
- private ProjectSettingsService getProjectSettings() {
- return _projectSettingsService;
+ public void setDocumentName(final String name) {
+ this._docname = name; // Name entered by the user if enabled
}
/**
- * Set project settings service.
+ * Set the default title if no title was defined.
*
- * @param projectSettingsService
- * project settings service
+ * @param name
+ * the default document title
*/
- public void setProjectSettings(ProjectSettingsService projectSettingsService) {
- _projectSettingsService = projectSettingsService;
+ public void setDocumentTitle(final String name) { // Called even if DocumentName is enabled
+ if (this._docname == null) {
+ this._docname = name;
+ }
}
/**
- * Get the publicationService.
+ * Set document type id.
*
- * @return the publicationService
+ * @param value
+ * the id as string
*/
- public PublicationService getPublicationService() {
- return _publicationService;
+ public void setDocumentType(final Long value) {
+ this._documentType = value;
}
/**
- * Set the publicationService.
+ * Set the default state if no state was selected.
*
- * @param publicationService
- * the publicationService to set
+ * @param state
+ * the default state
*/
- public void setPublicationService(PublicationService publicationService) {
- _publicationService = publicationService;
+ public void setDefaultDocumentState(final String state) { // Called even if DocumentState is enabled
+ if (this._state == null) {
+ this._state = ProgressState.valueOf(state);
+ }
}
/**
- * Get the stepService.
- * @return the stepService
+ * Set the default type if no type was selected.
+ *
+ * @param value
+ * the default document type id
*/
- public StepService getStepService() {
- return _stepService;
+ public void setDefaultDocumentType(final Long value) { // Called even if DocumentType is enabled
+ if (this._documentType == 0) {
+ this._documentType = value;
+ }
}
/**
- * Set the stepService.
- * @param stepService the stepService to set
+ * Set document reference extracted from the imported file, if exist.
+ *
+ * @param value
+ * the reference
*/
- public void setStepService(StepService stepService) {
- _stepService = stepService;
+ public void setReference(final String value) {
+ this._reference = value;
}
/**
* Get the documentService.
+ *
* @return the documentService
*/
public DocumentService getDocumentService() {
/**
* Set the documentService.
- * @param documentService the documentService to set
+ *
+ * @param documentService
+ * the documentService to set
*/
- public void setDocumentService(DocumentService documentService) {
+ public void setDocumentService(final DocumentService documentService) {
_documentService = documentService;
}
/**
- * Get the repositoryService.
- * @return the repositoryService
+ * Get the documentTypeService.
+ *
+ * @return the documentTypeService
*/
- public RepositoryService getRepositoryService() {
- return _repositoryService;
+ public DocumentTypeService getDocumentTypeService() {
+ return _documentTypeService;
}
/**
- * Set the repositoryService.
- * @param repositoryService the repositoryService to set
+ * Set the documentTypeService.
+ *
+ * @param documentTypeService
+ * the documentTypeService to set
*/
- public void setRepositoryService(RepositoryService repositoryService) {
- _repositoryService = repositoryService;
+ public void setDocumentTypeService(
+ final DocumentTypeService documentTypeService) {
+ _documentTypeService = documentTypeService;
}
/**
- * Get the documentTypeService.
- * @return the documentTypeService
+ * Get sorted list of available document states.
+ *
+ * @return the documentStates
*/
- public DocumentTypeService getDocumentTypeService() {
- return _documentTypeService;
+ public List<ProgressState> getDocumentStates() {
+ List<ProgressState> states = new ArrayList<ProgressState>();
+ states.add(ProgressState.inWORK);
+ states.add(ProgressState.inDRAFT);
+ states.add(ProgressState.EXTERN);
+ return states;
}
/**
- * Set the documentTypeService.
- * @param documentTypeService the documentTypeService to set
+ * Get the isReviewable.
+ *
+ * @return the isReviewable
*/
- public void setDocumentTypeService(DocumentTypeService documentTypeService) {
- _documentTypeService = documentTypeService;
+ public List<Boolean> getReviewable() {
+ return _reviewable;
}
-}
\ No newline at end of file
+}