From 5b9195852bedbb96937facb0ccd93c227053aace Mon Sep 17 00:00:00 2001 From: "massimiliano.assante" Date: Sun, 23 Dec 2012 20:55:39 +0000 Subject: [PATCH] Maven Portlet Initial import. git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/my-vres@65384 82a268e6-3cf1-43bd-a215-b396298e98cf --- .classpath | 36 ++ .project | 59 +++ .settings/.jsdtscope | 15 + .../com.google.appengine.eclipse.core.prefs | 3 + .settings/com.google.gdt.eclipse.core.prefs | 6 + .settings/com.google.gwt.eclipse.core.prefs | 5 + .settings/org.eclipse.core.resources.prefs | 7 + .settings/org.eclipse.jdt.core.prefs | 9 + .settings/org.eclipse.m2e.core.prefs | 5 + .settings/org.eclipse.wst.common.component | 11 + ....eclipse.wst.common.project.facet.core.xml | 7 + ...rg.eclipse.wst.jsdt.ui.superType.container | 1 + .settings/org.maven.ide.eclipse.prefs | 9 + MyVREsTest-dev.launch | 22 ++ MyVREsTest-prod.launch | 22 ++ pom.xml | 138 +++++++ .../portlet/user/my_vres/client/Header.ui.xml | 10 + .../portlet/user/my_vres/client/MyVREs.java | 18 + .../user/my_vres/client/MyVREsService.java | 20 + .../my_vres/client/MyVREsServiceAsync.java | 14 + .../user/my_vres/client/NoVresPanel.java | 23 ++ .../user/my_vres/client/NoVresPanel.ui.xml | 12 + .../user/my_vres/client/VresPanel.java | 257 +++++++++++++ .../my_vres/client/widgets/BulletList.java | 25 ++ .../my_vres/client/widgets/ClickableVRE.java | 72 ++++ .../user/my_vres/client/widgets/ListItem.java | 61 +++ .../my_vres/server/MyVREsServiceImpl.java | 353 ++++++++++++++++++ .../my_vres/server/portlet/MyVREsPortlet.java | 85 +++++ .../my_vres/shared/ResearchEnvironment.java | 87 +++++ .../user/my_vres/shared/UserBelonging.java | 5 + .../gcube/portlet/user/my_vres/shared/VO.java | 70 ++++ .../portlet/user/my_vres/shared/VRE.java | 30 ++ .../gcube/portlet/user/my_vres/MyVREs.gwt.xml | 26 ++ src/main/webapp/MyVREs.css | 157 ++++++++ src/main/webapp/MyVREs.html | 38 ++ src/main/webapp/WEB-INF/jsp/MyVREs_view.jsp | 16 + src/main/webapp/WEB-INF/liferay-display.xml | 8 + .../WEB-INF/liferay-plugin-package.properties | 9 + src/main/webapp/WEB-INF/liferay-portlet.xml | 17 + src/main/webapp/WEB-INF/portlet.xml | 21 ++ src/main/webapp/WEB-INF/web.xml | 40 ++ src/main/webapp/images/loading-bar.gif | Bin 0 -> 18727 bytes src/main/webapp/images/loading.gif | Bin 0 -> 6855 bytes src/main/webapp/images/portlet_bg.png | Bin 0 -> 1182 bytes src/main/webapp/images/sampleImage.jpeg | Bin 0 -> 9240 bytes src/main/webapp/images/vos.png | Bin 0 -> 464 bytes src/main/webapp/images/vres.png | Bin 0 -> 1294 bytes .../user/my_vres/client/GwtTestMyVREs.java | 74 ++++ .../portlet/user/my_vres/MyVREsJUnit.gwt.xml | 9 + 49 files changed, 1912 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/.jsdtscope create mode 100644 .settings/com.google.appengine.eclipse.core.prefs create mode 100644 .settings/com.google.gdt.eclipse.core.prefs create mode 100644 .settings/com.google.gwt.eclipse.core.prefs create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 .settings/org.eclipse.wst.common.component create mode 100644 .settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 .settings/org.eclipse.wst.jsdt.ui.superType.container create mode 100644 .settings/org.maven.ide.eclipse.prefs create mode 100644 MyVREsTest-dev.launch create mode 100644 MyVREsTest-prod.launch create mode 100644 pom.xml create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/client/Header.ui.xml create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/client/MyVREs.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsService.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsServiceAsync.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/client/NoVresPanel.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/client/NoVresPanel.ui.xml create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/client/VresPanel.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/client/widgets/BulletList.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/client/widgets/ClickableVRE.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/client/widgets/ListItem.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/server/MyVREsServiceImpl.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/server/portlet/MyVREsPortlet.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/shared/ResearchEnvironment.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/shared/UserBelonging.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/shared/VO.java create mode 100644 src/main/java/org/gcube/portlet/user/my_vres/shared/VRE.java create mode 100644 src/main/resources/org/gcube/portlet/user/my_vres/MyVREs.gwt.xml create mode 100644 src/main/webapp/MyVREs.css create mode 100644 src/main/webapp/MyVREs.html create mode 100644 src/main/webapp/WEB-INF/jsp/MyVREs_view.jsp create mode 100644 src/main/webapp/WEB-INF/liferay-display.xml create mode 100644 src/main/webapp/WEB-INF/liferay-plugin-package.properties create mode 100644 src/main/webapp/WEB-INF/liferay-portlet.xml create mode 100644 src/main/webapp/WEB-INF/portlet.xml create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/images/loading-bar.gif create mode 100644 src/main/webapp/images/loading.gif create mode 100644 src/main/webapp/images/portlet_bg.png create mode 100644 src/main/webapp/images/sampleImage.jpeg create mode 100644 src/main/webapp/images/vos.png create mode 100644 src/main/webapp/images/vres.png create mode 100644 src/test/java/org/gcube/portlet/user/my_vres/client/GwtTestMyVREs.java create mode 100644 src/test/resources/org/gcube/portlet/user/my_vres/MyVREsJUnit.gwt.xml diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..f51e4e5 --- /dev/null +++ b/.classpath @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..9969891 --- /dev/null +++ b/.project @@ -0,0 +1,59 @@ + + + my-vres + my-vres project + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + com.google.gdt.eclipse.core.webAppProjectValidator + + + + + com.google.gwt.eclipse.core.gwtProjectValidator + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + com.google.gwt.eclipse.core.gwtNature + + diff --git a/.settings/.jsdtscope b/.settings/.jsdtscope new file mode 100644 index 0000000..ba3c245 --- /dev/null +++ b/.settings/.jsdtscope @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/.settings/com.google.appengine.eclipse.core.prefs b/.settings/com.google.appengine.eclipse.core.prefs new file mode 100644 index 0000000..a60576c --- /dev/null +++ b/.settings/com.google.appengine.eclipse.core.prefs @@ -0,0 +1,3 @@ +#Thu Jun 16 10:18:26 CEST 2011 +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..75427c9 --- /dev/null +++ b/.settings/com.google.gdt.eclipse.core.prefs @@ -0,0 +1,6 @@ +#Sun Dec 23 11:33:33 CET 2012 +eclipse.preferences.version=1 +jarsExcludedFromWebInfLib= +lastWarOutDir=/Users/massi/Documents/workspace/my-vres/target/my-vres-1.0.0-SNAPSHOT +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..c803c44 --- /dev/null +++ b/.settings/com.google.gwt.eclipse.core.prefs @@ -0,0 +1,5 @@ +#Thu Jun 16 11:14:17 CEST 2011 +eclipse.preferences.version=1 +entryPointModules= +filesCopiedToWebInfLib=gwt-servlet.jar +gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgc3JjL21haW4vd2ViYXBwXV0+PC9leHRyYS1hcmdzPjx2bS1hcmdzPjwhW0NEQVRBWy1YbXg1MTJtXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLmNvbXBhbnkuU29tZU1vZHVsZTwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+ diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..9821b3d --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,7 @@ +#Sun Dec 23 11:10:00 CET 2012 +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..ad26666 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +#Thu Sep 02 10:42:20 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +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.5 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..ab3e7c3 --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,5 @@ +#Sun Dec 23 11:09:59 CET 2012 +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..ac73cc9 --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,11 @@ + + + + + + + + + + + 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..18c1b9a --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.container b/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/.settings/org.maven.ide.eclipse.prefs b/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..dae95d4 --- /dev/null +++ b/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Thu Sep 02 10:42:12 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\\:testResources +skipCompilerPlugin=true +version=1 diff --git a/MyVREsTest-dev.launch b/MyVREsTest-dev.launch new file mode 100644 index 0000000..1b3374b --- /dev/null +++ b/MyVREsTest-dev.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/MyVREsTest-prod.launch b/MyVREsTest-prod.launch new file mode 100644 index 0000000..c94de96 --- /dev/null +++ b/MyVREsTest-prod.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..9e44bbd --- /dev/null +++ b/pom.xml @@ -0,0 +1,138 @@ + + + + + 4.0.0 + org.gcube.portlet.user + my-vres + war + 1.0.0-SNAPSHOT + My VREs Portlet + + + + 2.4.0 + + ${project.build.directory}/${project.build.finalName} + UTF-8 + + + + + com.google.gwt + gwt-user + ${gwtVersion} + + provided + + + + xerces + xercesImpl + 2.9.1 + provided + + + org.gcube.portlets.user + gcube-widgets + 1.4.0-SNAPSHOT + provided + + + org.gcube.portal + custom-portal-handler + 1.2.0-SNAPSHOT + provided + + + com.liferay.portal + portal-service + 6.0.6 + provided + + + javax.portlet + portlet-api + 2.0 + 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 + 2.4.0 + + + + compile + test + + + + + + MyVREs.html + ${webappDirectory} + org.gcube.portlet.user.my_vres.client.Messages + + + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + compile + + exploded + + + + + ${webappDirectory} + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.5 + 1.5 + + + + + + diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/Header.ui.xml b/src/main/java/org/gcube/portlet/user/my_vres/client/Header.ui.xml new file mode 100644 index 0000000..1d61461 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/client/Header.ui.xml @@ -0,0 +1,10 @@ + + + + +
+ My Virtual Research Environments +
+
+
\ No newline at end of file diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREs.java b/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREs.java new file mode 100644 index 0000000..7a19654 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREs.java @@ -0,0 +1,18 @@ +package org.gcube.portlet.user.my_vres.client; + +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.user.client.ui.RootPanel; + +/** + * Entry point classes define onModuleLoad(). + */ +public class MyVREs implements EntryPoint { + + /** + * This is the entry point method. + */ + public void onModuleLoad() { + RootPanel.get("myVREsDIV").add(new VresPanel()); + + } +} diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsService.java b/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsService.java new file mode 100644 index 0000000..2eb6ae6 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsService.java @@ -0,0 +1,20 @@ +package org.gcube.portlet.user.my_vres.client; + +import java.util.ArrayList; + +import org.gcube.portlet.user.my_vres.shared.VO; + + + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +/** + * The client side stub for the RPC service. + */ +@RemoteServiceRelativePath("greet") +public interface MyVREsService extends RemoteService { + ArrayList getInfrastructureVOs(); + + void loadLayout(String scope, String URL); +} diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsServiceAsync.java b/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsServiceAsync.java new file mode 100644 index 0000000..f339e18 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsServiceAsync.java @@ -0,0 +1,14 @@ +package org.gcube.portlet.user.my_vres.client; + +import java.util.ArrayList; + +import org.gcube.portlet.user.my_vres.shared.VO; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +public interface MyVREsServiceAsync { + void getInfrastructureVOs(AsyncCallback> callback); + + void loadLayout(String scope, String URL, AsyncCallback callback); + +} diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/NoVresPanel.java b/src/main/java/org/gcube/portlet/user/my_vres/client/NoVresPanel.java new file mode 100644 index 0000000..094f7e4 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/client/NoVresPanel.java @@ -0,0 +1,23 @@ +package org.gcube.portlet.user.my_vres.client; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; + +public class NoVresPanel extends Composite { + + private static NoVresPanelUiBinder uiBinder = GWT + .create(NoVresPanelUiBinder.class); + + interface NoVresPanelUiBinder extends UiBinder { + } + + public NoVresPanel() { + initWidget(uiBinder.createAndBindUi(this)); + } + + public NoVresPanel(String firstName) { + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/NoVresPanel.ui.xml b/src/main/java/org/gcube/portlet/user/my_vres/client/NoVresPanel.ui.xml new file mode 100644 index 0000000..10558a7 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/client/NoVresPanel.ui.xml @@ -0,0 +1,12 @@ + + + +
+ You are not subscribed to any Virtual Research Environment, + begin by + joining one.

+ Find out the Virtual Research Environments available in the infrastructure! +
+
+
\ No newline at end of file diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/VresPanel.java b/src/main/java/org/gcube/portlet/user/my_vres/client/VresPanel.java new file mode 100644 index 0000000..8a18bb6 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/client/VresPanel.java @@ -0,0 +1,257 @@ +package org.gcube.portlet.user.my_vres.client; + + +import java.util.ArrayList; +import java.util.Date; + +import org.gcube.portlet.user.my_vres.client.widgets.BulletList; +import org.gcube.portlet.user.my_vres.client.widgets.ClickableVRE; +import org.gcube.portlet.user.my_vres.client.widgets.ListItem; +import org.gcube.portlet.user.my_vres.shared.UserBelonging; +import org.gcube.portlet.user.my_vres.shared.VO; +import org.gcube.portlet.user.my_vres.shared.VRE; + +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.user.client.Cookies; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.VerticalPanel; +/** + * + * @author Massimiliano Assante - ISTI CNR + * @version 1.1 Dec 2012 + * + */ +public class VresPanel extends Composite { + /** + * Create a remote service proxy to talk to the server-side service + */ + private final MyVREsServiceAsync myVREsService = GWT.create(MyVREsService.class); + + private static String VO = "Virtual Organizations"; + private static String VRE = "Virtual Research Environments"; + public static final String COOKIE_NAME = "gCube-EnvironmentViewRestore"; + public static final int COOKIE_MONTHS_EXPIRY_TIME = 6; //6 Months + private HTML switcher = new HTML(); + private FlowPanel flowPanel; + private VerticalPanel mainPanel = new VerticalPanel(); + private HorizontalPanel changeViewPanel = new HorizontalPanel(); + private HorizontalPanel imagesPanel = new HorizontalPanel(); + private Timer t = null; + + private ArrayList cachedVOs = null; + + private boolean isIconView = true; + boolean hasVres = false; + + public VresPanel() { + super(); + + mainPanel.setWidth("100%"); + mainPanel.setStyleName("mainPanel"); + this.flowPanel = new FlowPanel(); + flowPanel.setWidth("100%"); + flowPanel.setStyleName("flowPanel"); + + changeViewPanel.setWidth("95%"); + changeViewPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT); + changeViewPanel.add(imagesPanel); + initWidget(mainPanel); + + switcher.setStyleName("imageLink"); + imagesPanel.add(switcher); + + switcher.setStyleName("switcher"); + switcher.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + if (isIconView) + showListView(); + else + showIconView(); + } + }); + + setLastStateUsingCookie(); + } + + private void loadVREs() { + myVREsService.getInfrastructureVOs(new AsyncCallback>() { + public void onSuccess(ArrayList result) { + cachedVOs = result; + if (isIconView) + showIconView(); + else + showListView(); + } + public void onFailure(Throwable caught) { + flowPanel.add(new HTML("Could not fetch personal VREs: " + caught.getMessage())); + } + }); + } + + private void showListView() { + mainPanel.clear(); + mainPanel.add(changeViewPanel); + HTML voTitle = new HTML(VO); + voTitle.setStyleName("listPanel-title"); + + BulletList voList = new BulletList(); + voList.setStyleName("list"); + boolean showVOs = false; + for (VO vo: cachedVOs) { + if (! vo.isRoot() && vo.getUserBelonging() == UserBelonging.BELONGING) { + voList.add(addVo(vo)); + showVOs = true; + } + } + if (showVOs){ + mainPanel.add(voTitle); + mainPanel.add(voList); + } + HTML vreTitle = new HTML(VRE); + vreTitle.setStyleName("listPanel-title"); + + BulletList vreList = new BulletList(); + vreList.setStyleName("list"); + boolean showVREs = false; + for (VO vo: cachedVOs) { + for (VRE vre : vo.getVres()) { + vreList.add(addVRE(vre)); + showVREs = true; + } + } + if (showVREs) { + mainPanel.add(vreTitle); + mainPanel.add(vreList); + } + Cookies.setCookie(COOKIE_NAME, "1", getExpiryDate()); + isIconView = false; + setSwitcherText(); + } + + private void showIconView() { + mainPanel.clear(); + flowPanel.clear(); + mainPanel.add(changeViewPanel); + mainPanel.add(flowPanel); + for (VO vo: cachedVOs) { + for (VRE vre : vo.getVres()) { + ClickableVRE vreButton = new ClickableVRE(vre, myVREsService); + flowPanel.add(vreButton); + hasVres = true; + } + } + if (!hasVres) { + mainPanel.add(new NoVresPanel()); + imagesPanel.clear(); + } + Cookies.setCookie(COOKIE_NAME, "0", getExpiryDate()); + isIconView = true; + setSwitcherText(); + } + + + private ListItem addVo(final VO vo) { + final ListItem li = new ListItem(); + li.setStyleName("list-item item-vo "); + li.setText(vo.getName()); + li.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + showLoading(li); + String scope = vo.getGroupName(); + myVREsService.loadLayout(scope, vo.getFriendlyURL(), new AsyncCallback() { + public void onFailure(Throwable arg0) { + Window.open( vo.getFriendlyURL(), "_self", ""); + } + public void onSuccess(Void arg0) { + Window.open( vo.getFriendlyURL(), "_self", ""); + } + }); + } + }); + return li; + } + + private ListItem addVRE(final VRE vre) { + final ListItem li = new ListItem(); + li.setStyleName("list-item item-vre "); + li.setText(vre.getName()); + li.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + showLoading(li); + String scope = vre.getGroupName(); + myVREsService.loadLayout(scope, vre.getFriendlyURL(), new AsyncCallback() { + public void onFailure(Throwable arg0) { + Window.open( vre.getFriendlyURL(), "_self", ""); + } + public void onSuccess(Void arg0) { + Window.open( vre.getFriendlyURL(), "_self", ""); + } + }); + } + }); + return li; + } + + + private void showLoading(final ListItem li) { + li.setText("Loading ."); + t = new Timer() { + @Override + public void run() { + li.setText(li.getText() + " ."); + t.schedule(250); + if (li.getText().length() > 50) + t.cancel(); + } + }; + t.schedule(250); + } + + private void setSwitcherText() { + if (isIconView) + switcher.setHTML("SHOW LIST"); + else + switcher.setHTML("SHOW TILES"); + } + + + /** + * + * @return + */ + @SuppressWarnings("deprecation") + public Date getExpiryDate() { + Date expiryDate = new Date(); + int month = expiryDate.getMonth(); + month += COOKIE_MONTHS_EXPIRY_TIME ; + expiryDate.setMonth(month); + return expiryDate; + } + /** + * + */ + private void setLastStateUsingCookie() { + Date expiryDate = getExpiryDate(); + + if (Cookies.getCookie(COOKIE_NAME) == null) { + Cookies.setCookie(COOKIE_NAME, "0", expiryDate); + } + else { + String lastIconsState = Cookies.getCookie(COOKIE_NAME); + if (lastIconsState.compareTo("1") == 0) + isIconView = false; + else + isIconView = true; + } + loadVREs(); + } +} diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/BulletList.java b/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/BulletList.java new file mode 100644 index 0000000..8126c59 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/BulletList.java @@ -0,0 +1,25 @@ +package org.gcube.portlet.user.my_vres.client.widgets; + +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.ui.ComplexPanel; +import com.google.gwt.user.client.ui.Widget; +/** + * + * @author Massimiliano Assante, ISTI-CNR + * @version 0.1 Dec 2012 + * + */ +public class BulletList extends ComplexPanel { + public BulletList() { + setElement(DOM.createElement("ul")); + } + + public void add(Widget w) { + super.add(w, getElement()); + } + + public void insert(Widget w, int beforeIndex) { + super.insert(w, getElement(), beforeIndex, true); + } +} + diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/ClickableVRE.java b/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/ClickableVRE.java new file mode 100644 index 0000000..68869e2 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/ClickableVRE.java @@ -0,0 +1,72 @@ +package org.gcube.portlet.user.my_vres.client.widgets; + +import org.gcube.portlet.user.my_vres.client.MyVREsServiceAsync; +import org.gcube.portlet.user.my_vres.shared.VRE; + +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.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.Image; + +/** + * + * @author Massimiliano Assante - ISTI CNR + * @version 1.0 Jun 2012 + * + */ +public class ClickableVRE extends HTML { + + private final static int WIDTH = 115; + private final static int HEIGHT = 120; + + private String name; + private String imageUrl; + private int imageWidth = 0; + + public static final String LOADING_IMAGE = GWT.getModuleBaseURL() + "../images/loading.gif"; + Image img = new Image(LOADING_IMAGE); + + public ClickableVRE() { + super(); + } + + public ClickableVRE(final VRE vre, final MyVREsServiceAsync service) { + super.setPixelSize(WIDTH, HEIGHT); + setPixelSize(WIDTH, HEIGHT); + imageWidth = WIDTH - 20; + name = vre.getName(); + imageUrl = vre.getImageURL(); + this.setTitle("Enter this VRE"); + int imageHeight = 95; + String html = "
" + name + "
"; + html += "
" + + "" + + "
"; + setHTML(html); + setStyleName("vreButton"); + + addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + showLoading(); + String scope = vre.getGroupName(); + service.loadLayout(scope, vre.getFriendlyURL(), new AsyncCallback() { + public void onFailure(Throwable arg0) { + Window.open( vre.getFriendlyURL(), "_self", ""); + } + public void onSuccess(Void arg0) { + Window.open( vre.getFriendlyURL(), "_self", ""); + } + }); + + } + }); + } + + public void showLoading() { + String html = "
"; + setHTML(html); + } +} diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/ListItem.java b/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/ListItem.java new file mode 100644 index 0000000..7827b13 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/ListItem.java @@ -0,0 +1,61 @@ +package org.gcube.portlet.user.my_vres.client.widgets; + +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.KeyDownEvent; +import com.google.gwt.event.dom.client.KeyDownHandler; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.ui.ComplexPanel; +import com.google.gwt.user.client.ui.Widget; + +/** + * + * @author Massimiliano Assante, ISTI-CNR + * @version 0.1 Sep 2012 + * + */ +public class ListItem extends ComplexPanel { + HandlerRegistration clickHandler; + + public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) { + return addDomHandler(handler, KeyDownEvent.getType()); + } + + public HandlerRegistration addClickHandler(ClickHandler handler) { + return addDomHandler(handler, ClickEvent.getType()); + } + public String getHTML() { + return DOM.getInnerHTML(getElement()); + } + + public void setHTML(String html) { + DOM.setInnerHTML(getElement(), (html == null) ? "" : html); + } + + public ListItem() { + setElement(DOM.createElement("li")); + } + + public void setId(String id) { + DOM.setElementAttribute(getElement(), "id", id); + } + + public void add(Widget w) { + super.add(w, getElement()); + } + + public void insert(Widget w, int beforeIndex) { + super.insert(w, getElement(), beforeIndex, true); + } + + public String getText() { + return DOM.getInnerText(getElement()); + } + + public void setText(String text) { + DOM.setInnerText(getElement(), (text == null) ? "" : text); + } + + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlet/user/my_vres/server/MyVREsServiceImpl.java b/src/main/java/org/gcube/portlet/user/my_vres/server/MyVREsServiceImpl.java new file mode 100644 index 0000000..450ae0a --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/server/MyVREsServiceImpl.java @@ -0,0 +1,353 @@ +package org.gcube.portlet.user.my_vres.server; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Properties; + +import javax.servlet.http.HttpServletRequest; +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.core.utils.logging.GCUBELog; +import org.gcube.portal.custom.communitymanager.OrganizationsUtil; +import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; +import org.gcube.portlet.user.my_vres.client.MyVREsService; +import org.gcube.portlet.user.my_vres.shared.UserBelonging; +import org.gcube.portlet.user.my_vres.shared.VO; +import org.gcube.portlet.user.my_vres.shared.VRE; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; +import com.liferay.portal.kernel.servlet.ImageServletTokenUtil; +import com.liferay.portal.kernel.util.WebKeys; +import com.liferay.portal.model.Group; +import com.liferay.portal.model.Organization; +import com.liferay.portal.model.User; +import com.liferay.portal.service.OrganizationLocalServiceUtil; +import com.liferay.portal.theme.ThemeDisplay; + +/** + * The server side implementation of the RPC service. + * @author Massimiliano Assante - ISTI CNR + * @version 1.0 Jun 2012 + */ +@SuppressWarnings("serial") +public class MyVREsServiceImpl extends RemoteServiceServlet implements MyVREsService { + + private static GCUBELog _log = new GCUBELog(MyVREsServiceImpl.class); + /** + * + */ + public static final String CACHED_VOS = "CACHED_VRES"; + /** + * + */ + public static final String ROOT_ORG = "rootorganization"; + + private VO rootVO = new VO(); + + private boolean withinPortal = false; + + /** + * the current ASLSession + * @return the session + */ + private ASLSession getASLSession() { + String sessionID = this.getThreadLocalRequest().getSession().getId(); + String user = (String) this.getThreadLocalRequest().getSession().getAttribute(ScopeHelper.USERNAME_ATTRIBUTE); + if (user == null) { + _log.warn("USER IS NULL setting test.user"); + user = "test.user"; + } + else { + _log.info("LIFERAY PORTAL DETECTED user=" + user); + withinPortal = true; + } + return SessionManager.getInstance().getASLSession(sessionID, user); + } + + /** + * first method called by the UI + */ + public ArrayList getInfrastructureVOs() { + getASLSession(); + //_log.trace("getInfrastructureVOs method called"); + if (!withinPortal) + return getFakeVOs(); + //return new ArrayList(); + else + try { + String username = getASLSession().getUsername(); + User currUser = OrganizationsUtil.validateUser(username); + + List organizations = OrganizationLocalServiceUtil.getOrganizations(0, OrganizationLocalServiceUtil.getOrganizationsCount()); + + ThemeDisplay themeDisplay = (ThemeDisplay) this.getThreadLocalRequest().getSession().getAttribute(WebKeys.THEME_DISPLAY); + + Organization rootOrganization = null; + for (Organization organization : organizations) { + if (organization.getName().equals( getRootOrganizationName() ) ) { + rootOrganization = organization; + break; + } + } + try { + //_log.info("root: " + rootOrganization.getName() ); + } + catch (NullPointerException e) { + _log.error("Cannot find root organziation, please check gcube-data.properties file in $CATALINA_HOME/conf folder, unless your installing the Bundle"); + return new ArrayList(); + } + // Create the list of the Infrastructure VOs + List infrastructureVOs = new ArrayList(); + + //create and check the root VO + rootVO = new VO(); + rootVO.setName(rootOrganization.getName()); + rootVO.setGroupName("/"+rootOrganization.getName()); + rootVO.setRoot(true); + + Group orgGroup = rootOrganization.getGroup(); + String friendlyURL = orgGroup.getPathFriendlyURL(true, themeDisplay) + orgGroup.getFriendlyURL(); + + rootVO.setFriendlyURL(getPortalBasicUrl()+friendlyURL); + long logoId = rootOrganization.getLogoId(); + String logoURL = themeDisplay.getPathImage()+"/organization_logo?img_id="+ logoId +"&t" + ImageServletTokenUtil.getToken(logoId); + rootVO.setImageURL(logoURL); + + + if (rootOrganization.getComments() != null) + rootVO.setDescription(rootOrganization.getComments()); + + + //for each root sub organizations (VO) + for (Organization vOrg : rootOrganization.getSuborganizations()) { + + //_log.debug("SKIP GCUBE APPS " + vOrg.getName() ); + + //_log.debug("FOUND VO: " + vOrg.getName() ); + //create the VO + VO voToAdd = new VO(); + voToAdd.setName(vOrg.getName()); + voToAdd.setGroupName("/"+vOrg.getParentOrganization().getName()+"/"+vOrg.getName()); + voToAdd.setRoot(false); + + for (Organization vre : vOrg.getSuborganizations()) { + VRE vreToAdd = new VRE(); + vreToAdd.setName(vre.getName()); + vreToAdd.setGroupName("/"+vOrg.getParentOrganization().getName()+"/"+vOrg.getName()+"/"+vre.getName()); + + logoId = vre.getLogoId(); + logoURL = themeDisplay.getPathImage()+"/organization_logo?img_id="+ logoId +"&t" + ImageServletTokenUtil.getToken(logoId); + vreToAdd.setImageURL(logoURL); + + String vreUrl = vre.getGroup().getPathFriendlyURL(true, themeDisplay) + vre.getGroup().getFriendlyURL(); + vreToAdd.setFriendlyURL(getPortalBasicUrl()+vreUrl); + + //set the description for the vre + if (vre.getComments() != null) { + vreToAdd.setDescription(vre.getComments()); + } + + //check if the user belongs to it + if (currUser.getOrganizations().contains(vre)) { + vreToAdd.setUserBelonging(UserBelonging.BELONGING); + voToAdd.addVRE(vreToAdd); + } + } + + + + Group group = vOrg.getGroup(); + String url = group.getPathFriendlyURL(true, themeDisplay) + group.getFriendlyURL(); + voToAdd.setFriendlyURL(getPortalBasicUrl() + url); + + //set the description for the vre + if (vOrg.getComments() != null) voToAdd.setDescription(vOrg.getComments()); + //check if the user belongs to it + if (currUser.getOrganizations().contains(vOrg)) { + voToAdd.setUserBelonging(UserBelonging.BELONGING); + } + else + voToAdd.setUserBelonging(UserBelonging.NOT_BELONGING); + infrastructureVOs.add(voToAdd); + } + + + ArrayList toReturn = new ArrayList(); + + + for (VO vo : infrastructureVOs) { + for (VRE vre : vo.getVres()) { + //_log.debug("VRE FOUND.... " + vre.getName()); + } + toReturn.add(vo); + } + //sort the VOs + Collections.sort(toReturn, Collections.reverseOrder()); + + //set the root vo as FIRST + toReturn.add(0, rootVO); + + ArrayList toStoreInSession = toReturn; + //_log.debug("SETTING INFRASTRUCTURE VOS in ASLSession"); + getASLSession().setAttribute(CACHED_VOS, toStoreInSession); + + return toReturn; + + } + catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + + /** + * + * @param scope + */ + public void loadLayout(String scope, String URL) { + _log.trace("Calling Load Layout..."); + HttpSession session = this.getThreadLocalRequest().getSession(); + ASLSession mysession = getASLSession(); + mysession.setAttribute("loadlayout", "true"); + session.setAttribute("loadLayout", "true"); + session.setAttribute("selectedVRE", scope); + mysession.logUserLogin(scope); + mysession.setScope(scope); + + _log.trace("User login logged to: " + scope); + } + + /** + * read the root VO name from a property file and retuns it + */ + protected static String getRootOrganizationName() { + //get the portles to look for from the property file + Properties props = new Properties(); + String toReturn = "gcube"; + + try { + String propertyfile = OrganizationsUtil.getTomcatFolder()+"conf/gcube-data.properties"; + File propsFile = new File(propertyfile); + FileInputStream fis = new FileInputStream(propsFile); + props.load( fis); + toReturn = props.getProperty(ROOT_ORG); + } + //catch exception in case properties file does not exist + catch(IOException e) { + toReturn = "gcube"; + _log.error("gcube-data.properties file not found under $CATALINA_HOME/conf dir, returning default VO Name " + toReturn); + return toReturn; + } + _log.debug("Returning Root VO Name: " + toReturn ); + return toReturn; + } + + /** + * + * @return the portal basic url, e.g. http://www.foo.com + */ + private String getPortalBasicUrl() { + HttpServletRequest request = this.getThreadLocalRequest(); + String toReturn = ""; + //protocol + String protocol = (request.isSecure()) ? "https://" : "http://" ; + toReturn += protocol; + //server name + toReturn += request.getServerName(); + //port + toReturn += (request.getServerPort() == 80) ? "" : ":"+request.getServerPort() ; + // _log.trace("getPortalBasicUrl: " +toReturn + "queryString: " + request.getQueryString()); + return toReturn; + } + + + /** + * simply returns fake VOS for debugging purpose + * @return + */ + protected static ArrayList getFakeVOs() { + VO rootVO = new VO(); + rootVO.setRoot(true); + rootVO.setName("/d4science.research-infrastructures.eu/"); + rootVO.setDescription("This is the description for the ROOT VO"); + rootVO.setImageURL("http://portal.d4science.research-infrastructures.eu/vologin/html/RedGrid.jpg"); + rootVO.setUserBelonging(UserBelonging.BELONGING); + + + /***************************************/ + + VO emVO = new VO(); + emVO.setRoot(false); + emVO.setGroupName("/d4science.research-infrastructures.eu/EM/"); + emVO.setName("EM VO"); + emVO.setDescription("EM and AEM Virtual Organisation The FARM Virtual Organisation is the dynamic group of individuals and/or institutions defined around a set of sharing rules in which resource providers and consumers specify clearly and carefully just what is shared, who is allowed to share, and the conditions under which sharing occurs to serve the needs of the Fisheries and Aquaculture Resources Management."); + emVO.setImageURL("http://portal.d4science.research-infrastructures.eu/vologin/html/RedGrid.jpg"); + + emVO.setUserBelonging(UserBelonging.NOT_BELONGING); + // + // + VRE cool_EM_VRE = new VRE(); + cool_EM_VRE.setName("COOL EM VRE"); + cool_EM_VRE.setGroupName("/d4science.research-infrastructures.eu/EM/COOLEMVRE"); + cool_EM_VRE.setDescription("cool_EM_VRE VRE Description
"+ + "This Virtual Research Environment is for cool authors, managers and researchers who produce reports containing cool data."); + cool_EM_VRE.setImageURL("http://portal.d4science.research-infrastructures.eu/vologin/html/gcm-preview.jpg"); + cool_EM_VRE.setUserBelonging(UserBelonging.BELONGING); + emVO.addVRE(cool_EM_VRE); + + VRE cool_EM_VRE2 = new VRE(); + cool_EM_VRE2.setName("COOL VRE 2"); + cool_EM_VRE2.setGroupName("/d4science.research-infrastructures.eu/EM/COOLEMVRE2"); + cool_EM_VRE2.setDescription("Cool VRE Description
"+ + "This Virtual Research Environment is for cool authors, managers and researchers who produce reports containing cool data."); + + cool_EM_VRE2.setImageURL("https://newportal.i-marine.d4science.org/image/organization_logo?img_id=13302&t1339191699773"); + cool_EM_VRE2.setUserBelonging(UserBelonging.NOT_BELONGING); + + VRE cool_EM_VRE3 = new VRE(); + cool_EM_VRE3.setName("COOL EM VRE TRE"); + cool_EM_VRE3.setGroupName("/d4science.research-infrastructures.eu/EM/COOlVRE3"); + cool_EM_VRE3.setDescription("Cool VRE Description
"+ + "This Virtual Research Environment is for cool authors, managers and researchers who produce reports containing cool data."); + + cool_EM_VRE3.setImageURL("https://newportal.i-marine.d4science.org/image/organization_logo?img_id=13302&t1339191699773"); + cool_EM_VRE3.setUserBelonging(UserBelonging.BELONGING); + + VRE demo = new VRE(); + demo.setName("Demo"); + demo.setGroupName("/d4science.research-infrastructures.eu/EM/Demo"); + demo.setDescription("Cool VRE Description
"+ + "This Virtual Research Environment is for cool authors, managers and researchers who produce reports containing cool data."); + + demo.setImageURL("http://portal.d4science.research-infrastructures.eu/vologin/html/RedGrid.jpg"); + demo.setUserBelonging(UserBelonging.BELONGING); + + VRE vreGCM = new VRE(); + vreGCM.setName("GCM"); + vreGCM.setGroupName("/d4science.research-infrastructures.eu/EM/GCM"); + vreGCM.setDescription("Global Ocean Chlorophyll Monitoring (GCM) Virtual Research Environment
" + + "The phytoplankton plays a similar role to terrestrial green plants in the photosynthetic process and are credited with removing as much carbon dioxide from the atmosphere as their earthbound counterparts, making it important to monitor and model plankton into calculations of future climate change."); + vreGCM.setImageURL("https://newportal.i-marine.d4science.org/image/organization_logo?img_id=13302&t1339191699773"); + vreGCM.setUserBelonging(UserBelonging.BELONGING); + + + emVO.addVRE(cool_EM_VRE); + emVO.addVRE(cool_EM_VRE2); + emVO.addVRE(cool_EM_VRE3); + emVO.addVRE(demo); + emVO.addVRE(vreGCM); + + ArrayList toReturn = new ArrayList(); + toReturn.add(rootVO); + toReturn.add(emVO); + toReturn.add(emVO); + return toReturn; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlet/user/my_vres/server/portlet/MyVREsPortlet.java b/src/main/java/org/gcube/portlet/user/my_vres/server/portlet/MyVREsPortlet.java new file mode 100644 index 0000000..29ba942 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/server/portlet/MyVREsPortlet.java @@ -0,0 +1,85 @@ +package org.gcube.portlet.user.my_vres.server.portlet; + + + + +import java.io.IOException; + +import javax.portlet.ActionRequest; +import javax.portlet.ActionResponse; +import javax.portlet.GenericPortlet; +import javax.portlet.PortletException; +import javax.portlet.PortletRequestDispatcher; +import javax.portlet.PortletSession; +import javax.portlet.RenderRequest; +import javax.portlet.RenderResponse; + +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.exception.SystemException; +import com.liferay.portal.kernel.log.Log; +import com.liferay.portal.kernel.log.LogFactoryUtil; +import com.liferay.portal.kernel.util.WebKeys; +import com.liferay.portal.model.User; +import com.liferay.portal.service.UserLocalServiceUtil; +import com.liferay.portal.theme.ThemeDisplay; + +/** + * MyVREsPortlet Portlet Class + * @author Massimiliano Assante - ISTI CNR + * @version 1.0 Jun 2012 + */ +public class MyVREsPortlet extends GenericPortlet { + + private static Log _log = LogFactoryUtil.getLog(MyVREsPortlet.class); + + protected String viewJSP; + public void init() throws PortletException { + viewJSP = "/WEB-INF/jsp/MyVREs_view.jsp"; + } + + public void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { + long userid = Long.parseLong(renderRequest.getRemoteUser()); + + ThemeDisplay themeDisplay = (ThemeDisplay) renderRequest.getAttribute(WebKeys.THEME_DISPLAY); + renderRequest.getPortletSession().setAttribute(WebKeys.THEME_DISPLAY, themeDisplay, PortletSession.APPLICATION_SCOPE); + + + User user = null; + try { + user = UserLocalServiceUtil.getUser(userid); + + } catch (SystemException e) { + e.printStackTrace(); + } catch (PortalException e) { + e.printStackTrace(); + } + + + //get the username + String username = user.getScreenName(); + + //Set the username to the portlet session, so that it can be accessed through the servlet + renderRequest.getPortletSession().setAttribute("username", username, PortletSession.APPLICATION_SCOPE); + renderRequest.getPortletSession().setAttribute("user", username, PortletSession.APPLICATION_SCOPE); + + include(viewJSP, renderRequest, renderResponse); + } + + protected void include(String path, RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { + PortletRequestDispatcher portletRequestDispatcher = getPortletContext().getRequestDispatcher(path); + + if (portletRequestDispatcher == null) { + _log.error(path + " is not a valid include"); + } + else { + portletRequestDispatcher.include(renderRequest, renderResponse); + } + } + /** + * + */ + public void processAction(ActionRequest request, ActionResponse response) + throws PortletException, IOException { + } + +} diff --git a/src/main/java/org/gcube/portlet/user/my_vres/shared/ResearchEnvironment.java b/src/main/java/org/gcube/portlet/user/my_vres/shared/ResearchEnvironment.java new file mode 100644 index 0000000..b25ed4f --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/shared/ResearchEnvironment.java @@ -0,0 +1,87 @@ +package org.gcube.portlet.user.my_vres.shared; + +import java.io.Serializable; +/** + * + * @author Massimiliano Assante ISTI-CNR + * + * @version 2.0 Jan 10th 2012 + */ +@SuppressWarnings("serial") +public class ResearchEnvironment implements Serializable{ + private String name; + + private String description; + + private String imageURL; + + private String groupName; + + private String friendlyURL; + + private UserBelonging userBelonging; + + public ResearchEnvironment() { + super(); + } + + public ResearchEnvironment(String name, String description, + String imageURL, String groupName, String friendlyURL, + UserBelonging userBelonging) { + super(); + this.name = name; + this.description = description; + this.imageURL = imageURL; + this.groupName = groupName; + this.friendlyURL = friendlyURL; + this.userBelonging = userBelonging; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getImageURL() { + return imageURL; + } + + public void setImageURL(String imageURL) { + this.imageURL = imageURL; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public String getFriendlyURL() { + return friendlyURL; + } + + public void setFriendlyURL(String friendlyURL) { + this.friendlyURL = friendlyURL; + } + + public UserBelonging getUserBelonging() { + return userBelonging; + } + + public void setUserBelonging(UserBelonging userBelonging) { + this.userBelonging = userBelonging; + } +} diff --git a/src/main/java/org/gcube/portlet/user/my_vres/shared/UserBelonging.java b/src/main/java/org/gcube/portlet/user/my_vres/shared/UserBelonging.java new file mode 100644 index 0000000..8d73a69 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/shared/UserBelonging.java @@ -0,0 +1,5 @@ +package org.gcube.portlet.user.my_vres.shared; + +public enum UserBelonging { BELONGING, NOT_BELONGING, PENDING + +} diff --git a/src/main/java/org/gcube/portlet/user/my_vres/shared/VO.java b/src/main/java/org/gcube/portlet/user/my_vres/shared/VO.java new file mode 100644 index 0000000..439c6f3 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/shared/VO.java @@ -0,0 +1,70 @@ +package org.gcube.portlet.user.my_vres.shared; + +import java.io.Serializable; +import java.util.ArrayList; +/** + * + * @author Massimiliano Assante ISTI-CNR + * + * @version 2.0 Jan 10th 2012 + */ +@SuppressWarnings("serial") +public class VO extends ResearchEnvironment implements Comparable, Serializable{ + + private boolean isRoot; + + private ArrayList vres = new ArrayList(); + /** + * + */ + public VO() { + super(); + } + /** + * + * @param voName . + * @param description . + * @param imageURL . + * @param vomsGroupName . + * @param friendlyURL . + * @param userBelonging . + * @param isRoot . + * @param vres . + */ + public VO(String voName, String description, String imageURL, + String vomsGroupName, String friendlyURL, + UserBelonging userBelonging, boolean isRoot, ArrayList vres) { + super(voName, description, imageURL, vomsGroupName, friendlyURL, userBelonging); + this.isRoot = isRoot; + this.vres = vres; + } + + public boolean isRoot() { + return isRoot; + } + public void setRoot(boolean isRoot) { + this.isRoot = isRoot; + } + public ArrayList getVres() { + return vres; + } + public void setVres(ArrayList vres) { + this.vres = vres; + } + /** + * + * @param toAdd + */ + public void addVRE(VRE toAdd) { + if (vres == null) + vres = new ArrayList(); + vres.add(toAdd); + } + /** + * compare the number of vres + */ + public int compareTo(VO voToCompare) { + return (this.vres.size() >= voToCompare.getVres().size()) ? 1 : -1; + } + +} diff --git a/src/main/java/org/gcube/portlet/user/my_vres/shared/VRE.java b/src/main/java/org/gcube/portlet/user/my_vres/shared/VRE.java new file mode 100644 index 0000000..db3f028 --- /dev/null +++ b/src/main/java/org/gcube/portlet/user/my_vres/shared/VRE.java @@ -0,0 +1,30 @@ +package org.gcube.portlet.user.my_vres.shared; + +import java.io.Serializable; + +@SuppressWarnings("serial") +public class VRE extends ResearchEnvironment implements Serializable { + + /** + * + */ + public VRE() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * + * @param vreName + * @param description + * @param imageURL + * @param vomsGroupName + * @param friendlyURL + * @param userBelonging + */ + public VRE(String vreName, String description, String imageURL, + String vomsGroupName, String friendlyURL, + UserBelonging userBelonging) { + super(vreName, description, imageURL, vomsGroupName, friendlyURL, userBelonging); + } +} diff --git a/src/main/resources/org/gcube/portlet/user/my_vres/MyVREs.gwt.xml b/src/main/resources/org/gcube/portlet/user/my_vres/MyVREs.gwt.xml new file mode 100644 index 0000000..d1839e7 --- /dev/null +++ b/src/main/resources/org/gcube/portlet/user/my_vres/MyVREs.gwt.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/MyVREs.css b/src/main/webapp/MyVREs.css new file mode 100644 index 0000000..1bb21b7 --- /dev/null +++ b/src/main/webapp/MyVREs.css @@ -0,0 +1,157 @@ +@import url(http://fonts.googleapis.com/css?family=Architects+Daughter); + +div.vreButton { + float: left; +} + +a.vrelink,a.vrelink:active,a.vrelink:visited { + cursor: pointer; + cursor: hand; + text-decoration: none; + color: #15C; +} + +a.vrelink:hover { + opacity: 0.8; + text-decoration: underline; +} + +.gwt-Button { + margin: 0px; + padding: 0px; +} + +.mainPanel { + margin-bottom: 15px; + margin-left: 10px; +} + +.flowPanel { + margin-left: 5px; +} + +.important { + font-weight: bold; +} + +.NoVresStyle { + line-height: 25px; + font-family: 'Architects Daughter', Arial, Verdana, sans-serif; + font-size: 15px; + padding-left: 0px; +} + +.listPanel { + margin-right: 10px; + margin-top: 5px; + padding: 5px; +} + +.switcher { + color: #999; + font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; + font-size: 8px; + font-variant:small-caps; + font-weight: bold; +} + +.switcher:hover { + opacity: 0.8; + cursor: pointer; + cursor: hand; +} + +.listPanel-title { + color: #999; + font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; + font-size: 12px; + font-variant:small-caps; + font-weight: bold; +} + +.list { + list-style-type: none; + margin-bottom: 10px; + margin-top: 5px; + margin-left: 0px; + padding-bottom: 0px; + padding-left: 5px; + padding-right: 0px; + padding-top: 0px; +} + +.list-item { + color: #444; + font-family: 'Lucida Grande', Verdana, 'Bitstream Vera Sans', Arial, + sans-serif; + font-size: 15px; + margin-top: 5px; + line-height: 14px; + padding-left: 20px; + background-color: transparent; + background-repeat: no-repeat; +} + +.item-vre { + background-image: url("images/vres.png"); +} + +.item-vo { + background-image: url("images/vos.png"); +} + +.list-item:hover { + cursor: pointer; + cursor: hand; + color: #336699; + text-decoration: none; + transition: color .25s ease-in-out; + -moz-transition: color .25s ease-in-out; + -webkit-transition: color .25s ease-in-out; +} + + +.vreButton { + background: transparent; + margin-right: 10px; + margin-top: 5px; + padding: 5px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; + background-color: #FFF; + border: 1px solid #DBDBDB; + cursor: pointer; + cursor: hand; +} + +.vreCaption { + font-family: Arial, Helvetica, sans-serif; + color: #39C; + display: block; + font-size: 9px; + font-weight: bold; + margin-bottom: 3px; + text-align: left; + padding-left: 1px; + border-bottom: 4px solid #39C; +} + +.vreButton[disabled]:hover,.vreButton[disabled]:active,.vreButton[disabled] + { + color: #CCC; + border-color: #BBB; + cursor: default; + opacity: 1.0; +} + +.vreButton:hover { + border-color: #39C; + color: #222; + opacity: 0.8; +} + +.vreButton:active { + background: #fff; + border: 1px solid #DBDBDB; +} \ No newline at end of file diff --git a/src/main/webapp/MyVREs.html b/src/main/webapp/MyVREs.html new file mode 100644 index 0000000..e58701b --- /dev/null +++ b/src/main/webapp/MyVREs.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + Web Application Starter Project + + + + + + + + + + + + + + + +
+ + diff --git a/src/main/webapp/WEB-INF/jsp/MyVREs_view.jsp b/src/main/webapp/WEB-INF/jsp/MyVREs_view.jsp new file mode 100644 index 0000000..b9b9891 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/MyVREs_view.jsp @@ -0,0 +1,16 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + +<%-- Uncomment below lines to add portlet taglibs to jsp +<%@ page import="javax.portlet.*"%> +<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%> + + +--%> + + + +
+
+ + diff --git a/src/main/webapp/WEB-INF/liferay-display.xml b/src/main/webapp/WEB-INF/liferay-display.xml new file mode 100644 index 0000000..ab597c9 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-display.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/main/webapp/WEB-INF/liferay-plugin-package.properties b/src/main/webapp/WEB-INF/liferay-plugin-package.properties new file mode 100644 index 0000000..85637ed --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-plugin-package.properties @@ -0,0 +1,9 @@ +name=MyVREs +module-group-id=liferay +module-incremental-version=1 +tags= +short-description= +change-log= +page-url=http://www.d4science.org +author=D4Science Org. +licenses=EUPL \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/liferay-portlet.xml b/src/main/webapp/WEB-INF/liferay-portlet.xml new file mode 100644 index 0000000..1ed850d --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-portlet.xml @@ -0,0 +1,17 @@ + + + + + + MyVREs + false + false + false + + /MyVREs.css + + + administrator + Administrator + + diff --git a/src/main/webapp/WEB-INF/portlet.xml b/src/main/webapp/WEB-INF/portlet.xml new file mode 100644 index 0000000..d606c6d --- /dev/null +++ b/src/main/webapp/WEB-INF/portlet.xml @@ -0,0 +1,21 @@ + + + + + MyVREs + gCube MyVREs Login Portlet + org.gcube.portlet.user.my_vres.server.portlet.MyVREsPortlet + 0 + + text/html + + + My Virtual Research Environments + gCube MyVREs Login + gCube MyVREs Login + + + administrator + + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..3a115eb --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,40 @@ + + + + greetServlet + org.gcube.portlet.user.my_vres.server.MyVREsServiceImpl + + + + greetServlet + /myvres/greet + + + jUnitHostImpl + com.google.gwt.junit.server.JUnitHostImpl + + + + jUnitHostImpl + /myvres/junithost/* + + + + greetServlet + /org.gcube.portlet.user.my_vres.MyVREsJUnit/myvres/greet + + + + jUnitHostImpl + /org.gcube.portlet.user.my_vres.MyVREsJUnit/junithost/* + + + + + MyVREs.html + + + diff --git a/src/main/webapp/images/loading-bar.gif b/src/main/webapp/images/loading-bar.gif new file mode 100644 index 0000000000000000000000000000000000000000..4267f292014cb4458e9a0f5c800c131f0b2162b3 GIT binary patch literal 18727 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/images/loading.gif b/src/main/webapp/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..f4a8d806878d6b2e30d20ce4b00fe7dda04ec922 GIT binary patch literal 6855 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/images/portlet_bg.png b/src/main/webapp/images/portlet_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..c3a3266b91d40a16f0619f9d22c2c2fac2da3fd3 GIT binary patch literal 1182 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/images/vres.png b/src/main/webapp/images/vres.png new file mode 100644 index 0000000000000000000000000000000000000000..7d1303a4b26e20539edf4a8fa574f9494409f8a7 GIT binary patch literal 1294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L-^Aq1JP;qO z-q+X4Gq1QLF)umQ)5TT^Xo6m5W{Q=QtCOLTrHi4FtGS_}p{tRTi<`NlrICq=tFw!v zrG+a@uSMv>2~2MaLaz}{y`ZF!TL84#CABECEH%ZgC_h&L>}9J=oNjS;!)YE= zZwhX=7~s^a4|I$^C}NQ!8YToxJs>7L*#bH6grAxROzlO$WWDXR+7t!`#wJe}$B>F! zNq_$Tw`W#u5ImL<7rs>{c9Yo(-ANkE4zu3+%6_@1%0JJpK(PPbZwKyG5e{p%pTAeM z@5h%v(!02VYlC%jtajem5qUi~<}_zgGq1ojp?`IspZSIf?fECYgguXe!=?Jj>xn`Y z-sL)b+L8`5pWkk5?SH}HnGz8*A|?O*`OO>Np2#50 zEd6->{rwUlsiFV(R(&W9f{6^TqxCAo#Kd;oSGt@0 zPtfa^PQFEIB2$pV8|SpRTTI3ig;m`;nD;mQP*+}hQ&QmoLyu17;`Q&&egc(Hp00i_ I>zopr07N#{YybcN literal 0 HcmV?d00001 diff --git a/src/test/java/org/gcube/portlet/user/my_vres/client/GwtTestMyVREs.java b/src/test/java/org/gcube/portlet/user/my_vres/client/GwtTestMyVREs.java new file mode 100644 index 0000000..8472337 --- /dev/null +++ b/src/test/java/org/gcube/portlet/user/my_vres/client/GwtTestMyVREs.java @@ -0,0 +1,74 @@ +package org.gcube.portlet.user.my_vres.client; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.junit.client.GWTTestCase; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.rpc.ServiceDefTarget; + +/** + * GWT JUnit integration tests must extend GWTTestCase. + * Using "GwtTest*" naming pattern exclude them from running with + * surefire during the test phase. + * + * If you run the tests using the Maven command line, you will have to + * navigate with your browser to a specific url given by Maven. + * See http://mojo.codehaus.org/gwt-maven-plugin/user-guide/testing.html + * for details. + */ +public class GwtTestMyVREs extends GWTTestCase { + + /** + * Must refer to a valid module that sources this class. + */ + public String getModuleName() { + return "org.gcube.portlet.user.my_vres.MyVREsJUnit"; + } + + /** + * Tests the FieldVerifier. + */ + public void testFieldVerifier() { +// assertFalse(FieldVerifier.isValidName(null)); +// assertFalse(FieldVerifier.isValidName("")); +// assertFalse(FieldVerifier.isValidName("a")); +// assertFalse(FieldVerifier.isValidName("ab")); +// assertFalse(FieldVerifier.isValidName("abc")); +// assertTrue(FieldVerifier.isValidName("abcd")); + } + + /** + * This test will send a request to the server using the greetServer method in + * MyVREsService and verify the response. + */ + public void testGreetingService() { + // Create the service that we will test. + MyVREsServiceAsync greetingService = GWT.create(MyVREsService.class); + ServiceDefTarget target = (ServiceDefTarget) greetingService; + target.setServiceEntryPoint(GWT.getModuleBaseURL() + "MyVREs/greet"); + + // Since RPC calls are asynchronous, we will need to wait for a response + // after this test method returns. This line tells the test runner to wait + // up to 10 seconds before timing out. + delayTestFinish(10000); + + // Send a request to the server. +// greetingService.greetServer("GWT User", new AsyncCallback() { +// public void onFailure(Throwable caught) { +// // The request resulted in an unexpected error. +// fail("Request failure: " + caught.getMessage()); +// } +// +// public void onSuccess(String result) { +// // Verify that the response is correct. +// assertTrue(result.startsWith("Hello, GWT User!")); +// +// // Now that we have received a response, we need to tell the test runner +// // that the test is complete. You must call finishTest() after an +// // asynchronous test finishes successfully, or the test will time out. +// finishTest(); +// } +// }); + } + + +} diff --git a/src/test/resources/org/gcube/portlet/user/my_vres/MyVREsJUnit.gwt.xml b/src/test/resources/org/gcube/portlet/user/my_vres/MyVREsJUnit.gwt.xml new file mode 100644 index 0000000..ea58e19 --- /dev/null +++ b/src/test/resources/org/gcube/portlet/user/my_vres/MyVREsJUnit.gwt.xml @@ -0,0 +1,9 @@ + + + + + + + + +