diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java index c0b4ee53fe9bf4e5bf855fbebd24d24a678fc254..b1b62954dddb55562d3cab0b15931af16c6b771c 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java @@ -57,6 +57,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AuthorizationGroupUpdat import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityDescription; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchOperationKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind; @@ -1272,7 +1273,7 @@ public interface ICommonClientService extends IClientService /** * Performs custom import operation */ - public String performCustomImport(String sessionKey, String customImportCode) + public List<BatchRegistrationResult> performCustomImport(String sessionKey, String customImportCode, boolean async, String userEmail) throws UserFailureException; /** diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java index 2fa01d41886fa64266a39d68ffaad68b5da7cd37..577af9a17191c64aec0ff8ba316383ad9b259eef 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java @@ -59,6 +59,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AuthorizationGroupUpdat import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityDescription; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchOperationKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind; @@ -1161,10 +1162,10 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync public void emptyTrash(boolean forceDisallowedTypes, AsyncCallback<Void> callback); /** - * @see ICommonClientService#performCustomImport(String, String) + * @see ICommonClientService#performCustomImport(String, String, boolean, String) */ - public void performCustomImport(String sessionKey, String customImportCode, - AsyncCallback<String> callback) + public void performCustomImport(String sessionKey, String customImportCode, boolean async, String userEmail, + final AsyncCallback<List<BatchRegistrationResult>> asyncCallback) throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException; /** diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractBatchRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractBatchRegistrationForm.java index 48ebd48ab34979cf3ae5d44137a07ef765dd1e93..9bf42f1af465b4089e03c6e5c69aabd87684fc38 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractBatchRegistrationForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractBatchRegistrationForm.java @@ -66,7 +66,7 @@ public abstract class AbstractBatchRegistrationForm extends AbstractRegistration protected final String sessionKey; - protected final LabelField templateField; + protected Field<?> templateField; protected final BasicFileFieldManager fileFieldsManager; @@ -205,7 +205,7 @@ public abstract class AbstractBatchRegistrationForm extends AbstractRegistration return field; } - protected LabelField createTemplateField() + protected Field<?> createTemplateField() { LabelField result = new LabelField(LinkRenderer.renderAsLink(viewContext diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CustomImportForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CustomImportForm.java index ab9927869bc88faaff27fc65804b5423aa4c0e59..914c36f3e1d71fdb3cd95e536116bedc3ab0ae4f 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CustomImportForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CustomImportForm.java @@ -16,17 +16,10 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui; -import static ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareField.wrapUnaware; - -import java.util.Arrays; -import java.util.List; - import com.extjs.gxt.ui.client.event.BaseEvent; import com.extjs.gxt.ui.client.event.Events; -import com.extjs.gxt.ui.client.event.FormEvent; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.widget.form.Field; -import com.extjs.gxt.ui.client.widget.form.FileUploadField; import com.extjs.gxt.ui.client.widget.form.LabelField; import com.extjs.gxt.ui.client.widget.form.MultiField; import com.google.gwt.user.client.Event; @@ -35,11 +28,8 @@ import com.google.gwt.user.client.Window; import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.FormPanelListener; import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.file.BasicFileFieldManager; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.HtmlMessageElement; import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils; import ch.systemsx.cisd.openbis.generic.shared.basic.PermlinkUtilities; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentHolderKind; @@ -50,20 +40,11 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project; /** * @author Pawel Glyzewski */ -public class CustomImportForm extends AbstractRegistrationForm +public class CustomImportForm extends AbstractBatchRegistrationForm { - private static final String FIELD_LABEL_TEMPLATE = "File"; - - private static final int NUMBER_OF_FIELDS = 1; - - private final String sessionKey; private final CustomImport customImport; - private final IViewContext<ICommonClientServiceAsync> viewContext; - - private final BasicFileFieldManager fileFieldsManager; - /** * @param viewContext * @param id @@ -71,93 +52,28 @@ public class CustomImportForm extends AbstractRegistrationForm public CustomImportForm(IViewContext<ICommonClientServiceAsync> viewContext, String id, CustomImport customImport) { - super(viewContext, id); + super(viewContext.getCommonViewContext(), id, id + "-" + customImport.getCode()); - saveButton.setText(messageProvider.getMessage(Dict.BUTTON_UPLOAD)); setResetButtonVisible(true); setDirtyCheckEnabled(false); - this.sessionKey = id + "-" + customImport.getCode(); this.customImport = customImport; - this.viewContext = viewContext; if (isTemplateAvailable()) { MultiField<Object> multifield = - new MultiField<Object>("", createTemplateField(), + new MultiField<Object>("", createTemplateLinkField(), createEntityWithTemplateField()); multifield.setLabelSeparator(""); - formPanel.add(multifield); - } - - fileFieldsManager = - new BasicFileFieldManager(sessionKey, NUMBER_OF_FIELDS, FIELD_LABEL_TEMPLATE); - fileFieldsManager.setMandatory(); - for (FileUploadField field : fileFieldsManager.getFields()) - { - formPanel.add(wrapUnaware((Field<?>) field).get()); + this.templateField = multifield; } - addUploadFeatures(sessionKey); - - formPanel.addListener(Events.BeforeSubmit, new Listener<FormEvent>() - { - @Override - public void handleEvent(FormEvent be) - { - infoBox.displayProgress(messageProvider.getMessage(Dict.PROGRESS_UPLOADING)); - } - }); - - formPanel.addListener(Events.Submit, new FormPanelListener(infoBox) - { - @Override - protected void setUploadEnabled() - { - CustomImportForm.this.setUploadEnabled(true); - } - - @Override - protected void onSuccessfullUpload() - { - infoBox.displayProgress(messageProvider.getMessage(Dict.PROGRESS_PROCESSING)); - - CustomImportForm.this.viewContext.getCommonService().performCustomImport( - sessionKey, - CustomImportForm.this.customImport.getCode(), - new AbstractRegistrationCallback<String>( - CustomImportForm.this.viewContext) - { - @Override - protected void process(String result) - { - super.process(result); - resetPanel(); - } - - @Override - protected List<HtmlMessageElement> createSuccessfullRegistrationInfo(String result) - { - return Arrays.asList(new HtmlMessageElement(result + " succesfully uploaded to the datastore server.")); - } - - @Override - public void finishOnFailure(Throwable caught) - { - super.finishOnFailure(caught); - resetPanel(); - } - - }); - - } - }); } @Override - protected void submitValidForm() + protected void save() { - CustomImportForm.this.setUploadEnabled(false); - formPanel.submit(); + CustomImportForm.this.viewContext.getCommonService().performCustomImport(sessionKey, CustomImportForm.this.customImport.getCode(), isAsync(), + emailField.getValue(), new BatchRegistrationCallback(this.viewContext)); } private boolean isTemplateAvailable() @@ -166,9 +82,8 @@ public class CustomImportForm extends AbstractRegistrationForm && getTemplateAttachmentName() != null; } - private Field<?> createTemplateField() + private Field<?> createTemplateLinkField() { - LabelField linkToTemplate = new LabelField(LinkRenderer.renderAsLink(viewContext .getMessage(Dict.FILE_TEMPLATE_LABEL))); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java index b6433a283628f0e9eabad69aeb170348dfe6d802..6fe8c846a368db223fc48467bbfbbb9b01af86b4 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java @@ -119,6 +119,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractType; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AsyncBatchRegistrationResult; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Attachment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentHolderKind; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentVersions; @@ -127,6 +128,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AuthorizationGroupUpdat import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityDescription; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchOperationKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CustomImportFile; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelatedEntities; @@ -2707,7 +2709,7 @@ public final class CommonClientService extends AbstractClientService implements } @Override - public String performCustomImport(String sessionKey, String customImportCode) + public List<BatchRegistrationResult> performCustomImport(String sessionKey, String customImportCode, boolean async, String userEmail) { HttpSession httpSession = getHttpSession(); UploadedFilesBean uploadedFiles = null; @@ -2715,8 +2717,19 @@ public final class CommonClientService extends AbstractClientService implements { uploadedFiles = (UploadedFilesBean) httpSession.getAttribute(sessionKey); abortIfMaxSizeExceeded(uploadedFiles); - return commonServer.performCustomImport(getSessionToken(), customImportCode, - getCustomImportFile(uploadedFiles)); + + CustomImportFile customImportFile = getCustomImportFile(uploadedFiles); + + if (async) + { + commonServer.performCustomImportAsync(getSessionToken(), customImportCode, customImportFile, userEmail); + return AsyncBatchRegistrationResult.singletonList(customImportFile.getFileName()); + } else + { + commonServer.performCustomImport(getSessionToken(), customImportCode, customImportFile); + return Collections.singletonList(new BatchRegistrationResult(customImportFile.getFileName(), String + .format("Import successfully completed."))); + } } catch (final UserFailureException e) { throw UserFailureExceptionTranslator.translate(e); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java index 72f94019d017bd6838cf25c4763541b038799eef..342e3d3a5b0c48d630a8641ba1c0824c446bf60f 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.server; +import java.io.Writer; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; @@ -35,6 +36,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import javax.annotation.Resource; + import org.springframework.dao.DataAccessException; import org.springframework.dao.DataIntegrityViolationException; @@ -145,6 +148,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.IEnt import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.api.IEntityValidator; import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.EncapsulatedCommonServer; import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.MasterDataRegistrationScriptRunner; +import ch.systemsx.cisd.openbis.generic.shared.ICommonServer; import ch.systemsx.cisd.openbis.generic.shared.IOpenBisSessionManager; import ch.systemsx.cisd.openbis.generic.shared.basic.BasicEntityInformationHolder; import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter; @@ -264,6 +268,9 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt private String defaultPutDataStoreServerCodeOrNull; + @Resource(name = ch.systemsx.cisd.openbis.generic.shared.ResourceNames.COMMON_SERVER) + protected ICommonServer commonServer; + public CommonServer(final IAuthenticationService authenticationService, final IOpenBisSessionManager sessionManager, final IDAOFactory daoFactory, final ICommonBusinessObjectFactory businessObjectFactory, @@ -4122,7 +4129,28 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt @Override @RolesAllowed(RoleWithHierarchy.SPACE_USER) - public String performCustomImport(String sessionToken, String customImportCode, + public void performCustomImportAsync(final String sessionToken, final String customImportCode, + final CustomImportFile customImportFile, final String userEmail) throws UserFailureException + { + executeASync(userEmail, new AbstractASyncAction() + { + @Override + public String getName() + { + return "Custom import"; + } + + @Override + protected void doActionOrThrowException(Writer messageWriter) + { + commonServer.performCustomImport(sessionToken, customImportCode, customImportFile); + } + }); + } + + @Override + @RolesAllowed(RoleWithHierarchy.SPACE_USER) + public void performCustomImport(String sessionToken, String customImportCode, CustomImportFile customImportFile) throws UserFailureException { Session session = getSession(sessionToken); @@ -4144,7 +4172,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt IDataStoreBO dataStore = businessObjectFactory.createDataStoreBO(session); dataStore.loadByCode(dssCode); dataStore.uploadFile(dropboxName, customImportFile); - return customImportFile.getFileName(); + return; } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java index 54e473704f026b1a65a27856d47465d24cb00a05..ad0da899be3d3d706f81480eebaf3e6b7895edfd 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java @@ -1616,13 +1616,21 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe } @Override - public String performCustomImport(String sessionToken, String customImportCode, + public void performCustomImportAsync(String sessionToken, String customImportCode, + CustomImportFile customImportFile, String userEmail) + { + logAccess(sessionToken, "performCustomImportAsync", + "CUSTOM_IMPORT_CODE(%s), CUSTOM_IMPORT_FILE(%s), USER_EMAIL(%s)", customImportCode, + customImportFile, userEmail); + } + + @Override + public void performCustomImport(String sessionToken, String customImportCode, CustomImportFile customImportFile) { logAccess(sessionToken, "performCustomImport", "CUSTOM_IMPORT_CODE(%s), CUSTOM_IMPORT_FILE(%s)", customImportCode, customImportFile); - return null; } @Override diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java index 4815725c8aa9f8fb56795fba96afa4803d5aca2a..7aa222b018e1377a2bbb15c63daa623a4fe36e18 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java @@ -203,7 +203,7 @@ public abstract class AbstractServerLogger implements IServer if (sessionManagerOrNull != null && sessionManagerOrNull.isAWellFormedSessionToken(sessionToken)) { - Session session = sessionManagerOrNull.getSession(sessionToken); + Session session = sessionManagerOrNull.tryGetSession(sessionToken); if (session != null && session.isOnBehalfSession()) { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java index d27799a07f635fa6d115652fbccccf19aa589f6a..08e3100362ce191d32050534a64e35517b070dfe 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java @@ -1451,11 +1451,18 @@ public interface ICommonServer extends IServer @Transactional(readOnly = true) public List<Material> searchForMaterials(String sessionToken, DetailedSearchCriteria criteria); + /** + * Performs an asynchronous import of file to the dss. + */ + @Transactional + public void performCustomImportAsync(String sessionToken, String customImportCode, + CustomImportFile customImportFile, String userEmail) throws UserFailureException; + /** * Performs an import of file to the dss. */ @Transactional - public String performCustomImport(String sessionToken, String customImportCode, + public void performCustomImport(String sessionToken, String customImportCode, CustomImportFile customImportFile) throws UserFailureException; /**