/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE file at the root of the source * tree and available online at * * https://github.com/keeps/roda */ /** * */ package org.roda.wui.client.ingest.transfer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.roda.core.data.common.RodaConstants; import org.roda.core.data.v2.ip.TransferredResource; import org.roda.wui.client.browse.BrowseFile; import org.roda.wui.client.browse.BrowserService; import org.roda.wui.client.common.LastSelectedItemsSingleton; import org.roda.wui.client.common.UserLogin; import org.roda.wui.client.common.utils.JavascriptUtils; import org.roda.wui.common.client.HistoryResolver; import org.roda.wui.common.client.tools.HistoryUtils; import org.roda.wui.common.client.tools.ListUtils; import org.roda.wui.common.client.tools.RestUtils; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.DragLeaveEvent; import com.google.gwt.event.dom.client.DragLeaveHandler; import com.google.gwt.event.dom.client.DragOverEvent; import com.google.gwt.event.dom.client.DragOverHandler; import com.google.gwt.event.dom.client.DropEvent; import com.google.gwt.event.dom.client.DropHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.i18n.client.LocaleInfo; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import config.i18n.client.ClientMessages; /** * @author Luis Faria <lfaria@keep.pt> * */ public class TransferUpload extends Composite { public static final HistoryResolver INGEST_RESOLVER = new HistoryResolver() { @Override public void resolve(List<String> historyTokens, AsyncCallback<Widget> callback) { getInstance().resolve(historyTokens, callback); } @Override public void isCurrentUserPermitted(AsyncCallback<Boolean> callback) { UserLogin.getInstance().checkRole(this, callback); } @Override public String getHistoryToken() { return "upload"; } @Override public List<String> getHistoryPath() { return ListUtils.concat(IngestTransfer.RESOLVER.getHistoryPath(), getHistoryToken()); } }; public static final HistoryResolver BROWSE_RESOLVER = new HistoryResolver() { @Override public void resolve(List<String> historyTokens, AsyncCallback<Widget> callback) { getInstance().browseResolve(historyTokens, callback); } @Override public void isCurrentUserPermitted(AsyncCallback<Boolean> callback) { UserLogin.getInstance().checkRole(this, callback); } @Override public String getHistoryToken() { return "upload"; } @Override public List<String> getHistoryPath() { return ListUtils.concat(BrowseFile.RESOLVER.getHistoryPath(), getHistoryToken()); } }; interface MyUiBinder extends UiBinder<Widget, TransferUpload> { } private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); private static ClientMessages messages = (ClientMessages) GWT.create(ClientMessages.class); private static final String DRAGOVER = "dragover"; @UiField Label uploadTitle; @UiField SimplePanel itemIcon; @UiField Label itemTitle; @UiField Label itemDates; // BUTTONS @UiField Button done; @UiField HTML uploadForm; @UiField HTML uploadList; // INGEST TRANSFER private TransferredResource resource; // BROWSE UPLOAD private String aipId; private String representationId; private List<String> folderPath; private String folderId; private boolean isIngest = true; private static final List<String> fieldsToReturn = Arrays.asList(RodaConstants.INDEX_UUID, RodaConstants.TRANSFERRED_RESOURCE_ID, RodaConstants.TRANSFERRED_RESOURCE_ISFILE); @SuppressWarnings("unused") private HandlerRegistration handlerRegistration; private static TransferUpload instance = null; protected boolean verified = false; private TransferUpload() { initWidget(uiBinder.createAndBindUi(this)); } /** * Get the singleton instance * * @return the instance */ public static TransferUpload getInstance() { if (instance == null) { instance = new TransferUpload(); } return instance; } @Override protected void onLoad() { super.onLoad(); JavascriptUtils.stickSidebar(); } private String getUploadUrl() { String ret = null; if (isIngest) { uploadTitle.setText(messages.ingestTransferUploadTitle()); if (resource == null) { // upload to root ret = RestUtils.createTransferredResourceUploadUri(null, LocaleInfo.getCurrentLocale().getLocaleName()); } else if (!resource.isFile()) { ret = RestUtils.createTransferredResourceUploadUri(resource.getUUID(), LocaleInfo.getCurrentLocale().getLocaleName()); } } else { uploadTitle.setText(messages.fileUploadTitle()); LastSelectedItemsSingleton selectedItems = LastSelectedItemsSingleton.getInstance(); String details = selectedItems.getDetailsMessage(); List<String> directory = new ArrayList<>(); if (folderPath != null) { directory.addAll(folderPath); } if (folderId != null) { directory.add(folderId); } ret = RestUtils.createFileUploadUri(aipId, representationId, directory, details); } return ret; } @Override protected void onAttach() { verified = false; super.onAttach(); } protected void resolve(final List<String> historyTokens, final AsyncCallback<Widget> callback) { isIngest = true; if (historyTokens.isEmpty()) { // Upload to root resource = null; callback.onSuccess(TransferUpload.this); updateUploadForm(); } else if (historyTokens.size() == 1) { // Upload to directory String transferredResourceUUID = historyTokens.get(0); if (transferredResourceUUID != null) { BrowserService.Util.getInstance().retrieve(TransferredResource.class.getName(), transferredResourceUUID, fieldsToReturn, new AsyncCallback<TransferredResource>() { @Override public void onFailure(Throwable caught) { callback.onFailure(caught); } @Override public void onSuccess(TransferredResource r) { resource = r; callback.onSuccess(TransferUpload.this); updateUploadForm(); } }); } else { HistoryUtils.newHistory(IngestTransfer.RESOLVER); callback.onSuccess(null); } } } protected void browseResolve(final List<String> historyTokens, final AsyncCallback<Widget> callback) { isIngest = false; if (historyTokens.size() >= 2) { aipId = historyTokens.get(0); representationId = historyTokens.get(1); if (historyTokens.size() >= 3) { folderPath = new ArrayList<>(historyTokens.subList(2, historyTokens.size() - 1)); folderId = historyTokens.get(historyTokens.size() - 1); } else { folderPath = null; folderId = null; } callback.onSuccess(TransferUpload.this); updateUploadForm(); } } private void updateUploadForm() { String uploadUrl = getUploadUrl(); if (uploadUrl != null) { SafeHtml html = SafeHtmlUtils.fromSafeConstant("<form id='upload' method='post' action='" + uploadUrl + "' enctype='multipart/form-data'>" + "<div id='drop'><h4>" + messages.ingestTransferUploadDropHere() + "</h4><a>" + messages.ingestTransferUploadBrowseFiles() + "</a>" + "<input title='" + RodaConstants.API_PARAM_UPLOAD + "' type='file' name='" + RodaConstants.API_PARAM_UPLOAD + "' multiple='true' />" + " </div>" + "<input title='hiddenSubmit' type='submit' hidden/> </form>"); uploadForm.setHTML(html); uploadList.setHTML(SafeHtmlUtils.fromSafeConstant("<ul id='upload-list'></ul>")); uploadForm.addDomHandler(new DragOverHandler() { @Override public void onDragOver(DragOverEvent event) { uploadForm.addStyleName(DRAGOVER); } }, DragOverEvent.getType()); uploadForm.addDomHandler(new DragLeaveHandler() { @Override public void onDragLeave(DragLeaveEvent event) { uploadForm.removeStyleName(DRAGOVER); } }, DragLeaveEvent.getType()); uploadForm.addDomHandler(new DropHandler() { @Override public void onDrop(DropEvent event) { uploadForm.removeStyleName(DRAGOVER); } }, DropEvent.getType()); JavascriptUtils.runMiniUploadForm(); } else { uploadForm.setHTML(SafeHtmlUtils.EMPTY_SAFE_HTML); } } @UiHandler("done") void buttonDoneHandler(ClickEvent e) { if (isIngest) { if (resource != null) { HistoryUtils.newHistory(IngestTransfer.RESOLVER, resource.getUUID()); } else { HistoryUtils.newHistory(IngestTransfer.RESOLVER); } } else { if (folderId != null) { HistoryUtils.openBrowse(aipId, representationId, folderPath, folderId); } else { HistoryUtils.openBrowse(aipId, representationId); } } } }