diff --git a/schema/ResourceManager.wsdl b/schema/ResourceManager.wsdl index bb08570..949c531 100644 --- a/schema/ResourceManager.wsdl +++ b/schema/ResourceManager.wsdl @@ -154,16 +154,12 @@ - + - - - - - + @@ -196,13 +192,13 @@ - + - + @@ -214,7 +210,7 @@ - + diff --git a/src/org/gcube/vremanagement/resourcemanager/impl/ResourceManager.java b/src/org/gcube/vremanagement/resourcemanager/impl/ResourceManager.java index 949ed89..aaf3fdb 100644 --- a/src/org/gcube/vremanagement/resourcemanager/impl/ResourceManager.java +++ b/src/org/gcube/vremanagement/resourcemanager/impl/ResourceManager.java @@ -23,6 +23,7 @@ import org.gcube.vremanagement.resourcemanager.stubs.resourcemanager.RemoveResou import org.gcube.vremanagement.resourcemanager.stubs.resourcemanager.ScopeOption; import org.gcube.vremanagement.resourcemanager.stubs.resourcemanager.SendReportParameters; import org.gcube.vremanagement.resourcemanager.impl.operators.AddResourcesOperator; +import org.gcube.vremanagement.resourcemanager.impl.operators.DisposeScopeOperator; import org.gcube.vremanagement.resourcemanager.impl.operators.OperatorConfig; import org.gcube.vremanagement.resourcemanager.impl.operators.RemoveResourcesOperator; import org.gcube.vremanagement.resourcemanager.impl.resources.ScopedResource; @@ -30,6 +31,7 @@ import org.gcube.vremanagement.resourcemanager.impl.resources.ScopedRunningInsta import org.gcube.vremanagement.resourcemanager.impl.state.ResourceReport; import org.gcube.vremanagement.resourcemanager.impl.state.PublishedScopeResource; import org.gcube.vremanagement.resourcemanager.impl.state.InstanceState; +import org.gcube.vremanagement.resourcemanager.impl.state.ScopeState; import org.gcube.vremanagement.resourcemanager.impl.state.PublishedScopeResource.UnknownScopeOptionException; import org.globus.wsrf.NoSuchResourceException; import org.globus.wsrf.ResourceException; @@ -56,7 +58,7 @@ public class ResourceManager extends GCUBEPortType { return ServiceContext.getContext(); } /** - * Adds a new group of {@link GCUBEResource} to the PublishedScopeResource + * Adds a new group of {@link ScopedResource}s to the managed Scope * * @param resourcesList the resources to join * @return the ID assigned to the operation, it can be used to retrieve the resource report by invoking the {@link ResourceManager#getReport(String)} operation @@ -83,7 +85,7 @@ public class ResourceManager extends GCUBEPortType { } /** - * Removes a group of {@link GCUBEResource} from the PublishedScopeResource + * Removes a group of {@link ScopedResource}s from the managed Scope * * @param resourcesList the resources to remove from the PublishedScopeResource * @throws GCUBEFault if the operation fails @@ -91,15 +93,10 @@ public class ResourceManager extends GCUBEPortType { public String removeResources(RemoveResourcesParameters resourceList) throws GCUBEFault { try { - //PublishedScopeResource resource = this.getResource().getPublishedScopeResource(); - //resource.reload(); - GCUBEScope targetScope = this.validateOperationScope(resourceList.getTargetScope()); ResourceReport report = new ResourceReport(UUIDGenFactory.getUUIDGen().nextUUID(), targetScope); this.getResource().addReport(report); new RemoveResourcesOperator(new OperatorConfig(report, this.getResource().getResourceList(), targetScope),resourceList).run(); - //resource.publish(); - //returns the report ID, it can be used to invoke the getReport operation return report.getId(); } catch (IllegalScopeException ise){ logger.error("The target scope (" + resourceList.getTargetScope() + ") is not valid or null or not joined to this instance", ise); @@ -110,18 +107,25 @@ public class ResourceManager extends GCUBEPortType { } } - public void disposeScope(DisposeScopeParameters params) throws GCUBEFault { + /** + * Disposes the managed Scope + * @param params + * @return + * @throws GCUBEFault + */ + public String disposeScope(DisposeScopeParameters params) throws GCUBEFault { logger.info("Dispose Scope invoked... the entire scope is going to be thrown away!!"); try { ResourceReport report = new ResourceReport(UUIDGenFactory.getUUIDGen().nextUUID(), this.getResource().getManagedScope()); this.getResource().addReport(report); - //new RemoveResourcesOperator(new OperatorConfig(report, this.getResource().getResourceList(), this.getResource().getManagedScope()),resourceList).run(); + new DisposeScopeOperator(new OperatorConfig(report, this.getResource().getResourceList(), this.getResource().getManagedScope())).run(); + return report.getId(); } catch (NoSuchResourceException e) { logger.error("No resource found for this scope", e); throw ServiceContext.getContext().getDefaultException("No resource found for this scope", e).toFault(); } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); + logger.error("Unable to dispose the scope: " + e.getMessage(), e); + throw ServiceContext.getContext().getDefaultException("Unable to dispose the scope: " + e.getMessage(), e).toFault(); } } diff --git a/src/org/gcube/vremanagement/resourcemanager/impl/operators/DisposeScopeOperator.java b/src/org/gcube/vremanagement/resourcemanager/impl/operators/DisposeScopeOperator.java new file mode 100644 index 0000000..6e1660a --- /dev/null +++ b/src/org/gcube/vremanagement/resourcemanager/impl/operators/DisposeScopeOperator.java @@ -0,0 +1,15 @@ +package org.gcube.vremanagement.resourcemanager.impl.operators; + +public class DisposeScopeOperator extends Operator { + + public DisposeScopeOperator(OperatorConfig operatorConfig) { + // TODO Auto-generated constructor stub + } + + @Override + public void exec() throws Exception { + // TODO Auto-generated method stub + + } + +} diff --git a/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedAnyResource.java b/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedAnyResource.java index 717ba9b..c441748 100644 --- a/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedAnyResource.java +++ b/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedAnyResource.java @@ -26,7 +26,6 @@ import org.gcube.common.core.informationsystem.client.queries.GCUBEMCollectionQu import org.gcube.common.core.informationsystem.client.queries.GCUBEServiceQuery; import org.gcube.common.core.informationsystem.publisher.ISPublisher; -import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamOmitField; @@ -37,7 +36,6 @@ import com.thoughtworks.xstream.annotations.XStreamOmitField; * @author Manuele Simi (ISTI-CNR) * */ -@XStreamAlias("AnyResource") public final class ScopedAnyResource extends ScopedResource { @XStreamOmitField @@ -56,7 +54,7 @@ public final class ScopedAnyResource extends ScopedResource { */ @SuppressWarnings({ "unchecked"}) @Override - public void find() throws Exception { + public void find() throws ResourceNotFound, Exception { ISClient client = GHNContext.getImplementation(ISClient.class); Class query = null; try { @@ -71,22 +69,22 @@ public final class ScopedAnyResource extends ScopedResource { ISTemplateQuery realquery = (ISTemplateQuery) client.getQuery(query); realquery.addAtomicConditions(new AtomicCondition("//ID",this.id)); - List profiles = client.execute(realquery, this.scope); + List profiles = client.execute(realquery, GCUBEScope.getScope(this.scope)); if ((profiles != null) && (profiles.size() > 0)) this.profile = profiles.get(0); else // obviously, in the case of adding, the resource is not in the current scope, therefore we look upstairs (the enclosing scope) - this.profile = (GCUBEResource) client.execute(realquery, this.scope.getEnclosingScope()).get(0); + this.profile = (GCUBEResource) client.execute(realquery, GCUBEScope.getScope(this.scope).getEnclosingScope()).get(0); } catch (Exception e) { - this.noHopeForMe("unable to find the target resource (ID=" + id + "). Possible cause: " + e.getMessage(), e); + this.noHopeForMe("unable to find the target resource (ID=" + id + "). Possible cause: " + e.getMessage(), new ResourceNotFound(e)); } } @Override - protected void addToScope() throws Exception { + protected void addToScope() throws ResourceNotFound, Exception { this.find(); - logger.debug("Adding scope to resource's profile"); + getLogger().debug("Adding scope to resource profile"); try { profile.addScope(this.getScope()); //republish the resource @@ -104,9 +102,9 @@ public final class ScopedAnyResource extends ScopedResource { } @Override - protected void removeFromScope() throws Exception { + protected void removeFromScope() throws ResourceNotFound, Exception { this.find(); - logger.debug("Removing scope from resource's profile"); + getLogger().debug("Removing scope from resource profile"); try { profile.removeScope(this.getScope()); //republish the resource diff --git a/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedDeployedService.java b/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedDeployedService.java index 8b8f3cf..24ed198 100644 --- a/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedDeployedService.java +++ b/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedDeployedService.java @@ -15,8 +15,6 @@ import org.gcube.vremanagement.resourcemanager.impl.deployment.VirtualNode; import org.gcube.vremanagement.resourcemanager.impl.deployment.resources.Dependency; import org.gcube.vremanagement.resourcemanager.impl.deployment.resources.Service; -import com.thoughtworks.xstream.annotations.XStreamAlias; - /** * * Models a scoped {@link GCUBEService} @@ -24,7 +22,6 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @author Manuele Simi (ISTI-CNR) * */ -@XStreamAlias("Service") public final class ScopedDeployedService extends ScopedResource { public static final String TYPE = GCUBEService.TYPE; @@ -88,7 +85,7 @@ public final class ScopedDeployedService extends ScopedResource { } @Override - public void find() throws Exception { + public void find() throws ResourceNotFound { //looks for the service and its deps in the Software Repository SoftwareRepositoryRequest request = new SoftwareRepositoryRequest(); request.addService(this); @@ -104,15 +101,15 @@ public final class ScopedDeployedService extends ScopedResource { } this.success = true; } catch (Exception e) { - logger.error("Unable to resolve the list of deps for " + this.service, e); - this.noHopeForMe("Unable to resolve the list of dependencies for " + this.service,e); + getLogger().error("Unable to resolve the list of deps for " + this.service, e); + this.noHopeForMe("Unable to resolve the list of dependencies for " + this.service, new ResourceNotFound(e)); } } @Override - protected void addToScope() throws Exception { + protected void addToScope() throws ResourceNotFound, Exception { if (!this.isSuccess()) { this.noHopeForMe(this.getErrorMessage(),new Exception()); } @@ -130,7 +127,7 @@ public final class ScopedDeployedService extends ScopedResource { @Override - protected void removeFromScope() throws Exception { + protected void removeFromScope() throws ResourceNotFound, Exception { if (!this.isSuccess()) { //TODO: could we undeploy static packages here? this.noHopeForMe(this.getErrorMessage(),new Exception()); @@ -155,7 +152,7 @@ public final class ScopedDeployedService extends ScopedResource { * @throws Exception */ private void undeploy(VirtualNode node) throws Exception { - logger.info("Undeploying service "+ this.service+ " from GHN " + this.ghnID); + getLogger().info("Undeploying service "+ this.service+ " from GHN " + this.ghnID); //prepare the input list of packagesToAdd for that GHN List deps = this.getResolvedDependencies(); for (int i = 0; i < deps.size(); i++) { @@ -165,7 +162,7 @@ public final class ScopedDeployedService extends ScopedResource { p.setServiceVersion(deps.get(i).getService().getVersion()); p.setVersion(deps.get(i).getVersion()); p.setName(deps.get(i).getName()); - logger.trace("Adding Package to deployment request: " + deps.get(i)); + getLogger().trace("Adding Package to deployment request: " + deps.get(i)); this.packages.add(p); } node.removePackages(this.packages); @@ -192,7 +189,7 @@ public final class ScopedDeployedService extends ScopedResource { * @param node the target GHN */ public void setTargetGHN(VirtualNode node) { - logger.info("Using GHN " + node.getID() + " for " + this); + getLogger().info("Using GHN " + node.getID() + " for " + this); this.ghnID = node.getID(); Set packages = new HashSet(); @@ -205,7 +202,7 @@ public final class ScopedDeployedService extends ScopedResource { p.setServiceVersion(deps.get(i).getService().getVersion()); p.setVersion(deps.get(i).getVersion()); p.setName(deps.get(i).getName()); //packageName - logger.trace("Adding Package to deployment request: " + deps.get(i)); + getLogger().trace("Adding Package to deployment request: " + deps.get(i)); packages.add(p); } node.addPackages(packages); diff --git a/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedGHN.java b/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedGHN.java index b5851bf..def0541 100644 --- a/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedGHN.java +++ b/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedGHN.java @@ -14,17 +14,13 @@ import org.gcube.common.vremanagement.ghnmanager.stubs.GHNManagerPortType; import org.gcube.common.vremanagement.ghnmanager.stubs.service.GHNManagerServiceAddressingLocator; import org.gcube.vremanagement.resourcemanager.impl.contexts.ServiceContext; -import com.thoughtworks.xstream.annotations.XStreamAlias; - /** * Models a scoped {@link GCUBEHostingNode} * * @author Manuele Simi (ISTI-CNR) * */ -@XStreamAlias("GHN") public final class ScopedGHN extends ScopedResource { - public static final String TYPE = GCUBEHostingNode.TYPE; @@ -36,7 +32,7 @@ public final class ScopedGHN extends ScopedResource { @Override - protected void addToScope() throws Exception { + protected void addToScope() throws ResourceNotFound, Exception { if (this.nodename.compareToIgnoreCase("") == 0) this.find(); //contact the GHNManager to add the GHN to the given scope @@ -58,7 +54,7 @@ public final class ScopedGHN extends ScopedResource { } @Override - public void find() throws Exception { + public void find() throws ResourceNotFound { try { ISClient client = GHNContext.getImplementation(ISClient.class); GCUBEGHNQuery query = client.getQuery(GCUBEGHNQuery.class); @@ -66,13 +62,13 @@ public final class ScopedGHN extends ScopedResource { this.nodename = client.execute(query, ServiceContext.getContext().getScope().getEnclosingScope()).get(0).getNodeDescription().getName(); this.hostedOn = nodename; } catch (Exception e) { - this.noHopeForMe("unable to find the target GHN (ID=" + this.id + ")", e); + this.noHopeForMe("unable to find the target GHN (ID=" + this.id + ")", new ResourceNotFound(e)); } } @Override - protected void removeFromScope() throws Exception { + protected void removeFromScope() throws ResourceNotFound, Exception { if (this.nodename.compareToIgnoreCase("") == 0) this.find(); EndpointReferenceType endpoint = new EndpointReferenceType(); diff --git a/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedResource.java b/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedResource.java index 860dcd9..de4e559 100644 --- a/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedResource.java +++ b/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedResource.java @@ -13,6 +13,7 @@ import org.gcube.common.core.utils.logging.GCUBELog; import org.gcube.vremanagement.resourcemanager.impl.operators.Operator.ACTION; import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamOmitField; /** * An abstract model for a scoped {@link GCUBEResource} @@ -20,12 +21,11 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @author Manuele Simi (ISTI-CNR) * */ -@XStreamAlias("ScopedResource") public abstract class ScopedResource { - - /** Object logger */ - protected final GCUBELog logger=new GCUBELog(this); + /** Object getLogger() */ + @XStreamOmitField + protected GCUBELog logger; /** the resource identifier*/ @XStreamAlias("ResourceID") @@ -36,7 +36,6 @@ public abstract class ScopedResource { protected String type; /** where the resource is hosted on, it makes sense for RI, GHN*/ - @XStreamAlias("HostedOn") protected String hostedOn = ""; /** result of the last operation performed on the resource */ @@ -47,8 +46,7 @@ public abstract class ScopedResource { @XStreamAlias("LastOperationMessage") protected String errorMessage = ""; - @XStreamAlias("Scope") - protected GCUBEScope scope; + protected String scope; /** the last action performed on the resource*/ protected ACTION action; @@ -57,6 +55,10 @@ public abstract class ScopedResource { @XStreamAlias("LastModificationTime") protected Date lastModificationTime; + /** Last modification time stamp*/ + @XStreamAlias("JointTime") + protected Date jointTime; + @XStreamAlias("LastStatus") protected STATUS status; @@ -76,7 +78,7 @@ public abstract class ScopedResource { public ScopedResource(String id, String type, GCUBEScope scope) { this.id = id; this.type = type; - this.scope = scope; + this.scope = scope.toString(); this.status = STATUS.CREATED; } @@ -88,10 +90,10 @@ public abstract class ScopedResource { public abstract void find() throws Exception;; - public synchronized void doAction(ACTION action) throws Exception { + public synchronized void doAction(ACTION action) throws ResourceNotFound, Exception { this.action = action; switch (action) { - case ADD: this.addToScope(); this.success= true; break; + case ADD: this.addToScope(); this.setJointTime(Calendar.getInstance().getTime()); this.success= true; break; case REMOVE: this.removeFromScope(); this.success= true; break; default: break; } @@ -101,15 +103,17 @@ public abstract class ScopedResource { /** * Adds the resource to the scope * @throws Exception if the operation fails + * @throws ResourceNotFound if the resource does not exist in the infrastructure */ - protected abstract void addToScope() throws Exception; + protected abstract void addToScope() throws ResourceNotFound, Exception; /** * Removes the resource from the scope * @throws Exception if the operation fails + * @throws ResourceNotFound if the resource does not exist in the infrastructure */ - protected abstract void removeFromScope() throws Exception; + protected abstract void removeFromScope() throws ResourceNotFound, Exception; /** @@ -130,7 +134,7 @@ public abstract class ScopedResource { * @return the scope */ public GCUBEScope getScope() { - return scope; + return GCUBEScope.getScope(this.scope); } /** @@ -154,6 +158,15 @@ public abstract class ScopedResource { this.success = false; this.errorMessage = errorMessage; } + + /** + * Updates the time the resource joined the scope + * @param time the new joint time + */ + public void setJointTime(Date time) { + this.jointTime = time; + + } private void setChanged() { this.setLastModificationTime(Calendar.getInstance().getTime()); @@ -177,6 +190,10 @@ public abstract class ScopedResource { this.hostedOn = hostedOn; } + public Date getJointTime() { + return jointTime; + } + public Date getLastModificationTime() { if (lastModificationTime == null) this.setChanged(); @@ -198,6 +215,7 @@ public abstract class ScopedResource { * @param status the status to set */ public synchronized void setStatus(STATUS status) { + getLogger().trace(this.toString()+ ": status set to " + status); this.status = status; } @@ -237,14 +255,14 @@ public abstract class ScopedResource { * Gives up the operation on the resource * @param message the error message to return * @param e the exception that generates the hopeless - * @throws Exception the exception returned to the operation caller + * @throws E the source exception */ - protected void noHopeForMe(String message, Throwable e) throws Exception { - logger.error(this.toString() +": Unable to manage the resource " + message ,e); + protected void noHopeForMe(String message, E e) throws E { + getLogger().error(this.toString() +": Unable to manage the resource " + message ,e); this.setStatus(STATUS.LOST); this.success = false; this.setErrorMessage(message); - throw new Exception(e); + throw e; } /** @@ -254,10 +272,28 @@ public abstract class ScopedResource { public String toString() { return "Resource [id=" + id + ", type=" + type - + ", lastModificationTime=" + lastModificationTime - + ", scope=" + scope.getName() + + ", timestamp=" + lastModificationTime + + ", scope=" + scope + ", status=" + status + " hostedOn=" + hostedOn + "]"; } + + + protected GCUBELog getLogger() { + if (this.logger == null) + logger=new GCUBELog(this); + return logger; + } + + /** Unable to find the resource in the infrastructure*/ + public class ResourceNotFound extends Exception { + public ResourceNotFound(String message) {super(message);} + + public ResourceNotFound(Exception e) { + super(e); + } + + private static final long serialVersionUID = -6111206113583291172L; + } } diff --git a/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedRunningInstance.java b/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedRunningInstance.java index 46ea530..62cb396 100644 --- a/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedRunningInstance.java +++ b/src/org/gcube/vremanagement/resourcemanager/impl/resources/ScopedRunningInstance.java @@ -20,17 +20,14 @@ import org.gcube.common.vremanagement.ghnmanager.stubs.service.GHNManagerService import org.gcube.vremanagement.resourcemanager.impl.contexts.ServiceContext; import org.gcube.vremanagement.resourcemanager.impl.deployment.VirtualNode; -import com.thoughtworks.xstream.annotations.XStreamAlias; - /** * Models a scoped {@link GCUBERunningInstance} * * @author Manuele Simi (ISTI-CNR) * */ -@XStreamAlias("RunningInstance") public final class ScopedRunningInstance extends ScopedResource { - + public static final String TYPE = GCUBERunningInstance.TYPE; private String hostingNode = ""; @@ -51,7 +48,7 @@ public final class ScopedRunningInstance extends ScopedResource { } @Override - public void find() throws Exception { + public void find() throws ResourceNotFound { //looks for the RI to manage try { @@ -72,7 +69,7 @@ public final class ScopedRunningInstance extends ScopedResource { this.hostedOnID = profile.getGHNID(); this.scopes = profile.getScopes().values(); } catch (Exception e) { - this.noHopeForMe("unable to find the target RI (ID=" + id + ")", e); + this.noHopeForMe("unable to find the target RI (ID=" + id + ")", new ResourceNotFound(e)); } //looks for the GHN to contact @@ -83,7 +80,7 @@ public final class ScopedRunningInstance extends ScopedResource { this.hostingNode = client.execute(query, ServiceContext.getContext().getScope()).get(0).getNodeDescription().getName(); this.hostedOn = hostingNode; } catch (Exception e) { - this.noHopeForMe("unable to find the hosting GHN (ID=" + this.hostedOnID + ")", e); + this.noHopeForMe("unable to find the hosting GHN (ID=" + this.hostedOnID + ")", new ResourceNotFound(e)); } } @@ -94,7 +91,7 @@ public final class ScopedRunningInstance extends ScopedResource { * @throws Exception if it is not possible to add the resource */ @Override - protected void addToScope() throws Exception { + protected void addToScope() throws ResourceNotFound, Exception { if (this.hostingNode.compareToIgnoreCase("") == 0) this.find(); EndpointReferenceType endpoint = new EndpointReferenceType(); @@ -112,7 +109,7 @@ public final class ScopedRunningInstance extends ScopedResource { this.setStatus(STATUS.LOST); this.success = false; this.setErrorMessage("Failed to add RunningInstance to scope " + scope.toString()); - logger.error("Failed to add RunningInstance to scope " + scope.toString(), e); + getLogger().error("Failed to add RunningInstance to scope " + scope.toString(), e); throw new Exception("Failed to add RunningInstance to scope " + scope.toString()); } @@ -125,11 +122,11 @@ public final class ScopedRunningInstance extends ScopedResource { * @throws Exception if it is not possible to remove the resource */ @Override - protected void removeFromScope() throws Exception { + protected void removeFromScope() throws ResourceNotFound, Exception { //if (this.hostingNode.compareToIgnoreCase("") == 0) this.find();//we always need to refresh the resource before to remove it from the scopes if (this.scopes.size() == 1) { - logger.info("RI ("+this.getId()+") is only in this scope: it is going to be undeployed"); + getLogger().info("RI ("+this.getId()+") is only in this scope: it is going to be undeployed"); try { this.undeploy(); return; @@ -162,7 +159,7 @@ public final class ScopedRunningInstance extends ScopedResource { */ private void undeploy() throws Exception { //retrieving the related Service - ScopedDeployedService service = (ScopedDeployedService)ScopedResourceFactory.newResource(this.sourceService.serviceID, GCUBEService.TYPE, scope); + ScopedDeployedService service = (ScopedDeployedService)ScopedResourceFactory.newResource(this.sourceService.serviceID, GCUBEService.TYPE, GCUBEScope.getScope(scope)); service.removeFromScope(this.hostedOnID); } diff --git a/src/org/gcube/vremanagement/resourcemanager/impl/state/PublishedScopeResource.java b/src/org/gcube/vremanagement/resourcemanager/impl/state/PublishedScopeResource.java index daaedaa..33b1707 100644 --- a/src/org/gcube/vremanagement/resourcemanager/impl/state/PublishedScopeResource.java +++ b/src/org/gcube/vremanagement/resourcemanager/impl/state/PublishedScopeResource.java @@ -101,7 +101,7 @@ public class PublishedScopeResource { * @throws Exception */ public void addResource(ScopedResource resource) throws Exception { - this.publishedResourceList.add(resource.getId(), resource.getType(),resource.getLastModificationTime(), resource.getHostedOn()); + this.publishedResourceList.add(resource.getId(), resource.getType(),resource.getJointTime(), resource.getHostedOn()); resource.setStatus(STATUS.PUBLISHED); } @@ -468,12 +468,12 @@ public class PublishedScopeResource { protected String id; protected String type; protected String hostedOn; - protected Date lastModificationTime; + protected Date timestamp; - protected Item(String id, String value, Date lastModificationTime, String ... hostedOn) { + protected Item(String id, String value, Date timestamp, String ... hostedOn) { this.id = id; this.type = value; - this.lastModificationTime = lastModificationTime; + this.timestamp = timestamp; this.hostedOn = (hostedOn!=null && hostedOn.length>0) ? hostedOn[0] : null; } @@ -526,6 +526,7 @@ public class PublishedScopeResource { ScopedResource resource; try { resource = ScopedResourceFactory.newResource(item.id, item.type, scope); + resource.setJointTime(item.timestamp); if ((item.hostedOn != null) && (item.hostedOn.compareTo("") != 0)) resource.setHostedON(item.hostedOn); temp.add(resource); @@ -552,7 +553,7 @@ public class PublishedScopeResource { serializer.startTag(PublishedScopeResource.NS, "ResourceType").text(item.type).endTag(PublishedScopeResource.NS, "ResourceType"); if ((item.hostedOn != null) && (item.hostedOn.compareTo("") != 0)) serializer.startTag(PublishedScopeResource.NS, "HostedOn").text(item.hostedOn).endTag(PublishedScopeResource.NS, "HostedOn"); - serializer.startTag(PublishedScopeResource.NS, "JointTime").text(ProfileDate.toXMLDateAndTime(item.lastModificationTime)).endTag(PublishedScopeResource.NS, "JointTime"); + serializer.startTag(PublishedScopeResource.NS, "JointTime").text(ProfileDate.toXMLDateAndTime(item.timestamp)).endTag(PublishedScopeResource.NS, "JointTime"); serializer.endTag(PublishedScopeResource.NS, RESOURCE_ELEMENT); } serializer.endTag(PublishedScopeResource.NS, RESOURCES_ELEMENT); diff --git a/src/org/gcube/vremanagement/resourcemanager/impl/state/RawScopeState.java b/src/org/gcube/vremanagement/resourcemanager/impl/state/RawScopeState.java index b839eeb..fca7574 100644 --- a/src/org/gcube/vremanagement/resourcemanager/impl/state/RawScopeState.java +++ b/src/org/gcube/vremanagement/resourcemanager/impl/state/RawScopeState.java @@ -7,8 +7,6 @@ import org.gcube.common.core.scope.GCUBEScope; import org.gcube.vremanagement.resourcemanager.impl.resources.ScopedResource; import org.gcube.vremanagement.resourcemanager.impl.resources.types.MultiKeysMap; -import com.thoughtworks.xstream.annotations.XStreamAlias; - /** * * The scope state. @@ -22,21 +20,17 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @author Manuele Simi (ISTI-CNR) * */ -@XStreamAlias("RawScopeState") public class RawScopeState { /** the scope this state belongs to*/ - @XStreamAlias("Scope") - protected GCUBEScope scope; + protected String scope; /** the list of resources */ - @XStreamAlias("Resources") protected MultiKeysMap resources; //Open structure for information to store. By using it, we will avoid to broke XSTREAM serialization //when we need to add more information to the class /** any data belonging the state worthy to be serialized*/ - @XStreamAlias("Data") protected Map data; protected RawScopeState () {} @@ -48,14 +42,14 @@ public class RawScopeState { protected void initialize(final GCUBEScope scope) { resources = new MultiKeysMap(); data = new HashMap(); - this.scope = scope; + this.scope = scope.toString(); } /** * @return the scope this state belongs to */ public GCUBEScope getScope() { - return scope; + return GCUBEScope.getScope(this.scope); } diff --git a/src/org/gcube/vremanagement/resourcemanager/impl/state/ScopeState.java b/src/org/gcube/vremanagement/resourcemanager/impl/state/ScopeState.java index 724d798..c9a1e83 100644 --- a/src/org/gcube/vremanagement/resourcemanager/impl/state/ScopeState.java +++ b/src/org/gcube/vremanagement/resourcemanager/impl/state/ScopeState.java @@ -174,7 +174,7 @@ public class ScopeState extends Observable { * @return the scope */ public GCUBEScope getScope() { - return rawState.scope; + return rawState.getScope(); } public void notifyObservers(Object whatschanged) { diff --git a/src/org/gcube/vremanagement/resourcemanager/impl/state/observers/Executor.java b/src/org/gcube/vremanagement/resourcemanager/impl/state/observers/Executor.java index a8457de..6fc9b1f 100644 --- a/src/org/gcube/vremanagement/resourcemanager/impl/state/observers/Executor.java +++ b/src/org/gcube/vremanagement/resourcemanager/impl/state/observers/Executor.java @@ -2,6 +2,7 @@ package org.gcube.vremanagement.resourcemanager.impl.state.observers; import org.gcube.vremanagement.resourcemanager.impl.operators.Operator.ACTION; import org.gcube.vremanagement.resourcemanager.impl.resources.ScopedResource; +import org.gcube.vremanagement.resourcemanager.impl.resources.ScopedResource.ResourceNotFound; import org.gcube.vremanagement.resourcemanager.impl.resources.ScopedResource.STATUS; import org.gcube.vremanagement.resourcemanager.impl.state.ScopeState; import org.gcube.vremanagement.resourcemanager.impl.state.ScopeState.OPERATION; @@ -39,6 +40,9 @@ public class Executor extends ScopeObserver { try { resource.doAction(ACTION.ADD); resource.setStatus(STATUS.ADDED); + } catch (ResourceNotFound e) { + //the resource does not exist..it will be removed from the internal state + resource.setStatus(STATUS.REMOVED); } catch (Exception e) { resource.setStatus(STATUS.LOST); } @@ -47,12 +51,15 @@ public class Executor extends ScopeObserver { private void removeResourceFromScope(ScopedResource resource) { - try { - resource.doAction(ACTION.REMOVE); - resource.setStatus(STATUS.REMOVED); - } catch (Exception e) { - resource.setStatus(STATUS.LOST); - - } + try { + resource.doAction(ACTION.REMOVE); + resource.setStatus(STATUS.REMOVED); + } catch (ResourceNotFound e) { + //tolerate this exception... anyway it will be removed from the internal state + resource.setStatus(STATUS.REMOVED); + } catch (Exception e) { + //can't cope with this exception and don't know what to do + resource.setStatus(STATUS.LOST); + } } } diff --git a/src/org/gcube/vremanagement/resourcemanager/impl/state/observers/Serializer.java b/src/org/gcube/vremanagement/resourcemanager/impl/state/observers/Serializer.java index 5f67ff5..7d08991 100644 --- a/src/org/gcube/vremanagement/resourcemanager/impl/state/observers/Serializer.java +++ b/src/org/gcube/vremanagement/resourcemanager/impl/state/observers/Serializer.java @@ -4,14 +4,23 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.util.Map; import org.gcube.common.core.scope.GCUBEScope; import org.gcube.vremanagement.resourcemanager.impl.contexts.ServiceContext; +import org.gcube.vremanagement.resourcemanager.impl.resources.ScopedAnyResource; +import org.gcube.vremanagement.resourcemanager.impl.resources.ScopedDeployedService; +import org.gcube.vremanagement.resourcemanager.impl.resources.ScopedGHN; import org.gcube.vremanagement.resourcemanager.impl.resources.ScopedResource; +import org.gcube.vremanagement.resourcemanager.impl.resources.ScopedRunningInstance; +import org.gcube.vremanagement.resourcemanager.impl.resources.types.MultiKeysMap; import org.gcube.vremanagement.resourcemanager.impl.state.RawScopeState; import org.gcube.vremanagement.resourcemanager.impl.state.ScopeState; import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.QNameMap; +import com.thoughtworks.xstream.io.xml.StaxDriver; +import javax.xml.namespace.QName; /** * @@ -22,7 +31,9 @@ import com.thoughtworks.xstream.XStream; */ public class Serializer extends ScopeObserver { - final public static File persistentList = ServiceContext.getContext().getPersistentFile("ScopedResourceList.xml", true); + public final static File persistentList = ServiceContext.getContext().getPersistentFile("ScopedResourceList.xml", true); + private final static String namespace = "http://gcube-system.org/namespaces/resourcemanager/manager/xsd/state"; + /** * Serializes the notified list on the file system * @param scopeState the list to serialize @@ -40,8 +51,14 @@ public class Serializer extends ScopeObserver { } public synchronized static void store(final ScopeState scopeState) throws IOException { - XStream stream = new XStream(); - stream.processAnnotations(RawScopeState.class); + + QNameMap qmap = new QNameMap(); + qmap.registerMapping(new QName(namespace, ""), RawScopeState.class); + StaxDriver driver = new StaxDriver(qmap); + driver.setRepairingNamespace(false); + XStream stream = new XStream(driver); + prepareStream(stream); + FileOutputStream fs = new FileOutputStream(persistentList); stream.toXML(scopeState.getRawScopeState(), fs); fs.close(); @@ -58,8 +75,13 @@ public class Serializer extends ScopeObserver { throw new IOException(); //try to load the local list of resources - XStream stream = new XStream(); - stream.processAnnotations(RawScopeState.class); + QNameMap qmap = new QNameMap(); + qmap.registerMapping(new QName(namespace, ""), RawScopeState.class); + StaxDriver driver = new StaxDriver(qmap); + driver.setRepairingNamespace(false); + XStream stream = new XStream(driver); + prepareStream(stream); + RawScopeState state = (RawScopeState) stream.fromXML(new FileInputStream((persistentList))); //a bit of sanity checks.... @@ -69,4 +91,30 @@ public class Serializer extends ScopeObserver { //inject the state scopeState.setRawScopeState(state); } + + private static void prepareStream(XStream stream) { + stream.processAnnotations(RawScopeState.class); + stream.alias(RawScopeState.class.getSimpleName(), RawScopeState.class); + + stream.processAnnotations(ScopedResource.class); + stream.alias(ScopedResource.class.getSimpleName(), ScopedResource.class); + + stream.alias(ScopedGHN.class.getSimpleName(), ScopedGHN.class); + stream.processAnnotations(ScopedGHN.class); + + stream.alias(ScopedRunningInstance.class.getSimpleName(), ScopedRunningInstance.class); + stream.processAnnotations(ScopedRunningInstance.class); + + stream.alias(ScopedDeployedService.class.getSimpleName(), ScopedDeployedService.class); + stream.processAnnotations(ScopedDeployedService.class); + + stream.alias(ScopedAnyResource.class.getSimpleName(), ScopedAnyResource.class); + stream.processAnnotations(ScopedAnyResource.class); + + stream.alias("ResourceList", MultiKeysMap.class); + stream.alias("ResourceData", Map.class); + stream.alias("Scope", GCUBEScope.class); + stream.alias("ScopeType", GCUBEScope.Type.class); + + } }