package org.gcube.informationsystem.registry.impl.state; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.gcube.common.core.informationsystem.notifier.ISNotifier; import org.gcube.common.core.informationsystem.publisher.ISPublisher; import org.gcube.common.core.informationsystem.publisher.ISPublisherException; import org.gcube.common.core.contexts.GHNContext; import org.gcube.common.core.resources.GCUBEHostingNode; import org.gcube.common.core.resources.GCUBEResource; import org.gcube.common.core.resources.GCUBERunningInstance; import org.gcube.common.core.resources.GCUBEService; import org.gcube.common.core.state.GCUBEWSResource; import org.gcube.common.core.utils.logging.GCUBELog; import org.gcube.informationsystem.registry.impl.RegistryFactory; import org.gcube.informationsystem.registry.impl.contexts.ProfileContext; import org.gcube.informationsystem.registry.impl.contexts.ServiceContext; import org.globus.wsrf.ResourceException; import org.globus.wsrf.impl.SimpleTopic; import org.w3c.dom.Document; import org.xml.sax.InputSource; /** * @author Andrea Manzi * */ public class ProfileResource extends GCUBEWSResource { private static GCUBELog logger = new GCUBELog(ProfileResource.class.getName()); private ISPublisher publisher = null; private ISNotifier notifier= null; ArrayList listQname = new ArrayList(); protected static final String NotificationProfileRP="NotificationProfile"; protected GCUBEResource gCubeResource; protected static final String ProfileRP="Profile"; @Override protected String[] getTopicNames(){ return new String[] {NotificationProfileRP}; } @Override protected String[] getPropertyNames(){ return new String[] {ProfileRP}; } /** * Constructor * @throws Exception Exception */ public ProfileResource() throws Exception{}; /** * initialize the resource * @param params Object */ @Override public void initialise(Object... params) throws ResourceException { GCUBEResource resource = (GCUBEResource) params[0]; logger.debug("initializing resource "+resource.getID()); Document dom = null; StringWriter writer =new StringWriter(); try { resource.store(writer); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); StringReader reader = new StringReader(writer.toString().substring(writer.toString().indexOf("?>")+2, writer.toString().length())); InputSource source = new InputSource(reader); dom =builder.parse(source); } catch (Exception e1) { throw new ResourceException(e1); } this.setProfile(dom); this.setNotificationProfile(dom); this.setGCubeResource(resource); if (hasToLive(resource)) this.setTerminationTime(null); if (hasToLive(resource)) { //registration of Topic To IS-Notifier listQname.add(new SimpleTopic(this.generateQName())); synchronized(RegistryFactory.notificationMap) { if (!(RegistryFactory.notificationMap.contains(this.getID()))) { try { notifier = GHNContext.getImplementation(ISNotifier.class); notifier.registerISNotification(this.getEPR(), listQname, ServiceContext.getContext()); } catch (Exception e){ e.printStackTrace(); throw new ResourceException(e); } RegistryFactory.notificationMap.add(this.getID()); } } } } /** * set notification Profile * * @param profile Document */ public void setNotificationProfile(Document profile) { this.getResourcePropertySet().get(NotificationProfileRP).clear(); this.getResourcePropertySet().get(NotificationProfileRP).add(profile); //this.getPersistenceDelegate().store(this); } /** * get notification Profile * * @return Document profile */ public Document getNotificationProfile() { return (Document)this.getResourcePropertySet().get(NotificationProfileRP).get(0); } /** * set Profile * * @param profile Document */ public void setProfile(Document profile) { this.getResourcePropertySet().get(ProfileRP).clear(); this.getResourcePropertySet().get(ProfileRP).add(profile); //this.getPersistenceDelegate().store(this); } /** * get Profile * * @return Document profile */ public Document getProfile() { return (Document)this.getResourcePropertySet().get(ProfileRP).get(0); } /** * Checks if the profile has to live or not * * @param GCUBEReosurce resource * @return true/false */ private boolean hasToLive(GCUBEResource resource) { if (resource.getType().compareTo(GCUBERunningInstance.TYPE)==0 || resource.getType().compareTo(GCUBEHostingNode.TYPE)==0 || resource.getType().compareTo(GCUBEService.TYPE)==0) return true; else return false; } /** * Gets the Resource QName * @return the Resource QName */ private QName generateQName() { return new QName(ProfileContext.getContext().getNamespace(), NotificationProfileRP+this.getID().getValue()); } /** * returns the Resource * * @return resource GCUBEReosurce */ public GCUBEResource getGCubeResource() { return this.gCubeResource; } /** * sets the resource * @param resource GCUBEReosurce */ public void setGCubeResource(GCUBEResource resource) { this.gCubeResource = resource; } @Override public void remove() throws ResourceException{ super.remove(); logger.info("Resource " + this.getID()+ " is going to be removed."); try { publisher = GHNContext.getImplementation(ISPublisher.class); } catch (Exception e) { e.printStackTrace(); } if (RegistryFactory.notificationMap.contains(this.getID())) { try { notifier.unregisterISNotification(this.getEPR(),listQname,ServiceContext.getContext()); } catch (ISPublisherException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } synchronized(RegistryFactory.notificationMap) { RegistryFactory.notificationMap.remove(this.getID()); } } try { publisher.removeWSResource(this,ServiceContext.getContext().getScope()); } catch (ISPublisherException e) { e.printStackTrace(); } } /** * updates the resource * * @param resource * @throws Exception */ @SuppressWarnings("unchecked") public void updateResource(GCUBEResource resource) throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); StringWriter writer = new StringWriter(); resource.store(writer); StringReader reader = new StringReader(writer.toString()); InputSource source = new InputSource(reader); Document dom = builder.parse(source); this.setProfile(dom); this.setGCubeResource(resource); // updates the notification profile too if (this.hasToLive(resource)) this.setNotificationProfile(dom); this.getPersistenceDelegate().store(this); } }