From d52c47eabdeabdcc761454722f116ecf56a096c0 Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Mon, 8 Sep 2014 16:45:24 +0000 Subject: [PATCH] Initial import. git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/vre-members@99581 82a268e6-3cf1-43bd-a215-b396298e98cf --- .classpath | 35 +++ .project | 59 +++++ .settings/.jsdtscope | 15 ++ .../com.google.appengine.eclipse.core.prefs | 3 + .settings/com.google.gdt.eclipse.core.prefs | 5 + .settings/com.google.gwt.eclipse.core.prefs | 5 + .settings/org.eclipse.core.resources.prefs | 6 + .settings/org.eclipse.jdt.core.prefs | 8 + .settings/org.eclipse.m2e.core.prefs | 4 + .settings/org.eclipse.wst.common.component | 10 + ....eclipse.wst.common.project.facet.core.xml | 7 + ...rg.eclipse.wst.jsdt.ui.superType.container | 1 + .settings/org.eclipse.wst.validation.prefs | 2 + .settings/org.maven.ide.eclipse.prefs | 9 + VreMembersTest-dev.launch | 22 ++ VreMembersTest-prod.launch | 22 ++ pom.xml | 207 ++++++++++++++++++ .../vremembers/client/MembersService.java | 15 ++ .../client/MembersServiceAsync.java | 13 ++ .../user/vremembers/client/VreMembers.java | 16 ++ .../client/panels/VREMembersPanel.java | 73 ++++++ .../vremembers/client/ui/DisplayBadge.java | 84 +++++++ .../vremembers/client/ui/DisplayBadge.ui.xml | 71 ++++++ .../vremembers/server/MembersServiceImpl.java | 139 ++++++++++++ .../server/portlet/VREMembersPortlet.java | 30 +++ .../user/vremembers/shared/BelongingUser.java | 110 ++++++++++ src/main/resources/clientlog4j.properties | 12 + .../user/vremembers/VreMembers.gwt.xml | 19 ++ src/main/webapp/VreMembers.css | 0 src/main/webapp/VreMembers.html | 33 +++ .../webapp/WEB-INF/jsp/VREMembers_view.jsp | 6 + src/main/webapp/WEB-INF/liferay-display.xml | 8 + .../WEB-INF/liferay-plugin-package.properties | 9 + src/main/webapp/WEB-INF/liferay-portlet.xml | 28 +++ src/main/webapp/WEB-INF/portlet.xml | 30 +++ src/main/webapp/WEB-INF/web.xml | 24 ++ src/main/webapp/images/Avatar_default.png | Bin 0 -> 997 bytes src/main/webapp/images/avatarLoader.gif | Bin 0 -> 5215 bytes src/main/webapp/images/members-loader.gif | Bin 0 -> 17090 bytes .../user/vremembers/VreMembersJUnit.gwt.xml | 9 + 40 files changed, 1149 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.eclipse.wst.validation.prefs create mode 100644 .settings/org.maven.ide.eclipse.prefs create mode 100644 VreMembersTest-dev.launch create mode 100644 VreMembersTest-prod.launch create mode 100644 pom.xml create mode 100644 src/main/java/org/gcube/portlets/user/vremembers/client/MembersService.java create mode 100644 src/main/java/org/gcube/portlets/user/vremembers/client/MembersServiceAsync.java create mode 100644 src/main/java/org/gcube/portlets/user/vremembers/client/VreMembers.java create mode 100644 src/main/java/org/gcube/portlets/user/vremembers/client/panels/VREMembersPanel.java create mode 100644 src/main/java/org/gcube/portlets/user/vremembers/client/ui/DisplayBadge.java create mode 100644 src/main/java/org/gcube/portlets/user/vremembers/client/ui/DisplayBadge.ui.xml create mode 100644 src/main/java/org/gcube/portlets/user/vremembers/server/MembersServiceImpl.java create mode 100644 src/main/java/org/gcube/portlets/user/vremembers/server/portlet/VREMembersPortlet.java create mode 100644 src/main/java/org/gcube/portlets/user/vremembers/shared/BelongingUser.java create mode 100644 src/main/resources/clientlog4j.properties create mode 100644 src/main/resources/org/gcube/portlets/user/vremembers/VreMembers.gwt.xml create mode 100644 src/main/webapp/VreMembers.css create mode 100644 src/main/webapp/VreMembers.html create mode 100644 src/main/webapp/WEB-INF/jsp/VREMembers_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/Avatar_default.png create mode 100644 src/main/webapp/images/avatarLoader.gif create mode 100644 src/main/webapp/images/members-loader.gif create mode 100644 src/test/resources/org/gcube/portlets/user/vremembers/VreMembersJUnit.gwt.xml diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..8844579 --- /dev/null +++ b/.classpath @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..5dbe300 --- /dev/null +++ b/.project @@ -0,0 +1,59 @@ + + + vre-members + vre-members 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..107fda2 --- /dev/null +++ b/.settings/com.google.gdt.eclipse.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +jarsExcludedFromWebInfLib= +lastWarOutDir=/Users/massi/Documents/workspace/vre-members/target/vre-members-0.1.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..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.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +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..834696a --- /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..4045d87 --- /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.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/.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/VreMembersTest-dev.launch b/VreMembersTest-dev.launch new file mode 100644 index 0000000..64c27f9 --- /dev/null +++ b/VreMembersTest-dev.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/VreMembersTest-prod.launch b/VreMembersTest-prod.launch new file mode 100644 index 0000000..6a6f32f --- /dev/null +++ b/VreMembersTest-prod.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..029d6b8 --- /dev/null +++ b/pom.xml @@ -0,0 +1,207 @@ + + + + 4.0.0 + + maven-parent + org.gcube.tools + 1.0.0 + + + + org.gcube.portlets.user + vre-members + war + 0.1.0-SNAPSHOT + gCube VRE Members Portlet + + VRE Members display the members of the current VRE + + + 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.5.1 + distro + 1.7 + 1.7 + ${project.build.directory}/${project.build.finalName} + + UTF-8 + UTF-8 + + + + + org.gcube.distribution + maven-portal-bom + LATEST + pom + import + + + + + + com.google.gwt + gwt-user + provided + + + com.google.gwt + gwt-servlet + provided + + + org.gcube.portlets.user + gcube-widgets + provided + + + org.gcube.portal + custom-portal-handler + provided + + + com.google + gwt-jsonmaker + + + org.gcube.applicationsupportlayer + aslcore + provided + + + org.gcube.portal + social-networking-library + provided + + + org.gcube.dvos + usermanagement-core + + + com.liferay.portal + portal-service + provided + + + javax.portlet + portlet-api + provided + + + org.slf4j + slf4j-log4j12 + + + org.slf4j + slf4j-api + + + + + ${webappDirectory}/WEB-INF/classes + + + + org.codehaus.mojo + gwt-maven-plugin + ${gwtVersion} + + + + compile + + + + + + + VREMembers.html + ${webappDirectory} + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + compile + + exploded + + + + + ${webappDirectory} + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.7 + 1.7 + + + + + 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/vremembers/client/MembersService.java b/src/main/java/org/gcube/portlets/user/vremembers/client/MembersService.java new file mode 100644 index 0000000..f8ebf2f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/vremembers/client/MembersService.java @@ -0,0 +1,15 @@ +package org.gcube.portlets.user.vremembers.client; + +import java.util.ArrayList; + +import org.gcube.portlets.user.vremembers.shared.BelongingUser; +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("memberservice") +public interface MembersService extends RemoteService { + ArrayList getOrganizationUsers(); +} diff --git a/src/main/java/org/gcube/portlets/user/vremembers/client/MembersServiceAsync.java b/src/main/java/org/gcube/portlets/user/vremembers/client/MembersServiceAsync.java new file mode 100644 index 0000000..297c5fa --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/vremembers/client/MembersServiceAsync.java @@ -0,0 +1,13 @@ +package org.gcube.portlets.user.vremembers.client; + +import java.util.ArrayList; + +import org.gcube.portlets.user.vremembers.shared.BelongingUser; + + +import com.google.gwt.user.client.rpc.AsyncCallback; + +public interface MembersServiceAsync { + + void getOrganizationUsers(AsyncCallback> callback); +} diff --git a/src/main/java/org/gcube/portlets/user/vremembers/client/VreMembers.java b/src/main/java/org/gcube/portlets/user/vremembers/client/VreMembers.java new file mode 100644 index 0000000..7172ece --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/vremembers/client/VreMembers.java @@ -0,0 +1,16 @@ +package org.gcube.portlets.user.vremembers.client; + +import org.gcube.portlets.user.vremembers.client.panels.VREMembersPanel; + +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.user.client.ui.RootPanel; + +/** + * Entry point classes define onModuleLoad(). + */ +public class VreMembers implements EntryPoint { + + public void onModuleLoad() { + RootPanel.get("VRE-Members-Container").add(new VREMembersPanel()); + } +} diff --git a/src/main/java/org/gcube/portlets/user/vremembers/client/panels/VREMembersPanel.java b/src/main/java/org/gcube/portlets/user/vremembers/client/panels/VREMembersPanel.java new file mode 100644 index 0000000..3e8abc5 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/vremembers/client/panels/VREMembersPanel.java @@ -0,0 +1,73 @@ +package org.gcube.portlets.user.vremembers.client.panels; + +import java.util.ArrayList; + +import org.gcube.portlets.user.vremembers.client.MembersService; +import org.gcube.portlets.user.vremembers.client.MembersServiceAsync; +import org.gcube.portlets.user.vremembers.client.ui.DisplayBadge; +import org.gcube.portlets.user.vremembers.shared.BelongingUser; + +import com.google.gwt.core.client.GWT; +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.Grid; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasAlignment; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.VerticalPanel; + +public class VREMembersPanel extends Composite { + /** + * Create a remote service proxy to talk to the server-side Greeting service. + */ + private final MembersServiceAsync vreMemberService = GWT.create(MembersService.class); + + public static final String loading = GWT.getModuleBaseURL() + "../images/members-loader.gif"; + + private Image loadingImage; + + private VerticalPanel mainPanel = new VerticalPanel(); + public VREMembersPanel() { + super(); + loadingImage = new Image(loading); + mainPanel.add(loadingImage); + showLoader(); + vreMemberService.getOrganizationUsers(new AsyncCallback>() { + + @Override + public void onSuccess(ArrayList users) { + mainPanel.clear(); + mainPanel.setHorizontalAlignment(HasAlignment.ALIGN_LEFT); + mainPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_TOP); + Grid grid = new Grid(users.size()/3+1, 3); + mainPanel.add(grid); + + for (int i = 0; i < users.size(); i++) { + grid.setWidget(i/3, i%3, new DisplayBadge(users.get(i))); + } + } + + @Override + public void onFailure(Throwable caught) { + mainPanel.add(new HTML("
" + + "Sorry, looks like something is broken with the server connection
" + + "Please check your connection and try refresh this page.
")); + + } + }); + initWidget(mainPanel); + + } + + + private void showLoader() { + mainPanel.clear(); + mainPanel.setWidth("100%"); + mainPanel.setHeight("300px"); + mainPanel.setHorizontalAlignment(HasAlignment.ALIGN_CENTER); + mainPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); + mainPanel.add(loadingImage); + } +} diff --git a/src/main/java/org/gcube/portlets/user/vremembers/client/ui/DisplayBadge.java b/src/main/java/org/gcube/portlets/user/vremembers/client/ui/DisplayBadge.java new file mode 100644 index 0000000..1e4df50 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/vremembers/client/ui/DisplayBadge.java @@ -0,0 +1,84 @@ +package org.gcube.portlets.user.vremembers.client.ui; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.codec.binary.Base64; +import org.gcube.portal.databook.client.GCubeSocialNetworking; +import org.gcube.portlets.user.gcubewidgets.client.elements.Span; +import org.gcube.portlets.user.vremembers.shared.BelongingUser; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.AnchorElement; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.Window.Location; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.Widget; + +public class DisplayBadge extends Composite { + protected final static String HEADLINE_TEXT = "Professional Headline"; + protected final static String ISTI_TEXT = "Company"; + + private static DisplayBadgeUiBinder uiBinder = GWT.create(DisplayBadgeUiBinder.class); + + interface DisplayBadgeUiBinder extends UiBinder { + } + public static final String avatar_default = GWT.getModuleBaseURL() + "../images/Avatar_default.png"; + public static final String loading = GWT.getModuleBaseURL() + "../images/avatarLoader.gif"; + + @UiField HTMLPanel mainPanel; + @UiField Image avatarImage; + @UiField HTML userFullName; + + @UiField HTML headlineLabel; + @UiField HTML institutionLabel; + @UiField AnchorElement imageRedirect; + + private BelongingUser myUserInfo; + + public DisplayBadge(BelongingUser user) { + initWidget(uiBinder.createAndBindUi(this)); + avatarImage.setUrl(loading); + mainPanel.addStyleName("profile-section"); + + myUserInfo = user; + avatarImage.getElement().getParentElement().setAttribute("href", myUserInfo.getAvatarId()); + avatarImage.setSize("100px", "100px"); + avatarImage.setUrl(myUserInfo.getAvatarId()); + userFullName.setText(myUserInfo.getFullName()); + + + String head = (user.getHeadline() == null || user.getHeadline().compareTo("") == 0) ? "" : user.getHeadline(); + String isti = (user.getInstitution() == null || user.getInstitution().compareTo("") == 0) ? "" : user.getInstitution(); + headlineLabel.setText(head); + institutionLabel.setText(isti); + imageRedirect.setHref(user.getProfileLink()); + String title = "See profile of " + myUserInfo.getFullName(); + avatarImage.setTitle(title); + userFullName.setTitle(title); + + } + + @UiHandler("userFullName") + void onSubmitClick(ClickEvent e) { + Location.assign(myUserInfo.getProfileLink()); + } + + public void showError(String message) { + Window.alert("Failure: " + message); + avatarImage.setSize("100px", "100px"); + avatarImage.setUrl(avatar_default); + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/vremembers/client/ui/DisplayBadge.ui.xml b/src/main/java/org/gcube/portlets/user/vremembers/client/ui/DisplayBadge.ui.xml new file mode 100644 index 0000000..b2f3847 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/vremembers/client/ui/DisplayBadge.ui.xml @@ -0,0 +1,71 @@ + + + + .framed { + padding: 10px; + margin: 10px; + background: #FFF; + border-radius: 6px !important; + -moz-border-radius: 6px !important; + -webkit-border-radius: 6px !important; + border: 1px solid #DBDBDB; + } + + .user-photo { + display: block; + padding: 2px; + border: 1px solid #E6E6E6; + } + + .user-details { + padding: 5px; + } + + .fullName { + font-family: 'Helvetica Neue', Arial, sans-serif; + font-size: 22px; + font-weight: bold; + white-space: nowrap; + } + + .fullName:hover { + cursor: pointer; + cursor: hand; + text-decoration: underline; + color: #01497C; + } + + .headline { + font-family: 'Helvetica Neue', Arial, sans-serif; + font-size: 16px; + color: #444444; + } + + .institution { + font-family: 'Helvetica Neue', Arial, sans-serif; + font-size: 13px; + color: #444444; + } + + + + + + + +
+ + + + +
+ + + +
+
+
+
\ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/vremembers/server/MembersServiceImpl.java b/src/main/java/org/gcube/portlets/user/vremembers/server/MembersServiceImpl.java new file mode 100644 index 0000000..cc2fed7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/vremembers/server/MembersServiceImpl.java @@ -0,0 +1,139 @@ +package org.gcube.portlets.user.vremembers.server; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.apache.commons.codec.binary.Base64; +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.application.framework.core.session.SessionManager; +import org.gcube.common.scope.impl.ScopeBean; +import org.gcube.common.scope.impl.ScopeBean.Type; +import org.gcube.portal.custom.communitymanager.OrganizationsUtil; +import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; +import org.gcube.portal.databook.client.GCubeSocialNetworking; +import org.gcube.portlets.user.vremembers.client.MembersService; +import org.gcube.portlets.user.vremembers.shared.BelongingUser; +import org.gcube.vomanagement.usermanagement.GroupManager; +import org.gcube.vomanagement.usermanagement.UserManager; +import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayGroupManager; +import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayUserManager; +import org.gcube.vomanagement.usermanagement.model.UserModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; +import com.liferay.portal.service.UserLocalServiceUtil; + +/** + * @author Massimiliano Assante, ISTI-CNR + */ +@SuppressWarnings("serial") +public class MembersServiceImpl extends RemoteServiceServlet implements MembersService { + private static final Logger _log = LoggerFactory.getLogger(MembersServiceImpl.class); + + /** + * 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 and Running OUTSIDE PORTAL"); + user = getDevelopmentUser(); + SessionManager.getInstance().getASLSession(sessionID, user).setScope("/gcube"); + } + return SessionManager.getInstance().getASLSession(sessionID, user); + } + /** + * when packaging test will fail if the user is not set to test.user + * @return . + */ + public String getDevelopmentUser() { + String user = "test.user"; + //user = "massimiliano.assante"; + return user; + } + /** + * + * @return true if you're running into the portal, false if in development + */ + private boolean isWithinPortal() { + try { + UserLocalServiceUtil.getService(); + return true; + } + catch (com.liferay.portal.kernel.bean.BeanLocatorException ex) { + _log.trace("Development Mode ON"); + return false; + } + } + /** + * + * @param session the Asl Session + * @param withinPortal true when is on Liferay portal + * @return the users belonging to the current organization (scope) + */ + @Override + public ArrayList getOrganizationUsers() { + ArrayList portalUsers = new ArrayList(); + String scope = getASLSession().getScope(); + if (scope == null) + return portalUsers; + try { + if (isWithinPortal()) { + UserManager um = new LiferayUserManager(); + GroupManager gm = new LiferayGroupManager(); + ScopeBean sb = new ScopeBean(scope); + List users = null; + + if (sb.is(Type.INFRASTRUCTURE)) + users = um.listUsersByGroup(gm.getRootVO().getGroupId()); + else if (sb.is(Type.VRE)) { //must be in VRE + //get the name from the scope + String orgName = scope.substring(scope.lastIndexOf("/")+1, scope.length()); + //ask the users + users = um.listUsersByGroup(gm.getGroupId(orgName)); + } + else { + _log.error("Error, you must be in SCOPE VRE OR INFRASTURCTURE, you are in VO SCOPE returning no users"); + return portalUsers; + } + for (UserModel user : users) { + if (user.getScreenName().compareTo("test.user") != 0) { //skip test.user + String thumbnailURL = ""; + com.liferay.portal.model.User lifeUser = UserLocalServiceUtil.getUserByScreenName(OrganizationsUtil.getCompany().getCompanyId(), user.getScreenName()); + thumbnailURL = lifeUser.isMale() ? "/image/user_male_portrait?img_id="+lifeUser.getPortraitId() : "/image/user_female_portrait?img_id="+lifeUser.getPortraitId(); + portalUsers.add(new BelongingUser(user.getScreenName(), user.getFullname(), thumbnailURL, lifeUser.getJobTitle(), lifeUser.getOpenId(), getUserProfileLink(user.getScreenName() ),lifeUser.getPortraitId() != 0)); + } + } + + } + else { //test users + portalUsers.add(new BelongingUser("massimiliano.assante", "Test User #1", "1111", "headline", "isti", "",false)); + portalUsers.add(new BelongingUser("pino.assante", "Test Second User #2", "1111", "headline1", "istitution complex", "",false)); + portalUsers.add(new BelongingUser("pino.pino", "With Photo Third User", "1111", "hard worker", "acme Ltd", "",true)); + portalUsers.add(new BelongingUser("giorgi.giorgi", "Test Fourth User", "1111", "hard worker 3", "isti3", "",false)); + portalUsers.add(new BelongingUser("pinetti.giorgi", "Test Fifth User", "1111", "hard worker 4", "super acme Inc.", "",false)); + portalUsers.add(new BelongingUser("massimiliano.pinetti", "Test Sixth User", "1111", "hard worker the5th", "istiw", "", false)); + portalUsers.add(new BelongingUser("giorgi.assante", "Ninth Testing User", "1111", "hard worker the9th", "istiw9", "",false)); + portalUsers.add(new BelongingUser("massimiliano.giorgi", "Eighth Testing User", "1111", "hard worker the8th", "istiw56", "", false)); + portalUsers.add(new BelongingUser("giogio.giorgi", "Seventh Test User", "1111", "hard worker the7th", "istiw7", "", false)); + portalUsers.add(new BelongingUser("pino.pinetti", "Tenth Testing User Photoed", "1111", "hard worker the10th", "istiw777", "",true)); + } + } catch (Exception e) { + _log.error("Error in server get all contacts ", e); + } + //users having photo go first + Collections.sort(portalUsers); + return portalUsers; + } + + private String getUserProfileLink(String username) { + return GCubeSocialNetworking.USER_PROFILE_LINK + +"?"+ + new String(Base64.encodeBase64(GCubeSocialNetworking.USER_PROFILE_OID.getBytes()))+"="+ + new String(Base64.encodeBase64(username.getBytes())); + } +} diff --git a/src/main/java/org/gcube/portlets/user/vremembers/server/portlet/VREMembersPortlet.java b/src/main/java/org/gcube/portlets/user/vremembers/server/portlet/VREMembersPortlet.java new file mode 100644 index 0000000..34e18ab --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/vremembers/server/portlet/VREMembersPortlet.java @@ -0,0 +1,30 @@ + +package org.gcube.portlets.user.vremembers.server.portlet; + +import javax.portlet.GenericPortlet; +import javax.portlet.ActionRequest; +import javax.portlet.RenderRequest; +import javax.portlet.ActionResponse; +import javax.portlet.RenderResponse; +import javax.portlet.PortletException; +import java.io.IOException; +import javax.portlet.PortletRequestDispatcher; + +import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; + +/** + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + */ + public class VREMembersPortlet extends GenericPortlet { + public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException { + response.setContentType("text/html"); + ScopeHelper.setContext(request); + PortletRequestDispatcher dispatcher = getPortletContext().getRequestDispatcher("/WEB-INF/jsp/VREMembers_view.jsp"); + dispatcher.include(request, response); + } + + public void processAction(ActionRequest request, ActionResponse response) + throws PortletException, IOException { + } +} diff --git a/src/main/java/org/gcube/portlets/user/vremembers/shared/BelongingUser.java b/src/main/java/org/gcube/portlets/user/vremembers/shared/BelongingUser.java new file mode 100644 index 0000000..df5a86b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/vremembers/shared/BelongingUser.java @@ -0,0 +1,110 @@ +package org.gcube.portlets.user.vremembers.shared; + +import java.io.Serializable; + +@SuppressWarnings("serial") +public class BelongingUser implements Serializable, Comparable { + private String username; + private String fullName; + private String avatarId; + private String headline; + private String institution; + private String profileLink; + private boolean hasPhoto; + + public BelongingUser(String username, String fullName, String avatarId, + String headline, String institution, String profileLink, boolean hasPhoto) { + super(); + this.username = username; + this.fullName = fullName; + this.avatarId = avatarId; + this.headline = headline; + this.institution = institution; + this.hasPhoto = hasPhoto; + this.profileLink = profileLink; + } + + public BelongingUser() { + super(); + } + + + public String getUsername() { + return username; + } + + + public void setUsername(String username) { + this.username = username; + } + + + public String getFullName() { + return fullName; + } + + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + + public String getAvatarId() { + return avatarId; + } + + + public void setAvatarId(String avatarId) { + this.avatarId = avatarId; + } + + + public String getHeadline() { + return headline; + } + + + public void setHeadline(String headline) { + this.headline = headline; + } + + + public String getInstitution() { + return institution; + } + + + public void setInstitution(String institution) { + this.institution = institution; + } + + + public boolean hasPhoto() { + return hasPhoto; + } + + public void setHasPhoto(boolean hasPhoto) { + this.hasPhoto = hasPhoto; + } + + + + public String getProfileLink() { + return profileLink; + } + + public void setProfileLink(String profileLink) { + this.profileLink = profileLink; + } + + @Override + public int compareTo(BelongingUser o) { + if (this.hasPhoto && !o.hasPhoto) + return -1; + if (!this.hasPhoto && o.hasPhoto) + return 1; + return 0; + } + + +} diff --git a/src/main/resources/clientlog4j.properties b/src/main/resources/clientlog4j.properties new file mode 100644 index 0000000..4a2e1cd --- /dev/null +++ b/src/main/resources/clientlog4j.properties @@ -0,0 +1,12 @@ +log4j.rootLogger=DEBUG, A1 +log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1.layout=org.apache.log4j.PatternLayout + +# Print the date in ISO 8601 format +log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n + +# Print only messages of level TRACE or above in the package org.gcube +log4j.logger.org.gcube=TRACE +log4j.logger.org.gcube.application.framework.core.session=INFO +log4j.logger.org.gcube.common.scope.impl.DefaultScopeProvider=ERROR +log4j.logger.com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor=ERROR \ No newline at end of file diff --git a/src/main/resources/org/gcube/portlets/user/vremembers/VreMembers.gwt.xml b/src/main/resources/org/gcube/portlets/user/vremembers/VreMembers.gwt.xml new file mode 100644 index 0000000..ed11f3d --- /dev/null +++ b/src/main/resources/org/gcube/portlets/user/vremembers/VreMembers.gwt.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/VreMembers.css b/src/main/webapp/VreMembers.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/webapp/VreMembers.html b/src/main/webapp/VreMembers.html new file mode 100644 index 0000000..3b022b7 --- /dev/null +++ b/src/main/webapp/VreMembers.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + +Vre Members Project + + + + + + + +
+ + + diff --git a/src/main/webapp/WEB-INF/jsp/VREMembers_view.jsp b/src/main/webapp/WEB-INF/jsp/VREMembers_view.jsp new file mode 100644 index 0000000..d8d3d73 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/VREMembers_view.jsp @@ -0,0 +1,6 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + +
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..01ea2ae --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-display.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file 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..6263ab8 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-plugin-package.properties @@ -0,0 +1,9 @@ +name=VREMembers +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..ac028cd --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-portlet.xml @@ -0,0 +1,28 @@ + + + + + + VREMembers + false + false + false + /VreMembers.css + + + administrator + Administrator + + + guest + Guest + + + power-user + Power User + + + user + User + + diff --git a/src/main/webapp/WEB-INF/portlet.xml b/src/main/webapp/WEB-INF/portlet.xml new file mode 100644 index 0000000..f19846c --- /dev/null +++ b/src/main/webapp/WEB-INF/portlet.xml @@ -0,0 +1,30 @@ + + + + + VREMembers + VRE Members + org.gcube.portlets.user.vremembers.server.portlet.VREMembersPortlet + + view-jsp + /view.jsp + + 0 + + text/html + + + VRE Members + VRE Members + VRE Members + + + administrator + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..5163667 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,24 @@ + + + + + + + + greetServlet + org.gcube.portlets.user.vremembers.server.MembersServiceImpl + + + + greetServlet + /vremembers/memberservice + + + + + VreMembers.html + + + diff --git a/src/main/webapp/images/Avatar_default.png b/src/main/webapp/images/Avatar_default.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6c84458afa00029a1d5e6b96cc3f0237b4f745 GIT binary patch literal 997 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/images/members-loader.gif b/src/main/webapp/images/members-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..89ae681f66a017f1e57e7ec46f7808489ae876cc GIT binary patch literal 17090 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 Mx=8)S!lu&y0<|xX!2kdN literal 0 HcmV?d00001 diff --git a/src/test/resources/org/gcube/portlets/user/vremembers/VreMembersJUnit.gwt.xml b/src/test/resources/org/gcube/portlets/user/vremembers/VreMembersJUnit.gwt.xml new file mode 100644 index 0000000..a836131 --- /dev/null +++ b/src/test/resources/org/gcube/portlets/user/vremembers/VreMembersJUnit.gwt.xml @@ -0,0 +1,9 @@ + + + + + + + + +