/**************************************************************************** * This software is part of the gCube Project. * Site: http://www.gcube-system.org/ **************************************************************************** * The gCube/gCore software is licensed as Free Open Source software * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). * The software and documentation is provided by its authors/distributors * "as is" and no expressed or * implied warranty is given for its use, quality or fitness for a * particular case. **************************************************************************** * Filename: SWRepositoryManager.java **************************************************************************** * @author Daniele Strollo ***************************************************************************/ package org.gcube.resourcemanagement.support.server.managers.services; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Vector; import org.apache.axis.message.addressing.EndpointReferenceType; import org.gcube.common.core.contexts.GCUBERemotePortTypeContext; import org.gcube.common.core.contexts.GHNContext; import org.gcube.common.core.informationsystem.client.AtomicCondition; import org.gcube.common.core.informationsystem.client.ISClient; import org.gcube.common.core.informationsystem.client.queries.GCUBERIQuery; import org.gcube.common.core.resources.GCUBERunningInstance; import org.gcube.common.core.scope.GCUBEScope; import org.gcube.common.core.security.GCUBESecurityManagerImpl; import org.gcube.resourcemanagement.support.server.exceptions.ResourceAccessException; import org.gcube.resourcemanagement.support.server.exceptions.ResourceParameterException; import org.gcube.resourcemanagement.support.server.utils.Assertion; import org.gcube.resourcemanagement.support.server.utils.ServerConsole; import org.gcube.vremanagement.softwarerepository.stubs.SoftwareRepositoryPortType; import org.gcube.vremanagement.softwarerepository.stubs.service.SoftwareRepositoryServiceAddressingLocator; /** * A support library to handle and retrieve remote software * repository manager. *
* Useful to handle the proxy for repository manager. *
Usage: *
 *  SWRepositoryManager repMgr = new SWRepositoryManager();
 *  // if needed sets the time out for socket connection
 *  // -- repMgr.setCallTimeOut(240000);
 *  SoftwareRepositoryPortType swrep = repMgr.getSoftwareRepository(scope);
 *  // Applies a deploy
 *  swrep.store(...);
 * 
* @author Daniele Strollo (ISTI-CNR) */ public class SWRepositoryManager { private GCUBESecurityManagerImpl managerSec = null; private ISClient client = null; private int callTimeOut = 240000; private static final String LOG_PREFIX = "[SW-UPDT-MGR]"; public SWRepositoryManager() throws ResourceAccessException { /** * Initially the security management is disabled. */ this.managerSec = new GCUBESecurityManagerImpl() { public boolean isSecurityEnabled() { return false; } }; try { client = GHNContext.getImplementation(ISClient.class); } catch (Exception e) { throw new ResourceAccessException("Cannot instantiate the ISClient"); } } /** * Internally used by {@link AbstractResourceManager#getResourceManager(GCUBEScope)}. * @param scope * @return a raw list of resource manager descriptors. * @throws Exception */ private List getSoftwareRepositoryFromScope(final GCUBEScope scope) throws Exception { GCUBERIQuery query = this.client.getQuery(GCUBERIQuery.class); query.addAtomicConditions(new AtomicCondition("//Profile/ServiceClass", "VREManagement")); query.addAtomicConditions(new AtomicCondition("//Profile/ServiceName", "SoftwareRepository")); List result = client.execute(query, scope); List toReturn = new ArrayList(); for (GCUBERunningInstance ri : result) { if (ri.getScopes().containsValue(scope)) { toReturn.add(ri); } } return toReturn; } /** * The the list of resource managers able to handle the resource in a given scope. * @param scope the scope in which to operate * @return all the available managers * @throws ResourceAccessException if no manager can be instantiated * @throws ResourceParameterException if the parameters are invalid */ private List getSoftwareRepositories(final GCUBEScope scope) throws ResourceAccessException, ResourceParameterException { Assertion checker = new Assertion(); checker.validate(scope != null, new ResourceParameterException("Invalid scope")); List resourceManagerList = null; try { resourceManagerList = this.getSoftwareRepositoryFromScope(scope); } catch (Exception e) { throw new ResourceAccessException("Cannot retrieve the software repository in scope: " + scope.toString()); } List retval = new Vector(); if (resourceManagerList.isEmpty()) { throw new ResourceAccessException("Unable to find the software repository in scope: " + scope.toString()); } EndpointReferenceType endpoint = null; SoftwareRepositoryPortType pt = null; for (GCUBERunningInstance resourceManager : resourceManagerList) { try { endpoint = resourceManager.getAccessPoint().getEndpoint("gcube/vremanagement/softwarerepository/SoftwareRepository"); pt = GCUBERemotePortTypeContext.getProxy( new SoftwareRepositoryServiceAddressingLocator() .getSoftwareRepositoryPortTypePort(endpoint), scope, this.callTimeOut, this.managerSec); if (pt != null) { retval.add(pt); } } catch (Throwable e) { // trying on next entry ServerConsole.error(LOG_PREFIX, e); } } if (retval != null && retval.size() > 0) { // Return a random manager from the available ones return retval; } // no managers found throw new ResourceAccessException("Unable to find the software repository in scope: " + scope.toString()); } /** * Retrieves form the current scope the list of registered software managers * and returns one of them (random choice). * @param scope the scope in which search the sw repository * @return one randomly chosen repository manager (if many available). * @throws ResourceAccessException if no sw manager found * @throws ResourceParameterException if wrong parameters passed */ public final SoftwareRepositoryPortType getSoftwareRepository(final GCUBEScope scope) throws ResourceAccessException, ResourceParameterException { List retval = this.getSoftwareRepositories(scope); if (retval != null && retval.size() > 0) { Random generator = new Random(); // Return a random software repository manager from the available ones return retval.get(generator.nextInt(retval.size())); } // no managers found throw new ResourceAccessException("Unable to find SoftwareRepository in scope: " + scope.toString()); } /** * Used to set the time out for socket connection with the software repository * to update. * @param callTimeOut */ public final void setCallTimeOut(final int callTimeOut) { this.callTimeOut = callTimeOut; } public final int getCallTimeOut() { return callTimeOut; } }