commit 7619df4ca8b32dad64825bdfaa3089e0a290b629 Author: Francesco Mangiacrapa Date: Thu Apr 21 08:37:31 2016 +0000 git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/workspace-explorer-app@128209 82a268e6-3cf1-43bd-a215-b396298e98cf diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..3f26f3c --- /dev/null +++ b/.classpath @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..b65f237 --- /dev/null +++ b/.project @@ -0,0 +1,47 @@ + + + workspace-explorer-app-TRUNK + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + com.google.gdt.eclipse.core.webAppProjectValidator + + + + + com.google.gwt.eclipse.core.gwtProjectValidator + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + com.google.gwt.eclipse.core.gwtNature + + diff --git a/.settings/.jsdtscope b/.settings/.jsdtscope new file mode 100644 index 0000000..c3e8b26 --- /dev/null +++ b/.settings/.jsdtscope @@ -0,0 +1,5 @@ + + + + + diff --git a/.settings/com.google.appengine.eclipse.core.prefs b/.settings/com.google.appengine.eclipse.core.prefs new file mode 100644 index 0000000..82c36af --- /dev/null +++ b/.settings/com.google.appengine.eclipse.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +filesCopiedToWebInfLib= diff --git a/.settings/com.google.gdt.eclipse.core.prefs b/.settings/com.google.gdt.eclipse.core.prefs new file mode 100644 index 0000000..7efa2fe --- /dev/null +++ b/.settings/com.google.gdt.eclipse.core.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +jarsExcludedFromWebInfLib= +lastWarOutDir=/home/francesco-mangiacrapa/wseclipseluna/workspace-explorer-app/target/workspace-explorer-app-0.0.1-SNAPSHOT +launchConfigExternalUrlPrefix= +warSrcDir=src/main/webapp +warSrcDirIsOutput=false diff --git a/.settings/com.google.gwt.eclipse.core.prefs b/.settings/com.google.gwt.eclipse.core.prefs new file mode 100644 index 0000000..f23a752 --- /dev/null +++ b/.settings/com.google.gwt.eclipse.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +entryPointModules= diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..29abf99 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..443e085 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..8f2836d --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..ee39ed3 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/.settings/org.eclipse.wst.validation.prefs b/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000..04cad8c --- /dev/null +++ b/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/distro/LICENSE b/distro/LICENSE new file mode 100644 index 0000000..2d9616a --- /dev/null +++ b/distro/LICENSE @@ -0,0 +1 @@ +${gcube.license} \ No newline at end of file diff --git a/distro/README b/distro/README new file mode 100644 index 0000000..355aa76 --- /dev/null +++ b/distro/README @@ -0,0 +1,60 @@ +The gCube System - ${name} +-------------------------------------------------- + +${description} + + +${gcube.description} + +${gcube.funding} + + +Version +-------------------------------------------------- + +${version} (${buildDate}) + +Please see the file named "changelog.xml" in this directory for the release notes. + + +Authors +-------------------------------------------------- + +* Francesco Mangiacrapa (francesco.mangiacrapa-AT-isti.cnr.it), Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" - CNR, Pisa (Italy). + +Maintainers +----------- + +* Francesco Mangiacrapa (francesco.mangiacrapa-AT-isti.cnr.it), Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" - CNR, Pisa (Italy). + +Download information +-------------------------------------------------- + +Source code is available from SVN: + ${scm.url} + +Binaries can be downloaded from the gCube website: + ${gcube.website} + + +Installation +-------------------------------------------------- + + +Documentation +-------------------------------------------------- + +Documentation is available on-line in the gCube Wiki: + ${gcube.wikiRoot}/Workspace + +Support +-------------------------------------------------- + +Bugs and support requests can be reported in the gCube issue tracking tool: + ${gcube.issueTracking} + + +Licensing +-------------------------------------------------- + +This software is licensed under the terms you may find in the file named "LICENSE" in this directory. \ No newline at end of file diff --git a/distro/changelog.xml b/distro/changelog.xml new file mode 100644 index 0000000..b4fd1ef --- /dev/null +++ b/distro/changelog.xml @@ -0,0 +1,6 @@ + + + first release + + diff --git a/distro/descriptor.xml b/distro/descriptor.xml new file mode 100644 index 0000000..0eec2ec --- /dev/null +++ b/distro/descriptor.xml @@ -0,0 +1,32 @@ + + servicearchive + + tar.gz + + / + + + ${distroDirectory} + / + true + + README + LICENSE + changelog.xml + profile.xml + + 755 + true + + + + + target/${build.finalName}.${project.packaging} + /${artifactId} + + + + diff --git a/distro/profile.xml b/distro/profile.xml new file mode 100644 index 0000000..51c3b6b --- /dev/null +++ b/distro/profile.xml @@ -0,0 +1,25 @@ + + + + Service + + ${description} + PortletUser + ${artifactId} + ${version} + + + ${artifactId} + ${version} + + ${groupId} + ${artifactId} + ${version} + + + target/${build.finalName}.war + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..6ab2b7a --- /dev/null +++ b/pom.xml @@ -0,0 +1,319 @@ + + 4.0.0 + + maven-parent + org.gcube.tools + 1.0.0 + + + org.gcube.portlets.user + workspace-explorer-app + 0.1.0-SNAPSHOT + war + + + gCube Workspace Explorer Application is an application to navigate the Workspace in read-only mode + + + scm:svn:http://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId} + scm:https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId} + http://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId} + + + + + 2.7.0 + distro + + 1.7 + 1.7 + ${project.build.directory}/${project.build.finalName} + 1.4.1 + 2.1.1 + + + + UTF-8 + UTF-8 + + + + + + org.gcube.distribution + maven-portal-bom + LATEST + pom + import + + + gwt-user + com.google.gwt + + + com.google.gwt + gwt-servlet + + + + + + + + + + + com.google.gwt + gwt-user + ${gwtVersion} + compile + + + + + + + + + + + com.github.gwtbootstrap + gwt-bootstrap + 2.3.2.0 + compile + + + + + + com.github.gwtmaterialdesign + gwt-material + ${gwt-material.version} + + + com.github.gwtmaterialdesign + gwt-material-themes + 1.4 + + + + + + + + + + + + + + + + + org.gcube.resources.discovery + ic-client + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.core + common-scope-maps + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + compile + + + + + + org.gcube.applicationsupportlayer + aslcore + [4.0.0-SNAPSHOT, 5.0.0-SNAPSHOT) + provided + + + + + org.gcube.common + home-library-model + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.common + home-library-jcr + [2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT) + provided + + + asm-debug-all + org.ow2.asm + + + + + org.gcube.common + home-library + + [2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT) + provided + + + asm-all + asm + + + + + + + + + + + + + org.slf4j + slf4j-api + compile + + + + org.slf4j + slf4j-log4j12 + compile + + + + + log4j + log4j + + provided + + + + junit + junit + 4.7 + test + + + + javax.validation + validation-api + 1.0.0.GA + test + + + javax.validation + validation-api + 1.0.0.GA + sources + test + + + + + + ${webappDirectory}/WEB-INF/classes + + + + + + org.codehaus.mojo + gwt-maven-plugin + ${gwtVersion} + + + + compile + + + + + + + WorkspaceExplorerApp.html + ${webappDirectory} + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + + compile + + exploded + + + + + ${webappDirectory} + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.2 + + + ${distroDirectory}/descriptor.xml + + + + + servicearchive + install + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.5 + + + copy-profile + install + + copy-resources + + + target + + + ${distroDirectory} + true + + profile.xml + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/WorkspaceExplorerApp.gwt.xml b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/WorkspaceExplorerApp.gwt.xml new file mode 100644 index 0000000..111f347 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/WorkspaceExplorerApp.gwt.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/ItemComparatorUtility.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/ItemComparatorUtility.java new file mode 100644 index 0000000..b746f68 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/ItemComparatorUtility.java @@ -0,0 +1,89 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import org.gcube.portlets.user.workspaceexplorerapp.client.grid.DisplayField; +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + + +/** + * The Class ItemComparator. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 21, 2016 + * @param the generic type + */ +public class ItemComparatorUtility { + + /** + * Instantiates a new item comparator utility. + * + * @param field the field + * @param ascending the ascending + * @param list the list + * @return + */ + public static ArrayList sortItems(DisplayField field, boolean ascending, List list) { + + if(DisplayField.NAME.equals(field)){ + Collections.sort(list, new NameCompare()); + if(ascending) + Collections.reverse(list); + }else if(DisplayField.OWNER.equals(field)){ + + } + + return new ArrayList(list); + } + + /** + * The Class NameCompare. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 21, 2016 + */ + public static class NameCompare implements Comparator { + + /** + * {@inheritDoc} + */ + @Override + public int compare(Item item1, Item item2) { + + //if one of the item is folder and the other one not, we move up the folder + boolean isItem1Folder = item1.isFolder(); + boolean isItem2Folder = item2.isFolder(); + + boolean isSpecialFolder1 = isSpecialFolder(item1); + boolean isSpecialFolder2 = isSpecialFolder(item2); + + //XOR + if (isSpecialFolder1 ^ isSpecialFolder2) return isSpecialFolder1 ? -1 : 1; + + //XOR + if (isItem1Folder ^ isItem2Folder) return isItem1Folder ? -1 : 1; + + //otherwise we compare the names + return String.CASE_INSENSITIVE_ORDER.compare(item1.getName(), item2.getName()); + } + + /** + * Checks if is special folder. + * + * @param item the item + * @return true, if is special folder + */ + private boolean isSpecialFolder(Item item) { +// return item.getName().equals(WorkspaceExplorerConstants.VRE_FOLDERS_LABEL) && item.getParent()!=null && item.getParent().isRoot(); + return item.getName().equals(WorkspaceExplorerAppConstants.VRE_FOLDERS_LABEL) && item.isSpecialFolder(); + } + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/NewBrowserWindow.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/NewBrowserWindow.java new file mode 100644 index 0000000..e74c2a4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/NewBrowserWindow.java @@ -0,0 +1,51 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client; + +import com.google.gwt.core.client.JavaScriptObject; + + +/** + * The Class NewBrowserWindow. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 23, 2016 + */ +public final class NewBrowserWindow extends JavaScriptObject { + // All types that extend JavaScriptObject must have a protected, + // no-args constructor. + /** + * Instantiates a new new browser window. + */ + protected NewBrowserWindow() { + } + + /** + * Open. + * + * @param url the url + * @param target the target + * @param options the options + * @return the new browser window + */ + public static native NewBrowserWindow open(String url, String target, + String options) /*-{ + return $wnd.open(url, target, options); + }-*/; + + /** + * Close. + */ + public native void close() /*-{ + this.close(); + }-*/; + + /** + * Sets the url. + * + * @param url the new url + */ + public native void setUrl(String url) /*-{ + if (this.location) { + this.location = url; + } + }-*/; +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/SortByContextMenu.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/SortByContextMenu.java new file mode 100644 index 0000000..956642d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/SortByContextMenu.java @@ -0,0 +1,58 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client; + +import gwt.material.design.client.ui.MaterialColumn; +import gwt.material.design.client.ui.MaterialLink; +import gwt.material.design.client.ui.MaterialRow; + +import java.util.List; + +import org.gcube.portlets.user.workspaceexplorerapp.client.event.OrderDataByEvent; + +import com.google.gwt.core.shared.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.user.client.ui.PopupPanel; + + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 21, 2016 + */ +public class SortByContextMenu extends PopupPanel{ + + /** + * @param handlerManager + * @param links + */ + public SortByContextMenu(final HandlerManager handlerManager, List links) { + setAutoHideEnabled(true); + getElement().addClassName("popup-order"); + MaterialRow mr = new MaterialRow(); + MaterialColumn mc = new MaterialColumn(); + mr.add(mc); + for (int i= 0; i lenght) { + if (left) + return "..." + value.substring(value.length() - lenght + 3); + else + return value.substring(0, lenght - 3) + "..."; + } + return value; + } + + + + /** + * Gets the image resource. + * + * @param item the item + * @return the image resource + */ + public static ImageResource getImageResource(Item item) + { + if(item==null || item.getType()==null) + return WorkspaceLightTreeResources.INSTANCE.unknownType(); + + switch (item.getType()) { +// case ROOT: return WorkspaceLightTreeResources.INSTANCE.root(); + case FOLDER: { + if (item.isSharedFolder()) return WorkspaceExplorerResources.INSTANCE.shared_folder(); + else return WorkspaceExplorerResources.INSTANCE.folder(); + } + case EXTERNAL_IMAGE: return WorkspaceLightTreeResources.INSTANCE.external_image(); + case EXTERNAL_FILE: return WorkspaceLightTreeResources.INSTANCE.external_file(); + case EXTERNAL_PDF_FILE: return WorkspaceLightTreeResources.INSTANCE.external_pdf(); + case EXTERNAL_URL: return WorkspaceLightTreeResources.INSTANCE.external_url(); + case REPORT_TEMPLATE: return WorkspaceLightTreeResources.INSTANCE.report_template(); + case REPORT: return WorkspaceLightTreeResources.INSTANCE.report(); + case QUERY: return WorkspaceLightTreeResources.INSTANCE.query(); + case DOCUMENT: return WorkspaceLightTreeResources.INSTANCE.document(); + case METADATA: return WorkspaceLightTreeResources.INSTANCE.metadata(); + case PDF_DOCUMENT: return WorkspaceLightTreeResources.INSTANCE.pdf_document(); + case IMAGE_DOCUMENT: return WorkspaceLightTreeResources.INSTANCE.image_document(); + case URL_DOCUMENT: return WorkspaceLightTreeResources.INSTANCE.url_document(); + case GCUBE_ITEM: return WorkspaceLightTreeResources.INSTANCE.gucbeItem(); + case UNKNOWN_TYPE: return WorkspaceLightTreeResources.INSTANCE.unknown(); + default: { + System.err.println("Unknown item type "+item.getType()); + return WorkspaceLightTreeResources.INSTANCE.unknownType(); + } + } + } + + /** + * Gets the formatted size. + * + * @param value the value + * @return the formatted size + */ + public static String getFormattedSize(long value){ + + if(value>0){ + double kb = value/1024; + if(kb<1) + kb=1; +// return numberFormatterKB.format(kb); + return kb+"KB"; + }else if(value==0){ + return "EMPTY"; + }else + return ""; + } + + /** + * Adjust size. + * + * @param el the el + * @param panel the panel + * @param offset the offset + */ + public static void adjustSize(Element el, SimplePanel panel, int offset){ + if(el!=null){ + int heigth = el.getClientHeight(); + GWT.log("getClientHeight adjustSize el: "+heigth); + heigth = heigth-offset>100?heigth-offset:0; + if(heigth>0){ + GWT.log("set new Explorer size: "+heigth); + panel.setHeight(heigth+"px"); + } + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerApp.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerApp.java new file mode 100644 index 0000000..7c673d6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerApp.java @@ -0,0 +1,98 @@ +/** + * + */ + +package org.gcube.portlets.user.workspaceexplorerapp.client; + +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.RootPanel; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Feb 19, 2016 + */ +public class WorkspaceExplorerApp implements EntryPoint { + + + private WorkspaceExplorerAppController appController; + + /** + * This is the entry point method. + */ + public void onModuleLoad() { + + + boolean jQueryLoaded = isjQueryLoaded(); +// GWT.log("Injected : "+Resources.RESOURCES.jquery().getText()); + GWT.log("jQueryLoaded: "+jQueryLoaded); + + /*if (!jQueryLoaded) { + ScriptInjector.fromString(Resources.RESOURCES.jquery().getText()) + .setWindow(ScriptInjector.TOP_WINDOW) + .inject(); + }*/ + + /*ScriptInjector.fromString(Resources.RESOURCES.jquery().getText()) + .setWindow(ScriptInjector.TOP_WINDOW) + .inject();*/ + + appController = new WorkspaceExplorerAppController(); + appController.go(RootPanel.get(WorkspaceExplorerAppConstants.APPLICATION_DIV)); + Window.addResizeHandler(new ResizeHandler() { + + @Override + public void onResize(ResizeEvent event) { + updateSize(); + } + }); + + WorkspaceExplorerAppMainPanel mainPanel = new WorkspaceExplorerAppMainPanel(appController.getMainPanel(), appController.getEventBus(), appController.getDisplayFields()); + RootPanel.get(WorkspaceExplorerAppConstants.APPLICATION_DIV).add(mainPanel); + +// WorkspaceExplorerFoooterPanel footerPanel = new WorkspaceExplorerFoooterPanel(); +// RootPanel.get("footer_we").add(footerPanel); + + updateSize(); + } + + /** + * Checks if is j query loaded. + * + * @return true, if is j query loaded + */ + private native boolean isjQueryLoaded() /*-{ + return (typeof $wnd['jQuery'] !== 'undefined'); + }-*/; + + /** + * Update window size + */ + public static void updateSize() { + + int headerH = DOM.getElementById("we_nav_bar").getClientHeight(); + GWT.log("headerH " + headerH); + int footerH = DOM.getElementById("footer_we").getClientHeight(); + GWT.log("footerH " + footerH); + int breadcrumbsH = DOM.getElementById("breadcrumbs_we").getClientHeight(); + GWT.log("breadcrumbs_we " + breadcrumbsH); + int windowHeight = Window.getClientHeight(); + GWT.log("rootHeight " + windowHeight); + int diff = windowHeight - (headerH+footerH+breadcrumbsH)-10; + int containerH = diff>0?diff:50; + DOM.getElementById(WorkspaceExplorerAppConstants.APPLICATION_DIV).getElementsByTagName("main").getItem(0).getStyle().setHeight(containerH, Unit.PX); +// DOM.getElementById(WorkspaceExplorerAppConstants.APPLICATION_DIV).getStyle().setHeight(containerH, Unit.PX); + GWT.log("containerH " + containerH); + + Element table = DOM.getElementById("data_grid_explorer"); + if(table!=null){ + int headerTableH = 0; + table.getStyle().setHeight(containerH-headerTableH, Unit.PX); + } + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppConstants.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppConstants.java new file mode 100644 index 0000000..a671391 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppConstants.java @@ -0,0 +1,41 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client; + +import org.gcube.portlets.user.workspaceexplorerapp.client.rpc.WorkspaceExplorerAppService; +import org.gcube.portlets.user.workspaceexplorerapp.client.rpc.WorkspaceExplorerAppServiceAsync; + +import com.google.gwt.core.client.GWT; + + + +/** + * The Class WorkspaceExplorerAppConstants. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 23, 2016 + */ +public class WorkspaceExplorerAppConstants { + public static final String SPECIAL_FOLDERS_NAME = "MySpecialFolders"; + + public static final String VRE_FOLDERS_LABEL = "My VRE Folders"; + + public static final String WORKSPACE_EXPLORER_CAPTION = "Workspace Explorer"; + + public static final String WORKSPACE_EXPLORER_SAVE_AS_CAPTION = "Workspace Explorer Save As..."; + + public static final String HOME_LABEL = "Home"; + + public static final String WORKSPACE_MY_SPECIAL_FOLDERS_PATH = "/Workspace/MySpecialFolders"; + + // DIALOGS + public static final String SAVE = "Save"; + public static final String AUTO = "auto"; + public static final String SELECT = "Select"; + public static final WorkspaceExplorerAppServiceAsync workspaceNavigatorService = GWT.create(WorkspaceExplorerAppService.class); + + public static final String APPLICATION_DIV = "workspaceEplorerApplicationDiv"; + public static final String VALIDATEITEM = "validateitem"; + public static final String IDS = "ids"; + public static final String IDS_SEPARATOR = ";"; + public static final String DOWNLOAD_WORKSPACE_SERVICE = GWT.getModuleBaseURL() + "DownloadServlet"; + public static final String REDIRECTONERROR = "redirectonerror"; +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppController.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppController.java new file mode 100644 index 0000000..93e7e3a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppController.java @@ -0,0 +1,140 @@ +/** + * + */ + +package org.gcube.portlets.user.workspaceexplorerapp.client; + +import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerSelectNotification.WorskpaceExplorerSelectNotificationListener; +import org.gcube.portlets.user.workspaceexplorerapp.client.grid.DisplayField; +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.dom.client.ContextMenuEvent; +import com.google.gwt.event.dom.client.ContextMenuHandler; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.RootPanel; + +/** + * The Class WorkspaceExplorerAppController. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * @Oct 8, 2014 + */ +public class WorkspaceExplorerAppController { + +// private VerticalPanel mainPanel = new VerticalPanel(); + + private WorkspaceExplorerAppPanel mainPanel; + private WorkspaceResourcesExplorerPanel wsResourcesExplorerPanel; + private final HandlerManager eventBus = new HandlerManager(null); + + /** + * Instantiates a new workspace explorer app controller. + */ + public WorkspaceExplorerAppController() { + } + + /** + * Go. + * + * @param rootPanel the root panel + */ + public void go(final RootPanel rootPanel) { + RootPanel.getBodyElement().getStyle().setPadding(0, Unit.PX); +// mainPanel.setWidth("100%"); + + try { + String folderId = Window.Location.getParameter("folderId"); + + //TODO CHECK FOLDER ID + if(folderId==null) + Window.alert("Folder Id not found, it is not possible to retrieve a folder without a valid id"); + + RootPanel.get().addDomHandler(new ContextMenuHandler() { + + @Override + public void onContextMenu(ContextMenuEvent event) { + event.preventDefault(); + event.stopPropagation(); + } + }, ContextMenuEvent.getType()); + + wsResourcesExplorerPanel = new WorkspaceResourcesExplorerPanel(eventBus, folderId, false); + WorskpaceExplorerSelectNotificationListener listener = new WorskpaceExplorerSelectNotificationListener() { + + @Override + public void onSelectedItem(Item item) { + + GWT.log("Listener Selected Item " + item); + } + + @Override + public void onFailed(Throwable throwable) { + + GWT.log("There are networks problem, please check your connection."); + } + + @Override + public void onAborted() { + + } + + @Override + public void onNotValidSelection() { + + } + }; + wsResourcesExplorerPanel.addWorkspaceExplorerSelectNotificationListener(listener); + + /*new com.google.gwt.user.client.Timer() { + + @Override + public void run() { + + //TODO //IS A TEST REMOVE + ArrayList tests = new ArrayList(); + for (int i = 0; i < 50; i++) { + tests.add(new Item(i+""+Random.nextInt(), "name"+i, false)); + } + wsResourcesExplorerPanel.getWsExplorer().updateExplorer(tests); + } + }.schedule(1000);*/ + + mainPanel = new WorkspaceExplorerAppPanel(wsResourcesExplorerPanel); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * Gets the main panel. + * + * @return the mainPanel + */ + public WorkspaceExplorerAppPanel getMainPanel() { + return mainPanel; + } + + + /** + * Gets the event bus. + * + * @return the event bus + */ + public HandlerManager getEventBus(){ + return eventBus; + } + + /** + * Gets the display fields. + * + * @return the display fields + */ + public DisplayField[] getDisplayFields(){ + return wsResourcesExplorerPanel.getDisplayFields(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppMainPanel.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppMainPanel.java new file mode 100644 index 0000000..bfd02d7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppMainPanel.java @@ -0,0 +1,157 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client; + +import gwt.material.design.client.constants.IconPosition; +import gwt.material.design.client.constants.IconType; +import gwt.material.design.client.ui.MaterialLink; +import gwt.material.design.client.ui.MaterialNavBar; +import gwt.material.design.client.ui.MaterialNavSection; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.user.workspaceexplorerapp.client.download.DownloadType; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.DownloadItemEvent; +import org.gcube.portlets.user.workspaceexplorerapp.client.grid.DisplayField; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.Widget; + + +/** + * The Class WorkspaceExplorerAppMainPanel. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 2, 2016 + */ +public class WorkspaceExplorerAppMainPanel extends Composite { + + private static WorkspaceExplorerAppMainPanelUiBinder uiBinder = + GWT.create(WorkspaceExplorerAppMainPanelUiBinder.class); + + /** + * The Interface WorkspaceExplorerAppMainPanelUiBinder. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 8, 2016 + */ + interface WorkspaceExplorerAppMainPanelUiBinder + extends UiBinder { + } + + @UiField + HTMLPanel explorer_main_container; + + @UiField + HTMLPanel we_html_base_panel; + + @UiField + MaterialNavBar we_nav_bar; + + @UiField + MaterialNavSection we_nav_right; + + @UiField + MaterialLink download_we; + + @UiField + MaterialLink show_we; + + @UiField + Image d4science_workspace_logo_180; + + private HandlerManager handlerManager; + + /** + * Because this class has a default constructor, it can + * be used as a binder template. In other words, it can be used in other + * *.ui.xml files as follows: + * + * Hello! + * + * Note that depending on the widget that is used, it may be necessary to + * implement HasHTML instead of HasText. + * + * @param workspaceExplorerAppPanel the workspace explorer app panel + * @param handlerManager the handler manager + */ + public WorkspaceExplorerAppMainPanel(WorkspaceExplorerAppPanel workspaceExplorerAppPanel, HandlerManager handlerManager, DisplayField[] displayFields) { + initWidget(uiBinder.createAndBindUi(this)); + this.handlerManager = handlerManager; + explorer_main_container.add(workspaceExplorerAppPanel); + we_nav_bar.getElement().setId("we_nav_bar"); + we_nav_bar.getElement().setAttribute("id", "we_nav_bar"); + + final MaterialLink order = new MaterialLink("Order by"); + order.setTitle("Order data for item selected"); + order.setActivates("order_list"); + order.setTextColor("white"); + order.setIconType(IconType.ARROW_DROP_DOWN); + order.setIconPosition(IconPosition.RIGHT); + + final List links = new ArrayList(displayFields.length); + for (final DisplayField field : displayFields) { + if(field.isSortable()){ + MaterialLink link = new MaterialLink(field.getLabel()); + link.addStyleName("under-line-onhover"); + links.add(link); + } + } + + final SortByContextMenu scm = new SortByContextMenu(this.handlerManager, links); + + order.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + GWT.log("clicked : "+event.getSource().toString()); + scm.showRelativeTo(order); + } + }); + + we_nav_right.add(order); + download_we.addClickHandler(new ClickHandler() { + + /* (non-Javadoc) + * @see com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event.dom.client.ClickEvent) + */ + @Override + public void onClick(ClickEvent event) { + WorkspaceExplorerAppMainPanel.this.handlerManager.fireEvent(new DownloadItemEvent(null, DownloadType.DOWNLOAD)); + } + }); + + show_we.addClickHandler(new ClickHandler() { + + /* (non-Javadoc) + * @see com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event.dom.client.ClickEvent) + */ + @Override + public void onClick(ClickEvent event) { + WorkspaceExplorerAppMainPanel.this.handlerManager.fireEvent(new DownloadItemEvent(null, DownloadType.OPEN)); + } + }); + + d4science_workspace_logo_180.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + + Window.open("https://www.d4science.org", "_blank", null); + } + }); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppMainPanel.ui.xml b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppMainPanel.ui.xml new file mode 100644 index 0000000..8fee8c6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppMainPanel.ui.xml @@ -0,0 +1,75 @@ + + + + .adminMainContent { + overflow: auto; + } + + /*.label { + margin-left: 210px; + font-family: sans-serif; + font-size: 16px; + text-align: left; + font-weight: bold; + }*/ + + .nav-right { + /*padding-left: 200px;*/ +/* font-size: 16px;*/ + /*text-align: right;*/ + /*width: 200px;*/ + } + + + .title-left { + /*font-family: sans-serif;*/ + font-size: 14px; + text-align: left; + font-weight: bold; + } + + .navigation_explorer { + padding-bottom: 50px; + padding-left: 5px; + padding-top: 10px; + } + + .navigation_explorer :HOVER { + cursor: pointer !important; + } + + .navigation_bar { + height: 100px; + } + + header, main, footer { + padding-left: 200px; + } + + + + + Workspace Explorer + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppPanel.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppPanel.java new file mode 100644 index 0000000..5cd85cf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerAppPanel.java @@ -0,0 +1,33 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client; + +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; + + +/** + * The Class SplitPanel. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 23, 2015 + */ +public class WorkspaceExplorerAppPanel extends SimplePanel{ + + + /** + * Instantiates a new workspace explorer app panel. + * + * @param splitterSize the splitter size + * @param navigation the navigation + * @param wsExplorer the ws explorer + */ + public WorkspaceExplorerAppPanel(Widget wsExplorerPanel) { + ensureDebugId("WorkspaceExplorerAppPanel"); + this.getElement().setId("WorkspaceExplorerAppPanel"); + this.getElement().setAttribute("id","WorkspaceExplorerAppPanel"); + setWidth("100%"); + add(wsExplorerPanel); + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerFoooterPanel.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerFoooterPanel.java new file mode 100644 index 0000000..072d34d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerFoooterPanel.java @@ -0,0 +1,51 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client; + +import gwt.material.design.client.ui.MaterialFooter; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; + + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 18, 2016 + */ +public class WorkspaceExplorerFoooterPanel extends Composite { + + private static WorkspaceExplorerFoooterPanelUiBinder uiBinder = + GWT.create(WorkspaceExplorerFoooterPanelUiBinder.class); + + interface WorkspaceExplorerFoooterPanelUiBinder + extends UiBinder { + } + + /** + * Because this class has a default constructor, it can + * be used as a binder template. In other words, it can be used in other + * *.ui.xml files as follows: + * + * Hello! + * + * Note that depending on the widget that is used, it may be necessary to + * implement HasHTML instead of HasText. + */ + public WorkspaceExplorerFoooterPanel() { + + initWidget(uiBinder.createAndBindUi(this)); + } + @UiField + MaterialFooter we_footer_bar; + + public WorkspaceExplorerFoooterPanel(String firstName) { + + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerFoooterPanel.ui.xml b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerFoooterPanel.ui.xml new file mode 100644 index 0000000..5cc0aea --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerFoooterPanel.ui.xml @@ -0,0 +1,14 @@ + + + + .we_footer { + height: 50px important! + } + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerSelectNotification.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerSelectNotification.java new file mode 100644 index 0000000..a539db1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceExplorerSelectNotification.java @@ -0,0 +1,94 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client; + +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + + +/** + * The Class WorskpaceExplorerNotification. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 29, 2015 + */ +public class WorkspaceExplorerSelectNotification { + + + + /** + * The listener interface for receiving worskpaceExplorerSelectNotification events. + * The class that is interested in processing a worskpaceExplorerSelectNotification + * event implements this interface, and the object created + * with that class is registered with a component using the + * component's addWorskpaceExplorerSelectNotificationListener method. When + * the worskpaceExplorerSelectNotification event occurs, that object's appropriate + * method is invoked. + * + * @see WorskpaceExplorerSelectNotificationEvent + */ + public interface WorskpaceExplorerSelectNotificationListener { + + /** + * On selected item. + * + * @param item the item + */ + void onSelectedItem(Item item); + + + /** + * On aborted. + */ + void onAborted(); + + + /** + * On failed. + * + * @param throwable the throwable + */ + void onFailed(Throwable throwable); + + + /** + * On not valid selection. + */ + void onNotValidSelection(); + } + + + + /** + * The listener interface for receiving hasWorskpaceExplorerSelectNotification events. + * The class that is interested in processing a hasWorskpaceExplorerSelectNotification + * event implements this interface, and the object created + * with that class is registered with a component using the + * component's addHasWorskpaceExplorerSelectNotificationListener method. When + * the hasWorskpaceExplorerSelectNotification event occurs, that object's appropriate + * method is invoked. + * + * @see HasWorskpaceExplorerSelectNotificationEvent + */ + public interface HasWorskpaceExplorerSelectNotificationListener { + + + /** + * Adds the workspace explorer select notification listener. + * + * @param handler the handler + */ + public void addWorkspaceExplorerSelectNotificationListener(WorskpaceExplorerSelectNotificationListener handler); + + + + /** + * Removes the workspace explorer select notification listener. + * + * @param handler the handler + */ + public void removeWorkspaceExplorerSelectNotificationListener(WorskpaceExplorerSelectNotificationListener handler); + + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceResourcesExplorerPanel.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceResourcesExplorerPanel.java new file mode 100644 index 0000000..f7d97cd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/WorkspaceResourcesExplorerPanel.java @@ -0,0 +1,510 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client; + +import gwt.material.design.client.ui.MaterialToast; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerSelectNotification.HasWorskpaceExplorerSelectNotificationListener; +import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerSelectNotification.WorskpaceExplorerSelectNotificationListener; +import org.gcube.portlets.user.workspaceexplorerapp.client.download.RequestBuilderWorkspaceValidateItem; +import org.gcube.portlets.user.workspaceexplorerapp.client.download.WindowOpenParameter; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.BreadcrumbClickEvent; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.BreadcrumbClickEventHandler; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.ClickItemEvent; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.ClickItemEventHandler; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.DownloadItemEvent; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.DownloadItemEventHandler; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.LoadFolderEvent; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.LoadFolderEventHandler; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.OrderDataByEvent; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.OrderDataByEventHandler; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.RightClickItemEvent; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.RightClickItemEventHandler; +import org.gcube.portlets.user.workspaceexplorerapp.client.grid.DisplayField; +import org.gcube.portlets.user.workspaceexplorerapp.client.view.Breadcrumbs; +import org.gcube.portlets.user.workspaceexplorerapp.client.view.PopupContextMenu; +import org.gcube.portlets.user.workspaceexplorerapp.client.view.WorkspaceExplorer; +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemType; + +import com.github.gwtbootstrap.client.ui.constants.AlertType; +import com.google.gwt.core.shared.GWT; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.http.client.RequestBuilder; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.DockPanel; +import com.google.gwt.user.client.ui.ScrollPanel; +import com.google.gwt.user.client.ui.VerticalPanel; + + +/** + * The Class WorkspaceResourcesExplorerPanel. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Dec 3, 2015 + */ +public class WorkspaceResourcesExplorerPanel extends DockPanel implements HasWorskpaceExplorerSelectNotificationListener{ + + public HandlerManager eventBus; + private Breadcrumbs breadcrumbs; + private boolean isSelect = false; + private String captionTxt; +// private WorkspaceExplorerController controller; + private List listeners = new ArrayList(); + private VerticalPanel mainVP = new VerticalPanel(); +// private HorizontalPanel footerHP = new HorizontalPanel(); + private WorkspaceExplorer wsExplorer; + private ScrollPanel centerScrollable = new ScrollPanel(); +// private ScrollPanel southPanel = new ScrollPanel(); + private String folderId; + private String folderName; + private DisplayField[] displayFields = new DisplayField[]{DisplayField.ICON, DisplayField.NAME, DisplayField.OWNER, DisplayField.CREATION_DATE}; + + /** + * Instantiates a new workspace folder explorer select panel. + * + * @param eventBus the event bus + * @param folderId the folder id like root folder to explore + * @param folderName the folder name + * @throws Exception the exception + */ + public WorkspaceResourcesExplorerPanel(HandlerManager eventBus, String folderId, String folderName) throws Exception { + initExplorer(eventBus, folderId, folderName, ItemType.values(), ItemType.values()); + } + + /** + * Inits the explorer. + * + * @param eventBus the event bus + * @param folderId the folder id + * @param folderName the folder name + * @param selectableTypes the selectable types + * @param showableTypes the showable types + * @throws Exception the exception + */ + private void initExplorer(HandlerManager eventBus, String folderId, String folderName, ItemType[] selectableTypes, ItemType[] showableTypes) throws Exception{ + this.folderId = folderId; + this.folderName = folderName; + this.eventBus = eventBus; + this.breadcrumbs = new Breadcrumbs(eventBus); + bindEvents(); + + wsExplorer = new WorkspaceExplorer(eventBus, showableTypes, selectableTypes, displayFields); + Item item = new Item(folderId, folderName, true); + if(folderId!=null && !folderId.isEmpty()) + wsExplorer.loadFolder(item); + initPanel(""); + } + + + /** + * @return the displayFields + */ + public DisplayField[] getDisplayFields() { + + return displayFields; + } + + /** + * Instantiates a new workspace explorer select panel. + * + * @param folderId the folder id + * @param showOnlyFolders the show only folders + * @throws Exception the exception + */ + public WorkspaceResourcesExplorerPanel(HandlerManager eventBus, String folderId, boolean showOnlyFolders) throws Exception { + + if(showOnlyFolders){ + ItemType[] itemsType = new ItemType[1]; + itemsType[0] = ItemType.FOLDER; + initExplorer(eventBus, folderId, "", itemsType, itemsType); + }else{ + initExplorer(eventBus, folderId, "", ItemType.values(), ItemType.values()); + } + } + + + /** + * Bind events. + */ + private void bindEvents(){ + + eventBus.addHandler(ClickItemEvent.TYPE, new ClickItemEventHandler() { + + @Override + public void onClick(final ClickItemEvent clickItemEvent) { + isSelect = false; + Set items = wsExplorer.getItemsSelected(); + List lstItems = toList(items); + + //Return if item is not selectable + if(!itemIsSelectable(lstItems.get(0))){ + notifyNotValidSelection(); + return; + } + + notifySelectedItem(lstItems.get(0)); + isSelect = true; + } + }); + + eventBus.addHandler(LoadFolderEvent.TYPE, new LoadFolderEventHandler() { + + @Override + public void onLoadFolder(LoadFolderEvent loadFolderEvent) { + + if(loadFolderEvent.getTargetFolder()==null) + return; + + Item item = loadFolderEvent.getTargetFolder(); + if(item.isFolder()){ + try { + wsExplorer.loadFolder(item); + loadParentBreadcrumbByItemId(item.getId(), true); +// clearMoreInfo(); + } catch (Exception e) { + GWT.log(e.getMessage()); + } + } + } + }); + + eventBus.addHandler(BreadcrumbClickEvent.TYPE, new BreadcrumbClickEventHandler() { + + @Override + public void onBreadcrumbClick(BreadcrumbClickEvent breadcrumbClickEvent) { + if(breadcrumbClickEvent.getTargetItem()!=null) + eventBus.fireEvent(new LoadFolderEvent(breadcrumbClickEvent.getTargetItem())); + } + }); + + eventBus.addHandler(OrderDataByEvent.TYPE, new OrderDataByEventHandler() { + + @Override + public void onOrderDataBy(OrderDataByEvent orderDataByEvent) { + + wsExplorer.getItTables().sortDataBy(orderDataByEvent.getLabel()); + + /*ArrayList items = ItemComparatorUtility.sortItems(DisplayField.NAME, true, wsExplorer.getItTables().getDataProvider().getList()); + wsExplorer.updateExplorer(items);*/ + } + }); + + + eventBus.addHandler(RightClickItemEvent.TYPE, new RightClickItemEventHandler() { + + @Override + public void onClick(RightClickItemEvent rightClickItemEvent) { + + if(rightClickItemEvent.getItem()!=null && rightClickItemEvent.getItem().getId()!=null){ + + PopupContextMenu popupCM = new PopupContextMenu(true, eventBus, rightClickItemEvent.getItem()); + popupCM.showPopup(rightClickItemEvent.getXPos(), Window.getScrollTop()+rightClickItemEvent.getYPos()); + + /*final PopupPanel contextMenu = new PopupPanel(true); + contextMenu.getElement().getStyle().setBackgroundColor("#F5F5F5"); + Navigation nav = new Navigation(eventBus, rightClickItemEvent.getItem()); + nav.addCommandOnDownloadClick(new Command() { + + @Override + public void execute() { + contextMenu.hide(); + } + }); + contextMenu.add(nav); + contextMenu.setPopupPosition(rightClickItemEvent.getXPos(), Window.getScrollTop()+rightClickItemEvent.getYPos()); + contextMenu.show();*/ + } + } + }); + + eventBus.addHandler(DownloadItemEvent.TYPE, new DownloadItemEventHandler() { + + @Override + public void onDownloadItem(DownloadItemEvent downloadItemEvent) { + GWT.log("Fired event DownloadItemEvent"); + String itemIds = ""; + if(downloadItemEvent.getItem()!=null) + itemIds = downloadItemEvent.getItem().getId()+WorkspaceExplorerAppConstants.IDS_SEPARATOR; + else{ + + List lstItems = toList(wsExplorer.getItemsSelected()); + for (Item item : lstItems) { + itemIds +=item.getId()+WorkspaceExplorerAppConstants.IDS_SEPARATOR; + } + } + GWT.log("itemIds: "+itemIds); + if(!itemIds.isEmpty()){ +// MaterialToast.fireToast("Download..."); + + switch (downloadItemEvent.getType()) { + case DOWNLOAD: + MaterialToast.fireToast("Download..."); + try { + new RequestBuilderWorkspaceValidateItem(RequestBuilder.GET,WorkspaceExplorerAppConstants.DOWNLOAD_WORKSPACE_SERVICE, WorkspaceExplorerAppConstants.IDS+"="+itemIds, "_self", downloadHandlerCallback); + } catch (Exception e) { + Window.alert("Sorry, an error occurred while contacting server, try again"); + } + break; + case PREVIEW: + break; + case OPEN: + MaterialToast.fireToast("Showing..."); + try { + new RequestBuilderWorkspaceValidateItem(RequestBuilder.GET, WorkspaceExplorerAppConstants.DOWNLOAD_WORKSPACE_SERVICE, WorkspaceExplorerAppConstants.IDS+"="+itemIds+"&viewContent=true", "_blank", downloadHandlerCallback); + + } catch (Exception e) { + Window.alert("Sorry, an error occurred while contacting server, try again"); + } + break; + default: + break; + } + + + /*final NewBrowserWindow newBW = NewBrowserWindow.open("", "_self", ""); + WorkspaceExplorerAppConstants.workspaceNavigatorService.getPublicLinkForItemId(itemId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Window.alert(caught.getMessage()); + } + + @Override + public void onSuccess(String url) { + + if(url!=null){ + newBW.setUrl(url); + }else + Window.alert("Sorry, the item selected is not available for download"); + + } + });*/ + } + } + }); + } + + + /** + * To list. + * + * @param items the items + * @return the list + */ + private List toList(Set items){ + if(items!=null && items.size()>0){ + List lstItems = new ArrayList (items.size()); + lstItems.addAll(items); + return lstItems; + } + return null; + } + + + /** + * Load parent breadcrumb by item id. + * + * @param itemIdentifier the item identifier + * @param includeItemAsParent the include item as parent + */ + private void loadParentBreadcrumbByItemId(final String itemIdentifier, boolean includeItemAsParent){ + + GWT.log("Reload Parent Breadcrumb: [Item id: "+itemIdentifier+"]"); + + WorkspaceExplorerAppConstants.workspaceNavigatorService.getBreadcrumbsByItemIdentifierToParentLimit(itemIdentifier, folderId, includeItemAsParent, new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + GWT.log(caught.getMessage()); + wsExplorer.setAlert(caught.getMessage(), AlertType.ERROR); + } + + @Override + public void onSuccess(List result) { + if(result!=null){ + breadcrumbs.setPath(result); +// clearMoreInfo(); + } + } + }); + } + + + /** + * Refresh root folder view. + */ + public void refreshRootFolderView(){ + Item item = new Item(folderId, folderName, true); + eventBus.fireEvent(new LoadFolderEvent(item)); + } + +// /** +// * Clear more info. +// */ +// private void clearMoreInfo(){ +// southPanel.clear(); +// } + + /** + * Inits the panel. + * + * @param captionTxt the caption txt is the tool-tip + */ + private void initPanel(String captionTxt) { + this.captionTxt = captionTxt; + this.getElement().setId("WorkspaceExplorerContainer"); + this.getElement().setAttribute("id", "WorkspaceExplorerContainer"); + this.getElement().addClassName("workspace-explorer-container"); + + if(this.captionTxt!=null && !this.captionTxt.isEmpty()) + setTitle(this.captionTxt); + + setWidth("100%"); + add(breadcrumbs, DockPanel.NORTH); + mainVP.add(wsExplorer.getPanel()); + centerScrollable.add(mainVP); + add(centerScrollable, DockPanel.CENTER); + } + + /** + * Notify selected item. + * + * @param selected the selected + */ + private void notifySelectedItem(Item selected){ + + for (WorskpaceExplorerSelectNotificationListener worskpaceExplorerNotificationListener : listeners) { + worskpaceExplorerNotificationListener.onSelectedItem(selected); + } + } + + /** + * Notify aborted. + */ + private void notifyAborted(){ + + for (WorskpaceExplorerSelectNotificationListener worskpaceExplorerNotificationListener : listeners) { + worskpaceExplorerNotificationListener.onAborted(); + } + } + + + /** + * Notify not valid selection. + */ + private void notifyNotValidSelection(){ + + for (WorskpaceExplorerSelectNotificationListener worskpaceExplorerNotificationListener : listeners) { + worskpaceExplorerNotificationListener.onNotValidSelection(); + } + } + + /** + * Notify failed. + * + * @param t the t + */ + @SuppressWarnings("unused") + private void notifyFailed(Throwable t){ + + for (WorskpaceExplorerSelectNotificationListener worskpaceExplorerNotificationListener : listeners) { + worskpaceExplorerNotificationListener.onFailed(t); + } + } + + /** + * Gets the caption txt. + * + * @return the captionTxt + */ + public String getCaptionTxt() { + return captionTxt; + } + + /** + * Checks if is valid hide. + * + * @return the isValidHide + */ + public boolean isValidHide() { + return isSelect; + } + + /* (non-Javadoc) + * @see org.gcube.portlets.widgets.wsexplorer.client.notification.WorskpaceExplorerNotification.HasWorskpaceExplorerNotificationListener#addWorkspaceExplorerNotificationListener(org.gcube.portlets.widgets.wsexplorer.client.notification.WorskpaceExplorerNotification.WorskpaceExplorerNotificationListener) + */ + @Override + public void addWorkspaceExplorerSelectNotificationListener(WorskpaceExplorerSelectNotificationListener handler) { + if(handler!=null) + listeners.add(handler); + } + + /* (non-Javadoc) + * @see org.gcube.portlets.widgets.wsexplorer.client.notification.WorskpaceExplorerNotification.HasWorskpaceExplorerNotificationListener#removeWorkspaceExplorerNotificationListener(org.gcube.portlets.widgets.wsexplorer.client.notification.WorskpaceExplorerNotification.WorskpaceExplorerNotificationListener) + */ + @Override + public void removeWorkspaceExplorerSelectNotificationListener(WorskpaceExplorerSelectNotificationListener handler) { + if(handler!=null){ + if(listeners.contains(handler)) + listeners.remove(handler); + } + } + + /** + * Item is selectable. + * + * @param item the item + * @return true, if successful + */ + public boolean itemIsSelectable(Item item){ + GWT.log("Selectable type: "+wsExplorer.getSelectableTypes()); + GWT.log("item: "+item); + if (item!=null){ + boolean selectable = wsExplorer.getSelectableTypes().contains(item.getType()); + return selectable?true:false; + } + return false; + } + + + /** + * @return the wsExplorer + */ + public WorkspaceExplorer getWsExplorer() { + return wsExplorer; + } + + /** + * Gets the event bus. + * + * @return the eventBus + */ + public HandlerManager getEventBus() { + + return eventBus; + } + + public AsyncCallback downloadHandlerCallback = new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + + } + + @Override + public void onSuccess(WindowOpenParameter windowOpenParam) { + String params = "?"+windowOpenParam.getParameters(); + if(params.length()>1) + params+="&"; + params+=WorkspaceExplorerAppConstants.REDIRECTONERROR+"="+windowOpenParam.isRedirectOnError(); + windowOpenParam.getBrowserWindow().setUrl(WorkspaceExplorerAppConstants.DOWNLOAD_WORKSPACE_SERVICE+params); + } + }; +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/download/DownloadType.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/download/DownloadType.java new file mode 100644 index 0000000..189203d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/download/DownloadType.java @@ -0,0 +1,18 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.download; + + +/** + * The Enum DownloadType. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 7, 2016 + */ +public enum DownloadType { + + PREVIEW, + OPEN, + DOWNLOAD; +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/download/RequestBuilderWorkspaceValidateItem.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/download/RequestBuilderWorkspaceValidateItem.java new file mode 100644 index 0000000..3a70979 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/download/RequestBuilderWorkspaceValidateItem.java @@ -0,0 +1,121 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.download; + +import org.gcube.portlets.user.workspaceexplorerapp.client.NewBrowserWindow; +import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerAppConstants; + +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.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * The Class RequestBuilderWorkspaceValidateItem. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * @Jun 24, 2013 + */ +public class RequestBuilderWorkspaceValidateItem { + + private AsyncCallback callback; + private String parameters; + + /** + * Instantiates a new request builder workspace validate item. + * + * @param method the method + * @param servletName the name of the servlet that must be called + * @param params param=value¶m1=value1&... + * @param targetWindow the target of the window (e.g. "_blank") + * @param callback the callback + * @throws Exception the exception + */ + public RequestBuilderWorkspaceValidateItem(RequestBuilder.Method method, String servletName, final String params, final String targetWindow, final AsyncCallback callback) throws Exception{ + + this.callback = callback; + + final NewBrowserWindow newBrowserWindow = NewBrowserWindow.open("", targetWindow, ""); + + this.parameters = params; + + if(servletName==null) + return; + + servletName = servletName.isEmpty()?"/":servletName; + + if(!servletName.contains("/")) + servletName+="/"+servletName; + + if(parameters==null) + parameters = WorkspaceExplorerAppConstants.VALIDATEITEM+"=true"; + else + parameters +="&"+WorkspaceExplorerAppConstants.VALIDATEITEM+"=true"; + + String urlRequest = servletName+"?"+parameters; + + GWT.log("request builder for: "+urlRequest); + + RequestBuilder requestBuilder = new RequestBuilder(method, urlRequest); + try { + + requestBuilder.sendRequest("", new RequestCallback() { + + @Override + public void onResponseReceived(Request request, Response response) { + + int status = response.getStatusCode(); + + if(!(status==200) && !(status==202)){ //NOT IS STATUS SC_ACCEPTED + +// if(status==401){ // SC_UNAUTHORIZED = 401; +// GWT.log("Session expired"); +// AppControllerExplorer.getEventBus().fireEvent(new SessionExpiredEvent()); +// return; +// } + newBrowserWindow.close(); + handleError("Sorry, an error occurred on retriving the file. "+response.getText()); //ERROR STATUS + + }else { //OK STATUS + + if(callback!=null){ + //PASSING PARAMS WITHOUT VALIDATION=TRUE + callback.onSuccess(new WindowOpenParameter(targetWindow, "", params, true, newBrowserWindow)); + } + } + } + + @Override + public void onError(Request request, Throwable exception) { + newBrowserWindow.close(); + +// System.out.println("exception message is "+exception.getMessage()); + handleError(exception.getMessage()); + } + }); + + } catch (RequestException e) { + newBrowserWindow.close(); + throw new Exception("Sorry, an error occurred while contacting server, try again"); + } + } + + /** + * Handle error. + * + * @param message the message + */ + public void handleError(String message){ + + if(callback!=null) + callback.onFailure(new Exception(message)); + else + Window.alert("Error: "+message); + + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/download/WindowOpenParameter.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/download/WindowOpenParameter.java new file mode 100644 index 0000000..754380a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/download/WindowOpenParameter.java @@ -0,0 +1,91 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.download; + +import org.gcube.portlets.user.workspaceexplorerapp.client.NewBrowserWindow; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * @Jun 25, 2013 + * + */ +public class WindowOpenParameter { + + private String option; + private String parameters; + private String itemName; + private boolean redirectOnError; + private NewBrowserWindow browserWindow; + + /** + * + */ + public WindowOpenParameter() { + } + + + /** + * + * @param target the target of the window (e.g. "_blank") + * @param itemName + * @param parameters param=value¶m1=value1&... + * @param redirectOnError if true execute a redirect on fake URL + * @param browserWindow an instance of NewBrowserWindow + */ + public WindowOpenParameter(String target, String itemName, String parameters, boolean redirectOnError, NewBrowserWindow browserWindow) { + super(); + this.option = target; + this.itemName = itemName; + this.parameters = parameters; + this.redirectOnError = redirectOnError; + this.browserWindow = browserWindow; + } + + + public String getParameters() { + return parameters; + } + + public void setParameters(String parameters) { + this.parameters = parameters; + } + + public String getOption() { + return option; + } + + public void setOption(String option) { + this.option = option; + } + + + public String getItemName() { + return itemName; + } + + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + + public boolean isRedirectOnError() { + return redirectOnError; + } + + + public void setRedirectOnError(boolean redirectOnError) { + this.redirectOnError = redirectOnError; + } + + + public NewBrowserWindow getBrowserWindow() { + return browserWindow; + } + + + public void setBrowserWindow(NewBrowserWindow browserWindow) { + this.browserWindow = browserWindow; + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/BreadcrumbClickEvent.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/BreadcrumbClickEvent.java new file mode 100644 index 0000000..b7ab6b6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/BreadcrumbClickEvent.java @@ -0,0 +1,61 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * The Class BreadcrumbClickEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Aug 3, 2015 + */ +public class BreadcrumbClickEvent extends GwtEvent { + public static Type TYPE = new Type(); + private Item targetItem; + + + /** + * Instantiates a new breadcrumb click event. + * + * @param target the target + */ + public BreadcrumbClickEvent(Item target) { + this.targetItem = target; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(BreadcrumbClickEventHandler handler) { + handler.onBreadcrumbClick(this); + } + + /** + * Gets the target item. + * + * @return the targetItem + */ + public Item getTargetItem() { + return targetItem; + } + + /** + * Sets the target item. + * + * @param targetItem the targetItem to set + */ + public void setTargetItem(Item targetItem) { + this.targetItem = targetItem; + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/BreadcrumbClickEventHandler.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/BreadcrumbClickEventHandler.java new file mode 100644 index 0000000..5b4f541 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/BreadcrumbClickEventHandler.java @@ -0,0 +1,20 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.EventHandler; + + +/** + * The Interface BreadcrumbClickEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Aug 3, 2015 + */ +public interface BreadcrumbClickEventHandler extends EventHandler { + + /** + * On breadcrumb click. + * + * @param breadcrumbClickEvent the breadcrumb click event + */ + void onBreadcrumbClick(BreadcrumbClickEvent breadcrumbClickEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/BreadcrumbInitEvent.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/BreadcrumbInitEvent.java new file mode 100644 index 0000000..5b54f90 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/BreadcrumbInitEvent.java @@ -0,0 +1,61 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * The Class BreadcrumbInitEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 2, 2016 + */ +public class BreadcrumbInitEvent extends GwtEvent { + public static Type TYPE = new Type(); + private Item targetItem; + + + /** + * Instantiates a new breadcrumb click event. + * + * @param target the target + */ + public BreadcrumbInitEvent(Item target) { + this.targetItem = target; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(BreadcrumbInitEventHandler handler) { + handler.onBreadcrumbInit(this); + } + + /** + * Gets the target item. + * + * @return the targetItem + */ + public Item getTargetItem() { + return targetItem; + } + + /** + * Sets the target item. + * + * @param targetItem the targetItem to set + */ + public void setTargetItem(Item targetItem) { + this.targetItem = targetItem; + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/BreadcrumbInitEventHandler.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/BreadcrumbInitEventHandler.java new file mode 100644 index 0000000..0c3edf9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/BreadcrumbInitEventHandler.java @@ -0,0 +1,20 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.EventHandler; + + +/** + * The Interface BreadcrumbInitEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 2, 2016 + */ +public interface BreadcrumbInitEventHandler extends EventHandler { + + /** + * On breadcrumb init. + * + * @param breadcrumbInitEvent the breadcrumb init event + */ + void onBreadcrumbInit(BreadcrumbInitEvent breadcrumbInitEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/ClickItemEvent.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/ClickItemEvent.java new file mode 100644 index 0000000..5c0cc4a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/ClickItemEvent.java @@ -0,0 +1,54 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import java.util.Set; + +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * The Class ClickItemEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jul 6, 2015 + */ +public class ClickItemEvent extends GwtEvent { + public static Type TYPE = new Type(); + private Set items; + + + /** + * Instantiates a new click item event. + * + * @param selectedObject the item + */ + public ClickItemEvent(Set selectedObject) { + this.items = selectedObject; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(ClickItemEventHandler handler) { + handler.onClick(this); + } + + /** + * Gets the items. + * + * @return the items + */ + public Set getItems() { + return items; + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/ClickItemEventHandler.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/ClickItemEventHandler.java new file mode 100644 index 0000000..46c5455 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/ClickItemEventHandler.java @@ -0,0 +1,20 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.EventHandler; + + +/** + * The Interface ClickItemEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jul 6, 2015 + */ +public interface ClickItemEventHandler extends EventHandler { + + /** + * On click. + * + * @param moreInfoShowEvent the more info show event + */ + void onClick(ClickItemEvent moreInfoShowEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/CreateFolderClickEvent.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/CreateFolderClickEvent.java new file mode 100644 index 0000000..1fe5e90 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/CreateFolderClickEvent.java @@ -0,0 +1,36 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * The Class CreateFolderClickEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 1, 2016 + */ +public class CreateFolderClickEvent extends GwtEvent { + public static Type TYPE = new Type(); + + /** + * Instantiates a new click item event. + */ + public CreateFolderClickEvent() { + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(CreateFolderClickEventHandler handler) { + handler.onClick(this); + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/CreateFolderClickEventHandler.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/CreateFolderClickEventHandler.java new file mode 100644 index 0000000..d7eeb4c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/CreateFolderClickEventHandler.java @@ -0,0 +1,20 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.EventHandler; + + +/** + * The Interface ClickItemEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jul 6, 2015 + */ +public interface CreateFolderClickEventHandler extends EventHandler { + + /** + * On click. + * + * @param createFolderClickEvent the more info show event + */ + void onClick(CreateFolderClickEvent createFolderClickEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/DownloadItemEvent.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/DownloadItemEvent.java new file mode 100644 index 0000000..9a63a03 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/DownloadItemEvent.java @@ -0,0 +1,63 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import org.gcube.portlets.user.workspaceexplorerapp.client.download.DownloadType; +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemInterface; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * The Class ClickItemEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jul 6, 2015 + */ +public class DownloadItemEvent extends GwtEvent { + public static Type TYPE = new Type(); + private ItemInterface item; + private DownloadType type; + + /** + * Instantiates a new click item event. + * + * @param itemDownload the item download + * @param type the type + */ + public DownloadItemEvent(ItemInterface itemDownload, DownloadType type) { + this.item = itemDownload; + this.type = type; + } + + /** + * @return the type + */ + public DownloadType getType() { + + return type; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(DownloadItemEventHandler handler) { + handler.onDownloadItem(this); + } + + /** + * Gets the item. + * + * @return the item + */ + public ItemInterface getItem() { + return item; + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/DownloadItemEventHandler.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/DownloadItemEventHandler.java new file mode 100644 index 0000000..d29a3db --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/DownloadItemEventHandler.java @@ -0,0 +1,19 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * The Interface DownloadItemEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 23, 2016 + */ +public interface DownloadItemEventHandler extends EventHandler { + + /** + * On download item. + * + * @param downloadItemEvent the download item event + */ + void onDownloadItem(DownloadItemEvent downloadItemEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadFolderEvent.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadFolderEvent.java new file mode 100644 index 0000000..361c05f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadFolderEvent.java @@ -0,0 +1,61 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + +import com.google.gwt.event.shared.GwtEvent; + + + +/** + * The Class LoadFolderEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 25, 2015 + */ +public class LoadFolderEvent extends GwtEvent { + public static Type TYPE = new Type(); + private Item item; + + /** + * Instantiates a new load folder event. + * + * @param selected the selected + */ + public LoadFolderEvent(Item selected) { + this.item = selected; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(LoadFolderEventHandler handler) { + handler.onLoadFolder(this); + } + + /** + * Gets the target folder. + * + * @return the target folder + */ + public Item getTargetFolder() { + return item; + } + + /** + * Sets the target folder. + * + * @param item the new target folder + */ + public void setTargetFolder(Item item) { + this.item = item; + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadFolderEventHandler.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadFolderEventHandler.java new file mode 100644 index 0000000..12120b0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadFolderEventHandler.java @@ -0,0 +1,16 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * @May 23, 2013 + * + */ +public interface LoadFolderEventHandler extends EventHandler { + /** + * @param accountingHistoryEvent + */ + void onLoadFolder(LoadFolderEvent loadFolderEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadMySpecialFolderEvent.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadMySpecialFolderEvent.java new file mode 100644 index 0000000..c50715a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadMySpecialFolderEvent.java @@ -0,0 +1,35 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * + */ +public class LoadMySpecialFolderEvent extends GwtEvent { + + public static Type TYPE = new Type(); + + /** + * Instantiates a new double click event. + * + * @param target the target + */ + public LoadMySpecialFolderEvent() { + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(LoadMySpecialFolderEventHandler handler) { + handler.onLoadMySpecialFolder(this); + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadMySpecialFolderEventHandler.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadMySpecialFolderEventHandler.java new file mode 100644 index 0000000..6a181e4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadMySpecialFolderEventHandler.java @@ -0,0 +1,21 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.EventHandler; + + + +/** + * The Interface LoadMySpecialFolderEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 25, 2015 + */ +public interface LoadMySpecialFolderEventHandler extends EventHandler { + + /** + * On load my special folder. + * + * @param loadMySpecialFolderEvent the load my special folder event + */ + void onLoadMySpecialFolder(LoadMySpecialFolderEvent loadMySpecialFolderEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadRootEvent.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadRootEvent.java new file mode 100644 index 0000000..7dc1962 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadRootEvent.java @@ -0,0 +1,33 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * The Class LoadRootEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 25, 2015 + */ +public class LoadRootEvent extends GwtEvent { + + public static Type TYPE = new Type(); + + public LoadRootEvent() { + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(LoadRootEventHandler handler) { + handler.onLoadRoot(this); + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadRootEventHandler.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadRootEventHandler.java new file mode 100644 index 0000000..b0338c9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/LoadRootEventHandler.java @@ -0,0 +1,20 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.EventHandler; + + +/** + * The Interface LoadRootEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 25, 2015 + */ +public interface LoadRootEventHandler extends EventHandler { + + /** + * On load root. + * + * @param loadRootEvent the load root event + */ + void onLoadRoot(LoadRootEvent loadRootEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/OrderDataByEvent.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/OrderDataByEvent.java new file mode 100644 index 0000000..baa14e3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/OrderDataByEvent.java @@ -0,0 +1,51 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.GwtEvent; + + + +/** + * The Class LoadFolderEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 25, 2015 + */ +public class OrderDataByEvent extends GwtEvent { + public static Type TYPE = new Type(); + private String label; + + /** + * Instantiates a new order data by event. + * + * @param label the label + */ + public OrderDataByEvent(String label) { + this.label = label; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(OrderDataByEventHandler handler) { + handler.onOrderDataBy(this); + } + + + /** + * @return the label + */ + public String getLabel() { + + return label; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/OrderDataByEventHandler.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/OrderDataByEventHandler.java new file mode 100644 index 0000000..2bf0e81 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/OrderDataByEventHandler.java @@ -0,0 +1,24 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.EventHandler; + + + +/** + * The Class OrderDataByEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 18, 2016 + */ +public interface OrderDataByEventHandler extends EventHandler { + + /** + * On load root. + * + * @param orderDataByEvent the label + */ + void onOrderDataBy(OrderDataByEvent orderDataByEvent); +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/RightClickItemEvent.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/RightClickItemEvent.java new file mode 100644 index 0000000..6450330 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/RightClickItemEvent.java @@ -0,0 +1,81 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * The Class RightClickItemEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 23, 2016 + */ +public class RightClickItemEvent extends GwtEvent { + public static Type TYPE = new Type(); + private Item item; + private int xPos; + private int yPos; + + + /** + * Instantiates a new click item event. + * @param yPos + * @param xPos + * + * @param item the item + */ + public RightClickItemEvent(int xPos, int yPos, Item item) { + this.xPos = xPos; + this.yPos = yPos; + this.item = item; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + /** + * Dispatch. + * + * @param handler the handler + */ + @Override + protected void dispatch(RightClickItemEventHandler handler) { + handler.onClick(this); + } + + /** + * Gets the item. + * + * @return the item + */ + public Item getItem() { + return item; + } + + /** + * @return the xPos + */ + public int getXPos() { + + return xPos; + } + + + /** + * Gets the y pos. + * + * @return the yPos + */ + public int getYPos() { + + return yPos; + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/RightClickItemEventHandler.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/RightClickItemEventHandler.java new file mode 100644 index 0000000..9febd22 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/RightClickItemEventHandler.java @@ -0,0 +1,21 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.EventHandler; + + +/** + * The Interface RightClickItemEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 23, 2016 + */ +public interface RightClickItemEventHandler extends EventHandler { + + + /** + * On click. + * + * @param rightClickItemEvent the right click item event + */ + void onClick(RightClickItemEvent rightClickItemEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/RootLoadedEvent.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/RootLoadedEvent.java new file mode 100644 index 0000000..611309c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/RootLoadedEvent.java @@ -0,0 +1,45 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * The Class LoadRootEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 25, 2015 + */ +public class RootLoadedEvent extends GwtEvent { + + public static Type TYPE = new Type(); + private Item root; + + public RootLoadedEvent(Item root) { + this.root = root; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(RootLoadedEventHandler handler) { + handler.onRootLoaded(this); + } + + /** + * @return the root + */ + public Item getRoot() { + return root; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/RootLoadedEventHandler.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/RootLoadedEventHandler.java new file mode 100644 index 0000000..3c62fdd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/event/RootLoadedEventHandler.java @@ -0,0 +1,23 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.event; + +import com.google.gwt.event.shared.EventHandler; + + + +/** + * The Interface RootLoadedEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Aug 3, 2015 + */ +public interface RootLoadedEventHandler extends EventHandler { + + + + /** + * On root loaded. + * + * @param rootLoadedEvent the root loaded event + */ + void onRootLoaded(RootLoadedEvent rootLoadedEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/AbstractItemsCellTable.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/AbstractItemsCellTable.java new file mode 100644 index 0000000..4c2b199 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/AbstractItemsCellTable.java @@ -0,0 +1,196 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.grid; + +import java.util.List; +import java.util.Set; + +import org.gcube.portlets.user.workspaceexplorerapp.client.event.ClickItemEvent; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.LoadFolderEvent; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.RightClickItemEvent; +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + +import com.github.gwtbootstrap.client.ui.Pagination; +import com.google.gwt.core.shared.GWT; +import com.google.gwt.dom.client.NativeEvent; +import com.google.gwt.event.dom.client.ContextMenuEvent; +import com.google.gwt.event.dom.client.ContextMenuHandler; +import com.google.gwt.event.dom.client.DoubleClickEvent; +import com.google.gwt.event.dom.client.DoubleClickHandler; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.user.cellview.client.DataGrid; +import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy; +import com.google.gwt.user.cellview.client.SimplePager; +import com.google.gwt.user.client.Event; +import com.google.gwt.view.client.CellPreviewEvent; +import com.google.gwt.view.client.ListDataProvider; +import com.google.gwt.view.client.MultiSelectionModel; +import com.google.gwt.view.client.SelectionChangeEvent; +import com.google.gwt.view.client.SelectionChangeEvent.Handler; + +/** + * The Class AbstractItemTable. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Feb 19, 2015 + */ +public abstract class AbstractItemsCellTable { + + protected DataGrid dataGrid; + protected ListDataProvider dataProvider = new ListDataProvider(); + protected Item itemContextMenu = null; + protected boolean showMoreInfo; + protected final MultiSelectionModel msm; + protected final HandlerManager eventBus; + + /** + * Inits the table. + * + * @param ItemTable + * the Item table + * @param pager + * the pager + * @param pagination + * the pagination + */ + public abstract void initTable(final SimplePager pager, final Pagination pagination); + + + /** + * Instantiates a new abstract items cell table. + * + * @param eventBus the event bus + * @param fireOnClick the fire on click + */ + public AbstractItemsCellTable(HandlerManager eventBus, boolean fireOnClick) { + this.eventBus = eventBus; + this.showMoreInfo = fireOnClick; + dataGrid = new DataGrid(1); + dataGrid.getElement().setId("data_grid_explorer"); + dataGrid.getElement().setAttribute("id", "data_grid_explorer"); + dataGrid.setWidth("100%"); + dataGrid.setHeight("100%"); + dataProvider.addDataDisplay(dataGrid); + dataGrid.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED); + + msm = new MultiSelectionModel(); + dataGrid.setSelectionModel(msm); + msm.addSelectionChangeHandler(new Handler() { + @Override + public void onSelectionChange(final SelectionChangeEvent event) + { + final Set selectedObject = msm.getSelectedSet(); + GWT.log("Clicked: "+selectedObject); +// dataGrid.getRowContainer().removeClassName("dataGridSelectedRow"); + if(selectedObject!=null && !selectedObject.isEmpty()){ +// GWT.log("Current Selected Row : "+ dataGrid.getKeyboardSelectedRow()); +// dataGrid.getRowElement(dataGrid.getKeyboardSelectedRow()).addClassName("dataGridSelectedRow"); +// selectedItem(selectedObject); + if(showMoreInfo) + AbstractItemsCellTable.this.eventBus.fireEvent(new ClickItemEvent(selectedObject)); + } + } + }); + + dataGrid.addDomHandler(new DoubleClickHandler() { + + @Override + public void onDoubleClick(final DoubleClickEvent event) { + Set selected = msm.getSelectedSet(); + GWT.log("Double Click: "+selected); + if (selected != null && !selected.isEmpty()) { + AbstractItemsCellTable.this.eventBus.fireEvent(new LoadFolderEvent(selected.iterator().next())); + } + } + }, + DoubleClickEvent.getType()); + + dataGrid.addDomHandler(new ContextMenuHandler() { + + @Override + public void onContextMenu(ContextMenuEvent event) { + event.preventDefault(); + event.stopPropagation(); + } + }, ContextMenuEvent.getType()); + + + dataGrid.addCellPreviewHandler(new CellPreviewEvent.Handler() { + + @Override + public void onCellPreview(CellPreviewEvent event) { +// GWT.log("CellPreview click"); + if (event.getNativeEvent().getButton() == NativeEvent.BUTTON_RIGHT && event.getNativeEvent().getType().equals("contextmenu")) { + event.getNativeEvent().preventDefault(); + event.getNativeEvent().stopPropagation(); +// int clickedRow = event.getIndex(); + Item item = event.getValue(); + GWT.log("Right click on "+ item); + AbstractItemsCellTable.this.eventBus.fireEvent(new RightClickItemEvent(event.getNativeEvent().getClientX(), event.getNativeEvent().getClientY(), item)); + event.setCanceled(true); + } + } + }); + + /*MenuBar options = new MenuBar(true); + ScheduledCommand openCommand = new ScheduledCommand() { + + @Override + public void execute() { + AbstractItemsCellTable.this.eventBus.fireEvent(new LoadFolderEvent(itemContextMenu)); + } + }; + + MenuItem openItem = new MenuItem("Open", openCommand); + options.addItem(openItem); + final DialogBox menuWrapper = new DialogBox(true); + menuWrapper.getElement().getStyle().setBorderStyle(BorderStyle.NONE); + menuWrapper.getElement().getStyle().setZIndex(10000); + menuWrapper.add(options);*/ + dataGrid.sinkEvents(Event.ONCONTEXTMENU); + } + + + /** + * Update items. + * + * @param items the items + * @param removeOldItems the remove old items + */ + public void updateItems(List items, boolean removeOldItems) { + + if(removeOldItems){ + dataProvider.getList().clear(); + msm.clear(); + } + + dataProvider.getList().addAll(items); + dataGrid.setPageSize(items.size()+1); + dataGrid.redraw(); + } + + /** + * Gets the cell tables. + * + * @return the cell tables + */ + public DataGrid getCellTable() { + return dataGrid; + } + + /** + * Gets the data provider. + * + * @return the data provider + */ + public ListDataProvider getDataProvider() { + return dataProvider; + } + + /** + * Sets the data provider. + * + * @param dataProvider + * the new data provider + */ + public void setDataProvider(ListDataProvider dataProvider) { + this.dataProvider = dataProvider; + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/DisplayField.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/DisplayField.java new file mode 100644 index 0000000..1391bc0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/DisplayField.java @@ -0,0 +1,84 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.grid; + + +/** + * The Enum DisplayField. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 18, 2016 + */ +public enum DisplayField { + + ICON("Icon", true, false), + NAME("Name", true, true), + OWNER("Owner", true, true), + CREATION_DATE("Creation Date", false, true); + + + private String label; + private boolean isSortable; + private boolean showIntable; + /** + * Instantiates a new display field. + * + * @param id the id + * @param isSortable the is sortable + */ + private DisplayField(String label, boolean showInTable, boolean isSortable) { + this.label = label; + this.isSortable = isSortable; + this.showIntable = showInTable; + } + + /** + * @return the label + */ + public String getLabel() { + + return label; + } + + /** + * @return the isSortable + */ + public boolean isSortable() { + + return isSortable; + } + + /** + * @return the showIntable + */ + public boolean isShowIntable() { + + return showIntable; + } + + /** + * @param label the label to set + */ + public void setLabel(String label) { + + this.label = label; + } + + /** + * @param isSortable the isSortable to set + */ + public void setSortable(boolean isSortable) { + + this.isSortable = isSortable; + } + + /** + * @param showIntable the showIntable to set + */ + public void setShowIntable(boolean showIntable) { + + this.showIntable = showIntable; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/ItemsTable.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/ItemsTable.java new file mode 100644 index 0000000..4881f20 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/ItemsTable.java @@ -0,0 +1,399 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.grid; + +import gwt.material.design.client.base.MaterialImageCell; +import gwt.material.design.client.constants.IconPosition; +import gwt.material.design.client.constants.IconType; +import gwt.material.design.client.constants.ImageType; +import gwt.material.design.client.ui.MaterialIcon; +import gwt.material.design.client.ui.MaterialImage; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.gcube.portlets.user.workspaceexplorerapp.client.Util; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.LoadFolderEvent; +import org.gcube.portlets.user.workspaceexplorerapp.client.view.PopupContextMenu; +import org.gcube.portlets.user.workspaceexplorerapp.client.view.SelectionItem; +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + +import com.github.gwtbootstrap.client.ui.Pagination; +import com.google.gwt.cell.client.ButtonCell; +import com.google.gwt.cell.client.Cell.Context; +import com.google.gwt.cell.client.DateCell; +import com.google.gwt.cell.client.SafeHtmlCell; +import com.google.gwt.core.shared.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.NativeEvent; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.google.gwt.user.cellview.client.Column; +import com.google.gwt.user.cellview.client.ColumnSortEvent; +import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; +import com.google.gwt.user.cellview.client.ColumnSortList.ColumnSortInfo; +import com.google.gwt.user.cellview.client.SimplePager; +import com.google.gwt.user.cellview.client.TextColumn; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.Label; +/** + * The Class PackagesTable. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 19, 2015 + */ +public class ItemsTable extends AbstractItemsCellTable implements SelectionItem{ + + private DateTimeFormat dateFormatter = DateTimeFormat.getFormat("dd MMM hh:mm aaa yyyy"); + + /** + * The Enum DISPLAY_FIELD. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 1, 2016 + */ +// public static enum DISPLAY_FIELD{ICON, NAME, OWNER}; + private List displayFields; + + private Map mapFieldToColumnIndex = new HashMap(); + + private Column dateColumn; + + /** + * Instantiates a new items table. + * + * @param eventBus the event bus + * @param showMoreInfo the show more info + * @param fields the fields + */ + public ItemsTable(HandlerManager eventBus, boolean showMoreInfo, DisplayField[] fields) { + super(eventBus, showMoreInfo); + setDisplayFields(fields); + initTable(null, null); + + } + + /* (non-Javadoc) + * @see org.gcube.portlets.widgets.wsexplorer.client.view.grid.AbstractItemsCellTable#updateItems(java.util.List, boolean) + */ + public void updateItems(List items, boolean removeOldItems) { + super.updateItems(items, removeOldItems); + } + + /** + * Adds the items. + * + * @param items the items + */ + public void addItems(List items) { + if(items!=null) + dataProvider.getList().addAll(items); + } + + /* (non-Javadoc) + * @see org.gcube.portlets.admin.gcubereleases.client.view.AbstractPackageTable#initTable(com.google.gwt.user.cellview.client.AbstractCellTable, com.google.gwt.user.cellview.client.SimplePager, com.github.gwtbootstrap.client.ui.Pagination) + */ + @Override + public void initTable(final SimplePager pager, final Pagination pagination) { + dataGrid.setEmptyTableWidget(new Label("No data.")); + + if(this.displayFields.contains(DisplayField.ICON)){ + + MaterialImageCell myIcon = new MaterialImageCell(){ + public Set getConsumedEvents() { + HashSet events = new HashSet(); + events.add("click"); + return events; + } + }; + + // IMAGE + Column icon = new Column(myIcon) { + @Override + public MaterialImage getValue(final Item object) { + MaterialImage img = new MaterialImage(); + img.setUrl(Util.getImageResource(object).getSafeUri().asString()); + img.setWidth("32px"); + img.setHeight("32px"); + img.setType(ImageType.DEFAULT); + + if(object.isFolder()){ + img.addStyleName("navigation-cursor"); + } + + return img; + } + + public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context, Element elem, Item object, NativeEvent event) { + super.onBrowserEvent(context, elem, object, event); + GWT.log("onBrowserEvent ON IMG "+event.getType()); + // Handle the click event. + if ("click".equals(event.getType())) { + if(object.isFolder()){ + GWT.log("clicked folder onBrowserEvent "+object); + eventBus.fireEvent(new LoadFolderEvent(object)); + } + } + }; + }; + + icon.setSortable(false); +// packageTable.addColumn(icon, ""); + dataGrid.addColumn(icon); + dataGrid.setColumnWidth(icon, "45px"); + } + + Column nameColumn; + if(this.displayFields.contains(DisplayField.NAME)){ + + final SafeHtmlCell progressCell = new SafeHtmlCell(); + + nameColumn = new Column(progressCell) { + + @Override + public SafeHtml getValue(Item object) { + SafeHtmlBuilder sb = new SafeHtmlBuilder(); + sb.appendHtmlConstant("
"); + sb.appendHtmlConstant(object.getName()); + String formatDate = dateFormatter.format(object.getCreationDate()); + String tooltipDate = "Created: "+formatDate; + sb.appendHtmlConstant("
"); + sb.appendHtmlConstant(formatDate); + sb.appendHtmlConstant("
"); + return sb.toSafeHtml(); + } + }; + + nameColumn.setSortable(true); + ListHandler nameColumnHandler = new ListHandler(dataProvider.getList()); + nameColumnHandler.setComparator(nameColumn, new Comparator() { + @Override + public int compare(Item o1, Item o2) { + + if(o1==null) + return 1; + else if(o2==null) + return -1; + + //XOR + if (o1.isSpecialFolder() ^ o2.isSpecialFolder()) return o1.isSpecialFolder() ? -1 : 1; + if (o1.isFolder() ^ o2.isFolder()) return o1.isFolder() ? -1 : 1; + + return String.CASE_INSENSITIVE_ORDER.compare(o1.getName(), o2.getName()); + } + }); + + dataGrid.addColumnSortHandler(nameColumnHandler); + dataGrid.addColumn(nameColumn); + mapFieldToColumnIndex.put(DisplayField.NAME.getLabel(), dataGrid.getColumnIndex(nameColumn)); + dataGrid.getColumnSortList().push(nameColumn); + } + + if(this.displayFields.contains(DisplayField.OWNER)){ + + TextColumn owner = new TextColumn() { + @Override + public String getValue(Item object) { + return object.getOwner() != null ? object.getOwner() : ""; + } + }; + + owner.setSortable(true); + ListHandler ownerColumnHandler = new ListHandler(dataProvider.getList()); + ownerColumnHandler.setComparator(owner, new Comparator() { + @Override + public int compare(Item o1, Item o2) { + + if(o1==null) + return 1; + else if (o2==null) + return -1; + + return o1.getOwner().compareTo(o2.getOwner()); + } + }); + + dataGrid.addColumnSortHandler(ownerColumnHandler); + dataGrid.addColumn(owner); + mapFieldToColumnIndex.put(DisplayField.OWNER.getLabel(), dataGrid.getColumnIndex(owner)); + } + + + if(this.displayFields.contains(DisplayField.CREATION_DATE)){ + + DateCell dateCell = new DateCell(); + dateColumn = new Column(dateCell) { + @Override + public Date getValue(Item object) { + return object.getCreationDate(); + } + }; + + dateColumn.setSortable(true); + ListHandler dateColumnHandler = new ListHandler(dataProvider.getList()); + dateColumnHandler.setComparator(dateColumn, new Comparator() { + @Override + public int compare(Item o1, Item o2) { + return o1.getCreationDate().compareTo(o2.getCreationDate()); + } + }); + + dataGrid.addColumnSortHandler(dateColumnHandler); +// dataGrid.addColumn(dateColumn); +// mapFieldToColumnIndex.put(DisplayField.CREATION_DATE.getLabel(), dataGrid.getColumnIndex(dateColumn)); + } + + + Column moreColumn = new Column(new MaterialIconCell()){ + + @Override + public MaterialIcon getValue(final Item object) { + MaterialIcon button = new MaterialIcon(); + button.setIconColor("black"); + button.setWidth("15px"); +// button.setWaves(WavesType.DEFAULT); + button.setIconPosition(IconPosition.RIGHT); + button.getElement().getStyle().setMarginRight(17.0,Unit.PX); + button.setIconType(IconType.MORE_VERT); + return button; + } + + /* (non-Javadoc) + * @see com.google.gwt.user.cellview.client.Column#onBrowserEvent(com.google.gwt.cell.client.Cell.Context, com.google.gwt.dom.client.Element, java.lang.Object, com.google.gwt.dom.client.NativeEvent) + */ + @Override + public void onBrowserEvent(Context context, Element elem, Item object, NativeEvent event) { + + + // Handle the click event. + if ("click".equals(event.getType())) { + //skip right click + if (event.getButton() == NativeEvent.BUTTON_RIGHT) { + return; + } + PopupContextMenu popupCM = new PopupContextMenu(true, eventBus, object); + popupCM.showPopup(event.getClientX()-100, Window.getScrollTop()+event.getClientY()); + } + } + + }; + moreColumn.setSortable(false); +// packageTable.addColumn(moreColumn, ""); + dataGrid.addColumn(moreColumn); + dataGrid.setColumnWidth(moreColumn, "50px"); + } + + /** + * Sets the display fields. + * + * @param fields the new display fields + */ + public void setDisplayFields(DisplayField[] fields) { + this.displayFields = fields!=null && fields.length>0?Arrays.asList(fields):Arrays.asList(DisplayField.values()); + } + + /** + * Gets the display fields. + * + * @return the displayFields + */ + public List getDisplayFields() { + return displayFields; + } + + /** + * The Class ButtonImageCell. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 1, 2016 + */ + public class ButtonImageCell extends ButtonCell{ + + /* (non-Javadoc) + * @see com.google.gwt.cell.client.AbstractSafeHtmlCell#render(com.google.gwt.cell.client.Cell.Context, java.lang.Object, com.google.gwt.safehtml.shared.SafeHtmlBuilder) + */ + @Override + public void render(com.google.gwt.cell.client.Cell.Context context, + String value, SafeHtmlBuilder sb) { + SafeHtml html = SafeHtmlUtils.fromTrustedString(new Image(value).toString()); + sb.append(html); + } + } + + /* (non-Javadoc) + * @see org.gcube.portlets.widgets.wsexplorer.client.notification.SelectionItemHandler#getSelectionItem() + */ + @Override + public Set getSelectedItems() { + Set items = msm.getSelectedSet(); + + if(items==null || items.isEmpty()) + return null; + + return items; + } + + /** + * @param label + */ + public void sortDataBy(String label) { + GWT.log("sort by "+label); + boolean isAscending = true; + if(this.dataGrid.getColumnSortList().size()>0) + isAscending = this.dataGrid.getColumnSortList().get(0).isAscending(); + + boolean removeDateColumn = false; + if(label.compareTo(DisplayField.CREATION_DATE.getLabel())==0){ + dataGrid.addColumn(dateColumn); + mapFieldToColumnIndex.put(DisplayField.CREATION_DATE.getLabel(), dataGrid.getColumnIndex(dateColumn)); + removeDateColumn = true; + } + + int colIndex = mapFieldToColumnIndex.get(label); + + GWT.log("colIndex " + colIndex); + GWT.log("isAscending " + isAscending); + if(colIndex>-1){ + Column column = this.dataGrid.getColumn(colIndex); + if (column != null && column.isSortable()) { + this.dataGrid.getColumnSortList().clear(); + setSortedColumn(column, !isAscending); + ColumnSortEvent.fire(dataGrid, dataGrid.getColumnSortList()); + + if(removeDateColumn) + dataGrid.removeColumn(colIndex); + } + } + } + + /** + * Displays the appropriate sorted icon in the header of the column for the given index. + * + * @param columnIndex + * of the column to mark as sorted + * @param ascending + * true for ascending icon, false for descending icon + */ + public void setSortedColumn(Column column, boolean ascending) { + + if (column != null && column.isSortable()) { + ColumnSortInfo info = this.dataGrid.getColumnSortList().push(column); + GWT.log("ColumnSortInfo is anscending "+info.isAscending()); + if (info.isAscending() != ascending) { + this.dataGrid.getColumnSortList().push(column); + } + } + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/MaterialIconCell.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/MaterialIconCell.java new file mode 100644 index 0000000..c9c61f6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/MaterialIconCell.java @@ -0,0 +1,61 @@ +/** + * + */ + +package org.gcube.portlets.user.workspaceexplorerapp.client.grid; + +import gwt.material.design.client.ui.MaterialIcon; + +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.cell.client.ValueUpdater; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.NativeEvent; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Mar 8, 2016 + */ +public class MaterialIconCell extends AbstractCell { + + /** + * + */ + public MaterialIconCell() { + + /* + * Sink the click and keydown events. We handle click events in this + * class. AbstractCell will handle the keydown event and call + * onEnterKeyDown() if the user presses the enter key while the cell is + * selected. + */ + super("click", "keydown"); + } + + @Override + public void render( + com.google.gwt.cell.client.Cell.Context context, MaterialIcon value, + SafeHtmlBuilder sb) { + + if(value==null) + return; + + sb.appendHtmlConstant(value.getElement().getString()); + } + + /** + * Called when an event occurs in a rendered instance of this Cell. The + * parent element refers to the element that contains the rendered cell, NOT + * to the outermost element that the Cell rendered. + */ + + /* (non-Javadoc) + * @see com.google.gwt.cell.client.AbstractCell#onBrowserEvent(com.google.gwt.cell.client.Cell.Context, com.google.gwt.dom.client.Element, java.lang.Object, com.google.gwt.dom.client.NativeEvent, com.google.gwt.cell.client.ValueUpdater) + */ + @Override + public void onBrowserEvent( + com.google.gwt.cell.client.Cell.Context context, Element parent, + MaterialIcon value, NativeEvent event, + ValueUpdater valueUpdater) { + super.onBrowserEvent(context, parent, value, event, valueUpdater); + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/MenuMoreOptionsOnItem.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/MenuMoreOptionsOnItem.java new file mode 100644 index 0000000..356525a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/MenuMoreOptionsOnItem.java @@ -0,0 +1,93 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.grid; + +import gwt.material.design.client.ui.MaterialLink; + +import org.gcube.portlets.user.workspaceexplorerapp.client.download.DownloadType; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.DownloadItemEvent; +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemInterface; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; + + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 8, 2016 + */ +public class MenuMoreOptionsOnItem extends Composite { + + private static MenuMoreOptionsOnItemUiBinder uiBinder = + GWT.create(MenuMoreOptionsOnItemUiBinder.class); + + interface MenuMoreOptionsOnItemUiBinder + extends UiBinder { + } + + @UiField + MaterialLink open; + + @UiField + MaterialLink download; + + private HandlerManager eventBus; + + private ItemInterface itemToDownload; + + private Command commandOnClick; + + public MenuMoreOptionsOnItem(HandlerManager eventBus) { + initWidget(uiBinder.createAndBindUi(this)); + + this.eventBus = eventBus; + download.addClickHandler(new ClickHandler() { + + /* (non-Javadoc) + * @see com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event.dom.client.ClickEvent) + */ + @Override + public void onClick(ClickEvent event) { + + MenuMoreOptionsOnItem.this.eventBus.fireEvent(new DownloadItemEvent(itemToDownload, DownloadType.DOWNLOAD)); + GWT.log("commandOnClick " + commandOnClick); + if(commandOnClick!=null) + commandOnClick.execute(); + } + }); + + open.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + + MenuMoreOptionsOnItem.this.eventBus.fireEvent(new DownloadItemEvent(itemToDownload, DownloadType.OPEN)); + GWT.log("commandOnClick " + commandOnClick); + if(commandOnClick!=null) + commandOnClick.execute(); + } + }); + + } + + + /** + * Inits the on item. + * + * @param itemToDownload the item to download + * @param commandOnClick the command on click + */ + public void initOnItem(ItemInterface itemToDownload, Command commandOnClick){ + this.itemToDownload = itemToDownload; + this.commandOnClick = commandOnClick; + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/MenuMoreOptionsOnItem.ui.xml b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/MenuMoreOptionsOnItem.ui.xml new file mode 100644 index 0000000..16374ed --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/grid/MenuMoreOptionsOnItem.ui.xml @@ -0,0 +1,19 @@ + + + + .onHoverUnderline :HOVER{ + text-decoration: underline; + } + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerAppCss.css b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerAppCss.css new file mode 100644 index 0000000..1dad65c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerAppCss.css @@ -0,0 +1,7 @@ +/* @url */ +@url invalidNameUrl invalidName; + +.nameError{ + background:#fff invalidNameUrl repeat-x bottom; + border: 1px solid #dd7870; +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerAppCss.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerAppCss.java new file mode 100644 index 0000000..97bcf0e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerAppCss.java @@ -0,0 +1,23 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.resources; + +import com.google.gwt.resources.client.CssResource; + +/** + * The Interface WorkspaceLightTreeCss. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jul 8, 2015 + */ +public interface WorkspaceExplorerAppCss extends CssResource { + + /** + * Name error. + * + * @return the string + */ + public String nameError(); + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerResources.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerResources.java new file mode 100644 index 0000000..ce1207b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceExplorerResources.java @@ -0,0 +1,36 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.resources; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.ImageResource; + +/** + * The Interface WorkspaceLightTreeResources. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jul 8, 2015 + */ +public interface WorkspaceExplorerResources extends ClientBundle { + + public static final WorkspaceExplorerResources INSTANCE = GWT.create(WorkspaceExplorerResources.class); + + /** + * Root. + * + * @return the image resource + */ + @Source("_32/folder.png") + ImageResource folder(); + + /** + * Folder. + * + * @return the image resource + */ + @Source("_32/groups_folder.png") + ImageResource shared_folder(); + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceLightTreeResources.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceLightTreeResources.java new file mode 100644 index 0000000..7006fbf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/WorkspaceLightTreeResources.java @@ -0,0 +1,245 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.resources; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.DataResource; +import com.google.gwt.resources.client.ImageResource; + +/** + * The Interface WorkspaceLightTreeResources. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jul 8, 2015 + */ +public interface WorkspaceLightTreeResources extends ClientBundle { + + public static final WorkspaceLightTreeResources INSTANCE = GWT.create(WorkspaceLightTreeResources.class); + + /** + * Root. + * + * @return the image resource + */ + @Source("root.png") + ImageResource root(); + + /** + * Folder. + * + * @return the image resource + */ + @Source("folder.png") + ImageResource folder(); + + /** + * Shared folder. + * + * @return the image resource + */ + @Source("shared_folder.png") + ImageResource sharedFolder(); + + /** + * External_image. + * + * @return the image resource + */ + @Source("external_image.gif") + ImageResource external_image(); + + /** + * External_pdf. + * + * @return the image resource + */ + @Source("external_pdf.gif") + ImageResource external_pdf(); + + /** + * External_file. + * + * @return the image resource + */ + @Source("external_file.png") + ImageResource external_file(); + + /** + * External_resource_link. + * + * @return the image resource + */ + @Source("external_resource_link.png") + ImageResource external_resource_link(); + + /** + * External_url. + * + * @return the image resource + */ + @Source("external_url.png") + ImageResource external_url(); + + /** + * Report_template. + * + * @return the image resource + */ + @Source("report_template.png") + ImageResource report_template(); + + /** + * Report. + * + * @return the image resource + */ + @Source("report.png") + ImageResource report(); + + /** + * Query. + * + * @return the image resource + */ + @Source("query.png") + ImageResource query(); + + /** + * Document. + * + * @return the image resource + */ + @Source("document.png") + ImageResource document(); + + /** + * Metadata. + * + * @return the image resource + */ + @Source("metadata.png") + ImageResource metadata(); + + /** + * Pdf_document. + * + * @return the image resource + */ + @Source("pdf_document.png") + ImageResource pdf_document(); + + /** + * Image_document. + * + * @return the image resource + */ + @Source("image_document.png") + ImageResource image_document(); + + /** + * Url_document. + * + * @return the image resource + */ + @Source("url_document.png") + ImageResource url_document(); + + /** + * Timeseries. + * + * @return the image resource + */ + @Source("timeseries.png") + ImageResource timeseries(); + + /** + * Aquamaps. + * + * @return the image resource + */ + @Source("aquamaps.png") + ImageResource aquamaps(); + + /** + * Workflow_report. + * + * @return the image resource + */ + @Source("workflow_report.png") + ImageResource workflow_report(); + + /** + * Workflow_template. + * + * @return the image resource + */ + @Source("workflow_template.png") + ImageResource workflow_template(); + + /** + * Unknown type. + * + * @return the image resource + */ + @Source("noimage.png") + ImageResource unknownType(); + + /** + * Loading. + * + * @return the image resource + */ + @Source("ajax-loader.gif") + ImageResource loading(); + + /** + * Gucbe item. + * + * @return the image resource + */ + @Source("gcubeItem.jpeg") + ImageResource gucbeItem(); + + + /** + * Unknown. + * + * @return the image resource + */ + @Source("icon-unknown.gif") + ImageResource unknown(); + + /** + * Invalid name. + * + * @return the data resource + */ + @Source("invalid_name.gif") + DataResource invalidName(); + + /** + * Css. + * + * @return the workspace light tree css + */ + @Source("WorkspaceExplorerAppCss.css") + WorkspaceExplorerAppCss css(); + + /** + * Error. + * + * @return the image resource + */ + @Source("error.png") + ImageResource error(); + + /** + * Refresh. + * + * @return the image resource + */ + @Source("refresh.png") + ImageResource refresh(); +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/_32/folder.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/_32/folder.png new file mode 100644 index 0000000..a0057c2 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/_32/folder.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/_32/groups_folder.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/_32/groups_folder.png new file mode 100644 index 0000000..061968d Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/_32/groups_folder.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/ajax-loader.gif b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/ajax-loader.gif new file mode 100644 index 0000000..d0bce15 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/ajax-loader.gif differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/aquamaps.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/aquamaps.png new file mode 100644 index 0000000..25a4da6 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/aquamaps.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/document.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/document.png new file mode 100644 index 0000000..8b8b1ca Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/document.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/error.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/error.png new file mode 100644 index 0000000..628cf2d Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/error.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_file.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_file.png new file mode 100644 index 0000000..1dee9e3 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_file.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_image.gif b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_image.gif new file mode 100644 index 0000000..e2dba91 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_image.gif differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_pdf.gif b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_pdf.gif new file mode 100644 index 0000000..598fbed Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_pdf.gif differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_resource_link.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_resource_link.png new file mode 100644 index 0000000..6224d01 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_resource_link.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_url.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_url.png new file mode 100644 index 0000000..25eacb7 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/external_url.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/folder.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/folder.png new file mode 100644 index 0000000..784e8fa Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/folder.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/gcubeItem.jpeg b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/gcubeItem.jpeg new file mode 100644 index 0000000..bd354b0 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/gcubeItem.jpeg differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/icon-unknown.gif b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/icon-unknown.gif new file mode 100644 index 0000000..d23ff27 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/icon-unknown.gif differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/image_document.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/image_document.png new file mode 100644 index 0000000..134b669 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/image_document.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/invalid_name.gif b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/invalid_name.gif new file mode 100644 index 0000000..fb7e0f3 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/invalid_name.gif differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/metadata.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/metadata.png new file mode 100644 index 0000000..0c76bd1 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/metadata.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/WorkspaceExplorerAppResources.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/WorkspaceExplorerAppResources.java new file mode 100644 index 0000000..67dd8de --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/WorkspaceExplorerAppResources.java @@ -0,0 +1,52 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.resources.newres; + +import com.github.gwtbootstrap.client.ui.constants.BaseIconType; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class WorkspaceExplorerAppResources { + + public static final WorkspaceExplorerIcons ICONS = GWT.create(WorkspaceExplorerIcons.class); + /** Inject the icon's css once at first usage */ + static { + WorkspaceExplorerIcons icons = GWT.create(WorkspaceExplorerIcons.class); + icons.css().ensureInjected(); + } + + public static AbstractImagePrototype getIconCancel() { + + return AbstractImagePrototype.create(ICONS.cancel()); + } + + public static AbstractImagePrototype getIconLoading() { + + return AbstractImagePrototype.create(ICONS.loading()); + } + + public static AbstractImagePrototype getIconInfo() { + + return AbstractImagePrototype.create(ICONS.info()); + } + + /** My custom base icon collection */ + public enum CustomIconType implements BaseIconType { + + home, // Our runtime access + vre_folder, + new_folder; + + private static final String PREFIX = "myBaseIcon_"; + private String className; + + private CustomIconType() { + this.className = this.name().toLowerCase(); + } + @Override public String get() { + return PREFIX + className; + } + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/WorkspaceExplorerIcons.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/WorkspaceExplorerIcons.java new file mode 100644 index 0000000..34faf81 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/WorkspaceExplorerIcons.java @@ -0,0 +1,41 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.resources.newres; + +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; + +public interface WorkspaceExplorerIcons extends ClientBundle { + + /** Get access to the css resource during gwt compilation */ + @Source("baseIcons.css") + CssResource css(); + + @Source("cancel.png") + ImageResource cancel(); + + /** + * @return + */ + @Source("loading.gif") + ImageResource loading(); + + /** + * Our sample image icon. Makes the image resource for the gwt-compiler's + * css composer accessible + */ + @Source("loading.gif") + ImageResource logo(); + + @Source("vre_folder.png") + ImageResource vre_folder(); + + @Source("new_folder.png") + ImageResource new_folder(); + + @Source("home.png") + ImageResource home(); + + @Source("info-icon.png") + ImageResource info(); +} + diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/baseIcons.css b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/baseIcons.css new file mode 100644 index 0000000..c21077a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/baseIcons.css @@ -0,0 +1,32 @@ +/* Prevent our icons from css obfuscation */ +@external .myBaseIcon_*; /* Do some css stuff */ +.myBaseIcon_home:hover { + /* opacity: 0.5; */ + +} + +/* Our sample icon */ +@sprite .myBaseIcon_home { + gwt-image: "home"; + display: inline-block; + vertical-align: middle; + margin-bottom: 3px; + margin-right: 2px; +} + +/* Our sample icon */ +@sprite .myBaseIcon_vre_folder { + gwt-image: "vre_folder"; + display: inline-block; + vertical-align: middle; + margin-bottom: 3px; + margin-right: 2px; +} + +@sprite .myBaseIcon_new_folder { + gwt-image: "new_folder"; + display: inline-block; + vertical-align: middle; + margin-bottom: 3px; + margin-right: 2px; +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/cancel.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/cancel.png new file mode 100644 index 0000000..9aa895b Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/cancel.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/folder.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/folder.png new file mode 100644 index 0000000..db75e8d Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/folder.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/home.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/home.png new file mode 100644 index 0000000..d19e34d Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/home.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/info-icon.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/info-icon.png new file mode 100644 index 0000000..ad1e096 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/info-icon.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/info.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/info.png new file mode 100644 index 0000000..145ed1d Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/info.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/loading.gif b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/loading.gif new file mode 100644 index 0000000..e147426 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/loading.gif differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/new_folder.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/new_folder.png new file mode 100644 index 0000000..8727007 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/new_folder.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/vre_folder.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/vre_folder.png new file mode 100644 index 0000000..68ae4d3 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/newres/vre_folder.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/noimage.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/noimage.png new file mode 100644 index 0000000..d125de3 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/noimage.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/pdf_document.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/pdf_document.png new file mode 100644 index 0000000..8f8095e Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/pdf_document.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/query.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/query.png new file mode 100644 index 0000000..d9eefc2 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/query.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/refresh.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/refresh.png new file mode 100644 index 0000000..6d68b75 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/refresh.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/report.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/report.png new file mode 100644 index 0000000..779ad58 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/report.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/report_template.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/report_template.png new file mode 100644 index 0000000..b4aaad9 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/report_template.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/root.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/root.png new file mode 100644 index 0000000..fed6221 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/root.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/shared_folder.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/shared_folder.png new file mode 100644 index 0000000..2cd2841 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/shared_folder.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/timeseries.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/timeseries.png new file mode 100644 index 0000000..abcd936 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/timeseries.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/url_document.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/url_document.png new file mode 100644 index 0000000..bf7bd1c Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/url_document.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/workflow_report.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/workflow_report.png new file mode 100644 index 0000000..f35a979 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/workflow_report.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/workflow_template.png b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/workflow_template.png new file mode 100644 index 0000000..c32d25c Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/resources/workflow_template.png differ diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/rpc/WorkspaceExplorerAppService.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/rpc/WorkspaceExplorerAppService.java new file mode 100644 index 0000000..69c5eb4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/rpc/WorkspaceExplorerAppService.java @@ -0,0 +1,150 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.rpc; + +import java.util.List; + +import org.gcube.portlets.user.workspaceexplorerapp.shared.FilterCriteria; +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemCategory; +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemType; +import org.gcube.portlets.user.workspaceexplorerapp.shared.WorkspaceNavigatorServiceException; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +/** + * The client side stub for the RPC service. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jul 10, 2015 + */ +@RemoteServiceRelativePath("WorkspaceExplorerAppService") +public interface WorkspaceExplorerAppService extends RemoteService { + + /** + * Gets the breadcrumbs by item identifier. + * + * @param itemIdentifier the item identifier + * @param includeItemAsParent the include item as parent + * @return the breadcrumbs by item identifier + * @throws Exception the exception + */ + List getBreadcrumbsByItemIdentifier(String itemIdentifier, + boolean includeItemAsParent) throws Exception; + + /** + * Check name. + * + * @param name the name + * @return true, if successful + * @throws WorkspaceNavigatorServiceException the workspace navigator service exception + */ + boolean checkName(String name) throws WorkspaceNavigatorServiceException; + + Item getFolder( + Item folder, List showableTypes, boolean purgeEmpyFolders, + FilterCriteria filterCriteria) throws WorkspaceNavigatorServiceException; + + /** + * Gets the root. + * + * @param showableTypes the showable types + * @param purgeEmpyFolders the purge empy folders + * @param filterCriteria the filter criteria + * @return the root + * @throws WorkspaceNavigatorServiceException the workspace navigator service exception + */ + Item getRoot(List showableTypes, boolean purgeEmpyFolders, + FilterCriteria filterCriteria) + throws WorkspaceNavigatorServiceException; + + /** + * Gets the my special folder. + * + * @param showableTypes the showable types + * @param purgeEmpyFolders the purge empy folders + * @param filterCriteria the filter criteria + * @return the my special folder + * @throws WorkspaceNavigatorServiceException the workspace navigator service exception + */ + Item getMySpecialFolder(List showableTypes, + boolean purgeEmpyFolders, FilterCriteria filterCriteria) + throws WorkspaceNavigatorServiceException; + + /** + * Gets the item by category. + * + * @param category the category + * @return the item by category + * @throws WorkspaceNavigatorServiceException the workspace navigator service exception + */ + Item getItemByCategory(ItemCategory category)throws WorkspaceNavigatorServiceException; + + /** + * Gets the size by item id. + * + * @param itemId the item id + * @return the size by item id + * @throws Exception the exception + */ + Long getSizeByItemId(String itemId) throws Exception; + + /** + * Gets the mime type. + * + * @param itemId the item id + * @return the mime type + * @throws Exception the exception + */ + String getMimeType(String itemId) throws Exception; + + /** + * Gets the user acl for folder id. + * + * @param folderId the folder id + * @return the user acl for folder id + * @throws Exception the exception + */ + String getUserACLForFolderId(String folderId) throws Exception; + + + /** + * Gets the readable size by item id. + * + * @param id the id + * @return the readable size by item id + * @throws Exception the exception + */ + String getReadableSizeByItemId(String id) throws Exception; + + /** + * @param itemIdentifier + * @param parentLimit + * @param includeItemAsParent + * @return + * @throws Exception + */ + List getBreadcrumbsByItemIdentifierToParentLimit( + String itemIdentifier, String parentLimit, + boolean includeItemAsParent) throws Exception; + + /** + * @param nameFolder + * @param description + * @param parentId + * @param showableTypes + * @param filterCriteria + * @return + * @throws Exception + */ + Item createFolder( + String nameFolder, String description, String parentId) + throws Exception; + + /** + * @param itemId + * @return + * @throws Exception + */ + String getPublicLinkForItemId(String itemId) + throws Exception; +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/rpc/WorkspaceExplorerAppServiceAsync.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/rpc/WorkspaceExplorerAppServiceAsync.java new file mode 100644 index 0000000..a9a10de --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/rpc/WorkspaceExplorerAppServiceAsync.java @@ -0,0 +1,169 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.rpc; + +import java.util.List; + +import org.gcube.portlets.user.workspaceexplorerapp.shared.FilterCriteria; +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemCategory; +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemType; + +import com.google.gwt.user.client.rpc.AsyncCallback; + + +/** + * The Interface WorkspaceExplorerServiceAsync. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 24, 2015 + */ +public interface WorkspaceExplorerAppServiceAsync { + + /** + * Gets the root. + * + * @param showableTypes + * the showable types + * @param purgeEmpyFolders + * the purge empy folders + * @param filterCriteria + * the filter criteria + * @param callback + * the callback + * @return the root + */ + public void getRoot(List showableTypes, boolean purgeEmpyFolders, + FilterCriteria filterCriteria, AsyncCallback callback); + + /** + * Check name. + * + * @param name + * the name + * @param callback + * the callback + */ + public void checkName(String name, AsyncCallback callback); + + + /** + * Gets the folder. + * + * @param folder the folder + * @param showableTypes the showable types + * @param purgeEmpyFolders the purge empy folders + * @param filterCriteria the filter criteria + * @param callback the callback + * @return the folder + */ + public void getFolder(Item folder, List showableTypes, + boolean purgeEmpyFolders, FilterCriteria filterCriteria, + AsyncCallback callback); + + + /** + * Gets the breadcrumbs by item identifier. + * + * @param itemIdentifier the item identifier + * @param includeItemAsParent the include item as parent + * @param asyncCallback the async callback + * @return the breadcrumbs by item identifier + */ + public void getBreadcrumbsByItemIdentifier(String itemIdentifier, + boolean includeItemAsParent, AsyncCallback> asyncCallback); + + /** + * Gets the my special folder. + * + * @param showableTypes the showable types + * @param purgeEmpyFolders the purge empy folders + * @param filterCriteria the filter criteria + * @param asyncCallback the async callback + * @return the my special folder + */ + public void getMySpecialFolder(List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria, AsyncCallback asyncCallback); + + /** + * Gets the item by category. + * + * @param category the category + * @param asyncCallback the async callback + * @return the item by category + */ + public void getItemByCategory(ItemCategory category, AsyncCallback asyncCallback); + + /** + * Gets the size by item id. + * + * @param id the id + * @param asyncCallback the async callback + * @return the size by item id + */ + public void getSizeByItemId(String id, AsyncCallback asyncCallback); + + + /** + * Gets the readable size by item id. + * + * @param id the id + * @param asyncCallback the async callback + * @return the readable size by item id + */ + public void getReadableSizeByItemId(String id, AsyncCallback asyncCallback); + + /** + * Gets the mime type. + * + * @param id the id + * @param asyncCallback the async callback + * @return the mime type + */ + public void getMimeType(String id, AsyncCallback asyncCallback); + + /** + * Gets the user acl for folder id. + * + * @param id the id + * @param asyncCallback the async callback + * @return the user acl for folder id + */ + public void getUserACLForFolderId(String id, + AsyncCallback asyncCallback); + + /** + * Gets the breadcrumbs by item identifier to parent limit. + * + * @param itemIdentifier the item identifier + * @param parentLimit the parent limit + * @param includeItemAsParent the include item as parent + * @param callback the callback + * @return the breadcrumbs by item identifier to parent limit + */ + void getBreadcrumbsByItemIdentifierToParentLimit(String itemIdentifier, + String parentLimit, boolean includeItemAsParent, + AsyncCallback> callback); + + /** + * Creates the folder. + * + * @param nameFolder the name folder + * @param description the description + * @param parentId the parent id + * @param callback the callback + */ + void createFolder( + String nameFolder, String description, String parentId, + AsyncCallback callback); + + /** + * Gets the public link for item id. + * + * @param itemId the item id + * @param callback the callback + * @return the public link for item id + */ + void getPublicLinkForItemId(String itemId, AsyncCallback callback); + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/Breadcrumbs.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/Breadcrumbs.java new file mode 100644 index 0000000..5519abc --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/Breadcrumbs.java @@ -0,0 +1,171 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.view; + +import java.util.LinkedHashMap; +import java.util.List; + +import org.gcube.portlets.user.workspaceexplorerapp.client.event.BreadcrumbClickEvent; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.BreadcrumbInitEvent; +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + +import com.github.gwtbootstrap.client.ui.NavLink; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; + +/** + * The Class Breadcrumbs. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Jun 23, 2015 + */ +public class Breadcrumbs extends Composite { + + public static final String DIVIDER = "/"; + private LinkedHashMap hashListItems = new LinkedHashMap();// Ordered-HashMap + private Item lastParent; + private static BreadcrumbsUiBinder uiBinder = GWT.create(BreadcrumbsUiBinder.class); + + @UiField + com.github.gwtbootstrap.client.ui.Breadcrumbs breadcrumbs; + + private HandlerManager eventBus; + + /** + * The Interface BreadcrumbsUiBinder. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Jun 23, + * 2015 + */ + interface BreadcrumbsUiBinder extends UiBinder { + } + + /** + * Instantiates a new breadcrumbs. + */ + public Breadcrumbs(HandlerManager eventBus) { + initWidget(uiBinder.createAndBindUi(this)); + this.getElement().setId("breadcrumbs_we"); + this.getElement().setAttribute("id", "breadcrumbs_we"); + this.setStyleName("breadcrumbs-we"); + this.eventBus = eventBus; + breadcrumbs.setDivider(DIVIDER); +// init(); + // initBreadcrumb(true); + + } + + /** + * Sets the path. + * + * @param parents + * the new path + */ + public void setPath(List parents) { + resetBreadcrumbs(); + if (parents != null && parents.size() > 0) { + for (Item parent : parents) { + GWT.log("parent is: "+parent); + addNavigationLink(parent); + hashListItems.put(parent.getId(), parent); + } + lastParent = parents.get(parents.size() - 1); + } + } + + /** + * Checks if is root or special folder. + * + * @param item the item + * @return true, if is root or special folder + */ + private boolean isRootOrSpecialFolder(Item item){ + GWT.log(item.getName() +" is root "+(item.getParent()==null)); + GWT.log(item.getName() +" is special folder "+item.isSpecialFolder()); + return item.getParent()==null || item.isSpecialFolder(); + } + + /** + * Reset breadcrumbs. + */ + private void resetBreadcrumbs() { + breadcrumbs.clear(); + hashListItems.clear(); + } + + // @UiHandler("add") + + /** + * Adds the navigation link. + * + * @param parent the parent + */ + private void addNavigationLink(Item parent) { + if(parent==null) + return; + + final NavLink navLink = new NavLink(parent.getName()); + navLink.setName(parent.getId()); + breadcrumbs.add(navLink); + navLink.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + + Item target = hashListItems.get(navLink.getName()); +// WorkspaceExplorerController.eventBus.fireEvent(new LoadFolderEvent(target)); + eventBus.fireEvent(new BreadcrumbClickEvent(target)); + } + }); + } + + /** + * Breadcrumb is empty. + * + * @return true, if successful + */ + public boolean breadcrumbIsEmpty() { + + if (hashListItems.size() == 0) + return true; + + return false; + } + + /** + * Gets the last parent. + * + * @return the last parent + */ + public Item getLastParent() { + return lastParent; + } + + + /** + * Inits the. + * + * @param item the item + */ + public void init(Item item) { + resetBreadcrumbs(); + addNavigationLink(item); + hashListItems.put(item.getId(), item); + lastParent = item; + eventBus.fireEvent(new BreadcrumbInitEvent(item)); + } + + + /** + * Clear. + */ + public void clear() { + resetBreadcrumbs(); + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/Breadcrumbs.ui.xml b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/Breadcrumbs.ui.xml new file mode 100644 index 0000000..b86cb48 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/Breadcrumbs.ui.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/PopupContextMenu.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/PopupContextMenu.java new file mode 100644 index 0000000..db52470 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/PopupContextMenu.java @@ -0,0 +1,63 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.view; + +import org.gcube.portlets.user.workspaceexplorerapp.client.grid.MenuMoreOptionsOnItem; +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemInterface; + +import com.google.gwt.core.shared.GWT; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.ui.PopupPanel; + + +/** + * The Class PopupContextMenu. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 11, 2016 + */ +public class PopupContextMenu extends PopupPanel{ + + + private MenuMoreOptionsOnItem menuOpts; + + /** + * Instantiates a new popup context menu. + * + * @param autohide the autohide + * @param eventBus the event bus + * @param itemToDownload the item to download + */ + public PopupContextMenu(boolean autohide, HandlerManager eventBus, ItemInterface itemToDownload) { + super(autohide); + GWT.log("PopupContextMenu opened"); + menuOpts = new MenuMoreOptionsOnItem(eventBus); + setWidth("100px"); + addStyleName("context-menu-we"); + + Command cmd = new Command() { + + @Override + public void execute() { + hide(); + } + }; + + menuOpts.initOnItem(itemToDownload, cmd); + add(menuOpts); + } + + /** + * Show popup at x,y position + * + * @param x the x + * @param y the y + */ + public void showPopup(int x, int y){ + + setPopupPosition(x, y); + show(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/SelectableTypes.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/SelectableTypes.java new file mode 100644 index 0000000..b95fd12 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/SelectableTypes.java @@ -0,0 +1,34 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.view; + +import java.util.List; + +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemType; + +/** + * The Interface SelectableTypes. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 29, 2015 + */ +public interface SelectableTypes { + + + /** + * Sets the selectable types. + * + * @param selectableTypes the new selectable types + */ + public void setSelectableTypes(ItemType ... selectableTypes); + + + /** + * Gets the selectable types. + * + * @return the selectable types + */ + public List getSelectableTypes(); + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/SelectionItem.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/SelectionItem.java new file mode 100644 index 0000000..acfb70c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/SelectionItem.java @@ -0,0 +1,26 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.view; + +import java.util.Set; + +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + +/** + * The Interface SelectionItem. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 29, 2015 + */ +public interface SelectionItem { + + + /** + * Gets the selected items. + * + * @return the selected items + */ + Set getSelectedItems(); + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/ShowableTypes.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/ShowableTypes.java new file mode 100644 index 0000000..0b49da2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/ShowableTypes.java @@ -0,0 +1,33 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.client.view; + +import java.util.List; + +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemType; + + +/** + * The Interface ShowableTypes. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 29, 2015 + */ +public interface ShowableTypes { + + + /** + * Gets the showable types. + * + * @return the showable types + */ + public List getShowableTypes(); + + /** + * Sets the showable types. + * + * @param showableTypes the new showable types + */ + public void setShowableTypes(ItemType ... showableTypes); +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/WorkspaceExplorer.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/WorkspaceExplorer.java new file mode 100644 index 0000000..b311c33 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/client/view/WorkspaceExplorer.java @@ -0,0 +1,361 @@ +package org.gcube.portlets.user.workspaceexplorerapp.client.view; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +import org.gcube.portlets.user.workspaceexplorerapp.client.Util; +import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerApp; +import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerAppConstants; +import org.gcube.portlets.user.workspaceexplorerapp.client.event.RootLoadedEvent; +import org.gcube.portlets.user.workspaceexplorerapp.client.grid.DisplayField; +import org.gcube.portlets.user.workspaceexplorerapp.client.grid.ItemsTable; +import org.gcube.portlets.user.workspaceexplorerapp.client.resources.newres.WorkspaceExplorerAppResources; +import org.gcube.portlets.user.workspaceexplorerapp.shared.FilterCriteria; +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemType; + +import com.github.gwtbootstrap.client.ui.Alert; +import com.github.gwtbootstrap.client.ui.constants.AlertType; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.ScrollPanel; + + +/** + * The Class WorkspaceExplorer. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Aug 4, 2015 + */ +public class WorkspaceExplorer implements ShowableTypes, SelectableTypes{ + + + protected static final HorizontalPanel LOADING_PANEL = new HorizontalPanel(); + protected static final Image LOADING_IMAGE = WorkspaceExplorerAppResources.getIconLoading().createImage(); + + static { + LOADING_PANEL.setWidth("95%"); + LOADING_PANEL.getElement().getStyle().setPadding(5.0, Unit.PX); +// LOADING_PANEL.setSpacing(3); + LOADING_PANEL.add(LOADING_IMAGE); + HTML loading = new HTML("Loading..."); + loading.getElement().getStyle().setPaddingLeft(5.0, Unit.PX); + LOADING_PANEL.add(loading); + } + + protected Alert alert = new Alert(); + protected List selectableTypes = new ArrayList(); + protected List showableTypes = new ArrayList(); + protected FilterCriteria filterCriteria = null; + protected boolean showEmptyFolders = true; + protected ScrollPanel explorerPanel; + private ItemsTable itTables; + private DisplayField[] displayFields; + private HandlerManager eventBus; + + + /** + * Instantiates a new workspace explorer. + * + * @param eventBus the event bus + * @param showableTypes the showable types + * @param selectableTypes the selectable types + * @param fields the fields + */ + public WorkspaceExplorer(HandlerManager eventBus, ItemType[] showableTypes, ItemType[] selectableTypes, DisplayField...fields) { + this.eventBus = eventBus; + setShowableTypes(showableTypes); + setSelectableTypes(selectableTypes); + itTables = new ItemsTable(eventBus, true, fields); + explorerPanel = new ScrollPanel(); + explorerPanel.getElement().setId("explorer_panel_we"); + explorerPanel.getElement().setPropertyString("id", "explorer_panel_we"); + } + + + /** + * Instantiates a new workspace explorer. + * + * @param eventBus the event bus + * @param filterCriteria the filter criteria + * @param showableTypes the showable types + * @param selectableTypes the selectable types + * @param fields the fields + */ + public WorkspaceExplorer(HandlerManager eventBus, FilterCriteria filterCriteria, ItemType[] showableTypes, ItemType[] selectableTypes, DisplayField...fields) { + this(eventBus, showableTypes, selectableTypes, fields); + this.filterCriteria = filterCriteria; + } + + /** + * Sets the alert. + * + * @param html the html + * @param type the type + */ + public void setAlert(String html, AlertType type){ + explorerPanel.clear(); + alert.setHTML(html); + alert.setType(type); + alert.setClose(false); + explorerPanel.add(alert); + } + + /** + * Set the panel in loading mode. + */ + protected void setLoading() { + explorerPanel.clear(); + explorerPanel.add(LOADING_PANEL); + } + + /** + * Load the Workspace Tree. + */ + public void loadRoot() { + GWT.log("loading tree data"); + setLoading(); + + // we make a copy of showable types + List showableTypesParam = new ArrayList(showableTypes); + + // we get sure that folders are displayed + for (ItemType folder : Util.FOLDERS) { + if (!showableTypesParam.contains(folder)) + showableTypesParam.add(folder); + } + + boolean purgeEmpyFolders = !showEmptyFolders; + + GWT.log("loading workspace tree from server"); + + WorkspaceExplorerAppConstants.workspaceNavigatorService.getRoot(showableTypesParam, purgeEmpyFolders, filterCriteria, new AsyncCallback() { + + public void onFailure(Throwable caught) { + Window.alert(caught.getMessage()); + setAlert(caught.getMessage(), AlertType.ERROR); + GWT.log("Error loading workspace tree from server",caught); + } + + public void onSuccess(Item item) { + eventBus.fireEvent(new RootLoadedEvent(item)); + updateExplorer(item.getChildren()); + } + + }); + } + + /** + * Load folder. + * + * @param item the item + * @throws Exception the exception + */ + public void loadFolder(final Item item) throws Exception { + GWT.log("loading folder data"); + setLoading(); + + if(!item.isFolder()) + throw new Exception("Item is not a folder"); + + if(item.getId()==null || item.getId().isEmpty()) + throw new Exception("Item id is null or empty"); + + // we make a copy of showable types + List showableTypesParam = new ArrayList(showableTypes); + + // we get sure that folders are displayed + for (ItemType folder : Util.FOLDERS) { + if (!showableTypesParam.contains(folder)) + showableTypesParam.add(folder); + } + + boolean purgeEmpyFolders = !showEmptyFolders; +// FilterCriteria filterCriteria = new FilterCriteria(allowedMimeTypes,requiredProperties, allowedFileExtensions); + + GWT.log("loading workspace folder by item id from server: "+item.getId()); + WorkspaceExplorerAppConstants.workspaceNavigatorService.getFolder(item, showableTypesParam, purgeEmpyFolders, filterCriteria, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Window.alert(caught.getMessage()); + setAlert(caught.getMessage(), AlertType.ERROR); + GWT.log("Error loading workspace folder from server",caught); + } + + @Override + public void onSuccess(Item result) { + if(item.getName()==null || item.getName().isEmpty()) + item.setName(result.getName()); + + updateExplorer(result.getChildren()); + } + }); + } + + /** + * Load the Workspace Tree. + */ + public void loadMySpecialFolder() { + GWT.log("loading folder data"); + setLoading(); + + + // we make a copy of showable types + List showableTypesParam = new ArrayList(showableTypes); + + // we get sure that folders are displayed + for (ItemType folder : Util.FOLDERS) { + if (!showableTypesParam.contains(folder)) + showableTypesParam.add(folder); + } + + boolean purgeEmpyFolders = !showEmptyFolders; +// FilterCriteria filterCriteria = new FilterCriteria(allowedMimeTypes,requiredProperties, allowedFileExtensions); + + GWT.log("loading workspace tree from server"); + WorkspaceExplorerAppConstants.workspaceNavigatorService.getMySpecialFolder(showableTypesParam, purgeEmpyFolders, filterCriteria, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Window.alert(caught.getMessage()); + setAlert(caught.getMessage(), AlertType.ERROR); + GWT.log("Error loading workspace folder from server",caught); + } + + @Override + public void onSuccess(Item items) { + updateExplorer(items.getChildren()); + } + }); + } + + /** + * Update explorer. + * + * @param items the items + */ + public void updateExplorer(ArrayList items){ + GWT.log("workspace explorer updating.."); + explorerPanel.clear(); +// itTables = new ItemsTable(true, displayFields); + itTables.updateItems(items, true); + explorerPanel.add(itTables.getCellTable()); + GWT.log("workspace explorer updated"); + WorkspaceExplorerApp.updateSize(); + } + + + /** + * Adds the item to explorer. + * + * @param item the item + */ + public void addItemToExplorer(Item item){ + GWT.log("workspace explorer add item.."+item); +// itTables = new ItemsTable(true, displayFields); +// explorerPanel.clear(); + itTables.addItems(Arrays.asList(item)); +// explorerPanel.add(itTables.getCellTable()); + GWT.log("added item: "+item.getName() +", to Explorer"); + } + + /** + * Gets the panel. + * + * @return the explorerPanel + */ + public ScrollPanel getPanel() { + return explorerPanel; + } + + + /** + * Gets the display fields. + * + * @return the displayFields + */ + public DisplayField[] getDisplayFields() { + return displayFields; + } + + + /** + * Sets the display fields. + * + * @param displayFields the displayFields to set + */ + public void setDisplayFields(DisplayField[] displayFields) { + this.displayFields = displayFields; + itTables.setDisplayFields(displayFields); + } + + + /** + * Gets the it tables. + * + * @return the itTables + */ + public ItemsTable getItTables() { + return itTables; + } + + /** + * Gets the items selected. + * + * @return the items selected + */ + public Set getItemsSelected(){ + return itTables.getSelectedItems(); + } + + /** + * Gets the selectable types. + * + * @return the selectableTypes + */ + @Override + public List getSelectableTypes() { + return selectableTypes; + } + + /** + * Sets the selectable types. + * + * @param selectableTypes the selectableTypes to set + */ + @Override + public void setSelectableTypes(ItemType ... selectableTypes) { + this.selectableTypes.clear(); + if (selectableTypes!=null) for (ItemType type:selectableTypes) this.selectableTypes.add(type); + } + + /** + * Gets the showable types. + * + * @return the showableTypes + */ + @Override + public List getShowableTypes() { + return showableTypes; + } + + /** + * Sets the showable types. + * + * @param showableTypes the showableTypes to set + */ + @Override + public void setShowableTypes(ItemType ... showableTypes) { + this.showableTypes.clear(); + if (showableTypes!=null) for (ItemType type:showableTypes) this.showableTypes.add(type); + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/resources/BootstrapOverrideResources.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/resources/BootstrapOverrideResources.java new file mode 100644 index 0000000..0f434e5 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/resources/BootstrapOverrideResources.java @@ -0,0 +1,17 @@ +package org.gcube.portlets.user.workspaceexplorerapp.resources; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * @Jul 28, 2014 + * + */ +import com.github.gwtbootstrap.client.ui.resources.Resources; +import com.google.gwt.resources.client.TextResource; + +public interface BootstrapOverrideResources extends Resources { + @Source("css/bootstrap.min.css") + TextResource bootstrapCss(); + + @Source("css/gwt-bootstrap.css") + TextResource gwtBootstrapCss(); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/resources/CustomBootstrapConfigurator.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/resources/CustomBootstrapConfigurator.java new file mode 100644 index 0000000..14ef204 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/resources/CustomBootstrapConfigurator.java @@ -0,0 +1,30 @@ +package org.gcube.portlets.user.workspaceexplorerapp.resources; + + +import com.github.gwtbootstrap.client.ui.config.Configurator; +import com.github.gwtbootstrap.client.ui.resources.Resources; +import com.google.gwt.core.client.GWT; + + +/** + * The Class BootstrapConfigurator. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 10, 2016 + */ +public class CustomBootstrapConfigurator implements Configurator { + + /* (non-Javadoc) + * @see com.github.gwtbootstrap.client.ui.config.Configurator#getResources() + */ + public Resources getResources() { + return GWT.create(BootstrapOverrideResources.class); + } + + /* (non-Javadoc) + * @see com.github.gwtbootstrap.client.ui.config.Configurator#hasResponsiveDesign() + */ + public boolean hasResponsiveDesign() { + return false; + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/resources/css/bootstrap.min.css b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/resources/css/bootstrap.min.css new file mode 100644 index 0000000..f47623b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/resources/css/bootstrap.min.css @@ -0,0 +1,74 @@ +/************************************************* +* +* BOOTSTRAP NO CSS FOR WORKSPACE EXPLORER APP +* +**************************************************/ + +/*ALERTS*/ +.alert { + background-color: #FCF8E3; + border: 1px solid #FBEED5; + border-radius: 4px; + margin-bottom: 20px; + padding: 8px 35px 8px 14px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.alert, .alert h4 { + color: #C09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + line-height: 20px; + position: relative; + right: -21px; + top: -2px; +} + +.alert-success { + background-color: #DFF0D8; + border-color: #D6E9C6; + color: #468847; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, .alert-error { + background-color: #F2DEDE; + border-color: #EED3D7; + color: #B94A48; +} + +.alert-danger h4, .alert-error h4 { + color: #B94A48; +} + +.alert-info { + background-color: #D9EDF7; + border-color: #BCE8F1; + color: #3A87AD; +} + +.alert-info h4 { + color: #3A87AD; +} + +.alert-block { + padding-bottom: 14px; + padding-top: 14px; +} + +.alert-block>p, .alert-block>ul { + margin-bottom: 0; +} + +.alert-block p+p { + margin-top: 5px; +} + diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/resources/css/gwt-bootstrap.css b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/resources/css/gwt-bootstrap.css new file mode 100644 index 0000000..a6671d2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/resources/css/gwt-bootstrap.css @@ -0,0 +1,80 @@ +/************************************************* +* +* GWT-BOOTSTRAP MINIMAL CSS FOR WORKSPACE EXPLORE +* +**************************************************/ +/* body { */ +/* padding-top: 50px; */ +/* } */ +/* div.input-prepend > input, div.input-prepend > textarea, div.input-prepend > select, div.input-prepend > .uneditable-input { */ +/* margin-bottom: 0; */ +/* } */ +/* div.input-append > input, div.input-append > textarea, div.input-append > select, div.input-append > .uneditable-input { */ +/* margin-bottom: 0; */ +/* } */ +.gwt-PopupPanel .gwt-DatePicker { + width: 200px; +} + +.gwt-SuggestBoxPopup { + z-index: 2100; +} + +.gwt-SuggestBoxPopup .suggestPopupTop { + background-color: #FFFFFF; +} + +.gwt-SuggestBoxPopup .suggestPopupMiddle { + background-color: #FFFFFF; +} + +.gwt-SuggestBoxPopup .suggestPopupBottomCenter { + background-color: #FFFFFF; +} + +.gwt-SuggestBoxPopup .item { + clear: both; + color: #333333; + cursor: pointer; + font-size: 110%; + font-weight: normal; + line-height: 20px; + padding: 3px 9px; + white-space: nowrap; +} + +.gwt-SuggestBoxPopup .item-selected { + background-color: #0081C2; + background-image: linear-gradient(to bottom, #0088CC, #0077B3); + background-repeat: repeat-x; + color: #FFFFFF; + outline: 0 none; + text-decoration: none; +} + +.gwt-TextBox-personal { + background-color: #FFFFFF; + border: 1px solid #CCCCCC; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset; + transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s; + border-radius: 4px; + color: #555555; + display: inline-block; + font-size: 14px; + height: 20px; + line-height: 20px; + margin-bottom: 10px; + padding: 4px 6px; + vertical-align: middle; +} + +.form-inline input:FOCUS{ + border-color: rgba(82, 168, 236, 0.8); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset, 0 0 8px + rgba(82, 168, 236, 0.6); + outline: 0 none +} + +.margin-right-5px { + margin-right: 5px; +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/DownloadWorkspaceExplorerServlet.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/DownloadWorkspaceExplorerServlet.java new file mode 100644 index 0000000..5374a26 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/DownloadWorkspaceExplorerServlet.java @@ -0,0 +1,679 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.server; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.apache.log4j.Logger; +import org.gcube.common.homelibrary.home.exceptions.InternalErrorException; +import org.gcube.common.homelibrary.home.workspace.Workspace; +import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder; +import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; +import org.gcube.common.homelibrary.home.workspace.exceptions.ItemNotFoundException; +import org.gcube.common.homelibrary.home.workspace.folder.FolderItem; +import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalFile; +import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalImage; +import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalUrl; +import org.gcube.common.homelibrary.home.workspace.folder.items.GCubeItem; +import org.gcube.common.homelibrary.home.workspace.folder.items.Query; +import org.gcube.common.homelibrary.home.workspace.folder.items.Report; +import org.gcube.common.homelibrary.home.workspace.folder.items.ReportTemplate; +import org.gcube.common.homelibrary.home.workspace.folder.items.ts.TimeSeries; +import org.gcube.common.homelibrary.util.Extensions; +import org.gcube.common.homelibrary.util.MimeTypeUtil; +import org.gcube.common.homelibrary.util.zip.ZipUtil; +import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerAppConstants; +import org.gcube.portlets.user.workspaceexplorerapp.shared.HandlerResultMessage; + +/** + * The Class DownloadServlet. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + */ +public class DownloadWorkspaceExplorerServlet extends HttpServlet{ + + /** + * + */ + private static final String ERROR404_HTML = "error404.html"; + + private static final long serialVersionUID = -8423345575690165644L; + + protected static Logger logger = Logger.getLogger(DownloadWorkspaceExplorerServlet.class); + public static final String ERROR_ITEM_DOES_NOT_EXIST = "Item does not exist. It may have been deleted by another user"; + + public static final String REDIRECTONERROR = "redirectonerror"; + + private final String VALIDATEITEM = WorkspaceExplorerAppConstants.VALIDATEITEM; + private final String IDS = WorkspaceExplorerAppConstants.IDS; + private final String IDS_SEPARATOR = WorkspaceExplorerAppConstants.IDS_SEPARATOR; + /** + * {@inheritDoc} + */ + @Override + public void init() throws ServletException { + super.init(); + logger.trace("Workspace DownloadServlet ready."); + } + + + /* (non-Javadoc) + * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + + String itemIds = req.getParameter(IDS); + boolean viewContent = req.getParameter("viewContent")==null?false:req.getParameter("viewContent").equals("true"); + boolean isValidItem = req.getParameter(VALIDATEITEM)==null?false:req.getParameter(VALIDATEITEM).equals("true"); + boolean urlRedirectOnError = req.getParameter(REDIRECTONERROR)==null?false:req.getParameter(REDIRECTONERROR).equals("true"); + + logger.trace("Input Params [ids: "+itemIds + ", viewContent: "+viewContent+", "+VALIDATEITEM +": " +isValidItem+", urlRedirectOnError:" +urlRedirectOnError+"]"); + if(itemIds==null || itemIds.isEmpty()){ + sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Item id is null"); + return; + } + + logger.trace("FILE DOWNLOAD REQUEST "+itemIds); + List ids = toList(itemIds, IDS_SEPARATOR); + Workspace wa = null; + try { + + wa = WsUtil.getWorkspace(req.getSession()); + } catch (Exception e) { + + /*if (e instanceof SessionExpiredException){ + sendErrorForStatus(resp, HttpServletResponse.SC_UNAUTHORIZED +": Session expired", HttpServletResponse.SC_UNAUTHORIZED); + return; + }*/ + + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during workspace retrieving"); + return; + } + + if (wa == null) { + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error, no workspace in session"); + return; + } + + WorkspaceItem item; + try { + + //MULTIPLE DOWNLOAD - CREATE A ZIP FOR SUCH WORKSPACE IDs AND RETURN + if(ids.size()>1){ + List listWI = toWorkspaceItems(wa, ids); + try { + File tmpZip = ZipUtil.zipWorkspaceItems(listWI, null); + resp.setHeader( "Content-Disposition", "attachment; filename=\"gCube Workspace Files - " + new Date() +".zip\"" ); + resp.setContentType("application/zip"); + resp = setContentLength(resp, tmpZip.length()); + OutputStream out = resp.getOutputStream(); + + FileInputStream fileTmpZip = new FileInputStream(tmpZip); + IOUtils.copy(fileTmpZip, resp.getOutputStream()); + fileTmpZip.close(); + + out.close(); + tmpZip.delete(); + return; + } + catch (InternalErrorException e) { + logger.error("Error during folder compression "+itemIds,e); + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during folder compression: "+e.getMessage()); + return; + } + + } + + //SINGLE DONWLOAD - DOWNLOAD WORKSPACE ITEM + item = wa.getItem(ids.get(0)); + if(isValidItem){ //ADDED 25/06/2013 - THIS CODE RETURN A SC_ACCEPT IS ITEM EXIST + String message = HttpServletResponse.SC_ACCEPTED+ ": The resource is available"; + sendMessageResourceAvailable(resp, message); + logger.trace("response return: "+message); + return; + } + + try{ + //ACCOUNTING + item.markAsRead(true); + } catch (InternalErrorException e) { + logger.error("Requested item "+itemIds+" has thrown an internal error exception",e); + } + + } catch (ItemNotFoundException e) { + logger.error("Requested item "+itemIds+" not found",e); + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": The file has been deleted by another user."); + return; + } + + switch (item.getType()) { + + case SHARED_FOLDER: + case FOLDER:{ + try { + File tmpZip = ZipUtil.zipFolder((WorkspaceFolder) item); + resp.setHeader( "Content-Disposition", "attachment; filename=\"" + item.getName() + ".zip\"" ); + resp.setContentType("application/zip"); + resp = setContentLength(resp, tmpZip.length()); + OutputStream out = resp.getOutputStream(); + + FileInputStream fileTmpZip = new FileInputStream(tmpZip); + IOUtils.copy(fileTmpZip, resp.getOutputStream()); + fileTmpZip.close(); + + out.close(); + tmpZip.delete(); + return; + + } catch (Exception e) { + logger.error("Error during folder compression "+itemIds,e); + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during folder compression: "+e.getMessage()); + return; + } + } + case FOLDER_ITEM:{ + FolderItem folderItem = (FolderItem) item; + + switch (folderItem.getFolderItemType()) { + + case REPORT_TEMPLATE:{ + try{ + ReportTemplate reportTemplate = (ReportTemplate)folderItem; + String extension = FilenameUtils.getExtension(item.getName()); + String itemName = item.getName(); + logger.trace("case REPORT_TEMPLATE extension is" +extension); + + if(extension.compareToIgnoreCase(Extensions.REPORT_TEMPLATE.getName())!=0) //ADD EXTENSION? + itemName = "." + Extensions.REPORT_TEMPLATE.getName(); + + logger.trace("case REPORT_TEMPLATE itemName is" +extension); + String contentDisposition = viewContent?"inline":"attachment"; + resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + itemName + "\"" ); + + resp.setContentType("application/zip"); + resp = setContentLength(resp, reportTemplate.getLength()); + OutputStream out = resp.getOutputStream(); + + //MODIFIED 22-05-2013 CLOSE STREAM + InputStream is = reportTemplate.getData(); + IOUtils.copy(is, resp.getOutputStream()); + is.close(); + + out.close(); + } catch (Exception e) { + logger.error("Error during external item sending "+itemIds,e); + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage()); + return; + } + return; + + } + case REPORT:{ + try{ + Report report = (Report)folderItem; + String extension = FilenameUtils.getExtension(item.getName()); + String itemName = item.getName(); + logger.trace("case REPORT extension is" +extension); + + if(extension.compareToIgnoreCase(Extensions.REPORT.getName())!=0) //ADD EXTENSION? + itemName = "." + Extensions.REPORT.getName(); + + logger.trace("case REPORT itemName is" +extension); + String contentDisposition = viewContent?"inline":"attachment"; + resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + itemName + "\"" ); + + resp.setContentType("application/zip"); + resp = setContentLength(resp, report.getLength()); + OutputStream out = resp.getOutputStream(); + + //MODIFIED 22-05-2013 CLOSE STREAM + InputStream is = report.getData(); + IOUtils.copy(is, resp.getOutputStream()); + is.close(); + + out.close(); + } catch (Exception e) { + logger.error("Error during external item sending "+itemIds,e); + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage()); + return; + } + return; + + } + case EXTERNAL_PDF_FILE: + case EXTERNAL_FILE:{ + + InputStream is = null; + OutputStream out = null; + try{ + ExternalFile externalFile = (ExternalFile)folderItem; + + String mimeType = externalFile.getMimeType(); + + logger.trace("EXTERNAL_FILE DOWNLOAD FOR "+externalFile.getId()); + String contentDisposition = viewContent?"inline":"attachment"; + resp.setHeader("Content-Disposition", contentDisposition+"; filename=\"" + item.getName() + "\"" ); + resp.setContentType(mimeType); + resp = setContentLength(resp, externalFile.getLength()); + is = externalFile.getData(); + out = resp.getOutputStream(); + IOUtils.copy(is, out); + + is.close(); + out.close(); + + } catch (Exception e) { + logger.error("Error during external item retrieving "+itemIds,e); + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage()); + return; + } + return; + + } + case EXTERNAL_IMAGE:{ + + try{ + ExternalImage externalImage = (ExternalImage)folderItem; + + String mimeType = externalImage.getMimeType(); + String itemName = MimeTypeUtil.getNameWithExtension(item.getName(), mimeType); + + String contentDisposition = viewContent?"inline":"attachment"; + resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + itemName + "\"" ); + resp.setContentType(externalImage.getMimeType()); + resp = setContentLength(resp, externalImage.getLength()); + OutputStream out = resp.getOutputStream(); + InputStream is = externalImage.getData(); + IOUtils.copy(is, out); + is.close(); + + out.close(); + return; + } catch (Exception e) { + logger.error("Error during item retrieving "+itemIds,e); + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage()); + return; + } + } + case EXTERNAL_URL:{ + try{ + ExternalUrl externalUrl = (ExternalUrl)folderItem; + + String itemName = MimeTypeUtil.getNameWithExtension(externalUrl.getName(), "text/uri-list"); + String contentDisposition = viewContent?"inline":"attachment"; + resp.setHeader("Content-Disposition", contentDisposition+"; filename=\"" + itemName + "\"" ); + resp.setContentType("text/uri-list"); + resp = setContentLength(resp, externalUrl.getLength()); + + //MODIFIED 22-05-2013 CLOSE STREAM + StringReader sr = new StringReader(externalUrl.getUrl()); + OutputStream out = resp.getOutputStream(); + IOUtils.copy(sr, out); + + sr.close(); + out.close(); + return; + } catch (Exception e) { + logger.error("Error during item retrieving "+itemIds,e); + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage()); + return; + } + } + case QUERY:{ + + Query query = (Query)folderItem; + resp.setContentType("text/plain"); + try { + resp = setContentLength(resp, query.getLength()); + } catch (Exception e) { + logger.error("Error getting item lenght "+query,e); + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage()); + return; + } + + //MODIFIED 22-05-2013 CLOSE STREAM + OutputStream out = resp.getOutputStream(); + StringReader sr = new StringReader(query.getQuery()); + IOUtils.copy(sr, out); + sr.close(); + + out.close(); + return; + + } + case TIME_SERIES:{ + try{ + TimeSeries ts = (TimeSeries)folderItem; + File tmpZip = ZipUtil.zipTimeSeries(ts); + + String contentDisposition = viewContent?"inline":"attachment"; + resp.setHeader( "Content-Disposition", contentDisposition+"; filename=\"" + item.getName() + ".zip\"" ); + resp.setContentType("application/zip"); + resp = setContentLength(resp, tmpZip.length()); + + //MODIFIED 22-05-2013 CLOSE STREAM + OutputStream out = resp.getOutputStream(); + FileInputStream fileTmpZip = new FileInputStream(tmpZip); + IOUtils.copy(fileTmpZip, out); + fileTmpZip.close(); + + out.close(); + tmpZip.delete(); + return; + } catch (Exception e) { + logger.error("Error during item retrieving "+itemIds,e); + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage()); + return; + } + } + case IMAGE_DOCUMENT: + case PDF_DOCUMENT: + case URL_DOCUMENT: + case DOCUMENT:{ + try{ +// Document document = (Document)item; + GCubeItem document = (GCubeItem) item; //Cast GCubeItem + + if (!viewContent){ + File tmpZip = ZipUtil.zipDocument(document); + + resp.setHeader( "Content-Disposition", "attachment; filename=\"" + item.getName() + ".zip\"" ); + resp.setContentType("application/zip"); + resp = setContentLength(resp, tmpZip.length()); + + //MODIFIED 22-05-2013 CLOSE STREAM + OutputStream out = resp.getOutputStream(); + FileInputStream fileTmpZip = new FileInputStream(tmpZip); + IOUtils.copy(fileTmpZip, out); + fileTmpZip.close(); + + out.close(); + tmpZip.delete(); + } + else{ + String mimeType = document.getMimeType(); + String itemName = MimeTypeUtil.getNameWithExtension(item.getName(), mimeType); + resp.setHeader( "Content-Disposition", "inline; filename=\"" + itemName + "\"" ); + resp.setContentType(document.getMimeType()); + resp = setContentLength(resp, document.getLength()); + //MODIFIED 22-05-2013 CLOSE STREAM + OutputStream out = resp.getOutputStream(); + InputStream is = document.getData(); + IOUtils.copy(is, out); + is.close(); + + out.close(); + } + return; + } catch (Exception e) { + logger.error("Error during item retrieving "+itemIds,e); + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage()); + return; + } + } + + case METADATA:{ + try{ +// Metadata document = (Metadata)item; + GCubeItem metadata = (GCubeItem) item; //Cast GCubeItem + + resp.setContentType("text/html"); + resp = setContentLength(resp, metadata.getLength()); + + //MODIFIED 22-05-2013 CLOSE STREAM + OutputStream out = resp.getOutputStream(); + InputStream is = metadata.getData(); + IOUtils.copy(is, out); + is.close(); + out.close(); + + return; + } catch (Exception e) { + logger.error("Error during item retrieving "+itemIds,e); + handleError(urlRedirectOnError, req, resp, itemIds, HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving: "+e.getMessage()); + return; + } + } + } + + } + } + + handleError(urlRedirectOnError, req, resp, itemIds,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during data retrieving"); + return; + } + + + /** + * To list. + * + * @param ids the ids + * @param separator the separator + * @return the list + */ + private static List toList(String ids, String separator){ + + String[] toArray = ids.split(separator); + List lstIds = new ArrayList(toArray.length); + for (String id : toArray) { + if(id!=null && !id.isEmpty()) + lstIds.add(id); + } + logger.trace("ids to list: "+lstIds); + return lstIds; + } + + + /** + * To workspace items. + * + * @param ws the ws + * @param workspaceItemIds the workspace item ids + * @return the list + */ + private List toWorkspaceItems(Workspace ws, List workspaceItemIds){ + + if(workspaceItemIds==null) + return null; + + List listWI = new ArrayList(workspaceItemIds.size()); + + for (String wsId : workspaceItemIds) { + try{ + listWI.add(ws.getItem(wsId)); + }catch(Exception e){ + logger.warn("Error on getting item id: "+wsId +", skipping item"); + } + } + return listWI; + } + + /** + * Method to manage HttpServletResponse content length also to big data. + * + * @param resp the resp + * @param length the length + * @return the http servlet response + */ + protected HttpServletResponse setContentLength(HttpServletResponse resp, long length){ + try{ + if (length <= Integer.MAX_VALUE) + resp.setContentLength((int)length); + else + resp.addHeader("Content-Length", Long.toString(length)); + }catch(Exception e){ + //silent + } + return resp; + } + + /** + * Handle error. + * + * @param urlRedirectOnError the url redirect on error + * @param req the req + * @param resp the resp + * @param itemId the item id + * @param message the message + * @throws IOException Signals that an I/O exception has occurred. + */ + protected void handleError(boolean urlRedirectOnError, HttpServletRequest req, HttpServletResponse resp, String itemId, String message) throws IOException{ + + logger.warn("Handle error occurred: "+message); + logger.trace("urlRedirectOnError is active: "+urlRedirectOnError); + if(urlRedirectOnError){ + urlRedirect(req, resp, ERROR404_HTML); + }else + sendError(resp,message); + + } + + /** + * Send error. + * + * @param response the response + * @param message the message + * @throws IOException Signals that an I/O exception has occurred. + */ + protected void sendError(HttpServletResponse response, String message) throws IOException + { + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + HandlerResultMessage resultMessage = HandlerResultMessage.errorResult(message); + logger.trace("error message: "+resultMessage); + logger.trace("writing response..."); + StringReader sr = new StringReader(resultMessage.toString()); + IOUtils.copy(sr, response.getOutputStream()); + + logger.trace("response writed"); + response.flushBuffer(); + } + + + /** + * Send error for status. + * + * @param response the response + * @param message the message + * @param status the status + * @throws IOException Signals that an I/O exception has occurred. + */ + protected void sendErrorForStatus(HttpServletResponse response, String message, int status) throws IOException + { + response.setStatus(status); + HandlerResultMessage resultMessage = HandlerResultMessage.errorResult(message); + logger.trace("error message: "+resultMessage); + logger.trace("writing response..."); + StringReader sr = new StringReader(resultMessage.toString()); + IOUtils.copy(sr, response.getOutputStream()); + + logger.trace("response writed"); + response.flushBuffer(); + } + + /** + * Send message. + * + * @param response the response + * @param message the message + * @throws IOException Signals that an I/O exception has occurred. + */ + protected void sendMessage(HttpServletResponse response, String message) throws IOException + { + response.setStatus(HttpServletResponse.SC_ACCEPTED); + HandlerResultMessage resultMessage = HandlerResultMessage.okResult(message); + response.getWriter().write(resultMessage.toString()); + response.flushBuffer(); + } + + /** + * Send message resource available. + * + * @param response the response + * @param message the message + * @throws IOException Signals that an I/O exception has occurred. + */ + protected void sendMessageResourceAvailable(HttpServletResponse response, String message) throws IOException + { + response.setStatus(HttpServletResponse.SC_ACCEPTED); + HandlerResultMessage resultMessage = HandlerResultMessage.okResult(message); + response.getWriter().write(resultMessage.toString()); + response.flushBuffer(); + } + + /** + * Send warn message. + * + * @param response the response + * @param message the message + * @throws IOException Signals that an I/O exception has occurred. + */ + protected void sendWarnMessage(HttpServletResponse response, String message) throws IOException + { + response.setStatus(HttpServletResponse.SC_ACCEPTED); + HandlerResultMessage resultMessage = HandlerResultMessage.warnResult(message); + response.getWriter().write(resultMessage.toString()); + response.flushBuffer(); + } + + /** + * Url redirect. + * + * @param req the req + * @param response the response + * @param errorPage the error page + * @throws IOException Signals that an I/O exception has occurred. + */ + protected void urlRedirect(HttpServletRequest req, HttpServletResponse response, String errorPage) throws IOException { + + String requestUrl = getRedirectURL(req) +errorPage; + logger.trace("Url redirect on: "+requestUrl); +// System.out.println("Url redirect on: "+requestUrl); + response.sendRedirect(response.encodeRedirectURL(requestUrl)); + return; + } + + /** + * Gets the redirect url. + * + * @param req the req + * @return the redirect url + */ + public static String getRedirectURL(HttpServletRequest req) { + + String scheme = req.getScheme(); // http + String serverName = req.getServerName(); // hostname.com + int serverPort = req.getServerPort(); // 80 + String contextPath = req.getContextPath(); // /mywebapp +// String servletPath = req.getServletPath(); // /servlet/MyServlet +// String pathInfo = req.getPathInfo(); // /a/b;c=123 +// String queryString = req.getQueryString(); // d=789 + + // Reconstruct original requesting URL + StringBuffer url = new StringBuffer(); + url.append(scheme).append("://").append(serverName); + + if (serverPort != 80 && serverPort != 443) { + url.append(":").append(serverPort); + } + + url.append("/").append(contextPath); + logger.trace("returning url: "+url); + return url.toString(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/ItemBuilder.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/ItemBuilder.java new file mode 100644 index 0000000..1f2f933 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/ItemBuilder.java @@ -0,0 +1,400 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.server; + +import java.util.Calendar; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.gcube.common.homelibary.model.items.type.WorkspaceItemType; +import org.gcube.common.homelibrary.home.exceptions.InternalErrorException; +import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder; +import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; +import org.gcube.common.homelibrary.home.workspace.WorkspaceSharedFolder; +import org.gcube.common.homelibrary.home.workspace.folder.FolderItem; +import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalFile; +import org.gcube.portlets.user.workspaceexplorerapp.client.Util; +import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerAppConstants; +import org.gcube.portlets.user.workspaceexplorerapp.shared.FilterCriteria; +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The Class ItemBuilder. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 22, 2016 + */ +public class ItemBuilder { + + public static final Logger _log = LoggerFactory.getLogger(ItemBuilder.class); + /** + * Purge empty folders. + * + * @param item the item + * @return the item + */ + public static Item purgeEmptyFolders(Item item) + { + //for (Item child:item.getChildren()) purgeEmptyFolders(child); ONLY FIRST LEVEL + + List toRemoveList = new LinkedList(); + for (Item child:item.getChildren()) { + boolean toRemove = isAnEmptyFolder(child); + if (toRemove) { + toRemoveList.add(child); + } + } + for (Item child:toRemoveList) { + item.removeChild(child); + } + + return item; + } + + + /** + * Checks if is an empty folder. + * + * @param item the item + * @return true, if is an empty folder + */ + protected static boolean isAnEmptyFolder(Item item) + { + return Util.isFolder(item.getType()) && item.getChildren().size() == 0; + } + + + /** + * Gets the item. + * + * @param parent the parent + * @param workspaceItem the workspace item + * @param workspaceItemPath the workspace item path + * @param showableTypes the showable types + * @param filterCriteria the filter criteria + * @param loadChildren the load children + * @return the item + * @throws InternalErrorException the internal error exception + */ + public static Item getItem(Item parent, WorkspaceItem workspaceItem, String workspaceItemPath, List showableTypes, FilterCriteria filterCriteria, boolean loadChildren) throws InternalErrorException + { + + ItemType type = getItemType(workspaceItem); + + if (!showableTypes.contains(type)) { + return null; + } + if (!filterItem(type, workspaceItem, filterCriteria)) { + return null; + } + +// //TODO ADD CONTROL ON THE PATH WHEN WILL BE MORE FAST +// if (itemName.equals(WorkspaceExplorerConstants.SPECIAL_FOLDERS_LABEL)) +// itemName = WorkspaceExplorerConstants.VRE_FOLDERS_LABEL; + + boolean isFolder = type.equals(ItemType.FOLDER)?true:false; + boolean isSharedFolder = workspaceItem.getType().equals(WorkspaceItemType.SHARED_FOLDER)?true:false; + + String itemName = workspaceItem.getName(); + + if(isSharedFolder){ + _log.debug("Is shared folder"); + WorkspaceSharedFolder shared = (WorkspaceSharedFolder) workspaceItem; + itemName = shared.isVreFolder()?shared.getDisplayName():workspaceItem.getName(); + } + +// _log.debug("Building Item for: "+itemName); + Item item = null; + try{ + + item = new Item(parent, workspaceItem.getId(), itemName, type, workspaceItemPath, workspaceItem.getOwner().getPortalLogin(), toDate(workspaceItem.getCreationTime()), isFolder, false); + item.setSharedFolder(isSharedFolder); + }catch(Exception e){ + _log.error("Error on getting item: "+itemName+" with id: "+workspaceItem.getId()+", from HL, so skipping item"); + return null; + } + + if(loadChildren){ + //TODO A PATCH TO AVOID A SLOW GETPATH +// workspaceItemPath = workspaceItem.getPath(); + for (WorkspaceItem child: workspaceItem.getChildren()){ + String itemPath = workspaceItemPath; + if(child.isFolder()) + itemPath+="/"+child.getName(); + +// _log.trace("\nConverting child item: "+child.getName()); + Item itemChild = getItem(item, child, itemPath, showableTypes, filterCriteria, false); +// _log.trace("Item: "+child.getName() +" converted!!!"); + if (itemChild!=null){ + item.addChild(itemChild); + } + } + } + + return item; + } + + + /** + * To date. + * + * @param calendar the calendar + * @return the date + */ + public static Date toDate(Calendar calendar) + { + if (calendar == null) return null; + return calendar.getTime(); + + } + + /** + * Gets the item type. + * + * @param item the item + * @return the item type + * @throws InternalErrorException the internal error exception + */ + protected static ItemType getItemType(WorkspaceItem item) throws InternalErrorException + { + switch(item.getType()) + { + case SHARED_FOLDER: + case FOLDER:{ +// if (item.isRoot()) return ItemType.ROOT; + return ItemType.FOLDER; + } + case FOLDER_ITEM: return getFolderItemType((FolderItem) item); + + default: + return null; + } + } + + /** + * Gets the folder item type. + * + * @param item the item + * @return the folder item type + */ + protected static ItemType getFolderItemType(FolderItem item){ + + try{ + return ItemType.valueOf(item.getFolderItemType().toString()); + }catch (Exception e) { + _log.error("Item Type non found: ",e); + return ItemType.UNKNOWN_TYPE; + } + } + + + /** + * Filter item. + * + * @param type the type + * @param item the item + * @param filterCriteria the filter criteria + * @return true, if successful + * @throws InternalErrorException the internal error exception + */ + protected static boolean filterItem(ItemType type, WorkspaceItem item, FilterCriteria filterCriteria) throws InternalErrorException { + if(filterCriteria==null) { + return true; + } + + boolean mimeTypeCheck = checkAllowedMimeTypes(type, item, filterCriteria.getAllowedMimeTypes()); + if (!mimeTypeCheck) { + return false; + } + + boolean fileExtensionCheck = checkAllowedFileExtension(type, item, filterCriteria.getAllowedFileExtensions()); + if(!fileExtensionCheck) { + return false; + } + + boolean propertiesCheck = checkProperties(item, filterCriteria.getRequiredProperties()); + return propertiesCheck; + } + + /** + * Check allowed mime types. + * + * @param type the type + * @param item the item + * @param allowedMimeTypes the allowed mime types + * @return true, if successful + */ + protected static boolean checkAllowedMimeTypes(ItemType type, WorkspaceItem item, List allowedMimeTypes){ + if (allowedMimeTypes==null || allowedMimeTypes.size()==0) { + return true; + } + + if (type == ItemType.EXTERNAL_FILE || type == ItemType.EXTERNAL_IMAGE || type == ItemType.EXTERNAL_PDF_FILE) { + ExternalFile externalFile = (ExternalFile)item; + String mimeType = externalFile.getMimeType(); + return allowedMimeTypes.contains(mimeType); + } + return true; + } + + + + + /** + * Check allowed file extension. + * + * @param type the type + * @param item the item + * @param allowedFileExtension the allowed mime types + * @return true, if successful + */ + protected static boolean checkAllowedFileExtension(ItemType type, WorkspaceItem item, List allowedFileExtension){ + if (allowedFileExtension==null || allowedFileExtension.size()==0) { + return true; + } + + try { + if (type != ItemType.FOLDER) { + String name = item.getName(); + return checkFileExtension(name, allowedFileExtension); + } + return true; + } catch (InternalErrorException e) { + _log.error("checkAllowedFileExtension, InternalErrorException: ",e); + return false; + } + } + + /** + * Check file extension. + * + * @param fileName the file name + * @param allowedFileExtension the allowed file extension + * @return true, if successful + */ + protected static boolean checkFileExtension(String fileName, List allowedFileExtension){ + + if(fileName==null || fileName.isEmpty()) { + return false; + } + + int dot = fileName.lastIndexOf("."); + if(dot>=0 && dot+1<=fileName.length()){ + + String ext = fileName.substring(dot+1, fileName.length()); + _log.trace("Extension found: "+ext +" for: "+fileName); +// if(ext.isEmpty()) +// return false; + for (String fe : allowedFileExtension) { + if(ext.compareTo(fe)==0) { + return true; + } + } + return false; + } + _log.trace("Extension not found for: "+fileName); + return false; + } + + + /** + * Check properties. + * + * @param item the item + * @param requestedProperties the requested properties + * @return true, if successful + * @throws InternalErrorException the internal error exception + */ + protected static boolean checkProperties(WorkspaceItem item, Map requestedProperties) throws InternalErrorException + { + if (requestedProperties==null || requestedProperties.size()==0 || item.getType()!=WorkspaceItemType.FOLDER_ITEM) { + return true; + } + + Map itemProperties = item.getProperties().getProperties(); + for (Entry requestProperty:requestedProperties.entrySet()) { + String propertyValue = itemProperties.get(requestProperty.getKey()); + if (propertyValue == null) { + return false; + } + if (!propertyValue.equals(requestProperty.getValue())) { + return false; + } + } + + return true; + } + + + + /** + * Builds the folder to breadcrumbs. + * + * @param wsFolder the ws folder + * @param parent the parent + * @return the item + * @throws InternalErrorException the internal error exception + */ + public static Item buildFolderForBreadcrumbs(WorkspaceFolder wsFolder, Item parent) throws InternalErrorException { + + String name = ""; + boolean isSpecialFolder = false; + boolean isRoot = false; + + if(wsFolder.isRoot()){ //IS ROOT + name = WorkspaceExplorerAppConstants.HOME_LABEL; + isRoot = true; + }else if(wsFolder.isShared() && wsFolder.getType().equals(WorkspaceItemType.SHARED_FOLDER)){ //MANAGEMENT SHARED FOLDER NAME + WorkspaceSharedFolder shared = (WorkspaceSharedFolder) wsFolder; + name = shared.isVreFolder()?shared.getDisplayName():wsFolder.getName(); + //MANAGEMENT SPECIAL FOLDER + }else if(isSpecialFolder(wsFolder)){ + name = WorkspaceExplorerAppConstants.VRE_FOLDERS_LABEL; + isSpecialFolder = true; + } + else { + name = wsFolder.getName(); + } + + //BUILDS A SIMPLE ITEM FOR BREADCRUMB + String path = null; //wsFolder.getPath(); FORCED TO NULL BECAUSE IS SLOW CALL + Item item = new Item(null, wsFolder.getId(), name, ItemType.FOLDER, path, null, null, true, isRoot); + item.setSpecialFolder(isSpecialFolder); + + _log.debug("breadcrumb returning: "+item); + return item; + } + + /** + * Checks if is special folder. + * + * @param wsFolder the ws folder + * @return true, if is special folder + */ + public static boolean isSpecialFolder(WorkspaceFolder wsFolder){ + + try { + return wsFolder.getName().compareTo(WorkspaceExplorerAppConstants.SPECIAL_FOLDERS_NAME)==0 && wsFolder.getParent()!=null && wsFolder.getParent().isRoot(); + } catch (InternalErrorException e) { + _log.warn("isSpecialFolder exception, returning false"); + return false; + } + } + /* + public static void main(String[] args) { + List allowedFileExtension = new ArrayList(); + allowedFileExtension.add("csv"); + allowedFileExtension.add(""); + + String fileName = "t"; + System.out.println(checkFileExtension(fileName, allowedFileExtension)); + }*/ +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/ItemComparator.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/ItemComparator.java new file mode 100644 index 0000000..945d812 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/ItemComparator.java @@ -0,0 +1,46 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.server; + +import java.util.Comparator; + +import org.gcube.portlets.user.workspaceexplorerapp.client.Util; +import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerAppConstants; +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; + + +/** + * A comparator that sorts the items first by type, folder up others down, the each group alphabetically on the item name. + * @author "Federico De Faveri defaveri@isti.cnr.it" + */ +public class ItemComparator implements Comparator { + + /** + * {@inheritDoc} + */ + @Override + public int compare(Item item1, Item item2) { + + //if one of the item is folder and the other one not, we move up the folder + boolean isItem1Folder = Util.isFolder(item1.getType()); + boolean isItem2Folder = Util.isFolder(item2.getType()); + + boolean isSpecialFolder1 = isSpecialFolder(item1); + boolean isSpecialFolder2 = isSpecialFolder(item2); + + //XOR + if (isSpecialFolder1 ^ isSpecialFolder2) return isSpecialFolder1 ? -1 : 1; + + //XOR + if (isItem1Folder ^ isItem2Folder) return isItem1Folder ? -1 : 1; + + //otherwise we compare the names + return String.CASE_INSENSITIVE_ORDER.compare(item1.getName(), item2.getName()); + } + + private boolean isSpecialFolder(Item item) { +// return item.getName().equals(WorkspaceExplorerConstants.VRE_FOLDERS_LABEL) && item.getParent()!=null && item.getParent().isRoot(); + return item.getName().equals(WorkspaceExplorerAppConstants.VRE_FOLDERS_LABEL) && item.isSpecialFolder(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/StringUtil.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/StringUtil.java new file mode 100644 index 0000000..a2fd1cb --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/StringUtil.java @@ -0,0 +1,31 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.server; + +import java.text.DecimalFormat; + + +/** + * The Class StringUtil. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 22, 2016 + */ +public class StringUtil { + + /** + * Readable file size. + * + * @param size the size + * @return the string + */ + public static String readableFileSize(long size) { + if(size < 0) return "Unknown"; + if(size == 0) return "0"; + final String[] units = new String[] { "B", "KB", "MB", "GB", "TB" }; + int digitGroups = (int) (Math.log10(size)/Math.log10(1024)); + return new DecimalFormat("#,##0.#").format(size/Math.pow(1024, digitGroups))+units[digitGroups]; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/WorkspaceExplorerAppServiceImpl.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/WorkspaceExplorerAppServiceImpl.java new file mode 100644 index 0000000..cd52bd5 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/WorkspaceExplorerAppServiceImpl.java @@ -0,0 +1,644 @@ +package org.gcube.portlets.user.workspaceexplorerapp.server; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.common.homelibary.model.items.type.WorkspaceItemType; +import org.gcube.common.homelibrary.home.HomeLibrary; +import org.gcube.common.homelibrary.home.workspace.Workspace; +import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder; +import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; +import org.gcube.common.homelibrary.home.workspace.WorkspaceSharedFolder; +import org.gcube.common.homelibrary.home.workspace.exceptions.InsufficientPrivilegesException; +import org.gcube.common.homelibrary.home.workspace.exceptions.ItemAlreadyExistException; +import org.gcube.common.homelibrary.home.workspace.folder.FolderItem; +import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerAppConstants; +import org.gcube.portlets.user.workspaceexplorerapp.client.rpc.WorkspaceExplorerAppService; +import org.gcube.portlets.user.workspaceexplorerapp.shared.FilterCriteria; +import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemCategory; +import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemType; +import org.gcube.portlets.user.workspaceexplorerapp.shared.WorkspaceNavigatorServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +/** + * The server side implementation of the RPC service. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 25, 2015 + */ +@SuppressWarnings("serial") +public class WorkspaceExplorerAppServiceImpl extends RemoteServiceServlet implements WorkspaceExplorerAppService { + + /** + * + */ + public static final Logger logger = LoggerFactory.getLogger(WorkspaceExplorerAppServiceImpl.class); + + + + /** + * {@inheritDoc} + */ + @Override + public Item getRoot(List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria) throws WorkspaceNavigatorServiceException { + logger.trace("getRoot showableTypes: "+showableTypes+" purgeEmpyFolders: "+purgeEmpyFolders+" filterCriteria: "+ filterCriteria); + + try { + + Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); + logger.trace("Start getRoot..."); + + WorkspaceItem root = workspace.getRoot(); + + logger.trace("GetRoot - Replyiing root"); + long startTime = System.currentTimeMillis(); + logger.trace("start time - " + startTime); + + Item rootItem = ItemBuilder.getItem(null, root, root.getPath(), showableTypes, filterCriteria, true); + rootItem.setName(WorkspaceExplorerAppConstants.HOME_LABEL); + rootItem.setIsRoot(true); + + /* SPECIAL FOLDERS + Item specialFolders = ItemBuilder.getItem(null, specials, showableTypes, filterCriteria, 2); + specialFolders.setShared(true); + rootItem.addChild(specialFolders); + */ + if (purgeEmpyFolders) { + rootItem = ItemBuilder.purgeEmptyFolders(rootItem); + } + + logger.trace("Returning:"); + Long endTime = System.currentTimeMillis() - startTime; + String time = String.format("%d msc %d sec", endTime, TimeUnit.MILLISECONDS.toSeconds(endTime)); + logger.info("end time - " + time); + + Collections.sort(rootItem.getChildren(), new ItemComparator()); + logger.info("Returning children size: "+rootItem.getChildren().size()); + + return rootItem; + + } catch (Exception e) { + logger.error("Error during root retrieving", e); + throw new WorkspaceNavigatorServiceException("Sorry, an error occurred when performing get root"); + } + } + + /** + * {@inheritDoc} + */ + @Override + public Item getFolder(Item item, List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria) throws WorkspaceNavigatorServiceException { + logger.trace("getFolder item: "+item+" showableTypes: "+showableTypes+" purgeEmpyFolders: "+purgeEmpyFolders+" filterCriteria: "+filterCriteria); + + try { + + if(item==null || item.getId()==null) + throw new Exception("Item id is null"); + + Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); + WorkspaceItem folder = workspace.getItem(item.getId()); + + logger.trace("GetFolder - Replyiing folder"); + long startTime = System.currentTimeMillis(); + logger.trace("start time - " + startTime); + + String path = item.getPath()!=null && !item.getPath().isEmpty()?item.getPath():folder.getPath(); + + Item itemFolder = ItemBuilder.getItem(null, folder, path, showableTypes, filterCriteria, true); +// _log.trace("Only showable types:"); + + if (purgeEmpyFolders) { + itemFolder = ItemBuilder.purgeEmptyFolders(itemFolder); + } + + logger.trace("Returning:"); + Long endTime = System.currentTimeMillis() - startTime; + String time = String.format("%d msc %d sec", endTime, TimeUnit.MILLISECONDS.toSeconds(endTime)); + logger.info("end time - " + time); + + Collections.sort(itemFolder.getChildren(), new ItemComparator()); + + return itemFolder; + + } catch (Exception e) { + logger.error("Error during folder retrieving", e); + throw new WorkspaceNavigatorServiceException("Sorry, an error occurred when performing get folder"); + } + } + + /* (non-Javadoc) + * @see org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService#getItemByCategory(org.gcube.portlets.widgets.wsexplorer.shared.ItemCategory) + */ + @Override + public Item getItemByCategory(ItemCategory category) throws WorkspaceNavigatorServiceException{ + logger.trace("GetItemByCategory category: "+category); + try { + Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); + Item item = null; + + switch(category){ + case HOME:{ + WorkspaceItem root = workspace.getRoot(); + ASLSession session = WsUtil.getASLSession(this.getThreadLocalRequest().getSession()); +// String fullName = UserUtil.getUserFullName(session.getUsername()); + String fullName = session.getUsername(); + if(fullName.indexOf(" ")>0){ + fullName = fullName.substring(0, fullName.indexOf(" ")); + }else if(fullName.indexOf(".")>0){ + fullName = fullName.substring(0, fullName.indexOf(".")); + } + item = new Item(null, root.getId(), fullName+"'s", ItemType.FOLDER, root.getPath(), root.getOwner().getPortalLogin(), null, true, true); + break; + } + case VRE_FOLDER:{ + WorkspaceItem folder = workspace.getMySpecialFolders(); + item = new Item(null, folder.getId(), WorkspaceExplorerAppConstants.VRE_FOLDERS_LABEL, ItemType.FOLDER, folder.getPath(), folder.getOwner().getPortalLogin(), null, true, false); + //SET SPECIAL FOLDER /Workspace/MySpecialFolders + item.setSpecialFolder(true); + break; + } + } + return item; + } catch (Exception e) { + logger.error("Error during get item by category", e); + throw new WorkspaceNavigatorServiceException("Sorry, an error occurred when performing get item by category"); + } + } + + /** + * {@inheritDoc} + */ + @Override + public Item getMySpecialFolder(List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria) throws WorkspaceNavigatorServiceException { + logger.trace("GetMySpecialFolder showableTypes: "+showableTypes+" purgeEmpyFolders: "+purgeEmpyFolders+" filterCriteria: "+filterCriteria); + + try { + + Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); + WorkspaceItem folder = workspace.getMySpecialFolders(); + + long startTime = System.currentTimeMillis(); + logger.trace("start time - " + startTime); + + Item itemFolder = ItemBuilder.getItem(null, folder, folder.getPath(), showableTypes, filterCriteria, true); + //OVERRIDING VRE FOLDERS NAME - SET SPECIAL FOLDER /Workspace/MySpecialFolders + itemFolder.setName(WorkspaceExplorerAppConstants.VRE_FOLDERS_LABEL); + itemFolder.setSpecialFolder(true); + + logger.trace("Builded MySpecialFolder: "+itemFolder); + + logger.trace("Only showable types:"); + //printName("", folderItem); + + if (purgeEmpyFolders) { + itemFolder = ItemBuilder.purgeEmptyFolders(itemFolder); + } + + logger.trace("Returning:"); + + Long endTime = System.currentTimeMillis() - startTime; + String time = String.format("%d msc %d sec", endTime, TimeUnit.MILLISECONDS.toSeconds(endTime)); + logger.trace("end time - " + time); + + //printName("", folderItem); + + Collections.sort(itemFolder.getChildren(), new ItemComparator()); + + return itemFolder; + + } catch (Exception e) { + logger.error("Error during special folders retrieving", e); + throw new WorkspaceNavigatorServiceException("Sorry, an error occurred when performing get My Special Folder"); + } + } + + + /** + * {@inheritDoc} + */ + @Override + public boolean checkName(String name) throws WorkspaceNavigatorServiceException { + logger.trace("checkName name: "+name); + try { + ASLSession session = WsUtil.getASLSession(this.getThreadLocalRequest().getSession()); + Workspace workspace = HomeLibrary.getUserWorkspace(session.getUsername()); + return workspace.isValidName(name); + } catch (Exception e) { + logger.error("Error during folder retrieving", e); + throw new WorkspaceNavigatorServiceException(e.getMessage()); + } + } + + /*protected void printName(String indentation, Item item) + { + if(item!=null){ + _log.trace(indentation+item.getName()); + for (Item child:item.getChildren()) printName(indentation+"\t", child); + } + }*/ + + /** + * Gets Breadcrumbs (the list of parents) by item identifier. + * + * @param itemIdentifier the item identifier + * @param includeItemAsParent - if parameter is true and item passed in input is a folder, the folder is included in path returned as last parent + * @return the list parents by item identifier + * @throws Exception the exception + */ + @Override + public List getBreadcrumbsByItemIdentifier(String itemIdentifier, boolean includeItemAsParent) throws Exception { + logger.trace("ListParents By Item Identifier "+ itemIdentifier); + try { + + Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); + WorkspaceItem wsItem = workspace.getItem(itemIdentifier); + logger.trace("workspace retrieve item name: "+wsItem.getName()); + List parents = workspace.getParentsById(itemIdentifier); + logger.trace("parents size: "+parents.size()); + Item[] arrayParents; + + if(includeItemAsParent==true && wsItem.isFolder()){ + arrayParents = new Item[parents.size()]; + arrayParents[parents.size()-1] = ItemBuilder.buildFolderForBreadcrumbs((WorkspaceFolder) wsItem, null); + } + else { + arrayParents = new Item[parents.size()-1]; + } + + /** HANDLE MY_SPECIAL_FOLDER TO AVOID COMPLETE PATH WORKSPACE/MY_SPECIAL_FOLDER + * BUT RETURNING ONLY /MY_SPECIAL_FOLDER + */ + if(wsItem.isFolder()){ + if(ItemBuilder.isSpecialFolder((WorkspaceFolder) wsItem)){ + return new ArrayList(Arrays.asList(arrayParents)); + } + } + + //CONVERTING PATH + logger.trace("converting path from second-last.."); + for (int i = parents.size()-2; i >= 0; i--) { + WorkspaceFolder wsParentFolder = (WorkspaceFolder) parents.get(i); + arrayParents[i] = ItemBuilder.buildFolderForBreadcrumbs(wsParentFolder, null); + if(arrayParents[i].isSpecialFolder()){ //SKIP HOME PARENT FOR MY_SPECIAL_FOLDER + logger.info("arrayParents index "+i+" is special folder, exit"); + break; + } + } + + //SET PARENTS + logger.trace("setting parents.."); + for(int i=0; i breadcrumbs = new ArrayList(arrayParents.length-1); + for (int i=1; i(Arrays.asList(arrayParents)); + } + + } catch (Exception e) { + logger.error("Error in get List Parents By Item Identifier ", e); + throw new Exception("Sorry, an error occurred during path retrieving!"); + } + } + + /** + * Gets the parents by item identifier to limit. + * + * @param itemIdentifier the item identifier + * @param parentLimit the parent limit + * @param includeItemAsParent the include item as parent + * @return the parents by item identifier to limit + * @throws Exception the exception + */ + @Override + public List getBreadcrumbsByItemIdentifierToParentLimit(String itemIdentifier, String parentLimit, boolean includeItemAsParent) throws Exception { + logger.trace("getBreadcrumbsByItemIdentifierToParentLimit by Item Identifier " + itemIdentifier +" and limit: "+parentLimit); + try { + + Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); + WorkspaceItem wsItem = workspace.getItem(itemIdentifier); + logger.trace("workspace retrieve item name: "+wsItem.getName()); + List parents = workspace.getParentsById(itemIdentifier); + logger.trace("parents size: "+parents.size()); + Item[] arrayParents; + + if(includeItemAsParent==true && wsItem.isFolder()){ + arrayParents = new Item[parents.size()]; + arrayParents[parents.size()-1] = ItemBuilder.buildFolderForBreadcrumbs((WorkspaceFolder) wsItem, null); + } + else { + arrayParents = new Item[parents.size()-1]; + } + + parentLimit = parentLimit!=null?parentLimit:""; + + /** HANDLE MY_SPECIAL_FOLDER TO AVOID COMPLETE PATH WORKSPACE/MY_SPECIAL_FOLDER + * BUT RETURNING ONLY /MY_SPECIAL_FOLDER + */ + if(wsItem.isFolder()){ + if(ItemBuilder.isSpecialFolder((WorkspaceFolder) wsItem)){ + logger.debug("item id is special folder, returning"); + return new ArrayList(Arrays.asList(arrayParents)); + } + + if(itemIdentifier.compareTo(parentLimit)==0){ + logger.debug("item and parent limit are identical element, returning"); + return new ArrayList(Arrays.asList(arrayParents)); + } + + } + + //CONVERTING PATH + logger.trace("converting path from second-last.."); + for (int i = parents.size()-2; i >= 0; i--) { + WorkspaceFolder wsParentFolder = (WorkspaceFolder) parents.get(i); + arrayParents[i] = ItemBuilder.buildFolderForBreadcrumbs(wsParentFolder, null); + if(arrayParents[i].isSpecialFolder()){ //SKIP HOME PARENT FOR MY_SPECIAL_FOLDER + logger.info("arrayParents index "+i+" is special folder, break"); + break; + }else if(parentLimit.compareTo(arrayParents[i].getId())==0){ + logger.info("reached parent limit "+parentLimit+", break"); + break; + } + } + + //SET PARENTS + logger.trace("setting parents.."); + for(int i=0; i breadcrumbs = new ArrayList(); + for (int i=1; i(Arrays.asList(arrayParents)); + } + + } catch (Exception e) { + logger.error("Error in get List Parents By Item Identifier ", e); + throw new Exception("Sorry, an error occurred during path retrieving!"); + } + } + + /* (non-Javadoc) + * @see org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService#loadSizeByItemId(java.lang.String) + */ + @Override + public Long getSizeByItemId(String itemId) throws Exception { + + logger.info("get Size By ItemId "+ itemId); + try { + + Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); + WorkspaceItem wsItem = workspace.getItem(itemId); + Long size = new Long(-1); + + if(wsItem instanceof FolderItem){ //ITEM + FolderItem folderItem = (FolderItem) wsItem; + size = new Long(folderItem.getLength()); + } else if (wsItem instanceof WorkspaceFolder ){ //FOLDER + WorkspaceFolder theFolder = (WorkspaceFolder) wsItem; + size = theFolder.getSize(); + } else if (wsItem instanceof WorkspaceSharedFolder){ //SHARED FOLDER + WorkspaceSharedFolder theFolder = (WorkspaceSharedFolder) wsItem; + size = theFolder.getSize(); + } + logger.info("returning size: " +size); + return size; + + } catch (Exception e) { + logger.error("get Size By ItemId ", e); + throw new Exception(e.getMessage()); + } + } + + /* (non-Javadoc) + * @see org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService#getMimeType(java.lang.String) + */ + @Override + public String getMimeType(String itemId) throws Exception { + + logger.info("get MimeType By ItemId "+ itemId); + try { + + Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); + WorkspaceItem wsItem = workspace.getItem(itemId); + + if(!wsItem.getType().equals(WorkspaceItemType.FOLDER_ITEM)) { + return null; + } + + FolderItem folderItem = (FolderItem) wsItem; + + return folderItem.getMimeType(); + + } catch (Exception e) { + logger.error("get MimeType By ItemId ", e); + throw new Exception(e.getMessage()); + } + } + + + /** + * Gets the user acl for folder id. + * + * @param folderId the folder id + * @return the user acl for folder id + * @throws Exception the exception + */ + @Override + public String getUserACLForFolderId(String folderId) throws Exception{ + try { + logger.info("Get user ACL to FOLDER id: "+folderId); + Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); + WorkspaceItem wsItem = workspace.getItem(folderId); + + if(!isASharedFolder(wsItem, false)) { + return "OWNER"; + } + else { + return wsItem.getACLUser().toString(); + } + } catch (Exception e) { + logger.error("Error in server get UserACLForFolderId", e); + String error = "An error occurred when getting ACL rules for selected folder. "+e.getMessage(); + throw new Exception(error); + } + } + + + /** + * Checks if is a shared folder. + * + * @param item the item + * @param asRoot the as root + * @return true, if is a shared folder + */ + private boolean isASharedFolder(WorkspaceItem item, boolean asRoot){ + try { + + if(item!=null && item.isFolder() && item.isShared()){ //IS A SHARED SUB-FOLDER + if(asRoot) + { + return item.getType().equals(WorkspaceItemType.SHARED_FOLDER); //IS ROOT? + } + + return true; + } + return false; + }catch(Exception e){ + logger.error("Error in server isASharedFolder", e); + return false; + } + } + + + /* (non-Javadoc) + * @see org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService#getFormattedSizeByItemId(java.lang.String, org.gcube.portlets.widgets.wsexplorer.shared.SizeFormatter) + */ + @Override + public String getReadableSizeByItemId(String itemId) throws Exception { + + try{ + logger.info("getFormattedSize ByItemId "+ itemId); + long size = getSizeByItemId(itemId); + return StringUtil.readableFileSize(size); + } catch (Exception e) { + logger.error("getFormattedSize By ItemId ", e); + throw new Exception(e.getMessage()); + } + } + + /* (non-Javadoc) + * @see org.gcube.portlets.user.workspaceexplorerapp.client.rpc.WorkspaceExplorerAppService#createFolder(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public Item createFolder(String nameFolder, String description, String parentId) throws Exception { + + logger.debug("creating folder: "+nameFolder +", parent id: "+parentId); + + try { + + if(parentId==null || parentId.isEmpty()) + throw new Exception("Parent id is null or empty"); + + if(nameFolder == null) + nameFolder = "Empty Folder"; + + Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); + WorkspaceFolder wsFolder = workspace.createFolder(nameFolder, description, parentId); + List allTypes = Arrays.asList(ItemType.values()); + + Item parent = null; + try{ + String parentPath = wsFolder.getParent()!=null?wsFolder.getParent().getPath():""; + parent = ItemBuilder.getItem(null, wsFolder.getParent(), parentPath, allTypes, null, false); + }catch(Exception e){ + logger.error("Get parent thown an exception, is it the root id? "+parentId); + } + + //TODO PATCH TO AVOID PROBLEM ON GETPATH. FOR EXAMPLE WHEN PARENT IS ROOT + String itemPath = null; + try{ + itemPath = wsFolder.getPath(); + }catch(Exception e){ + logger.error("Get path thown an exception, for id: "+wsFolder.getId()); + itemPath= wsFolder.isFolder()?workspace.getRoot().getPath()+"/"+wsFolder.getName():workspace.getRoot().getPath(); + } + + return ItemBuilder.getItem(parent, wsFolder, itemPath, allTypes, null, false); + + } catch(InsufficientPrivilegesException e){ + String error = "Insufficient Privileges to create the folder"; + logger.error(error, e); + throw new Exception(error); + } catch (ItemAlreadyExistException e) { + String error = "An error occurred on creating folder, " +e.getMessage(); + logger.error(error, e); + throw new Exception(error); + } catch (Exception e) { + String error = "An error occurred on the sever during creating folder. Try again"; + logger.error(error, e); + throw new Exception(error); + } + + } + + + /** + * Gets the public link for item id. + * + * @param itemId the item id + * @return the public link for item id + * @throws Exception the exception + */ + @Override + public String getPublicLinkForItemId(String itemId) throws Exception{ + + logger.trace("get Public Link For ItemId: "+ itemId); + try{ + + if(itemId==null) + throw new Exception("Sorry, The Public Link for empty item is unavailable (itemId is null)"); + + Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); + WorkspaceItem wsItem = workspace.getItem(itemId); + + if(wsItem==null) + throw new Exception("Sorry, The Public Link for empty item is unavailable"); + + if(wsItem.getType().equals(WorkspaceItemType.FOLDER_ITEM)){ + + FolderItem folderItem = (FolderItem) wsItem; + String uriRequest = folderItem.getPublicLink(false); + + if(uriRequest==null || uriRequest.isEmpty()) + throw new Exception("Sorry, public link on "+folderItem.getName() +" is not available"); + + return uriRequest; + + }else{ + logger.warn("ItemId: "+ itemId +" is not available, sent exception Public Link unavailable"); + throw new Exception("Sorry, The Public Link for selected item is unavailable"); + } + + }catch (Exception e) { + logger.error("Error getPublicLinkForItemId for item: "+itemId, e); + throw new Exception(e.getMessage()); + } + + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/WsUtil.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/WsUtil.java new file mode 100644 index 0000000..b154e9a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/server/WsUtil.java @@ -0,0 +1,89 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.server; + +import javax.servlet.http.HttpSession; + +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.application.framework.core.session.SessionManager; +import org.gcube.common.homelibrary.home.HomeLibrary; +import org.gcube.common.homelibrary.home.exceptions.HomeNotFoundException; +import org.gcube.common.homelibrary.home.exceptions.InternalErrorException; +import org.gcube.common.homelibrary.home.workspace.Workspace; +import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException; +import org.gcube.common.scope.api.ScopeProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The Class WsUtil. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 7, 2016 + */ +public class WsUtil { + + public static final String USERNAME_ATTRIBUTE = "username"; + public static final String TEST_USER = "francesco.mangiacrapa"; + public static final String TEST_SCOPE = "/gcube/devsec/devVRE"; + + public static final Logger logger = LoggerFactory.getLogger(WsUtil.class); + + /** + * Gets the ASL session. + * + * @param httpSession the http session + * @return the ASL session + */ + public static ASLSession getASLSession(HttpSession httpSession) { + String sessionID = httpSession.getId(); + String user = (String) httpSession.getAttribute(USERNAME_ATTRIBUTE); + + //TODO we check for the older attribute name + if (user == null) { + user = (String) httpSession.getAttribute("user"); + } + + if (user == null) { + + logger.error("WORKSPACE PORTLET STARTING IN TEST MODE - NO USER FOUND"); + + //for test only +// user = "test.user"; + user = TEST_USER; + httpSession.setAttribute(USERNAME_ATTRIBUTE, user); + ASLSession session = SessionManager.getInstance().getASLSession(sessionID, user); + session.setScope(TEST_SCOPE); + + return session; + } + else { + logger.trace("user found in session "+user); + } + return SessionManager.getInstance().getASLSession(sessionID, user); + } + + /** + * Gets the workspace. + * + * @param httpSession the http session + * @return the workspace + * @throws InternalErrorException the internal error exception + * @throws HomeNotFoundException the home not found exception + * @throws WorkspaceFolderNotFoundException the workspace folder not found exception + */ + public static Workspace getWorkspace(HttpSession httpSession) throws InternalErrorException, HomeNotFoundException, WorkspaceFolderNotFoundException { + ASLSession session = getASLSession(httpSession); + logger.trace("Scope : "+session.getScope() + " username: "+session.getUsername()); + String scope = session.getScope(); + if(scope==null) + scope= WsUtil.TEST_SCOPE; + System.out.println("Scope : "+scope + " username: "+session.getUsername()); + ScopeProvider.instance.set(scope); + Workspace workspace = HomeLibrary.getUserWorkspace(session.getUsername()); + return workspace; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/FilterCriteria.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/FilterCriteria.java new file mode 100644 index 0000000..be91461 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/FilterCriteria.java @@ -0,0 +1,116 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.shared; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + + +/** + * The Class FilterCriteria. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 18, 2015 + */ +public class FilterCriteria implements Serializable { + + + private static final long serialVersionUID = 1912760277441333686L; + protected List allowedMimeTypes; + protected Map requiredProperties; + protected List allowedFileExtensions; + + /** + * Instantiates a new filter criteria. + */ + public FilterCriteria(){} + + + /** + * Instantiates a new filter criteria. + * + * @param allowedMimeTypes the allowed mime types + * @param allowedFileExtensions the allowed file extensions + * @param requiredProperties the required properties + */ + public FilterCriteria(List allowedMimeTypes, List allowedFileExtensions, Map requiredProperties) { + this.allowedMimeTypes = allowedMimeTypes; + this.allowedFileExtensions = allowedFileExtensions; + this.requiredProperties = requiredProperties; + } + + /** + * Sets the allowed mime types. + * + * @param allowedMimeTypes the allowedMimeTypes to set + */ + public void setAllowedMimeTypes(List allowedMimeTypes) { + this.allowedMimeTypes = allowedMimeTypes; + } + + + /** + * Sets the required properties. + * + * @param requiredProperties the requiredProperties to set + */ + public void setRequiredProperties(Map requiredProperties) { + this.requiredProperties = requiredProperties; + } + + + /** + * Sets the allowed file extensions. + * + * @param allowedFileExtensions the allowedFileExtensions to set + */ + public void setAllowedFileExtensions(List allowedFileExtensions) { + this.allowedFileExtensions = allowedFileExtensions; + } + + /** + * Gets the allowed file extensions. + * + * @return the allowed file extensions + */ + public List getAllowedFileExtensions() { + return allowedFileExtensions; + } + + /** + * Gets the allowed mime types. + * + * @return the allowedMimeTypes + */ + public List getAllowedMimeTypes() { + return allowedMimeTypes; + } + + /** + * Gets the required properties. + * + * @return the requiredProperties + */ + public Map getRequiredProperties() { + return requiredProperties; + } + + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("FilterCriteria [allowedMimeTypes="); + builder.append(allowedMimeTypes); + builder.append(", requiredProperties="); + builder.append(requiredProperties); + builder.append(", allowedFileExtensions="); + builder.append(allowedFileExtensions); + builder.append("]"); + return builder.toString(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/HandlerResultMessage.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/HandlerResultMessage.java new file mode 100644 index 0000000..c09c132 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/HandlerResultMessage.java @@ -0,0 +1,153 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.shared; + +import java.io.Serializable; + + +/** + * The Class HandlerResultMessage. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 7, 2016 + */ +public class HandlerResultMessage implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = -817188198850449565L; + + /** + * The Enum Status. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Mar 7, 2016 + */ + public enum Status { + /** + * If an error occurs. + */ + ERROR, + /** + * If no error occurs. + */ + OK, + /** + * If there was some problems. + */ + WARN, + + /** + * If the result is unknown. + */ + UNKNOWN; + } + + /** + * Error result. + * + * @param message the message + * @return the handler result message + */ + public static HandlerResultMessage errorResult(String message){ + return new HandlerResultMessage(Status.ERROR, message); + } + + /** + * Ok result. + * + * @param message the message + * @return the handler result message + */ + public static HandlerResultMessage okResult(String message){ + return new HandlerResultMessage(Status.OK, message); + } + + /** + * Warn result. + * + * @param message the message + * @return the handler result message + */ + public static HandlerResultMessage warnResult(String message){ + return new HandlerResultMessage(Status.WARN, message); + } + + /** + * Parses the result. + * + * @param result the result + * @return the handler result message + */ + public static HandlerResultMessage parseResult(String result){ + //expected 200:Upload complete + String statusToken = null; + String messageToken = null; + + int index = result.indexOf(':'); + if (index>0){ + statusToken = result.substring(0,index); + if (index children; + private String owner; + private boolean isFolder; + private boolean isSpecialFolder = false; + private boolean isSharedFolder = false; + private boolean isRoot = false; + private Date creationDate; + + /** + * Instantiates a new item. + */ + public Item() { + } + /** + * Instantiates a new item. + * + * @param id the id + * @param name the name + * @param isFolder the is folder + */ + public Item(String id, String name, boolean isFolder) { + this.id = id; + this.isFolder = isFolder; + this.name = name; + } + + /** + * Instantiates a new item. + * + * @param parent the parent + * @param id the id + * @param name the name + * @param type the type + * @param path the path + * @param owner the owner + * @param date the creationDate + * @param isFolder the is folder + * @param isRoot the is root + */ + public Item(Item parent, String id, String name, ItemType type, String path, String owner, Date creationDate, boolean isFolder, boolean isRoot) { + this(id, name, isFolder); + this.parent = parent; + this.type = type; + this.path = path; + this.children = new ArrayList(); + this.owner = owner; + this.creationDate = creationDate; + this.isRoot = isRoot; + } + + + /** + * @return the creationDate + */ + public Date getCreationDate() { + + return creationDate; + } + + /** + * @param creationDate the creationDate to set + */ + public void setCreationDate(Date creationDate) { + + this.creationDate = creationDate; + } + /** + * Sets the id. + * + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + + /** + * Checks if is root. + * + * @return true, if is root + */ + public boolean isRoot() { + return isRoot; + } + + /** + * Sets the is root. + * + * @param isRoot the is root + * @return true, if successful + */ + public void setIsRoot(boolean isRoot) { + this.isRoot = isRoot; + } + + /** + * Checks if is folder. + * + * @return the isFolder + */ + public boolean isFolder() { + return isFolder; + } + + /** + * Sets the folder. + * + * @param isFolder + * the isFolder to set + */ + public void setFolder(boolean isFolder) { + this.isFolder = isFolder; + } + + /** + * Checks if is shared folder. + * + * @return the isSharedFolder + */ + public boolean isSharedFolder() { + return isSharedFolder; + } + + /** + * Sets the shared folder. + * + * @param isSharedFolder + * the isSharedFolder to set + */ + public void setSharedFolder(boolean isSharedFolder) { + this.isSharedFolder = isSharedFolder; + } + + /** + * The item parent. Null if is the root. + * + * @return the item parent. + */ + public Item getParent() { + return parent; + } + + /** + * The item id. + * + * @return the id. + */ + public String getId() { + return id; + } + + /** + * The item name. + * + * @return the name. + */ + public String getName() { + return name; + } + + /** + * The item type. + * + * @return the type. + */ + public ItemType getType() { + return type; + } + + /** + * The item children. + * + * @return the children. + */ + public ArrayList getChildren() { + return children; + } + + /** + * Gets the owner. + * + * @return the owner + */ + public String getOwner() { + return owner; + } + + /** + * Sets the name. + * + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * Sets the owner. + * + * @param owner + * the owner to set + */ + public void setOwner(String owner) { + this.owner = owner; + } + + /** + * The item child. + * + * @param index + * the index + * @return the child at the specific position. + */ + public Item getChild(int index) { + return children.get(index); + } + + /** + * Add a child to this item. + * + * @param child + * the child to add. + */ + public void addChild(Item child) { + children.add(child); + } + + /** + * Remove a child from this item. + * + * @param child + * the child + */ + public void removeChild(Item child) { + children.remove(child); + } + + /** + * Checks if is special folder. + * + * @return the isSpecialFolder + */ + public boolean isSpecialFolder() { + return isSpecialFolder; + } + + /** + * Sets the special folder. + * + * @param isSpecialFolder the isSpecialFolder to set + */ + public void setSpecialFolder(boolean isSpecialFolder) { + this.isSpecialFolder = isSpecialFolder; + } + + /** + * Gets the path. + * + * @return the path + */ + public String getPath() { + return path; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (id == null ? 0 : id.hashCode()); + return result; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Item other = (Item) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else if (!id.equals(other.id)) { + return false; + } + return true; + } + + /** + * Sets the parent. + * + * @param parent + * the new parent + */ + public void setParent(Item parent) { + this.parent = parent; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + + StringBuilder builder = new StringBuilder(); + builder.append("Item [id="); + builder.append(id); + builder.append(", name="); + builder.append(name); + builder.append(", type="); + builder.append(type); + builder.append(", path="); + builder.append(path); + builder.append(", children="); + builder.append(children); + builder.append(", owner="); + builder.append(owner); + builder.append(", isFolder="); + builder.append(isFolder); + builder.append(", isSpecialFolder="); + builder.append(isSpecialFolder); + builder.append(", isSharedFolder="); + builder.append(isSharedFolder); + builder.append(", isRoot="); + builder.append(isRoot); + builder.append(", creationDate="); + builder.append(creationDate); + builder.append("]"); + return builder.toString(); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/ItemCategory.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/ItemCategory.java new file mode 100644 index 0000000..b1b7cce --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/ItemCategory.java @@ -0,0 +1,17 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.shared; + + +/** + * The Enum ItemCategory. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 30, 2015 + */ +public enum ItemCategory { + + HOME, + VRE_FOLDER; +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/ItemInterface.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/ItemInterface.java new file mode 100644 index 0000000..243ce06 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/ItemInterface.java @@ -0,0 +1,28 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.shared; + + +/** + * The Interface IntemInterface. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 22, 2016 + */ +public interface ItemInterface { + + /** + * Gets the parent. + * + * @return the parent + */ + ItemInterface getParent(); + + /** + * Gets the id. + * + * @return the id + */ + String getId(); +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/ItemType.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/ItemType.java new file mode 100644 index 0000000..e71f6b7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/ItemType.java @@ -0,0 +1,31 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.shared; + + +/** + * The Enum ItemType. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 18, 2015 + */ +public enum ItemType { + + FOLDER, //MANDATORY + EXTERNAL_IMAGE, + EXTERNAL_FILE, + EXTERNAL_PDF_FILE, + EXTERNAL_URL, + QUERY, + REPORT_TEMPLATE, + REPORT, + DOCUMENT, + METADATA, + PDF_DOCUMENT, + IMAGE_DOCUMENT, + URL_DOCUMENT, + GCUBE_ITEM, + TIME_SERIES, + UNKNOWN_TYPE; +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/PublicLink.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/PublicLink.java new file mode 100644 index 0000000..74a91be --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/PublicLink.java @@ -0,0 +1,94 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.shared; + +import java.io.Serializable; + + +/** + * The Class PublicLink. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 23, 2016 + */ +public class PublicLink implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 4050358438512028240L; + private String completeURL; + private String shortURL; + + /** + * Instantiates a new public link. + */ + public PublicLink() { + + } + + /** + * Instantiates a new public link. + * + * @param completeURL the complete url + * @param shortURL the short url + */ + public PublicLink(String completeURL, String shortURL) { + super(); + this.completeURL = completeURL; + this.shortURL = shortURL; + } + + /** + * Gets the complete url. + * + * @return the completeURL + */ + public String getCompleteURL() { + return completeURL; + } + + /** + * Gets the short url. + * + * @return the shortURL + */ + public String getShortURL() { + return shortURL; + } + + /** + * Sets the complete url. + * + * @param completeURL the completeURL to set + */ + public void setCompleteURL(String completeURL) { + this.completeURL = completeURL; + } + + /** + * Sets the short url. + * + * @param shortURL the shortURL to set + */ + public void setShortURL(String shortURL) { + this.shortURL = shortURL; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("PublicLink [completeURL="); + builder.append(completeURL); + builder.append(", shortURL="); + builder.append(shortURL); + builder.append("]"); + return builder.toString(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/SizeFormatter.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/SizeFormatter.java new file mode 100644 index 0000000..8e91f8a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/SizeFormatter.java @@ -0,0 +1,49 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.shared; + + +/** + * The Enum SizeFormatter. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 22, 2016 + */ +public enum SizeFormatter { + + KB("KB", 1024), + MB("MB", 1048576); + + private long value; + private String unit; + + /** + * Instantiates a new size formatter. + * + * @param unit the unit + * @param value the value + */ + private SizeFormatter(String unit, long value) { + this.unit = unit; + this.value = value; + } + + /** + * Gets the value. + * + * @return the value + */ + public long getValue() { + return value; + } + + /** + * Gets the unit. + * + * @return the unit + */ + public String getUnit() { + return unit; + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/WorkspaceNavigatorServiceException.java b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/WorkspaceNavigatorServiceException.java new file mode 100644 index 0000000..7ba8e2d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspaceexplorerapp/shared/WorkspaceNavigatorServiceException.java @@ -0,0 +1,35 @@ +/** + * + */ +package org.gcube.portlets.user.workspaceexplorerapp.shared; + + +/** + * The Class WorkspaceNavigatorServiceException. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 18, 2015 + */ +public class WorkspaceNavigatorServiceException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 6416932531764081333L; + + /** + * Instantiates a new workspace navigator service exception. + */ + public WorkspaceNavigatorServiceException() { + } + + /** + * Instantiates a new workspace navigator service exception. + * + * @param message the message + */ + public WorkspaceNavigatorServiceException(String message) { + super(message); + } + +} diff --git a/src/main/resources/org/gcube/portlets/user/workspaceexplorerapp/WorkspaceExplorerApp.gwt.xml b/src/main/resources/org/gcube/portlets/user/workspaceexplorerapp/WorkspaceExplorerApp.gwt.xml new file mode 100644 index 0000000..cfc709d --- /dev/null +++ b/src/main/resources/org/gcube/portlets/user/workspaceexplorerapp/WorkspaceExplorerApp.gwt.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..74c8c9c --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,31 @@ + + + + WorkspaceExplorerApp.html + + + workspaceExplorerAppServlet + org.gcube.portlets.user.workspaceexplorerapp.server.WorkspaceExplorerAppServiceImpl + + + DownloadServlet + org.gcube.portlets.user.workspaceexplorerapp.server.DownloadWorkspaceExplorerServlet + + + workspaceExplorerAppServlet + /workspaceexplorerapp/WorkspaceExplorerAppService + + + DownloadServlet + /workspaceexplorerapp/DownloadServlet + + + workspace-explorer-app + + + WorkspaceExplorerApp.html + + \ No newline at end of file diff --git a/src/main/webapp/WorkspaceExplorerApp.css b/src/main/webapp/WorkspaceExplorerApp.css new file mode 100644 index 0000000..e068e2b --- /dev/null +++ b/src/main/webapp/WorkspaceExplorerApp.css @@ -0,0 +1,209 @@ +/* TEMPLATE START*/ +html, body { + height: 100%; +} + +#wrap_we { + min-height: 100%; +} + +#header_we { + height: 90px; + background: linear-gradient(to bottom, #FFFFFF, #F5F5F5); + border-bottom: 2px solid #8F8F8F; +} + +#content_we { + /* overflow: auto; */ + overflow: hidden; + padding-bottom: 50px; /* must be same height as the footer */ +} + +#footer_we { + position: relative; + margin-top: -50px; /* negative value of footer height */ + height: 50px; + clear: both; + /* background-color: #7F7F7F; */ + background: url("img/dark-noise.png") repeat scroll 0 0 #2196F3; + width: 100%; + text-align: center; + vertical-align: middle; + line-height: 50px; +} + +/*Opera Fix*/ +body:before { + content: ""; + height: 100%; + float: left; + width: 0; + margin-top: -32767px; +} + +#links-footer { + /* vertical-align: middle; + height: 100%; */ + color: #FFFFFF; + font-family: serif; + font-size: 13px; +} + +#links-footer a { + color: #FFF; + text-decoration: underline; + /* font-weight: bold; */ +} + +#links-footer a:HOVER { + /* text-decoration: underline; */ + +} + +#WorkspaceExplorerAppPanel>table td { + opacity: 1 !important; +} + +#WorkspaceExplorerAppPanel>table th { + opacity: 1 !important; +} + +/********************/ +/*WORKSPACE EXPLORER*/ +.navigation_explorer_app { + padding-top: 48px; + height: 100%; + /* margin-right: 2px; */ + text-align: center; + /* border-right: 1px solid #8F8F8F; */ +} + +.table-overflow td, th { + overflow: hidden !important; + height: 100%; +} + +.table-overflow th:FIRST-CHILD { + width: 20px !important; +} + +.table-overflow tr:FIRST-CHILD { + width: 20px !important; +} + +#workspaceEplorerApplicationDiv { + width: 100%; + height: 100%; +} + +.view_items_explorer_app { + margin-top: 2px; +} + +.workspace-explorer-container :FIRST-CHILD td { + padding-top: 0px !important; + padding-bottom: 0px !important; +} + +.navigation_link li:HOVER { + /*background-color: transparent !important;*/ + text-decoration: underline !important; + color: #2196F3; +} + +.navigation_link .side-nav li.active { + background-color: transparent !important; +} + +/********************/ +.breadcrumbs-we { + /* font-size: 13px; */ + list-style: none outside none; + margin-bottom: 3px; + margin-left: 2px; + margin-top: 3px; + padding: 10px !important; + background-color: #F5F5F5; + border-radius: 4px; + font-size: 14px; +} + +.breadcrumbs-we li { + display: inline-block; +} + +.breadcrumbs-we .active { + color: #999999; + text-decoration: none; +} + +.breadcrumbs-we .divider { + color: #AABBCC; + padding: 0 3px; + background-color: transparent !important; +} + +.breadcrumbs-we a { + color: #226599; + text-decoration: none; +} + +.breadcrumbs-we a:hover { + text-decoration: underline; +} + +/*PADDING FOR TABLE (COLUMNS) OF CONTENTS (WORKSPACE ITEMS)*/ +#explorer_panel_we td { + padding-top: 15px !important; + padding-bottom: 15px !important; +} + +.context-menu-we { + -webkit-border-bottom-right-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-radius-bottomright: 5px; + -moz-border-radius-bottomleft: 5px; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + border: 1px solid #D1D1D1; + background-color: white; +} + +.context-menu-we .row { + margin: 0 !important; + /* background-color: #B5C5DF; */ + padding-bottom: 3px; + padding-left: 5px; + padding-right: 5px; +} + +#data_grid_explorer td { + font-size: 15px !important; +} + +.dataGridSelectedRow { + background: none repeat scroll 0 0 #A9C1EB !important; + color: #FFFFFF !important; + height: auto !important; + overflow: auto !important; +} + +.navigation-cursor { + cursor: url(img/glass_cursor.cur), auto; +} + +.popup-order { + border: 1px solid #D1D1D1; + background-color: white; +} + +.popup-order .row { + margin: 0 !important; + padding-bottom: 3px; + padding-left: 5px; + padding-right: 5px; +} + +.under-line-onhover :HOVER { + text-decoration: underline; +} \ No newline at end of file diff --git a/src/main/webapp/WorkspaceExplorerApp.html b/src/main/webapp/WorkspaceExplorerApp.html new file mode 100644 index 0000000..d825154 --- /dev/null +++ b/src/main/webapp/WorkspaceExplorerApp.html @@ -0,0 +1,46 @@ + + + + + + +Welcome - gCube Folder Explorer Application + + + + + + +
+ + + + + + +
+
+
+ +
+ + + + + + diff --git a/src/main/webapp/WorkspaceExplorerAppMaterial.html b/src/main/webapp/WorkspaceExplorerAppMaterial.html new file mode 100644 index 0000000..fab510c --- /dev/null +++ b/src/main/webapp/WorkspaceExplorerAppMaterial.html @@ -0,0 +1,25 @@ + + + + + +Welcome - gCube Folder Explorer Application + + + + + + + +
+ + + + diff --git a/src/main/webapp/error404.html b/src/main/webapp/error404.html new file mode 100644 index 0000000..2ba1a62 --- /dev/null +++ b/src/main/webapp/error404.html @@ -0,0 +1,26 @@ + + + + + +Error 404 - gCube Folder Explorer Application + + + + +
+ D4Science Workspace Folder Explorer
+

404 NOT FOUND

+
+

Sorry, the request resource is not found!

+
+ + + + diff --git a/src/main/webapp/img/d4science_workspace_logo.png b/src/main/webapp/img/d4science_workspace_logo.png new file mode 100644 index 0000000..71063db Binary files /dev/null and b/src/main/webapp/img/d4science_workspace_logo.png differ diff --git a/src/main/webapp/img/d4science_workspace_logo_180.png b/src/main/webapp/img/d4science_workspace_logo_180.png new file mode 100644 index 0000000..0def337 Binary files /dev/null and b/src/main/webapp/img/d4science_workspace_logo_180.png differ diff --git a/src/main/webapp/img/dark-noise.png b/src/main/webapp/img/dark-noise.png new file mode 100644 index 0000000..be1965d Binary files /dev/null and b/src/main/webapp/img/dark-noise.png differ diff --git a/src/main/webapp/img/gCubeWorkspace3.png b/src/main/webapp/img/gCubeWorkspace3.png new file mode 100644 index 0000000..89d04b1 Binary files /dev/null and b/src/main/webapp/img/gCubeWorkspace3.png differ diff --git a/src/main/webapp/img/gCube_70.png b/src/main/webapp/img/gCube_70.png new file mode 100644 index 0000000..018d52c Binary files /dev/null and b/src/main/webapp/img/gCube_70.png differ diff --git a/src/main/webapp/img/glass_cursor.cur b/src/main/webapp/img/glass_cursor.cur new file mode 100644 index 0000000..a22038e Binary files /dev/null and b/src/main/webapp/img/glass_cursor.cur differ diff --git a/src/main/webapp/img/glass_cursor.png b/src/main/webapp/img/glass_cursor.png new file mode 100644 index 0000000..32f491c Binary files /dev/null and b/src/main/webapp/img/glass_cursor.png differ