Java tutorial
/*! * 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() { } } }