org.pentaho.mantle.client.solutionbrowser.fileproperties.FilePropertiesDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.mantle.client.solutionbrowser.fileproperties.FilePropertiesDialog.java

Source

/*!
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * Copyright (c) 2002-2013 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.mantle.client.solutionbrowser.fileproperties;

import java.util.ArrayList;

import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback;
import org.pentaho.gwt.widgets.client.dialogs.MessageDialogBox;
import org.pentaho.gwt.widgets.client.dialogs.PromptDialogBox;
import org.pentaho.gwt.widgets.client.filechooser.RepositoryFile;
import org.pentaho.gwt.widgets.client.tabs.PentahoTab;
import org.pentaho.gwt.widgets.client.tabs.PentahoTabPanel;
import org.pentaho.mantle.client.dialogs.WaitPopup;
import org.pentaho.mantle.client.events.EventBusUtil;
import org.pentaho.mantle.client.events.GenericEvent;
import org.pentaho.mantle.client.messages.Messages;
import org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel;
import org.pentaho.mantle.client.ui.PerspectiveManager;

import com.google.gwt.core.client.GWT;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.ui.Widget;

/**
 * File properties parent panel displayed when right clicking a file in PUC repo browser. Subpanels include: General,
 * Share, History
 */
public class FilePropertiesDialog extends PromptDialogBox {
    public enum Tabs {
        GENERAL, PERMISSION
    }

    private PentahoTabPanel propertyTabs;
    private GeneralPanel generalTab;
    private PermissionsPanel permissionsTab;

    private String moduleBaseURL = GWT.getModuleBaseURL();
    private String moduleName = GWT.getModuleName();
    private String contextURL = moduleBaseURL.substring(0, moduleBaseURL.lastIndexOf(moduleName));
    boolean canManageAcls = false;
    boolean dirty = false;

    private String parentPath = null;

    /**
     * @param fileSummary
     * @param propertyTabs
     * @param callback
     * @param defaultTab
     */
    public FilePropertiesDialog(RepositoryFile fileSummary, final PentahoTabPanel propertyTabs,
            final IDialogCallback callback, Tabs defaultTab, final boolean canManageAcls) {
        super(fileSummary.getTitle() + " " + Messages.getString("properties"), Messages.getString("ok"), //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
                Messages.getString("cancel"), false, true);
        boolean isInTrash = fileSummary.getPath().contains("/.trash/pho:");
        setContent(propertyTabs);
        this.canManageAcls = canManageAcls;
        generalTab = new GeneralPanel(this, fileSummary);

        if (canManageAcls && !isInTrash) {
            permissionsTab = new PermissionsPanel(fileSummary);
        }

        generalTab.getElement().setId("filePropertiesGeneralTab");
        if (canManageAcls && !isInTrash) {
            permissionsTab.getElement().setId("filePropertiesPermissionsTab");
        }

        // get metadata via REST
        getMetadata(fileSummary);
        getAcls(fileSummary);

        okButton.getElement().setId("filePropertiesOKButton");
        cancelButton.getElement().setId("filePropertiesCancelButton");

        parentPath = fileSummary.getPath().substring(0, fileSummary.getPath().lastIndexOf("/"));

        super.setCallback(new IDialogCallback() {

            public void cancelPressed() {
                if (callback != null) {
                    callback.cancelPressed();
                }
            }

            public void okPressed() {
                applyPanel();
                if (callback != null) {
                    callback.okPressed();
                }
            }
        });
        this.propertyTabs = propertyTabs;
        this.propertyTabs.addTab(Messages.getString("general"), Messages.getString("general"), false, generalTab);
        if (canManageAcls && permissionsTab != null) {
            this.propertyTabs.addTab(Messages.getString("share"), Messages.getString("share"), false,
                    permissionsTab);
        }
        getWidget().setHeight("100%"); //$NON-NLS-1$
        getWidget().setWidth("100%"); //$NON-NLS-1$
        setPixelSize(490, 420);
        showTab(defaultTab);
    }

    /**
     *
     */
    private void applyPanel() {
        ArrayList<RequestBuilder> requestBuilders = new ArrayList<RequestBuilder>();
        for (int i = 0; i < propertyTabs.getTabCount(); i++) {
            Widget w = propertyTabs.getTab(i).getContent();
            if (w instanceof IFileModifier) {
                // get requests from sub panels
                if (((IFileModifier) w).prepareRequests() != null) {
                    requestBuilders.addAll(((IFileModifier) w).prepareRequests());
                }
            }
        }

        RequestCallback requestCallback;
        // chain requests from subpanels using callbacks to try and avoid any StaleItemStateExceptions
        for (int i = 0; i <= requestBuilders.size() - 1; i++) {
            RequestBuilder requestBuilder = requestBuilders.get(i);
            if (i < requestBuilders.size() - 1) {
                final RequestBuilder nextRequest = requestBuilders.get(i + 1);
                // This header is required to force Internet Explorer to not cache values from the GET response.
                nextRequest.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
                requestCallback = new ChainedRequestCallback(nextRequest);
            } else {
                requestCallback = new RequestCallback() {
                    @Override
                    public void onError(Request request, Throwable th) {
                        WaitPopup.getInstance().setVisible(false);
                        MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$
                                th.toString(), false, false, true);
                        dialogBox.center();
                    }

                    @Override
                    public void onResponseReceived(Request arg0, Response arg1) {
                        WaitPopup.getInstance().setVisible(false);
                        if (arg1.getStatusCode() == Response.SC_OK) {
                            dirty = false;
                            // Refresh current folder or parent folder
                            PerspectiveManager.getInstance().setPerspective(PerspectiveManager.BROWSER_PERSPECTIVE);

                            GenericEvent ge = new GenericEvent();
                            ge.setEventSubType("RefreshFolderEvent");
                            ge.setStringParam(parentPath);

                            EventBusUtil.EVENT_BUS.fireEvent(ge);

                        } else {
                            MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$
                                    Messages.getString("operationPermissionDenied"), false, false, true);
                            dialogBox.center();
                        }
                    }
                };
            }
            requestBuilder.setCallback(requestCallback);
        }

        // start the chain
        try {
            if (!requestBuilders.isEmpty()) {
                WaitPopup.getInstance().setVisible(true);
                requestBuilders.get(0).send();
            }
        } catch (RequestException e) {
            // ignored
        }
    }

    /**
     * @param tab
     */
    public void showTab(Tabs tab) {
        for (int i = 0; i < propertyTabs.getTabCount(); i++) {
            PentahoTab pTab = propertyTabs.getTab(i);
            switch (tab) {
            case GENERAL:
                if (pTab.getContent() == generalTab) {
                    propertyTabs.selectTab(pTab);
                }
                break;
            case PERMISSION:
                if (canManageAcls && pTab.getContent() == permissionsTab) {
                    propertyTabs.selectTab(pTab);
                }
                break;
            default:
                break;
            }
        }
    }

    /**
     * @param fileSummary
     */
    protected void getAcls(RepositoryFile fileSummary) {
        String url = contextURL + "api/repo/files/" + SolutionBrowserPanel.pathToId(fileSummary.getPath()) + "/acl"; //$NON-NLS-1$ //$NON-NLS-2$
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
        // This header is required to force Internet Explorer to not cache values from the GET response.
        builder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
        try {
            builder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable exception) {
                    MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$
                            exception.getLocalizedMessage(), false, false, true);
                    dialogBox.center();
                }

                public void onResponseReceived(Request request, Response response) {
                    if (response.getStatusCode() == Response.SC_OK) {
                        generalTab.setAclResponse(response);
                        if (permissionsTab != null) {
                            permissionsTab.setAclResponse(response);
                        }
                    } else {
                        MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$
                                Messages.getString("serverErrorColon") + " " + response.getStatusCode(), false, //$NON-NLS-1$//$NON-NLS-2$
                                false, true);
                        dialogBox.center();
                    }
                }
            });
        } catch (RequestException e) {
            MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), e.getLocalizedMessage(), //$NON-NLS-1$
                    false, false, true);
            dialogBox.center();
        }
    }

    /**
     * @param fileSummary
     */
    protected void getMetadata(RepositoryFile fileSummary) {
        String metadataUrl = contextURL + "api/repo/files/" + SolutionBrowserPanel.pathToId(fileSummary.getPath()) //$NON-NLS-1$
                + "/metadata?cb=" + System.currentTimeMillis(); //$NON-NLS-1$
        RequestBuilder metadataBuilder = new RequestBuilder(RequestBuilder.GET, metadataUrl);
        // This header is required to force Internet Explorer to not cache values from the GET response.
        metadataBuilder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
        metadataBuilder.setHeader("accept", "application/json");
        try {
            metadataBuilder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable exception) {
                    MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$
                            exception.getLocalizedMessage(), false, false, true);
                    dialogBox.center();
                }

                public void onResponseReceived(Request request, Response response) {
                    if (response.getStatusCode() == Response.SC_OK) {
                        if (response.getText() != null && !"".equals(response.getText())
                                && !response.getText().equals("null")) {
                            generalTab.setMetadataResponse(response);
                        }
                    } else {
                        MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$
                                Messages.getString("serverErrorColon") + " " + response.getStatusCode(), false, //$NON-NLS-1$//$NON-NLS-2$
                                false, true);
                        dialogBox.center();
                    }
                }
            });
        } catch (RequestException e) {
            MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), e.getLocalizedMessage(), //$NON-NLS-1$
                    false, false, true);
            dialogBox.center();
        }
    }

    /**
     *
     */
    protected class ChainedRequestCallback implements RequestCallback {
        RequestBuilder nextRequest;

        /**
         * @param arg0
         * @param arg1
         */
        @Override
        public void onError(Request arg0, Throwable arg1) {
            WaitPopup.getInstance().setVisible(false);
            MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), arg1.toString(), false, //$NON-NLS-1$
                    false, true);
            dialogBox.center();
        }

        /**
         * @param arg0
         * @param arg1
         */
        @Override
        public void onResponseReceived(Request arg0, Response arg1) {
            if (arg1.getStatusCode() == Response.SC_OK) {
                try {
                    nextRequest.send();
                } catch (RequestException e) {
                    // ignored
                }
                dirty = false;
            } else {
                WaitPopup.getInstance().setVisible(false);
                MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$
                        Messages.getString("operationPermissionDenied"), false, false, true);
                dialogBox.center();
            }
        }

        /**
         * @param nextRequest
         */
        public void setNextRequest(RequestBuilder nextRequest) {
            this.nextRequest = nextRequest;
        }

        /**
         * @param nextRequest
         */
        public ChainedRequestCallback(RequestBuilder nextRequest) {
            this.nextRequest = nextRequest;
        }

        /**
         *
         */
        public ChainedRequestCallback() {

        }
    }
}