From d8315a8a919ed04128a18df6f6fb053b01260014 Mon Sep 17 00:00:00 2001 From: Manuele Simi Date: Sat, 31 Jul 2010 03:18:56 +0000 Subject: [PATCH] Classes of living resources configurable via JNDI git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/information-system/gCubeIS/Registry@25579 82a268e6-3cf1-43bd-a215-b396298e98cf --- etc/deploy-jndi-config.xml | 227 +++--- etc/profile.xml | 2 +- .../impl/porttypes/RegistryFactory.java | 729 ++++++++++-------- 3 files changed, 486 insertions(+), 472 deletions(-) diff --git a/etc/deploy-jndi-config.xml b/etc/deploy-jndi-config.xml index a03d4a4..0c0ce26 100644 --- a/etc/deploy-jndi-config.xml +++ b/etc/deploy-jndi-config.xml @@ -1,116 +1,46 @@ - - - - - - - - - - - - - - - - - - + + + + + + - - - - - factory - org.globus.wsrf.jndi.BeanFactory - - - mode - pull - - - fileName - registration.xml - - - - - - - + + - - factory - org.globus.wsrf.jndi.BeanFactory - - - resourceClass - org.gcube.informationsystem.registry.impl.state.ProfileResource - - - persistenceDelegateClass - org.gcube.informationsystem.registry.impl.persistence.RegistryPersistenceDelegate - - - sweeperDelay - 10000 - - - - - + - + - + - - - - - - - - - - - - - - factory - org.globus.wsrf.jndi.BeanFactory - - - resourceClass - org.gcube.informationsystem.registry.impl.state.RegistryFactoryResource - - - persistenceDelegateClass - org.gcube.informationsystem.registry.impl.persistence.RegistryFactoryPersistenceDelegate - - - - - - - + + + + + + + factory + org.globus.wsrf.jndi.BeanFactory + + + resourceClass + org.gcube.informationsystem.registry.impl.state.ProfileResource + + + + persistenceDelegateClass + org.gcube.informationsystem.registry.impl.persistence.RegistryPersistenceDelegate + + + + sweeperDelay + 10000 + + + + + + + + + + + + + + + + + + + factory + org.globus.wsrf.jndi.BeanFactory + + + resourceClass + org.gcube.informationsystem.registry.impl.state.RegistryFactoryResource + + + + persistenceDelegateClass + org.gcube.informationsystem.registry.impl.persistence.RegistryFactoryPersistenceDelegate + + + + + + + + diff --git a/etc/profile.xml b/etc/profile.xml index d771c79..a73fb2a 100644 --- a/etc/profile.xml +++ b/etc/profile.xml @@ -18,7 +18,7 @@
IS-Registry: validate, register and unregister GCUBE resources to/from the IS. It also publishes Topics for notifications about GCUBE resource events IS-Registry-service - 1.3.3 + 1.4.0 diff --git a/src/org/gcube/informationsystem/registry/impl/porttypes/RegistryFactory.java b/src/org/gcube/informationsystem/registry/impl/porttypes/RegistryFactory.java index e231ed8..6b1466e 100644 --- a/src/org/gcube/informationsystem/registry/impl/porttypes/RegistryFactory.java +++ b/src/org/gcube/informationsystem/registry/impl/porttypes/RegistryFactory.java @@ -7,7 +7,11 @@ import java.io.StringReader; import java.io.StringWriter; import java.lang.reflect.Method; import java.rmi.RemoteException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; +import java.util.List; + import org.apache.axis.components.uuid.UUIDGen; import org.apache.axis.components.uuid.UUIDGenFactory; import org.gcube.common.core.contexts.GCUBEServiceContext; @@ -47,195 +51,214 @@ import static org.gcube.informationsystem.registry.impl.core.RegistryConfigurati */ public class RegistryFactory extends GCUBEPortType { - /** Name of temporaryResourceLifetimeInMs JNDI environment. */ - private static final String LIFETIME_JNDI_NAME = "temporaryResourceLifetimeInMs"; - - /** - * Lifetime of temporary resources - */ - private static long temporaryResourceLifetimeInMs = 120000; - - /** The UUIDGen */ - private static final UUIDGen uuidgen = UUIDGenFactory.getUUIDGen(); - - /** Object logger */ - protected final GCUBELog logger = new GCUBELog(RegistryFactory.class); - - enum OperationType {create, update, destroy}; - - - /** the key used to label the Factory Resource */ - public static final String NOTIFICATOR_RESOURCE_KEY = "RegistryResource"; - - /** - * {@inheritDoc} - */ - @Override - protected void onInitialisation() throws Exception { - temporaryResourceLifetimeInMs = (Long) ServiceContext.getContext().getProperty(LIFETIME_JNDI_NAME); - logger.info("Temporary resources lifetime = " + temporaryResourceLifetimeInMs); - } - - - /** - * - * Creates a new GCUBEResource's profile manager - * - * @param inputMessage - * @return the profile as string - * @throws SchemaValidationFault - * @throws RemoteException - * @throws ProfileAlreadyRegisteredFault - */ - @SuppressWarnings("unchecked") - public String createResource(CreateResourceMessage mess) throws SchemaValidationFault, RemoteException, - ProfileAlreadyRegisteredFault, ResourceNotAcceptedFault { + /** Name of temporaryResourceLifetimeInMs JNDI environment. */ + private static final String LIFETIME_JNDI_NAME = "temporaryResourceLifetimeInMs"; + /** Name of Living Resource Types JNDI environment. */ + private static final String LIVINGTYPES_JNDI_NAME = "livingResourceTypes"; + + /** + * Lifetime of temporary resources + */ + private static long temporaryResourceLifetimeInMs = 120000; + + /** + * Lifetime of temporary resources + */ + private static List livingResourceTypes; + + /** The UUIDGen */ + private static final UUIDGen uuidgen = UUIDGenFactory.getUUIDGen(); + + /** Object logger */ + protected final GCUBELog logger = new GCUBELog(RegistryFactory.class); + + enum OperationType { + create, update, destroy + }; + + /** the key used to label the Factory Resource */ + public static final String NOTIFICATOR_RESOURCE_KEY = "RegistryResource"; + + /** + * {@inheritDoc} + */ + @Override + protected void onInitialisation() throws Exception { + temporaryResourceLifetimeInMs = (Long) ServiceContext.getContext().getProperty(LIFETIME_JNDI_NAME); + logger.info("Temporary resources lifetime = "+ temporaryResourceLifetimeInMs); + try { + temporaryResourceLifetimeInMs = (Long) ServiceContext.getContext().getProperty(LIFETIME_JNDI_NAME); + livingResourceTypes = Arrays.asList(((String)ServiceContext.getContext().getProperty(LIVINGTYPES_JNDI_NAME)).split(",")); + } catch (Exception e) {livingResourceTypes = new ArrayList();} + } + + /** + * + * Creates a new {@link ProfileResource} and registers the {@link GCUBEResource} in the IS-IC + * + * @param inputMessage defined in the WSDL + * @return the registered profile + * @throws SchemaValidationException if the string serialization of the resource is not valid + * @throws ResourceNotAcceptedFault it the resource is rejected when evaluating the resources' filters + * @throws RemoteException + * @throws ProfileAlreadyRegisteredFault + */ + @SuppressWarnings("unchecked") + public String createResource(CreateResourceMessage mess) + throws SchemaValidationFault, RemoteException, + ProfileAlreadyRegisteredFault, ResourceNotAcceptedFault { + GCUBEResource resource = null; - + logger.info("CreateResource operation invoked"); // logSecurityInfo("createResource"); - + String profile = mess.getProfile(); if (profile == null || profile.compareTo("") == 0) { - String msg = "Profile file is empty"; - logger.debug(msg); - throw new RemoteException(msg); + String msg = "Profile file is empty"; + logger.debug(msg); + throw new RemoteException(msg); } - + try { - resource = ResourceType.valueOf(mess.getType()).getResourceClass(); - - resource.load(new BufferedReader(new InputStreamReader(new ByteArrayInputStream(profile.getBytes("UTF-8")), "UTF-8"))); - - // the parse Profile class allows to extract from profiles - // information about type/SCOPE/UniqueID - // in order to distinguish among different Resource Type - // Adding scopes to Profile - String[] scopes = mess.getScopes(); - if (scopes != null) { - for (String scope : scopes) { - logger.debug(resource.getID() - + " Adding Scopes to Profile " + scope); - resource.addScope(GCUBEScope.getScope(scope)); + resource = ResourceType.valueOf(mess.getType()).getResourceClass(); + + resource.load(new BufferedReader(new InputStreamReader( + new ByteArrayInputStream(profile.getBytes("UTF-8")), + "UTF-8"))); + + // the parse Profile class allows to extract from profiles + // information about type/SCOPE/UniqueID + // in order to distinguish among different Resource Type + // Adding scopes to Profile + String[] scopes = mess.getScopes(); + if (scopes != null) { + for (String scope : scopes) { + logger.debug(resource.getID() + + " Adding Scopes to Profile " + scope); + resource.addScope(GCUBEScope.getScope(scope)); + } + } - - } - // check ID - if (resource.getID() == null || resource.getID().compareTo("") == 0) { - resource.setID(uuidgen.nextUUID()); - } - + // check ID + if (resource.getID() == null || resource.getID().compareTo("") == 0) { + resource.setID(uuidgen.nextUUID()); + } + } catch (Exception ex) { - logger.error("Error trying to load profile", ex); - throw new SchemaValidationFault(); + logger.error("Error trying to load profile", ex); + throw new SchemaValidationFault(); } // apply resource filter try { - if (!FilterManager.getExecutor(resource.getType()).accept(resource)) { - logger.warn("Resource " + resource.getID() + " NOT accepted "); - throw new ResourceNotAcceptedFault(); - } - logger.trace("Resource " + resource.getID() + " accepted "); + if (!FilterManager.getExecutor(resource.getType()).accept(resource)) { + logger.warn("Resource " + resource.getID() + " NOT accepted "); + throw new ResourceNotAcceptedFault(); + } + logger.trace("Resource " + resource.getID() + " accepted "); } catch (InvalidFilterException e) { - logger.warn("Invalid filter selected, the resource " - + resource.getID() + " CANNOT be filtered "); + logger.warn("Invalid filter selected, the resource " + + resource.getID() + " CANNOT be filtered "); } - + // check if the Resource already exists if (isResourceCreated(resource.getID())) { - // update the existing resource - logger.warn("A Resource with ID " + resource.getID() - + " is already registered"); - UpdateResourceMessage upmess = new UpdateResourceMessage(); - upmess.setUniqueID(resource.getID()); - upmess.setXmlProfile(mess.getProfile()); - upmess.setType(mess.getType()); - this.updateResource(upmess); - // throw new ProfileAlreadyRegisteredFault(); + // update the existing resource + logger.debug("A Resource with ID " + resource.getID() + " is already registered"); + UpdateResourceMessage upmess = new UpdateResourceMessage(); + upmess.setUniqueID(resource.getID()); + upmess.setXmlProfile(mess.getProfile()); + upmess.setType(mess.getType()); + this.updateResource(upmess); + // throw new ProfileAlreadyRegisteredFault(); } else { - // try to create resource - try { - logger.debug(resource.getID() + " Creating the stateful resource for " + resource.getID()); - - ProfileResource presource = (ProfileResource) ProfileContext.getContext().getWSHome().create(ProfileContext.getContext() - .makeKey(resource.getID()), resource); - presource.store(); - - // Deleting the WSResource created if != from GHN - if (resource.getType().compareTo(GCUBEHostingNode.TYPE) != 0) - this.scheduleForLazyDeletion(presource); - - } catch (Exception ex) { - String msg = "Error creating Resource " + resource.getID(); - logger.error(msg, ex); - throw new RemoteException(msg); - } - try { - updateCounterInfo(resource.getID(), ResourceType.valueOf(mess.getType()), OperationType.create, Calendar.getInstance(), mess.getProfile()); - - GCUBEEvent event = new GCUBEEvent(); - event.setPayload(resource); - ServiceContext.getContext().getTopicProducer().notify( - ServiceContext.RegistryTopic.CREATE, event); - } catch (Exception e) { - logger.warn("Error updating Counting info for resource with ID " + resource.getID(), e); - } + // try to create resource + try { + logger.debug(resource.getID() + + " Creating the stateful resource for " + + resource.getID()); + + ProfileResource presource = (ProfileResource) ProfileContext + .getContext().getWSHome().create( + ProfileContext.getContext().makeKey( + resource.getID()), resource); + presource.store(); + + // Deleting the WSResource created if != from GHN || RI + if (! this.isLivingResource(resource)) + this.scheduleForLazyDeletion(presource); + + } catch (Exception ex) { + String msg = "Error creating Resource " + resource.getID(); + logger.error(msg, ex); + throw new RemoteException(msg); + } + try { + updateCounterInfo(resource.getID(), ResourceType.valueOf( + mess.getType()), OperationType.create, + Calendar.getInstance(), mess.getProfile()); + + GCUBEEvent event = new GCUBEEvent(); + event.setPayload(resource); + ServiceContext.getContext().getTopicProducer().notify(ServiceContext.RegistryTopic.CREATE, event); + } catch (Exception e) { + logger.warn( + "Error updating Counting info for resource with ID " + + resource.getID(), e); + } } - + StringWriter writer = new StringWriter(); try { - logger.debug("Persisting the stateful resource for " - + resource.getID()); - resource.store(writer); + logger.debug("Persisting the stateful resource for " + resource.getID()); + resource.store(writer); } catch (Exception e) { - logger.error("Persistence failed for " + resource.getID(), e); + logger.error("Persistence failed for " + resource.getID(), e); } - + logger.info("Profile " + resource.getID() + " created "); return writer.toString(); - } - - /** - * Schedules a resource for a delayed deletion - * - * @param presource the resource to delete - */ - private void scheduleForLazyDeletion(ProfileResource presource) { - - long timestamp = System.currentTimeMillis() + temporaryResourceLifetimeInMs; - GCUBEScope scope = ServiceContext.getContext().getScope().getType() == GCUBEScope.Type.VRE ? ServiceContext - .getContext().getScope().getEnclosingScope(): ServiceContext.getContext().getScope(); - - Pair c = new Pair(timestamp, presource); - if (!ServiceContext.threadTable.get(scope.getName()).getStack().contains(c)) { - ServiceContext.threadTable.get(scope.getName()).getStack().add(c); - logger.trace("Adding resource to EliminatePoolingThread " + presource.getGCubeResource().getID()); - } else { //add more life to the resource by further delaying its deletion - int index = ServiceContext.threadTable.get(scope.getName()).getStack().indexOf(c); - ServiceContext.threadTable.get(scope.getName()).getStack().get(index).lifetime = timestamp+ temporaryResourceLifetimeInMs; } - - } - - /** - * Updates Resource Profiles (in case of an update of an ID not present it - * invokes calls the Create resource operation) - * - * @param mess - * Complex Object that contains a String representing the XML - * profile to update and the diligentID - * @return UpdateResourceResponse - * @throws RemoteException - * Exception - * @throws SchemaValidationException - * Exception - */ - @SuppressWarnings("unchecked") - public UpdateResourceResponse updateResource(UpdateResourceMessage mess) - throws RemoteException, SchemaValidationFault, ResourceNotAcceptedFault, GCUBEFault { - + /** + * Schedules a resource for a delayed deletion + * + * @param presource the resource to delete + */ + private void scheduleForLazyDeletion(ProfileResource presource) { + + long timestamp = System.currentTimeMillis() + temporaryResourceLifetimeInMs; + GCUBEScope scope = ServiceContext.getContext().getScope().getType() == + GCUBEScope.Type.VRE ? ServiceContext.getContext().getScope().getEnclosingScope() + : ServiceContext.getContext().getScope(); + + Pair c = new Pair(timestamp, presource); + if (!ServiceContext.threadTable.get(scope.getName()).getStack().contains(c)) { + ServiceContext.threadTable.get(scope.getName()).getStack().add(c); + logger.trace("Adding resource to EliminatePoolingThread "+ presource.getGCubeResource().getID()); + } else { // add more life to the resource by further delaying its + // deletion + int index = ServiceContext.threadTable.get(scope.getName()).getStack().indexOf(c); + ServiceContext.threadTable.get(scope.getName()).getStack().get(index).lifetime = timestamp + temporaryResourceLifetimeInMs; + } + + } + + /** + * Updates a {@link GCUBEResource} + * + * @param mess Complex Object that contains a String representing the XML profile to update and the diligentID + * @return UpdateResourceResponse + * @throws RemoteException Exception + * @throws SchemaValidationException if the string serialization of the resource is not valid + * @throws ResourceNotAcceptedFault it the resource is rejected when evaluating the resources' filters + */ + @SuppressWarnings("unchecked") + public UpdateResourceResponse updateResource(UpdateResourceMessage mess) + throws RemoteException, SchemaValidationFault, + ResourceNotAcceptedFault, GCUBEFault { + logger.info("UpdateResource operation invoked"); String ID = mess.getUniqueID(); String xmlProfile = mess.getXmlProfile(); @@ -243,219 +266,239 @@ public class RegistryFactory extends GCUBEPortType { CreateResourceMessage input = null; // validating input parameters if (ID == null || ID.compareTo("") == 0) { - logger.debug(" ID missing "); - throw new RemoteException("Error, ID missing"); + logger.debug(" ID missing "); + throw new RemoteException("Error, ID missing"); } if (xmlProfile == null || xmlProfile.compareTo("") == 0) { - logger.debug("Profile missing"); - throw new RemoteException("Error, profile missing"); + logger.debug("Profile missing"); + throw new RemoteException("Error, profile missing"); } // check if the profile exist if (!isResourceCreated(ID)) { - input = new CreateResourceMessage(); - input.setProfile(xmlProfile); - input.setType(mess.getType()); - this.createResource(input); - return new UpdateResourceResponse(); + input = new CreateResourceMessage(); + input.setProfile(xmlProfile); + input.setType(mess.getType()); + this.createResource(input); + return new UpdateResourceResponse(); } try { - resource = ResourceType.valueOf(mess.getType()).getResourceClass(); - resource.load(new StringReader(xmlProfile)); - // apply resource filter - try { + resource = ResourceType.valueOf(mess.getType()).getResourceClass(); + resource.load(new StringReader(xmlProfile)); + // apply resource filter + try { if (!FilterManager.getExecutor(resource.getType()).accept(resource)) { - logger.warn("Resource " + resource.getID() + " NOT accepted "); - throw new ResourceNotAcceptedFault(); + logger.warn("Resource " + resource.getID() + " NOT accepted "); + throw new ResourceNotAcceptedFault(); } logger.trace("Resource " + resource.getID() + " accepted "); - } catch (InvalidFilterException e) { - logger.warn("Invalid filter selected, the resource " + resource.getID() + " CANNOT be filtered "); - } - - ProfileResource presource = getProfileResource(ID); - presource.updateResource(resource); - - // Deleting the WSResource created - if (resource.getType().compareTo(GCUBEHostingNode.TYPE) != 0) - this.scheduleForLazyDeletion(presource); - + } catch (InvalidFilterException e) { + logger.warn("Invalid filter selected, the resource " + + resource.getID() + " CANNOT be filtered "); + } + + ProfileResource presource = getProfileResource(ID); + presource.updateResource(resource); + + // Deleting the WSResource created if != from GHN || RI + if (! this.isLivingResource(resource)) + this.scheduleForLazyDeletion(presource); + } catch (Exception e) { - logger.error("Error updating profile for ID " + e); - throw new RemoteException(e.toString()); + logger.error("Error updating profile for ID " + e); + throw new RemoteException(e.toString()); } - + try { - this.updateCounterInfo(ID, ResourceType.valueOf(mess.getType()), OperationType.update, Calendar.getInstance(), xmlProfile); - GCUBEEvent event = new GCUBEEvent(); - event.setPayload(resource); - ServiceContext.getContext().getTopicProducer().notify(ServiceContext.RegistryTopic.UPDATE, event); + this.updateCounterInfo(ID, ResourceType.valueOf(mess.getType()), + OperationType.update, Calendar.getInstance(), xmlProfile); + GCUBEEvent event = new GCUBEEvent(); + event.setPayload(resource); + ServiceContext.getContext().getTopicProducer().notify(ServiceContext.RegistryTopic.UPDATE, event); } catch (Exception e) { - logger.warn("Error while updating the counting info for resource with ID " + resource.getID(), e); + logger.warn("Error while updating the counting info for resource with ID " + resource.getID(), e); } logger.info("Profile " + mess.getUniqueID() + " updated"); return new UpdateResourceResponse(); - } - - /** - * Removes a Resource profile identified by the given the resource ID - * - * @param inputMessage defined into WSDL file - * @return RemoveResourceResponse - * @throws RemoteException - */ - @SuppressWarnings("unchecked") - public RemoveResourceResponse removeResource(RemoveResourceMessage inputMessage) throws RemoteException, GCUBEFault { - //logSecurityInfo("removeResource"); - - String ID = inputMessage.getUniqueID(); - String type = inputMessage.getType(); - logger.info("RemoveResource operation invoked on resource ID=" + ID + ", type=" + type); - if (ID == null || ID.compareTo("") == 0) { - logger.warn("Resource ID is missing, cannot manage the resource"); - throw new RemoteException("Resource ID is missing, cannot manage the resource"); } - try { - logger.debug("Trying to remove the resource from the IS-IC"); - new ProfileManager().removeFromISIC(ID, type, ServiceContext.getContext().getScope(), ServiceContext.getContext()); - logger.info("Resource removed from the IS-IC"); - } catch (Exception e) { - logger.error("Unable to remove the resource", e); - throw ServiceContext.getContext().getDefaultException("", e).toFault( "Unable to remove the resource: the remote IS-IC returned an error"); - } - // if the resource is a GHN, remove also the related RIs - try { - if (type.compareTo(GCUBEHostingNode.TYPE) == 0) { - logger.debug("Removing the related RIs"); - GHN ghn = new GHN(ID); - ghn.unregisterHostedRIs(this); - logger.debug("Related RIs removed"); - } - } catch (Exception e) { - logger.error("Error while removing RI profiles related to the GHN", e); - } + /** + * Removes a Resource profile identified by the given the resource ID + * + * @param inputMessage defined into WSDL file + * @return RemoveResourceResponse + * @throws RemoteException + */ + @SuppressWarnings("unchecked") + public RemoveResourceResponse removeResource( + RemoveResourceMessage inputMessage) throws RemoteException, GCUBEFault { - if (this.isResourceCreated(ID)) { - // destroy the resource - try { - logger.debug("Destroying the local stateful Resoruce"); - ProfileContext.getContext().getWSHome().remove(ProfileContext.getContext().makeKey(ID)); - logger.info(" Resource Destroyed"); - } catch (Exception e) { - logger.error("Error removing resource for ID ", e); - throw new RemoteException(); - } - try { - GCUBEEvent event = new GCUBEEvent(); - GCUBEResource resource = ResourceType.valueOf(type).getResourceClass(); - resource.setID(ID); - event.setPayload(resource); - ServiceContext.getContext().getTopicProducer().notify(ServiceContext.RegistryTopic.REMOVE, event); - updateCounterInfo(ID, ResourceType.valueOf(type),OperationType.destroy, Calendar.getInstance(),null); - } catch (Exception e) { - logger.warn("Error updating counting info for resource with ID " + ID, e); - } - } + String ID = inputMessage.getUniqueID(); + String type = inputMessage.getType(); + logger.info("RemoveResource operation invoked on resource ID=" + ID + + ", type=" + type); + if (ID == null || ID.compareTo("") == 0) { + logger.warn("Resource ID is missing, cannot manage the resource"); + throw new RemoteException( + "Resource ID is missing, cannot manage the resource"); + } - return new RemoveResourceResponse(); + try { + logger.debug("Trying to remove the resource from the IS-IC"); + new ProfileManager().removeFromISIC(ID, type, ServiceContext + .getContext().getScope(), ServiceContext.getContext()); + logger.info("Resource removed from the IS-IC"); + } catch (Exception e) { + logger.error("Unable to remove the resource", e); + throw ServiceContext + .getContext() + .getDefaultException("", e) + .toFault( + "Unable to remove the resource: the remote IS-IC returned an error"); + } + // if the resource is a GHN, remove also the related RIs + try { + if (type.compareTo(GCUBEHostingNode.TYPE) == 0) { + logger.debug("Removing the related RIs"); + GHN ghn = new GHN(ID); + ghn.unregisterHostedRIs(this); + logger.debug("Related RIs removed"); + } + } catch (Exception e) { + logger.error("Error while removing RI profiles related to the GHN", + e); + } - } + if (this.isResourceCreated(ID)) { + // destroy the resource + try { + logger.debug("Destroying the local stateful Resoruce"); + ProfileContext.getContext().getWSHome().remove( + ProfileContext.getContext().makeKey(ID)); + logger.info(" Resource Destroyed"); + } catch (Exception e) { + logger.error("Error removing resource for ID ", e); + throw new RemoteException(); + } + try { + GCUBEEvent event = new GCUBEEvent(); + GCUBEResource resource = ResourceType.valueOf(type) + .getResourceClass(); + resource.setID(ID); + event.setPayload(resource); + ServiceContext.getContext().getTopicProducer().notify( + ServiceContext.RegistryTopic.REMOVE, event); + updateCounterInfo(ID, ResourceType.valueOf(type), + OperationType.destroy, Calendar.getInstance(), null); + } catch (Exception e) { + logger.warn( + "Error updating counting info for resource with ID " + + ID, e); + } + } - - /** - * Checks if the Resource has been created - * - * @param id - * the Resource ID - * @return the resource ( null if the resource has not been created yet - */ - protected synchronized ProfileResource getProfileResource(String id) { - try { - return (ProfileResource) ProfileContext.getContext().getWSHome() - .find(ProfileContext.getContext().makeKey(id)); - } catch (Exception e) { - logger.debug("A profile with the given id " + id - + " has not been created yet"); - } - return null; - - } - - /** - * - * @param id - * @return - */ - protected synchronized boolean isResourceCreated(String id) { - if (getProfileResource(id) != null) - return true; - else - return false; - } - - /** - * Updates the RegistryFactoryResource RPs for notification - * - * - * @param ID - * resource ID - * @param type - * the resource type - * @param operationType - * the type of Operation performed on the Profile - * @param updateTime - * The last operation Time - * @throws Exception - * Exception - */ - - private synchronized void updateCounterInfo(String ID, - ResourceType resType, OperationType opType, Calendar updateTime, String profile) - throws Exception { - - RegistryProperty property = new RegistryProperty(); - property.setUniqueID(ID); - property.setProfile(profile); - property.setOperationType(opType.name()); - property.setChangeTime(updateTime); - // select the type of the resource to update - for (Method method : this.getResource().getClass().getDeclaredMethods()) { - if (method.getName().contains(resType.name()) - && method.getName().contains("set")) { - method.invoke(this.getResource(), property); - break; - } + return new RemoveResourceResponse(); } - this.getResource().store(); - } - /** - * return the resource - * - * @return NotifierResource resource - * @throws RemoteException - * - */ - private RegistryFactoryResource getResource() throws RemoteException { + /** + * Gets the profile resource + * + * @param id the Resource ID + * @return the resource or null if the resource has not been created yet + */ + protected synchronized ProfileResource getProfileResource(String id) { + try { + return (ProfileResource) ProfileContext.getContext().getWSHome() + .find(ProfileContext.getContext().makeKey(id)); + } catch (Exception e) { + logger.debug("A profile with the given id " + id+ " has not been created yet"); + } + return null; + + } + + /** + * Checks whether a stateful resource with the given identifier exists + * + * @param id the resource's identifier + * @return true if the resource exists, false otherwise + */ + protected synchronized boolean isResourceCreated(String id) { + if (getProfileResource(id) != null) + return true; + else + return false; + } + + /** + * Updates the RegistryFactoryResource RPs for notification + * + * @param ID resource ID + * @param type the resource type + * @param operationType the type of Operation performed on the Profile + * @param updateTime the last operation Time + * @throws Exception if the update fails + */ + private synchronized void updateCounterInfo(String ID, + ResourceType resType, OperationType opType, Calendar updateTime, + String profile) throws Exception { + + RegistryProperty property = new RegistryProperty(); + property.setUniqueID(ID); + property.setProfile(profile); + property.setOperationType(opType.name()); + property.setChangeTime(updateTime); + // select the type of the resource to update + for (Method method : this.getResource().getClass().getDeclaredMethods()) { + if (method.getName().contains(resType.name()) + && method.getName().contains("set")) { + method.invoke(this.getResource(), property); + break; + } + + } + this.getResource().store(); + } + + /** + * Gets the factory stateful resource + * + * @return the resource + * @throws RemoteException if the stateful resource of the factory cannot be found in the home + * + */ + private RegistryFactoryResource getResource() throws RemoteException { Object resource = null; try { - resource = FactoryContext.getContext().getWSHome().find( - FactoryContext.getContext().makeKey(NOTIFICATOR_RESOURCE_KEY)); + resource = FactoryContext.getContext().getWSHome().find( + FactoryContext.getContext().makeKey(NOTIFICATOR_RESOURCE_KEY)); } catch (Exception e) { - logger.error(" Unable to access resource", e); + logger.error(" Unable to access resource", e); } - + RegistryFactoryResource factoryResource = (RegistryFactoryResource) resource; return factoryResource; - } + } - /** - * {@inheritDoc} - */ - @Override - protected GCUBEServiceContext getServiceContext() { - return ServiceContext.getContext(); - } + /** + * Decides whether the given resource is a living resource. + * + * Living resources are those resources that are not automatically destroyed because they are updated regularly. + * + * @param resource the resource to check + * @return true if the given resource is a living resource, false otherwise + */ + private boolean isLivingResource(GCUBEResource resource) { + return (livingResourceTypes.contains(resource.getType()))? true : false; + } + + /** + * {@inheritDoc} + */ + @Override + protected GCUBEServiceContext getServiceContext() { + return ServiceContext.getContext(); + } } +