org.roda.wui.client.ingest.transfer.TransferUpload.java Source code

Java tutorial

Introduction

Here is the source code for org.roda.wui.client.ingest.transfer.TransferUpload.java

Source

/**
 * 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);
            }
        }
    }
}