package org.gcube.portlets.admin.vredefinition.server; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.http.HttpSession; import org.gcube.application.framework.accesslogger.library.impl.AccessLogger; 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.workspace.Workspace; import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; import org.gcube.portlets.admin.vredefinition.client.VREDefinitionService; import org.gcube.portlets.admin.vredefinition.client.model.VREFunctionalityModel; import org.gcube.portlets.admin.vredefinition.server.loggers.CreatedVRELogEntry; import org.gcube.portlets.admin.vredefinition.server.loggers.OpenVREWizardLogEntry; import org.gcube.portlets.admin.vredefinition.shared.ExternalResourceModel; import org.gcube.portlets.admin.vredefinition.shared.ResourceCategory; import org.gcube.portlets.admin.vredefinition.shared.ResourceCategoryItem; import org.gcube.portlets.admin.vredefinition.shared.VRECollectionBean; import org.gcube.portlets.admin.vredefinition.shared.VREDescriptionBean; import org.gcube.portlets.admin.vredefinition.shared.exception.VREDefinitionException; import org.gcube.vomanagement.usermanagement.RoleManager; import org.gcube.vomanagement.usermanagement.UserManager; import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayRoleManager; import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayUserManager; import org.gcube.vomanagement.usermanagement.model.UserModel; import org.gcube.vremanagement.vremodel.cl.stubs.types.FunctionalityItem; 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.SelectedResourceDescriptionType; import org.gcube.vremanagement.vremodel.cl.stubs.types.VREDescription; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gwt.user.server.rpc.RemoteServiceServlet; public class VREDefinitionServiceImpl extends RemoteServiceServlet implements VREDefinitionService { private static final long serialVersionUID = -7565518362225100485L; private static final Logger _log = LoggerFactory.getLogger(VREDefinitionServiceImpl.class); private static final String DESIGNER = "Designer"; private static final String MANAGER = "Manager"; private static final String DESCRIPTION = "DESCRIPTION"; private static String VRE_MANAGER_STRING = "VRE-Manager"; private static final String VRE_GENERATOR_ATTRIBUTE = "VREGenerator"; private static final String VRE_DEFINER_GENERATOR_ATTRIBUTE = "VREDefinerGenerator"; private static final String USERNAME_ATTRIBUTE = "username"; private static final String HARD_CODED_VO_NAME = "/gcube/devsec"; private static final String REEDIT_TYPE_ATTRIBUTE = "reeditType"; private static final String APPROVE_MODE = "approve"; public static final String EDIT_MODE = "edit"; private static final String CATEGORIES = "CATEGORIES"; private boolean withinEclipse = false; /** * * @return */ private ASLSession 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); withinEclipse = true; } return SessionManager.getInstance().getASLSession(session.getId(), username); } private VREGeneratorEvo getVREGenerator(){ ASLSession d4ScienceSession = getASLSession(); VREGeneratorEvo vreGenerator = (VREGeneratorEvo) d4ScienceSession.getAttribute(VRE_DEFINER_GENERATOR_ATTRIBUTE); if(vreGenerator==null){ vreGenerator = new VREGeneratorEvo(d4ScienceSession); d4ScienceSession.setAttribute(VRE_DEFINER_GENERATOR_ATTRIBUTE, vreGenerator); } AccessLogger log = AccessLogger.getAccessLogger(); OpenVREWizardLogEntry logEntry = new OpenVREWizardLogEntry(); log.logEntry(getASLSession().getUsername(), getASLSession().getScopeName(), logEntry); return vreGenerator; } private void storeResourceCategoryInSession(HashMap> funcCategories) { getASLSession().setAttribute(CATEGORIES, funcCategories); } @SuppressWarnings("unchecked") private HashMap> getResourceCategoryFromSession() { return (HashMap>) getASLSession().getAttribute(CATEGORIES); } /** * return the categories per functionality * @param func */ public ArrayList getResourceCategoryByFunctionality(String id) { ArrayList toReturn = new ArrayList(); return (getResourceCategoryFromSession().containsKey(id) ? getExternaleResources(id) : toReturn); } /** * * @param id * @return */ private ArrayList getExternaleResources(String id) { ArrayList toReturn = new ArrayList(); ArrayList cats = getResourceCategoryFromSession().get(id); for (ResourceCategory rc : cats) for(ResourceCategoryItem item : rc.getItems()) { toReturn.add(new ExternalResourceModel(item.getId(), item.getName(), item.getDescription(), item.isSelected(), rc.getName(), rc.getId())); } return toReturn; } public Map isEditMode() { System.out.println("\n\n\n********************* isEditMode()"); String reeditType = (String) getASLSession().getAttribute(REEDIT_TYPE_ATTRIBUTE); ASLSession session = getASLSession(); session.setAttribute(VRE_DEFINER_GENERATOR_ATTRIBUTE, null); if(reeditType != null && reeditType.equals(EDIT_MODE)) { String vreid = (String) session.getAttribute(VRE_GENERATOR_ATTRIBUTE); if(vreid==null){ session.setAttribute(VRE_DEFINER_GENERATOR_ATTRIBUTE, null); } else { VREGeneratorEvo vreGenerator = new VREGeneratorEvo(session, vreid); session.setAttribute(VRE_DEFINER_GENERATOR_ATTRIBUTE, vreGenerator); } session.setAttribute(REEDIT_TYPE_ATTRIBUTE, null); try { List collections = getCollections(); VREFunctionalityModel functionalities = getFunctionality(true); Map map = new HashMap(); map.put("collections", collections); map.put("functionalities", functionalities); return map; } catch (VREDefinitionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; } /** * read the available functionality from the service through ASL extension */ public VREFunctionalityModel getFunctionality(boolean isEdit) throws VREDefinitionException { //if i am creating a new Vre I need to 'pretend' I already set the description to the service otherwise VREModeler won't return me the collections //if is editing instead this is not necessary if (! isEdit) { Calendar cal= Calendar.getInstance(); long startTime = cal.getTimeInMillis(); cal.add(Calendar.MONTH, 5); cal.add(Calendar.HOUR, 7); long endTime = cal.getTimeInMillis(); try { //this is because Lucio is stupid getVREGenerator().setVREModel("notCompletedVirtualResearchEnv.", UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString(), startTime, endTime); Thread.sleep(1000); } catch (Exception e1) { e1.printStackTrace(); } } if (! getVREGenerator().isVreModelerServiceUp()) return null; VREFunctionalityModel toReturn = new VREFunctionalityModel("","selected functionality", "", "",false); try{ HashMap> funCategories = new HashMap>(); List list = getVREGenerator().getFunctionality(); if (list == null) { _log.warn("FunctionalityList NULL"); } for (FunctionalityItem fi :list) { System.out.println("id:"+fi.id()+" "+fi.name()); VREFunctionalityModel toAdd = new VREFunctionalityModel(Integer.toString(fi.id()), fi.name(), fi.description(), "",fi.selected()); if (fi.children() != null && !fi.children().isEmpty()) { List children = fi.children(); VREFunctionalityModel[] newchildrens = new VREFunctionalityModel[children.size() ]; //creating node children for (int i = 0; i < children.size(); i++) { System.out.println(children.get(i).name() + " is " + children.get(i).selected()); newchildrens[i] = new VREFunctionalityModel(Integer.toString(children.get(i).id()), children.get(i).name(), children.get(i).description(), "functionality-add-icon",children.get(i).selected()); ArrayList resCats = new ArrayList(); if ( children.get(i).selectableResourcesDescription()!=null) { for (ResourceDescriptionItem category: children.get(i).selectableResourcesDescription()) { if (category.resources()!=null) { ResourceCategory rc = new ResourceCategory(category.id(), category.description()); for (ResourceItem resource : category.resources()) { rc.addResourceItem(new ResourceCategoryItem(resource.id(), resource.name(), resource.description(), resource.selected())); } resCats.add(rc); } } funCategories.put(newchildrens[i].getId() , resCats); } } toAdd.addChildren(newchildrens); toReturn.add(toAdd); } else { System.out.println("id:"+fi.id()+" "+fi.name() + " has no children"); } } storeResourceCategoryInSession(funCategories); 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()); } } } } catch (Exception e) { e.printStackTrace(); throw new VREDefinitionException("Set functionalities Error"); } return toReturn; } public Map getVRE() throws VREDefinitionException { HashMap toReturn = new HashMap(); HttpSession session = this.getThreadLocalRequest().getSession(); String username = (String) session.getAttribute(USERNAME_ATTRIBUTE); List belongingUsers = new LinkedList(); if (withinEclipse) { return getFakeBelongingUsers(); } else { UserManager um = null; try { um = new LiferayUserManager(); long currOrgid = getASLSession().getGroupId(); RoleManager rm = new LiferayRoleManager(); System.out.println("Trying to get roleid of " + VRE_MANAGER_STRING + " into " + getASLSession().getGroupName()); String roleId = "none"; roleId = rm.getRoleId(VRE_MANAGER_STRING, getASLSession().getGroupName()); System.out.println("Trying to get VRE-Managers of " + currOrgid + " role id=" + roleId); belongingUsers = um.listUsersByGroupAndRole(""+currOrgid, roleId); } catch (Exception e1) { e1.printStackTrace(); throw new VREDefinitionException("We cannot find any VO-Admin user for this environment." + " There must be at least one."); } if (belongingUsers == null || belongingUsers.size() == 0) throw new VREDefinitionException("We cannot find any VO-Admin user for this environment." + " There must be at least one."); try { ArrayList managers = new ArrayList(); for (int i = 0; i < belongingUsers.size(); i++) { managers.add(belongingUsers.get(i).getFullname()+" ("+belongingUsers.get(i).getScreenName()+")"); } toReturn.put("Manager", managers); } catch (Exception e) { e.printStackTrace(); throw new VREDefinitionException("We cannot find any VO-Admin user for this environment." + " There must be at least one."); } try { String fullName = um.getUserByScreenName(username).getFullname(); toReturn.put("Designer", fullName+" ("+username+")"); VREDescriptionBean vre = getVREInSession(); if(vre!= null) { toReturn.put("vreName",vre.getName()); toReturn.put("vreManager", vre.getManager()); toReturn.put("vreDesigner", fullName+" ("+vre.getDesigner()+")"); toReturn.put("vreDescription", vre.getDescription()); toReturn.put("vreStartTime", vre.getStartTime()); toReturn.put("vreEndTime",vre.getEndTime()); } } catch (Exception e){ e.printStackTrace(); } } return toReturn; } private HashMap getFakeBelongingUsers() { HashMap ret = new HashMap(); ArrayList managers = new ArrayList(); managers.add("Pasquale Pagano (pasquale.pagano)"); managers.add("Andrea Manzi (andrea.manzi)"); managers.add("Massimiliano Assante (massimiliano.assante)"); ret.put("Manager",managers); ret.put("Designer", "Leanoardo Candela (leonardo.candela)"); try { VREDescriptionBean vre = getVREInSession(); if(vre!= null) { System.out.println(" ########### VRE != NULL ##########"); ret.put("vreName",vre.getName()); ret.put("vreManager", vre.getManager()); ret.put("vreDesigner", vre.getDesigner()); ret.put("vreDescription", vre.getDescription()); ret.put("vreStartTime", vre.getStartTime()); ret.put("vreEndTime",vre.getEndTime()); } } catch (Exception e1){ } return ret; } private String extractUserName(String toExtract) { int openBracket = toExtract.indexOf("(")+1; int closeBracket = toExtract.indexOf(")"); return toExtract.substring(openBracket, closeBracket); } public String setVRE(VREDescriptionBean bean, String[] functionalityIDs, HashMap> funcToExternalResources) throws VREDefinitionException { String completeDesigner = bean.getDesigner(); bean.setDesigner(extractUserName(bean.getDesigner())); String managerUserName = extractUserName(bean.getManager()); bean.setManager(managerUserName); setVREDescription(bean); setFunctionality(functionalityIDs, funcToExternalResources); try { getVREGenerator().setVREtoPendingState(); getASLSession().setAttribute(VRE_DEFINER_GENERATOR_ATTRIBUTE, null); Workspace workspace = HomeLibrary.getUserWorkspace(getASLSession().getUsername()); ArrayList toSend = new ArrayList(); toSend.add(managerUserName); String subject = "New VRE Definition requires your approval"; String body = "Dear Manager, \n\n" + completeDesigner + " has created a VRE Definition indicating you as VRE Manager on " + getASLSession().getScope(); body+=".\n\nThe VRE Name is: " + bean.getName() +", the VRE Description is: " + bean.getDescription()+"."; String messagedId = workspace.getWorkspaceMessageManager().sendMessageToPortalLogins(subject, body, new ArrayList(), toSend); NotificationsManager nnm = new ApplicationNotificationsManager(getASLSession()); if (nnm.notifyMessageReceived(managerUserName, messagedId, subject, body)) _log.trace("Sending VRE Definition create notification: " + subject + " OK"); } catch (Exception e) { e.printStackTrace(); } AccessLogger log = AccessLogger.getAccessLogger(); CreatedVRELogEntry logEntry = new CreatedVRELogEntry(bean.getName(), "unknown", bean.getDesigner(), bean.getManager()); log.logEntry(getASLSession().getUsername(), getASLSession().getScopeName(), logEntry); return null; } /** * * @param functionalityIDs * @param funcToExternalResources * @return * @throws VREDefinitionException */ public String setFunctionality(String[] functionalityIDs, HashMap> funcToExternalResources) throws VREDefinitionException { //fillling up ArrayList toSend = new ArrayList(); //for each func for (int i = 0; i < functionalityIDs.length; i++) { if (funcToExternalResources.containsKey(functionalityIDs[i])) { //get the associated resources String descriptionId = ""; ArrayList resourceIds = new ArrayList(); for (ExternalResourceModel extRes : funcToExternalResources.get(functionalityIDs[i])) { _log.debug("resource: " + extRes.getName() + " Selected?" + extRes.isSelected()); if (extRes.isSelected()) { descriptionId = extRes.getCategoryId(); resourceIds.add(extRes.getId()); _log.debug("------> Added selected resource: " + extRes.getName() + " id=" + extRes.getId() + "\n"); } } SelectedResourceDescriptionType toAdd = new SelectedResourceDescriptionType(); toAdd.descriptionId(descriptionId); toAdd.resourceIds(resourceIds); toSend.add(toAdd); } } Integer funcIdAsInts[] = new Integer[functionalityIDs.length]; for (int i = 0; i < functionalityIDs.length; i++) { try { funcIdAsInts[i] = Integer.parseInt(functionalityIDs[i]); } catch (ClassCastException e) { _log.error("Could not convert to int: " + functionalityIDs[i]); } } SelectedResourceDescriptionType[] selres = toSend.toArray(new SelectedResourceDescriptionType[toSend.size()]); System.out.println("SelectedResourceDescriptionType[] Sending to Service .... toSend size = " + toSend.size()); for (int i = 0; i < selres.length; i++) { System.out.println("SelectedResourceDescriptionType DESC: " + selres[i].getDescriptionId()); for (int j = 0; j < selres[i].resourceIds().size(); j++) { System.out.println("resid= " +selres[i].resourceIds().get(j)); } } VREGeneratorEvo vreGenerator = getVREGenerator(); try { vreGenerator.setFunctionality(funcIdAsInts, selres); vreGenerator.setVREtoPendingState(); } catch (RemoteException e) { e.printStackTrace(); throw new VREDefinitionException("Set functionalities Error"); } return null; } private String setVREDescription(VREDescriptionBean bean) throws VREDefinitionException { VREGeneratorEvo vreGenerator = getVREGenerator(); ASLSession d4ScienceSession = getASLSession(); d4ScienceSession.setAttribute("VREName", bean.getName()); d4ScienceSession.setAttribute(DESCRIPTION, bean.getDescription()); d4ScienceSession.setAttribute(DESIGNER, bean.getDesigner()); d4ScienceSession.setAttribute(MANAGER, bean.getManager()); try { vreGenerator.setVREModel(bean.getName(), bean.getDescription(), bean.getDesigner(), bean.getManager(), bean.getStartTime().getTime() , bean.getEndTime().getTime()); } catch (RemoteException e) { e.printStackTrace(); throw new VREDefinitionException("Set Description Error"); } return null; } public List getCollections() throws VREDefinitionException { List listToReturn = new ArrayList(); return listToReturn; } private VREDescriptionBean getVREInSession() throws VREDefinitionException { VREGeneratorEvo vreGenerator = getVREGenerator(); VREDescriptionBean vreDescBean = null; try { VREDescription sd = vreGenerator.getVREModel(); vreDescBean = new VREDescriptionBean(sd.name(), sd.description(), sd.designer(), sd.manager(), sd.startTime().getTime(), sd.endTime().getTime()); } catch (RemoteException e) { throw new VREDefinitionException("Fail retrieve VRE"); } System.out.println("Model: " + vreDescBean.getName()); System.out.println("--- END Getting VRE Model ---"); return vreDescBean; } public String[] getExistingNames() { return null; } }