package org.gcube.portlets.admin.vredeployer.server; import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.StringReader; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Hashtable; import java.util.LinkedList; import java.util.List; import java.util.UUID; import javax.servlet.http.HttpSession; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.gcube.application.framework.core.session.ASLSession; import org.gcube.application.framework.core.session.SessionManager; import org.gcube.application.framework.vremanagement.vremanagement.impl.VREGeneratorEvo; import org.gcube.applicationsupportlayer.social.ApplicationNotificationsManager; import org.gcube.applicationsupportlayer.social.NotificationsManager; import org.gcube.common.homelibrary.home.HomeLibrary; import org.gcube.common.homelibrary.home.exceptions.InternalErrorException; import org.gcube.common.homelibrary.home.workspace.Workspace; import org.gcube.common.homelibrary.home.workspace.WorkspaceSharedFolder; import org.gcube.common.homelibrary.home.workspace.accessmanager.ACLType; import org.gcube.common.homelibrary.home.workspace.usermanager.GCubeGroup; import org.gcube.common.portal.PortalContext; import org.gcube.common.resources.gcore.GenericResource; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.informationsystem.publisher.RegistryPublisher; import org.gcube.informationsystem.publisher.RegistryPublisherFactory; import org.gcube.portal.custom.communitymanager.OrganizationsUtil; import org.gcube.portal.custom.communitymanager.PortletsIdManager; import org.gcube.portal.custom.communitymanager.ThemesIdManager; import org.gcube.portal.custom.communitymanager.components.GCUBELayoutTab; import org.gcube.portal.custom.communitymanager.components.GCUBEPortlet; import org.gcube.portal.custom.communitymanager.components.GCUBESiteLayout; import org.gcube.portal.custom.communitymanager.impl.OrganizationManagerImpl; import org.gcube.portal.custom.communitymanager.types.GCUBELayoutType; import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; import org.gcube.portal.databook.server.DBCassandraAstyanaxImpl; import org.gcube.portal.databook.server.DatabookStore; import org.gcube.portal.databook.shared.Feed; import org.gcube.portal.databook.shared.FeedType; import org.gcube.portal.databook.shared.PrivacyLevel; import org.gcube.portal.databook.shared.UserInfo; import org.gcube.portal.databook.shared.ex.FeedIDNotFoundException; import org.gcube.portlets.admin.vredeployer.client.VredeployerService; import org.gcube.portlets.admin.vredeployer.client.model.VREFunctionalityModel; import org.gcube.portlets.admin.vredeployer.shared.GHNMemory; import org.gcube.portlets.admin.vredeployer.shared.GHNProfile; import org.gcube.portlets.admin.vredeployer.shared.GHNSite; import org.gcube.portlets.admin.vredeployer.shared.ResourceCategory; import org.gcube.portlets.admin.vredeployer.shared.ResourceCategoryItem; import org.gcube.portlets.admin.vredeployer.shared.RunningInstance; import org.gcube.portlets.admin.vredeployer.shared.VREDeployerStatusType; import org.gcube.portlets.admin.vredeployer.shared.VREDescrBean; import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientCloudReport; import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientDeployReport; import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientFunctionalityDeployReport; import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientFunctionalityReport; import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientResource; import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientResourceManagerDeployingReport; import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientResourcesDeployReport; import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientServiceReport; import org.gcube.portlets.admin.vredeployer.shared.deployreport.DeployStatus; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.gcube.vomanagement.usermanagement.GroupManager; import org.gcube.vomanagement.usermanagement.RoleManager; import org.gcube.vomanagement.usermanagement.UserManager; import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault; import org.gcube.vomanagement.usermanagement.exception.UserManagementPortalException; import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException; import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault; import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayGroupManager; import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayRoleManager; import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayUserManager; import org.gcube.vomanagement.usermanagement.model.GroupModel; import org.gcube.vomanagement.usermanagement.model.UserModel; import org.gcube.vremanagement.vremodel.cl.stubs.types.FunctionalityItem; import org.gcube.vremanagement.vremodel.cl.stubs.types.GHN; import org.gcube.vremanagement.vremodel.cl.stubs.types.GHNsPerFunctionality; import org.gcube.vremanagement.vremodel.cl.stubs.types.ResourceDescriptionItem; import org.gcube.vremanagement.vremodel.cl.stubs.types.ResourceItem; import org.gcube.vremanagement.vremodel.cl.stubs.types.RunningInstanceMessage; import org.gcube.vremanagement.vremodel.cl.stubs.types.VREDescription; import org.gcube.vremanagement.vremodeler.utils.Utils; import org.gcube.vremanagement.vremodeler.utils.reports.DeployReport; import org.gcube.vremanagement.vremodeler.utils.reports.FunctionalityReport; import org.gcube.vremanagement.vremodeler.utils.reports.GHNonCloudReport; import org.gcube.vremanagement.vremodeler.utils.reports.Resource; import org.gcube.vremanagement.vremodeler.utils.reports.ServiceReport; import org.gcube.vremanagement.vremodeler.utils.reports.Status; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.liferay.portal.NoSuchRoleException; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.model.Company; import com.liferay.portal.model.Group; import com.liferay.portal.model.Organization; import com.liferay.portal.model.Role; import com.liferay.portal.service.OrganizationLocalServiceUtil; import com.liferay.portal.service.RoleLocalServiceUtil; import com.liferay.portal.service.UserLocalServiceUtil; import com.liferay.portal.theme.ThemeDisplay; /** * The server side implementation of the RPC service. */ @SuppressWarnings("serial") public class VREDeployerServiceImpl extends RemoteServiceServlet implements VredeployerService { private static final Logger log = LoggerFactory.getLogger(VREDeployerServiceImpl.class); protected static final String ORGANIZATION_DEFAULT_LOGO = "/org/gcube/portal/custom/communitymanager/resources/default_logo.png"; protected static final String ORGANIZATION_DEFAULT_LOGO_URL = "http://ftp.d4science.org/apps/profiles/d4slogo.png"; private static final int LIFERAY_REGULAR_ROLE_ID = 1; /** * */ private static final String VRE_GENERATOR_ATTRIBUTE = "VREGenerator"; private static final String GHN_PER_FUNC_ATTRIBUTE = "GHN_PER_FUNC_ATTRIBUTE"; private static final String HARD_CODED_VO_NAME = "/gcube/devsec"; private static final String APPROVING_VRE = "approvingVRE"; public static final String APPROVE_MODE = "approve"; public static final String EDIT_MODE = "edit"; public static final String REEDIT_TYPE_ATTRIBUTE = "reeditType"; public static final String MODE_ATTRIBUTE = "mode"; private static final String DESCRIPTION = "DESCRIPTION"; private static final String DEPLOYING = "DEPLOYING"; private static final String DESIGNER = "Designer"; private static final String MANAGER = "Manager"; /** * */ private boolean isTesting = true; String customEPR = "1d648460-2d05-11e3-9f6f-a17a856bd44f"; /** * * @return */ private VREGeneratorEvo getVREGeneratorEvo(ASLSession aslSession){ log.info("getVREGeneratorEvo called with scope: " + aslSession.getScopeName()); String vreid = (String) aslSession.getAttribute(VRE_GENERATOR_ATTRIBUTE); if(vreid==null){ return null; } return new VREGeneratorEvo(aslSession, vreid); //cannot cache VREGeneretor instance; } private void setDeployingStatusOn() { getASLSession().setAttribute(DEPLOYING, "ON"); } private void setDeployingStatusOff() { getASLSession().setAttribute(DEPLOYING, null); } private boolean isDeploying() { return getASLSession().getAttribute(DEPLOYING) != null; } /** * * @return */ private ASLSession getASLSession() { log.info("getVREGeneratorEvo getASLSession() : "); HttpSession session = this.getThreadLocalRequest().getSession(); String username = (String) session.getAttribute(ScopeHelper.USERNAME_ATTRIBUTE); if (username == null) { username = "massimiliano.assante"; SessionManager.getInstance().getASLSession(session.getId(), username).setScope(HARD_CODED_VO_NAME); SessionManager.getInstance().getASLSession(session.getId(), username).setAttribute(REEDIT_TYPE_ATTRIBUTE, APPROVE_MODE); } else { isTesting = false; } return SessionManager.getInstance().getASLSession(session.getId(), username); } /** * {@inheritDoc} */ public VREDeployerStatusType isApprovingModeEnabled() { if (isTesting) { setDeployingStatusOff(); return VREDeployerStatusType.APPROVE; } if (isDeploying()) return VREDeployerStatusType.DEPLOYING; log.debug("--- isApprovingModeEnabled in Log ---"); ASLSession aslSession = getASLSession(); aslSession.setAttribute(MODE_ATTRIBUTE, null); String reeditType = (String) aslSession.getAttribute(REEDIT_TYPE_ATTRIBUTE); log.debug("REEDIT_TYPE_ATTRIBUTE = " + reeditType); aslSession.setAttribute(REEDIT_TYPE_ATTRIBUTE, null); if ( reeditType != null && reeditType.compareTo(APPROVE_MODE) == 0) { System.out.println(APPROVING_VRE + " = " + true); aslSession.setAttribute(MODE_ATTRIBUTE,APPROVING_VRE); return VREDeployerStatusType.APPROVE; } else{ /* This is needed to avoid to log out and log in again to create a new VRE */ aslSession.setAttribute(VRE_GENERATOR_ATTRIBUTE, null); } aslSession.setAttribute(REEDIT_TYPE_ATTRIBUTE, null); return VREDeployerStatusType.NON_APPROVE; } /** * return the VRE Overall Information */ public VREDescrBean getVRE() throws NullPointerException { VREGeneratorEvo vreGenerator = null; if (isTesting) { vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR); } else { ASLSession aslSession = getASLSession(); vreGenerator = getVREGeneratorEvo(aslSession); log.info("VRE EPR: " + vreGenerator.getVREepr()); } VREDescrBean vreDescBean = null; log.debug("--- Getting VRE Model ---"); try { VREDescription sd = vreGenerator.getVREModel(); vreDescBean = new VREDescrBean(sd.name(), sd.description(), sd.designer(), sd.manager(), sd.startTime().getTime(), sd.endTime().getTime()); getASLSession().setAttribute(DESIGNER, sd.designer()); getASLSession().setAttribute(MANAGER, sd.manager()); } catch (RemoteException e) { e.printStackTrace(); } log.debug("Model: " + vreDescBean.getName()); log.debug("--- END Getting VRE Model ---"); return vreDescBean; } /** * return the name and last name of the user * @param username * @return */ private String getFullname(String screenName) { UserManager um = new LiferayUserManager(); UserModel user = null; try { user = um.getUserByScreenName(screenName); } catch (UserManagementSystemException e) { e.printStackTrace(); } catch (UserRetrievalFault e) { e.printStackTrace(); } catch (UserManagementPortalException e) { e.printStackTrace(); } return user.getFullname(); } /** * read the available functionality from the service through ASL extension */ @Override public VREFunctionalityModel getFunctionality() { VREFunctionalityModel toReturn = new VREFunctionalityModel("","selected functionality", "", "",false); HashMap> funCategories = new HashMap>(); List list = null; VREGeneratorEvo vreGenerator = null; try { if (isTesting) vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR); else { ASLSession aslSession = getASLSession(); vreGenerator = getVREGeneratorEvo(aslSession); log.info("VRE EPR: " + vreGenerator.getVREepr()); } list = vreGenerator.getFunctionality(); } catch (Exception e) { e.printStackTrace(); } if (list == null) { log.warn("FunctionalityList NULL"); return null; } for (FunctionalityItem fi :list){ System.out.println(fi.id()+"-"+fi.name()); VREFunctionalityModel toAdd = new VREFunctionalityModel(Integer.toString(fi.id()), fi.name(), fi.description(), "",fi.selected()); if (fi.children() != null) { List children = fi.children(); ArrayList newchildrens = new ArrayList(); //creating node children for (FunctionalityItem child : children) { System.out.println(child.name() + " is " + child.selected()); if (child.selected()) { VREFunctionalityModel subFunc = new VREFunctionalityModel(Integer.toString(child.id()), child.name(), child.description(), "functionality-add-icon",child.selected()); newchildrens.add(subFunc); ArrayList resourceChildren = new ArrayList(); if ( child.selectableResourcesDescription()!=null) { for (ResourceDescriptionItem category: child.selectableResourcesDescription()) { if (category.resources()!=null) for (ResourceItem resource : category.resources()) if (resource.selected()) resourceChildren.add(new VREFunctionalityModel(resource.id(), resource.name(), resource.description(), "extres-icon", resource.selected())); } //subFunc.addChildren(resourceChildrens.toArray(new VREFunctionalityModel[resourceChildrens.size()])); } AdditionalFuncInfo addInfo = getServicesAndGHNs(subFunc.getId()); if (addInfo != null) { RunningInstanceMessage[] ris = addInfo.getMissingServices(); for (int j = 0; j < ris.length; j++) { RunningInstanceMessage ri = ris[j]; resourceChildren.add(new VREFunctionalityModel("", ri.serviceName() + " (" + ri.serviceClass()+")", "", "missing-ri", true)); } ris = addInfo.getFoundServices(); for (int j = 0; j < ris.length; j++) { RunningInstanceMessage ri = ris[j]; resourceChildren.add(new VREFunctionalityModel("", ri.serviceName() + " (" + ri.serviceClass()+")", "", "runninginstance-icon", true)); } GHN[] relGHNs = addInfo.getGhns(); for (int j = 0; j < relGHNs.length; j++) { GHN ghn = relGHNs[j]; resourceChildren.add(new VREFunctionalityModel("", ghn.host() + " (" + ghn.site().domain()+")", "", "architecture-icon", true)); } } else log.error("getServicesAndGHNs per subfunctionality returns NULL"); subFunc.addChildren(resourceChildren.toArray(new VREFunctionalityModel[resourceChildren.size()])); } } if (newchildrens.size() > 0) { toAdd.addChildren(newchildrens.toArray(new VREFunctionalityModel[newchildrens.size()])); toReturn.add(toAdd); } } } for (String func : funCategories.keySet()) { System.out.println("-"+func); for(ResourceCategory category : funCategories.get(func)) { System.out.println("--"+category.getName()); for(ResourceCategoryItem rc: category.getItems()) { System.out.println("----"+rc.getName() + " : " + rc.isSelected()); } } } return toReturn; } @Override public void getGHNPerFunctionality(String funcId) { VREGeneratorEvo vreGenerator = null; if (isTesting) vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR); else { ASLSession aslSession = getASLSession(); vreGenerator = getVREGeneratorEvo(aslSession); } int funcToLookFor = Integer.parseInt(funcId); try { GHNsPerFunctionality[] ghnsPerFunc = vreGenerator.getGHNsPerFunctionality(); GHNsPerFunctionality toWorkWith = null; for (int i = 0; i < ghnsPerFunc.length; i++) if (funcToLookFor == ghnsPerFunc[i].id()) { toWorkWith = ghnsPerFunc[i]; break; } if (toWorkWith == null) return; List services = toWorkWith.foundServices(); if (services != null) { for (RunningInstanceMessage se : services) { System.out.println(se.serviceName() + " - " + se.serviceClass()); } } } catch (RemoteException e) { e.printStackTrace(); } } private void setGHNsPerFunctionalityInSession(GHNsPerFunctionality[] ghnsPerFunc) { getASLSession().setAttribute(GHN_PER_FUNC_ATTRIBUTE, ghnsPerFunc); } private GHNsPerFunctionality[] getGHNsPerFunctionalityFromSession() { return (GHNsPerFunctionality[]) getASLSession().getAttribute(GHN_PER_FUNC_ATTRIBUTE); } /** * get the list of running instances associated to a service * @param funcId * @return */ private AdditionalFuncInfo getServicesAndGHNs(String funcId) { AdditionalFuncInfo toReturn = new AdditionalFuncInfo(); try { GHNsPerFunctionality[] ghnsPerFunc = null; if (getGHNsPerFunctionalityFromSession() == null) { //avoid multiple calls to the service VREGeneratorEvo vreGenerator = null; if (isTesting) vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR); else { ASLSession aslSession = getASLSession(); vreGenerator = getVREGeneratorEvo(aslSession); } ghnsPerFunc = vreGenerator.getGHNsPerFunctionality(); setGHNsPerFunctionalityInSession(ghnsPerFunc); } else { ghnsPerFunc = getGHNsPerFunctionalityFromSession(); } int funcToLookFor = Integer.parseInt(funcId); GHNsPerFunctionality ghnPF = null; for (int i = 0; i < ghnsPerFunc.length; i++) { if (funcToLookFor == ghnsPerFunc[i].id()) { ghnPF = ghnsPerFunc[i]; break; } } if (ghnPF == null || ghnPF.missingServices() == null) toReturn.setMissingServices(new RunningInstanceMessage[0]); else { toReturn.setMissingServices(ghnPF.missingServices().toArray(new RunningInstanceMessage[0])); } if (ghnPF == null || ghnPF.foundServices() == null) toReturn.setFoundServices(new RunningInstanceMessage[0]); else { toReturn.setFoundServices(ghnPF.foundServices().toArray(new RunningInstanceMessage[0])); } if (ghnPF == null || ghnPF.ghns() == null) toReturn.setGhns(new GHN[0]); else toReturn.setGhns(ghnPF.ghns().toArray(new GHN[0])); return toReturn; } catch (RemoteException e) { e.printStackTrace(); return null; } } /** * return the ghn available list * @return * @throws RemoteException */ @Override public List getAvailableGHNs() { List toReturn = new ArrayList(); VREGeneratorEvo vreGenerator = null; if (isTesting) { vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR); } else { ASLSession aslSession = getASLSession(); vreGenerator = getVREGeneratorEvo(aslSession); } List ghns = null; try { log.debug("Asking gHN list"); ghns = vreGenerator.getGHNs(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (ghns == null) return toReturn; log.debug("got gHN list, menbers: " + ghns.size()); for (GHN ghn : ghns) { List ris = new ArrayList(); if (ghn.relatedRIs() != null) { for (int i = 0; i < ghn.relatedRIs().size(); i++) { ris.add(new RunningInstance(ghn.relatedRIs().get(i).serviceName(), ghn.relatedRIs().get(i).serviceClass())); } } toReturn.add(new GHNProfile(ghn.id(), ghn.host(), ris, ghn.securityEnabled(), new GHNMemory(ghn.memory().memorySize()+"", ghn.memory().diskSpace()+""), new GHNSite(ghn.site().location(), ghn.site().country(), ghn.site().domain()), null, ghn.selected()) ); } return toReturn; } /** * * @param selectedGHNIds * @param idCandidateGHN * @return */ public boolean setGHNsSelected(String[] selectedGHNIds) { VREGeneratorEvo vreGenerator = null; if (isTesting) { vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR); } else { ASLSession aslSession = getASLSession(); vreGenerator = getVREGeneratorEvo(aslSession); } try { log.debug(" selectedIDs"); for (int i = 0; i < selectedGHNIds.length; i++) { System.out.println(" id: " + selectedGHNIds[i].toString()); } vreGenerator.setGHNs(selectedGHNIds); } catch (RemoteException e) { e.printStackTrace(); return false; } return true; } /** * * @return */ public int isCloudSelected() { VREGeneratorEvo vreGenerator = null; if (isTesting) { vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR); } else { ASLSession aslSession = getASLSession(); vreGenerator = getVREGeneratorEvo(aslSession); } if (vreGenerator.isCloudSelected()) return vreGenerator.getCloudVMSelected(); else return -1; } /** * */ public int getCloudVMSelected() { VREGeneratorEvo vreGenerator = null; if (isTesting) { vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR); } else { ASLSession aslSession = getASLSession(); vreGenerator = getVREGeneratorEvo(aslSession); } return vreGenerator.getCloudVMSelected(); } /** * * @param virtualMachines * @return */ public boolean setCloudDeploy(int virtualMachines) { VREGeneratorEvo vreGenerator = null; if (isTesting) { vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR); } else { ASLSession aslSession = getASLSession(); vreGenerator = getVREGeneratorEvo(aslSession); } return vreGenerator.setCloudDeploy(virtualMachines); } public boolean deployVRE() { log.info("--- deployVRE started ---"); VREGeneratorEvo vreGenerator = null; if (isTesting) { vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR); } else { ASLSession aslSession = getASLSession(); vreGenerator = getVREGeneratorEvo(aslSession); } try { vreGenerator.deployVRE(); //need time to prepare report log.info("--- SLEEP 2 seconds ---"); Thread.sleep(2500); } catch (Exception e) { e.printStackTrace(); return false; } //TODO: re enable in the future it gives exception // AccessLogger log = AccessLogger.getAccessLogger(); // CreatedVRELogEntry logEntry; // try { // logEntry = new CreatedVRELogEntry( // vreGenerator.getVREModel().name(), // vreGenerator.getVREepr(), // vreGenerator.getVREModel().designer(), // vreGenerator.getVREModel().manager()); // log.logEntry(getASLSession().getUsername(), getASLSession().getScopeName(), logEntry); // } catch (RemoteException e) { // e.printStackTrace(); // } return true; } /** * {@inheritDoc} */ public ClientDeployReport checkCreateVRE() { log.info("--- check Create VRE started ---"); VREGeneratorEvo vreGenerator = null; if (isTesting) { try { vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR); } catch (NullPointerException e) { log.error("Error while trying to contact VRE Modeler service with TEST ID: " + customEPR + " Probly does not exist anymore, request from " + this.getThreadLocalRequest().getRemoteHost() + "("+this.getThreadLocalRequest().getRemoteAddr()+")"); return new ClientDeployReport(); } } else { ASLSession aslSession = getASLSession(); vreGenerator = getVREGeneratorEvo(aslSession); } DeployReport report = null; try { report = vreGenerator.checkVREStatus(); } catch (Exception e) { log.error("Error while trying to retrieve VRE Status, return Empty Report" + e.getMessage() + "\n, " + "request from " + this.getThreadLocalRequest().getRemoteHost() + "("+this.getThreadLocalRequest().getRemoteAddr()+")"); return new ClientDeployReport(); } if (report == null || report.getStatus() == null) { log.error("--- DeployReport is NULL or Status is null, return Empty Report, " + "request from " + this.getThreadLocalRequest().getRemoteHost() + "("+this.getThreadLocalRequest().getRemoteAddr()+")"); return new ClientDeployReport(); } if (report.getStatus() == Status.Finished) { log.info("--- Create VRE COMPLETED, CREATING LAYOUTS AND COMMUNITY ... "); String name = ""; String description = ""; try { VREDescription de = vreGenerator.getVREModel(); name = de.name(); description = de.description(); } catch (RemoteException e) { e.printStackTrace(); } String designer = (String) getASLSession().getAttribute(DESIGNER); String manager = (String) getASLSession().getAttribute(MANAGER); Organization vreCreated = createCommunityAndLayout(name); if (vreCreated != null) { try { log.info("--- CREATED LAYOUTS AND COMMUNITY OK, updating Calendar Application Profile."); String vreScope = getScopeByOrganizationId(""+vreCreated.getOrganizationId()); String vreUrl = "/group/"+vreCreated.getName().toLowerCase()+"/calendar"; updateCalendarApplicationProfile(vreScope, vreUrl); log.info("--- creating VRE Group Folder"); createVRESharedGroupFolder(vreCreated, designer, manager, description); log.info("--- createVRESharedGroupFolder OK, sending Message to designer."); UserManager um = new LiferayUserManager(); UserModel userDesigner = um.getUserByScreenName(designer); UserModel userManager = um.getUserByScreenName(manager); Workspace workspace = HomeLibrary.getUserWorkspace(getASLSession().getUsername()); ArrayList toSend = new ArrayList(); toSend.add(designer); String subject = "Definition approved and deployed"; String body = "Dear "+userDesigner.getFirstname()+", \n\n" + userManager.getFullname() + " has approved the deployment of the group you requested: " + name +"."; body+=".\n\nThis group has been deployed successfully and is already available for you on this portal. Please, check your list."; workspace.getWorkspaceMessageManager().sendMessageToPortalLogins(subject, body, new ArrayList(), toSend); NotificationsManager nnm = new ApplicationNotificationsManager(getASLSession()); if (nnm.notifyMessageReceived(designer, subject)) log.trace("Sending Definition create notification: " + subject + " OK"); } catch (Exception e) { } log.info("--- Trying to share a news for this VRE"); //shareCreatedVRENews(designer, manager, name, description); } else log.error("--- DANGER DANGER DANGER!!!!! -> CREATED LAYOUTS AND COMMUNITY WITH ERRORS"); } else setDeployingStatusOn(); //jsut for testing // if (isTesting) // return convertServiceDeployReport(simulateReport()); log.debug("---Sending Report, globalState --- " + report.getStatus() ); return convertServiceDeployReport(report); } /** * update the ApplicationProfile of the calendar for this scope * @param vreScope * @param vreURL */ private void updateCalendarApplicationProfile(String vreScope, String vreURL) { String appId = "org.gcube.portal.calendarwrapper.GCubeCalendarHandler"; String currScope = ScopeProvider.instance.get(); String scopeToQuery = PortalContext.getConfiguration().getInfrastructureName(); ScopeProvider.instance.set("/"+scopeToQuery); SimpleQuery query = queryFor(GenericResource.class); query.addCondition("$resource/Profile/SecondaryType/text() eq 'ApplicationProfile'"); query.addCondition("$resource/Profile/Body/AppId/text() eq '" + appId + "'"); DiscoveryClient client = clientFor(GenericResource.class); // List list = client.submit(query); if (list == null || list.isEmpty()) { log.error("Cannot retrieve the IS profile for resource: "); return; } GenericResource gr = list.get(0); log.debug("updating " + gr.profile().name()); String endpoint = ""+vreScope+""+vreURL+""; Node fragmentNode; try { DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Element elem = gr.profile().body(); System.out.println("QUI "); fragmentNode = docBuilder.parse(new InputSource(new StringReader(endpoint))).getDocumentElement(); fragmentNode = elem.getOwnerDocument().importNode(fragmentNode, true); elem.appendChild(fragmentNode); } catch (Exception e) { //in case no xml is entered, just text log.error("errore"); } RegistryPublisher rp=RegistryPublisherFactory.create(); rp.update(gr); ScopeProvider.instance.set(currScope); } /** * this method is in charge of reflecting the VRE deployed in a gCube Portal context in the HomeLibrary JackRabbit Repository. It also creates shared folders for these groups and assign VRE-Managers as Administrators of such foldes * @param vreName * @param vreScope * @param designer the username of the designer * @param manager the username of the manager * @param description * @throws GroupRetrievalFault * @throws UserManagementSystemException */ private void createVRESharedGroupFolder(Organization vreCreated, String designer, String manager, String description) throws Exception { String currScope = ScopeProvider.instance.get(); ScopeProvider.instance.set("/"+getRootOrganizationName()); GroupManager gm = new LiferayGroupManager(); UserManager um = new LiferayUserManager(); GroupModel group = gm.getGroup(""+vreCreated.getOrganizationId()); String groupId = group.getGroupId(); String vreName = group.getGroupName(); String vreScope = gm.getScope(groupId); List users = um.listUsersByGroup(group.getGroupId()); String vreDesignerUserName = designer; if (vreDesignerUserName != null) { Workspace ws = HomeLibrary .getHomeManagerFactory() .getHomeManager() .getHome(vreDesignerUserName) .getWorkspace(); GCubeGroup gGroup = createGroup(vreScope, users); String groupid = (gGroup == null) ? vreScope : gGroup.getName(); WorkspaceSharedFolder wSharedFolder =createVREFolder(vreScope, vreName, groupid, ws); List groups = new ArrayList(); groups.add(gGroup.getName()); wSharedFolder.setACL(groups, ACLType.WRITE_OWNER); } else { log.error("NO VRE-MANAGER FOUND IN THIS VRE"); } ScopeProvider.instance.set(currScope); } /** * return the infrastructure name */ private static String getRootOrganizationName() { return PortalContext.getConfiguration().getInfrastructureName(); } /** * * @param vreScope * @param vreName * @param groupId * @param ws * @return * @throws Exception */ private static WorkspaceSharedFolder createVREFolder(String vreScope, String vreName, String groupId, Workspace ws) throws Exception { WorkspaceSharedFolder folder = ws.createSharedFolder(vreScope, "Special Shared folder for VRE " + vreName, groupId, ws.getRoot().getId(), vreName, true); System.out.println(folder.getPath()); return folder; } /** * Create the group in HL and assign users to it * @param vreScope the scope of the vre as name * @param usersToAdd the listo of users to add * @throws InternalErrorException */ private static GCubeGroup createGroup(String vreScope, List usersToAdd) throws InternalErrorException { org.gcube.common.homelibrary.home.workspace.usermanager.UserManager gm = HomeLibrary .getHomeManagerFactory().getUserManager(); GCubeGroup group = gm.createGroup(vreScope); for (UserModel user : usersToAdd) { group.addMember(user.getScreenName()); } return group; } /** * * @param designer the username of the designer * @param manager the username of the manager * @param name the vre name */ private void shareCreatedVRENews(String designer, String manager, String name, String description) { String text = "A new Virtual Research Environment is worming up. " + name + " announced open day is tomorrow!"; Date feedDate = new Date(); UserInfo managerInfo = null; try { managerInfo = getuserInfo(manager); } catch (Exception e1) { e1.printStackTrace(); } String previewTitle = "The new VRE " + name + " will be available starting from tomorrow"; Feed toShare = new Feed(UUID.randomUUID().toString(), FeedType.TWEET, managerInfo.getUsername(), feedDate, "", "/group/data-e-infrastructure-gateway/join-new", ORGANIZATION_DEFAULT_LOGO_URL, text, PrivacyLevel.VRES, managerInfo.getFullName(), managerInfo.getEmailaddress(), managerInfo.getAvatarId(), previewTitle, description, "d4science.org", false); DatabookStore store = new DBCassandraAstyanaxImpl(); log.trace("Attempting to save Feed with text: " + text); boolean result = store.saveUserFeed(toShare); if (result) { for (GroupModel vre : getUserVREs(manager)) { String vreScope = getScopeByOrganizationId(vre.getGroupId()); log.trace("Attempting to write onto " + vreScope); try { store.saveFeedToVRETimeline(toShare.getKey(), vreScope); } catch (FeedIDNotFoundException e) { log.error("Error writing onto VRES Time Line" + vreScope); } //save the feed log.trace("Success writing onto " + vreScope); } } } /** * * @param vreid the organizatio id in Liferay API * @return */ private String getScopeByOrganizationId(String vreid) { GroupManager gm = new LiferayGroupManager(); try { return gm.getScope(vreid); } catch (Exception e) { log.error("Could not find a scope for this VREid: " + vreid); return null; } } private UserInfo getuserInfo(String username) throws PortalException, SystemException { log.debug("getuserInfo for " + username); String email = username+"@isti.cnr.it"; String fullName = username+" FULL"; String thumbnailURL = "images/Avatar_default.png"; String accountURL = ""; if (!isTesting) { getUserVREs(username); com.liferay.portal.model.UserModel user = UserLocalServiceUtil.getUserByScreenName(OrganizationsUtil.getCompany().getCompanyId(), username); thumbnailURL = "/image/user_male_portrait?img_id="+user.getPortraitId(); fullName = user.getFirstName() + " " + user.getLastName(); email = user.getEmailAddress(); ThemeDisplay themeDisplay = (ThemeDisplay) this.getThreadLocalRequest().getSession().getAttribute(WebKeys.THEME_DISPLAY); accountURL = themeDisplay.getURLMyAccount().toString(); } return new UserInfo(username, fullName, thumbnailURL, email, accountURL, true, false, null); } /** * * @param username * @return */ private ArrayList getUserVREs(String username) { log.debug("getUserVREs for " + username); ArrayList toReturn = new ArrayList(); com.liferay.portal.model.User currUser; try { GroupManager gm = new LiferayGroupManager(); currUser = OrganizationsUtil.validateUser(username); for (Organization org : currUser.getOrganizations()) if (gm.isVRE(org.getOrganizationId()+"")) { GroupModel toAdd = gm.getGroup(""+org.getOrganizationId()); toReturn.add(toAdd); } } catch (Exception e) { log.error("Failed reading User VREs for : " + username); e.printStackTrace(); return toReturn; } return toReturn; } /** * * @return the html representation of the report */ public String getHTMLReport() { log.info("--- getHTMLReport VRE ---"); VREGeneratorEvo vreGenerator = null; if (isTesting) { vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR); } else { ASLSession aslSession = getASLSession(); vreGenerator = getVREGeneratorEvo(aslSession); } String report = null; try { report = Utils.toXML(vreGenerator.checkVREStatus()); } catch (RemoteException e) { e.printStackTrace(); } String startDirectory = this.getServletContext().getRealPath(""); String xslFileLocation = startDirectory + "/styles/report.xsl"; String transformed = ""; if (isTesting) { String pathXML = startDirectory + "/xml/report.xml"; log.info("--- pathXML: " + pathXML); log.info("--- xsl: " + xslFileLocation); transformed = transformToHtml(fileToString(pathXML), xslFileLocation); } else { transformed = transformToHtml(report, xslFileLocation); } return transformed; } /** * convert the service report to a report client sendable * @param toConvert * @return */ private ClientDeployReport convertServiceDeployReport(DeployReport toConvert) { ClientDeployReport toReturn = new ClientDeployReport(); //*** Overall deploy status report part toReturn.setGlobalStatus(convStatus(toConvert.getStatus())); //*** Cloud deploy report part GHNonCloudReport cDeploy = toConvert.getCloudDeployingReport(); if (isCloudSelected() != -1) { System.out.println("***** GHNonCloudReportSelected ******"); List singleCloudStatus = new LinkedList(); for (int i = 0; i < cDeploy.getDeployingState().length; i++) { singleCloudStatus.add(convStatus(cDeploy.getDeployingState()[i])); } toReturn.setCloudReport(new ClientCloudReport(convStatus(cDeploy.getStatus()), singleCloudStatus)); } else { System.out.println("***** GHNonCloudReport Not Selected ******"); ClientCloudReport cdp = new ClientCloudReport(); cdp.setStatus(DeployStatus.SKIP); toReturn.setCloudReport(cdp); } //*** ResourceManager deploy report part toReturn.setResourceManagerReport( new ClientResourceManagerDeployingReport(convStatus(toConvert.getResourceDeployingReport().getStatus()), toConvert.getResourceDeployingReport().toString())); //*** Functionality deploy report part ClientFunctionalityDeployReport cfDeployReport = new ClientFunctionalityDeployReport(); Hashtable> table = toConvert.getFunctionalityDeployingReport().getFunctionalityTable(); HashMap> newTable = new HashMap>(); //creating new hashtable for (FunctionalityReport fr : table.keySet()) { List theList = new LinkedList(); for (ServiceReport sr : table.get(fr)) theList.add(new ClientServiceReport(sr.getServiceName(), sr.getServiceClass(), sr.getServiceVersion())); //adding new key and payload newTable.put(new ClientFunctionalityReport(fr.getFunctionalityId(), fr.getFunctionalityName(), convStatus(fr.getState())), theList); } cfDeployReport.setStatus(convStatus(toConvert.getFunctionalityDeployingReport().getStatus())); cfDeployReport.setReportXML(toConvert.getFunctionalityDeployingReport().getResourceManagerReport()); cfDeployReport.setFunTable(newTable); toReturn.setFunctionalityReport(cfDeployReport); //*** Resource deploy report part List newResources = new LinkedList(); for (Resource res : toConvert.getResourceDeployingReport().getResources()) { newResources.add(new ClientResource(res.getResourceId(), res.getResourceType(), convStatus(res.getStatus()))); } toReturn.setResourcesReport(new ClientResourcesDeployReport( convStatus(toConvert.getResourceDeployingReport().getStatus()), newResources)); return toReturn; } /** * * @param status to convert * @return */ private DeployStatus convStatus(Status status) { switch (status) { case Failed: return DeployStatus.FAIL; case Finished: return DeployStatus.FINISH; case Pending: return DeployStatus.PENDING; case Running: return DeployStatus.RUN; case Skipped: return DeployStatus.SKIP; case Waiting: return DeployStatus.WAIT; default: return DeployStatus.FAIL; } } /** * * @param vreName * @return */ private boolean vreExists(String vreName) { GroupManager gm = new LiferayGroupManager(); String currOrgid = ""+getASLSession().getGroupId(); List vres = null; try { vres = gm.listSubGroupsByGroup(currOrgid); } catch (Exception e) { e.printStackTrace(); } for (GroupModel vre : vres) { if (vre.getGroupName().equals(vreName)) return true; } return false; } /** * Creates the community and its layout in Liferay */ private Organization createCommunityAndLayout(String vreName) { if (vreExists(vreName)) { System.out.println("VRE Exists already"); return null; } log.info("TRYING READING CURRENT ORG ID"); long currOrgid = getASLSession().getGroupId(); //VO ID String desc = (getASLSession().getAttribute(DESCRIPTION) == null) ? "No Description found": getASLSession().getAttribute(DESCRIPTION).toString(); //desc String designer = (String) getASLSession().getAttribute(DESIGNER); log.info("Designer found Name : " + designer); String manager = (String) getASLSession().getAttribute(MANAGER); System.out.println("Manager found Name : " + manager); OrganizationManagerImpl orgManager = OrganizationManagerImpl.getInstance(getASLSession()); try { GCUBESiteLayout siteLayout = getBaseLayout(vreName, orgManager, false); long groupModelid = orgManager.createVRE(vreName, desc, currOrgid, siteLayout, OrganizationsUtil.getgCubeThemeId(ThemesIdManager.GCUBE_LOGGEDIN_THEME)); //the method above create a VRE and assign the manager Role to the person that triggers the creation //however the VRE-Designer and the VRE-Manager persons of the VRE could be different and need to be created too UserManager uman = new LiferayUserManager(); //if the manager is not the one who triggered the creation if (manager.compareTo(getASLSession().getUsername()) != 0) { //add the role VRE-Manager long uid = Long.parseLong(uman.getUserId(manager)); Role created = createRole("VRE-Manager", vreName, uid); log.debug("Admin Role "+ created.getName() + " Created Successfully"); Organization toReturn = OrganizationLocalServiceUtil.getOrganization(groupModelid); Group vreCreated = toReturn.getGroup(); uman.assignUserToGroup(""+vreCreated.getClassPK(), ""+uid); log.debug("Added user " + manager + " to group " + vreCreated.getName() + " with Success"); log.debug("Assigning Role: VRE-Manager"); RoleManager rm = new LiferayRoleManager(); rm.assignRoleToUser(""+vreCreated.getClassPK(), ""+created.getRoleId(), ""+uid); log.debug("Admin Role VRE-Manager Associated to user " + designer + " .... returning ..."); return toReturn; } //if the designer is different if (designer.compareTo(manager) != 0) { //add the role VRE-Designer long uid = Long.parseLong(uman.getUserId(designer)); Role created = createRole("VRE-Designer", vreName, uid); log.debug("Admin Role "+ created.getName() + " Created Successfully"); Organization toReturn = OrganizationLocalServiceUtil.getOrganization(groupModelid); Group vreCreated = toReturn.getGroup(); uman.assignUserToGroup(""+vreCreated.getClassPK(), ""+uid); log.debug("Added user " + designer + " to group " + vreCreated.getName() + " with Success"); RoleManager rm = new LiferayRoleManager(); rm.assignRoleToUser(""+vreCreated.getClassPK(), ""+created.getRoleId(), ""+uid); log.debug("Admin Role VRE-Designer Associated to user " + designer + " .... returning ..."); return toReturn; } } catch (Exception e) { e.printStackTrace(); return null; } return null; } /** * Create a Regular Manager Role for the community * @param vreName * @return * @throws PortalException * @throws SystemException */ protected static Role createRole(String roleName, String vreName, long userid){ try { Company company = OrganizationsUtil.getCompany(); String roletoAdd = roleName+"-" + vreName.replaceAll(" ", "-"); Role toCreate = null; try { toCreate = RoleLocalServiceUtil.getRole(company.getCompanyId(), roletoAdd); } catch (NoSuchRoleException e) { log.debug("Adding Role: " + roletoAdd); return RoleLocalServiceUtil.addRole(userid, company.getCompanyId(), roletoAdd, null, roleName +" of " + vreName, LIFERAY_REGULAR_ROLE_ID); } return toCreate; } catch (PortalException e) { e.printStackTrace(); } catch (SystemException e) { e.printStackTrace(); } return null; } /** * CHECK IF THE VRE DEPLOYMENT IS FINISHED * @param report * @return */ private String getGlobalDeploymentStatus(String report) { String ret = "NOT FINISHED"; return ret; } /** * * @param profile * @param xslFile * @return */ private String transformToHtml(String profile, String xslFile){ File stylesheet = new File(xslFile); TransformerFactory tFactory = TransformerFactory.newInstance(); StreamSource stylesource = new StreamSource(stylesheet); Transformer transformer = null; try { transformer = tFactory.newTransformer(stylesource); } catch (TransformerConfigurationException e) { e.printStackTrace(); return ""; } Document document = null; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); return ""; } StringReader reader = new StringReader(profile); InputSource inputSource = new InputSource(reader); log.debug("***** --- Reading **** "); try { document = builder.parse(inputSource); } catch (SAXException e) { log.error("***** --- ERROR PARSING REPORT SAXException--- **** "); log.error("CHECK THIS: \n" + profile); e.printStackTrace(); return ""; } catch (IOException e) { e.printStackTrace(); return ""; } DOMSource source = new DOMSource(document); ByteArrayOutputStream resultStream = new ByteArrayOutputStream(); StreamResult result = new StreamResult(resultStream); try { transformer.transform(source, result); } catch (TransformerException e) { e.printStackTrace(); return ""; } return resultStream.toString(); } /** * simulate a report * @return */ private DeployReport simulateReport() { DeployReport reportToReturn = new DeployReport(); // // Random random = new Random(); // int pick = random.nextInt(5); // // reportToReturn.setStatus(Status.Running); // // GHNonCloudReport cloudDeploy = new GHNonCloudReport(); // Status globalstatus; // Status singlestatus; // // switch (pick) { // case 0: // cloudDeploy.setStatus(Status.Running); // Status[] statuses = {Status.Failed,Status.Running, Status.Failed, Status.Failed, Status.Finished}; // cloudDeploy.setDeployingState(statuses); // // globalstatus = Status.Running; // singlestatus = Status.Running; // break; // case 1: // cloudDeploy.setStatus(Status.Waiting); // Status[] status1 = {Status.Running, Status.Running, Status.Running, Status.Running, Status.Finished, // Status.Failed,Status.Running, Status.Failed, Status.Failed, Status.Finished}; // cloudDeploy.setDeployingState(status1); // // globalstatus = Status.Finished; // singlestatus = Status.Finished; // break; // case 2: // cloudDeploy.setStatus(Status.Failed); // Status[] status2 = {Status.Running, Status.Failed, Status.Failed, Status.Running, Status.Finished, // Status.Failed,Status.Running, Status.Failed, Status.Failed, Status.Finished}; // cloudDeploy.setDeployingState(status2); // // globalstatus = Status.Failed; // singlestatus = Status.Failed; // break; // case 3: // cloudDeploy.setStatus(Status.Waiting); // Status[] status3 = {Status.Running, Status.Running, Status.Running, Status.Waiting, Status.Waiting}; // cloudDeploy.setDeployingState(status3); // // globalstatus = Status.Waiting; // singlestatus = Status.Running; // case 4: // cloudDeploy.setStatus(Status.Finished); // Status[] status4 = {Status.Running, Status.Running, Status.Running, Status.Waiting, Status.Waiting}; // cloudDeploy.setDeployingState(status4); // // globalstatus = Status.Waiting; // singlestatus = Status.Waiting; // default: // Status[] statusd = {Status.Skipped, Status.Skipped, Status.Skipped, Status.Skipped, Status.Skipped}; // cloudDeploy.setDeployingState(statusd); // // globalstatus = Status.Waiting; // singlestatus = Status.Waiting; // } // // reportToReturn.setCloudDeployingReport(cloudDeploy); // // ResourceDeployingReport rmdr = new ResourceDeployingReport(); // rmdr.setStatus(singlestatus); // // FunctionalityDeployingReport fdr = new FunctionalityDeployingReport(); // // //creating func table // Hashtable> funtable = new Hashtable>(); // for (int i = 0; i < 5; i++) { // FunctionalityReport fr = new FunctionalityReport(); // fr.setFunctionalityId("0000"); // fr.setFunctionalityName("Search Potente"); // fr.setStatus(Status.Running); // // List sreports = new ArrayList(); // // for (int j = 0; j < 7; j++) { // ServiceReport sr = new ServiceReport(); // sr.setServiceClass("search"); // sr.setServiceName("ft indexer"); // sr.setServiceVersion("1.0"); // sreports.add(sr); // } // funtable.put(fr, sreports); // } // // fdr.setFunctionalityTable(funtable); // fdr.setStatus(Status.Running); // fdr.setResourceManagerReport(null); // // reportToReturn.setFunctionalityDeployingReport(fdr); // reportToReturn.setStatus(globalstatus); return reportToReturn; } /** * * @param path * @return */ private String fileToString(String path) { BufferedReader filebuf = null; String nextStr = null; StringBuilder ret = new StringBuilder(); try { filebuf = new BufferedReader(new FileReader(path)); nextStr = filebuf.readLine(); // Read a line from file while (nextStr != null) { ret.append(nextStr); nextStr = filebuf.readLine(); // Read the next line } filebuf.close(); // close the file } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } return ret.toString(); } /** * * @return the built layout of a rootVO * @throws SystemException . * @throws PortalException . */ public GCUBESiteLayout getBaseLayout(String voName, OrganizationManagerImpl orgManager, boolean isVO) throws PortalException, SystemException { GCUBESiteLayout siteLayout = null; String email = OrganizationManagerImpl.validateUser(getASLSession().getUsername()).getEmailAddress(); siteLayout = new GCUBESiteLayout(OrganizationManagerImpl.getCompany(), voName, email); siteLayout.addTab(new GCUBELayoutTab(voName, GCUBELayoutType.ONE_COL, new GCUBEPortlet("gCube Loggedin", PortletsIdManager.getLRPortletId(PortletsIdManager.GCUBE_LOGGEDIN)))); //create tab Users and Roles with 2 subtabs GCUBELayoutTab usersAndRoles = new GCUBELayoutTab("Administration", GCUBELayoutType.ONE_COL, new GCUBEPortlet("Navigation", PortletsIdManager.getLRPortletId(PortletsIdManager.LR_NAVIGATION))); GCUBELayoutTab usersTab = new GCUBELayoutTab("Manage User and Requests", GCUBELayoutType.ONE_COL, new GCUBEPortlet("Users", PortletsIdManager.getLRPortletId(PortletsIdManager.GCUBE_USERS_MANAGE))); GCUBELayoutTab usersAddTab = new GCUBELayoutTab("Add new Users", GCUBELayoutType.ONE_COL, new GCUBEPortlet("Users", PortletsIdManager.getLRPortletId(PortletsIdManager.GCUBE_ADD_USERS_MANAGE))); GCUBELayoutTab rolesTab = new GCUBELayoutTab("Add new Roles", GCUBELayoutType.ONE_COL, new GCUBEPortlet("Roles", PortletsIdManager.getLRPortletId(PortletsIdManager.GCUBE_ROLES_MANAGE))); usersAndRoles.addSubTab(usersTab); usersAndRoles.addSubTab(usersAddTab); usersAndRoles.addSubTab(rolesTab); //add the tab siteLayout.addTab(usersAndRoles); if (isVO) siteLayout.addTab(new GCUBELayoutTab("Resources Management", GCUBELayoutType.ONE_COL, new GCUBEPortlet("Resources Management", PortletsIdManager.getLRPortletId(PortletsIdManager.RESOURCES_MANAGEMENT)))); else siteLayout.addTab(new GCUBELayoutTab("Calendar", GCUBELayoutType.ONE_COL, new GCUBEPortlet("Calendar", PortletsIdManager.getLRPortletId(PortletsIdManager.LR_CALENDAR)), true)); return siteLayout; } }