package org.ngbw.web.actions; import java.util.List; import org.apache.log4j.Logger; import org.ngbw.cipres.sdk.api.foldershare.policy.AppendCopyDuplicateNumberPolicy; import org.ngbw.sdk.common.util.CipresTaskThread; import org.ngbw.sdk.database.SourceDocument; import org.ngbw.sdk.database.Task; import org.ngbw.sdk.foldershare.task.FileUploadTask; /** * * @author Tony Chen */ public class CipresDataShareManager extends SetTaskOutput { private static final Logger logger = Logger.getLogger(CipresDataShareManager.class); /** * When task output documents are transferred to CIPRES Share site, * it is important that the directory structures should be maintained * (except the username) to avoid confusing. This method reads the * structures of the directory and returns them in a List. * *
     * The directory structures of CIPRES Task output documents are in this form:
     * 
     *   {@code /username/user-defined-folder-name/Tasks/user-defined-task-label/scheduler.conf}
     *   {@code /username/user-defined-folder-name/Tasks/user-defined-task-label/_JOBINFO.TXT}
     *   ...
     * 
     * where {@code user-defined-folder-name} can have multiple sub-directories. 
     * 
     * i.e. 
     *   {@code /johndoe/beast/Tasks/beast-task-01/scheduler.conf}
     *   {@code /johndoe/beast/aminoacid/Tasks/beast-task-37/scheduler.conf}
     *   ...
     * 
     * On CIPRES Share site, the same directory structures, except the username, should be maintained for 
     * consistency. 
     * 
     * Example 1:
     * When the user johndoe transfers the file {@code /johndoe/beast/Tasks/beast-task-01/scheduler.conf} 
     * to CIPRES Share, it will be placed under {@code /beast/Tasks/beast-task-01} directory.  Note that the root 
     * directory 'johndoe' will be created on CIPRES Share. 
     * 
     * Thus, invoking this method {@code getTaskOutputDocsDirectories(Task)} returns 
     * {@code List["beast", "Tasks", "beast-task-01"]}.
     * 
     * Example 2: 
     * The file {@code /johndoe/beast/aminoacid/Tasks/beast-task-37/scheduler.conf} transferred to CIPRES Share 
     * will be placed under {@code /beast/aminoacid/Tasks/beast-task-37} directory.  Thus invoking this method 
     * {@code getTaskOutputDocsDirectories(Task)} returns {@code List ["beast", "aminoacid", "Tasks", "beast-task-37"]}.
     * 
* * * NOTE: The {@code username} will be removed. * * * @param task the CIPRES Task which output files are from * * @return directory structures * * @throws Throwable */ private List getTaskOutputDocsDirectories ( Task task ) throws Throwable { if (task != null) { return task.getDirectoryList( getAuthenticatedUser(), "Tasks", task.getLabel()); } return null; } /** * Transfers user selected task output files to CIPRES Share (SeedMe2) site. * *

* Directory structures will be maintained the same on CIPRES Share. * * @return * * @throws Throwable */ public String transferTaskOutputFiles () throws Throwable { logger.debug("BEGIN: transferTaskOutputFiles()::String"); Task task = (Task) getSessionAttribute(CURRENT_TASK); List selectedDocs = getSelectedDocuments(); if (task == null) { logger.debug(super.reportUserError("No Task was selected.")); } else if (selectedDocs == null || selectedDocs.isEmpty()) { logger.debug(super.reportUserError("No documents were selected.")); } else { FileUploadTask fileUploadTask = new FileUploadTask( getAuthenticatedUser(), getTaskOutputDocsDirectories(task), selectedDocs, new AppendCopyDuplicateNumberPolicy()); CipresTaskThread thread = new CipresTaskThread(fileUploadTask); thread.start(); super.reportUserMessage(NgbwSupport.CIPRES_SHARE_FILES_TRANS_MSG); } logger.debug("END: transferTaskOutputFiles()::String"); return super.displayOutput(); } }