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 0000000..2a6c844
Binary files /dev/null and b/src/main/webapp/images/Avatar_default.png differ
diff --git a/src/main/webapp/images/avatarLoader.gif b/src/main/webapp/images/avatarLoader.gif
new file mode 100644
index 0000000..4c4d825
Binary files /dev/null and b/src/main/webapp/images/avatarLoader.gif differ
diff --git a/src/main/webapp/images/members-loader.gif b/src/main/webapp/images/members-loader.gif
new file mode 100644
index 0000000..89ae681
Binary files /dev/null and b/src/main/webapp/images/members-loader.gif differ
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 @@
+
+
+
+
+
+
+
+
+