From 576a69e7878523fd4d365c238fc3aedca9b6447a Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Tue, 24 May 2022 11:01:25 +0200 Subject: [PATCH] Fixing lib --- pom.xml | 5 ++ .../resourceregistry/EServiceHandler.java | 54 ++++++++++----- .../resourceregistry/HostingNodeHandler.java | 67 ++++++++++--------- .../resourcemanager/EServiceManager.java | 40 +++++------ 4 files changed, 94 insertions(+), 72 deletions(-) diff --git a/pom.xml b/pom.xml index c36a6e6..7e7ee4c 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,11 @@ org.gcube.resource-management gcube-model + + org.gcube.common + authorization-utils + [2.0.0, 3.0.0-SNAPSHOT) + javax.servlet javax.servlet-api diff --git a/src/main/java/org/gcube/smartgears/handler/resourceregistry/EServiceHandler.java b/src/main/java/org/gcube/smartgears/handler/resourceregistry/EServiceHandler.java index 7787d30..6d99082 100644 --- a/src/main/java/org/gcube/smartgears/handler/resourceregistry/EServiceHandler.java +++ b/src/main/java/org/gcube/smartgears/handler/resourceregistry/EServiceHandler.java @@ -112,23 +112,10 @@ public class EServiceHandler extends ApplicationLifecycleHandler { boolean create = true; Set startTokens = applicationContext.configuration().startTokens(); - Set startContextsUUID = new HashSet<>(); - - ContextCache contextCache = null; - Secret firstSecret = null; for (String token : startTokens) { try { Secret secret = SecretUtility.getSecretByTokenString(token); - if(firstSecret==null) { - firstSecret = secret; - } secretManager.startSession(secret); - if(contextCache == null) { - contextCache = ContextCache.getInstance(); - } - String contextFullName = secret.getContext(); - UUID contextUUID = contextCache.getUUIDByFullName(contextFullName); - startContextsUUID.add(contextUUID); if (create) { eServiceManager = new EServiceManager(applicationContext); eServiceManager.createEService(); @@ -148,11 +135,6 @@ public class EServiceHandler extends ApplicationLifecycleHandler { } } - secretManager.startSession(firstSecret); - Set resourceContextsUUID = eServiceManager.getContextsUUID().keySet(); - removeResourceFromOldContexts(startContextsUUID, resourceContextsUUID); - secretManager.endSession(); - } catch (Throwable e) { rethrowUnchecked(e); } finally { @@ -173,6 +155,12 @@ public class EServiceHandler extends ApplicationLifecycleHandler { void onChanged(ApplicationLifecycle lc) { ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); SecretManager secretManager = SecretManagerProvider.instance.get(); + boolean secretManagerNull = false; + if(secretManager==null) { + secretManager = new SecretManager(); + secretManagerNull = true; + SecretManagerProvider.instance.set(secretManager); + } try { Thread.currentThread().setContextClassLoader(EServiceHandler.class.getClassLoader()); SortedSet secrets = secretManager.getCurrentSecretHolder().getSecrets(); @@ -186,6 +174,9 @@ public class EServiceHandler extends ApplicationLifecycleHandler { logger.error("Failed to update {} State", EService.NAME, e); } finally { secretManager.endSession(); + if(secretManagerNull) { + SecretManagerProvider.instance.reset(); + } Thread.currentThread().setContextClassLoader(contextCL); } } @@ -194,6 +185,12 @@ public class EServiceHandler extends ApplicationLifecycleHandler { void addTo(String token) { ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); SecretManager secretManager = SecretManagerProvider.instance.get(); + boolean secretManagerNull = false; + if(secretManager==null) { + secretManager = new SecretManager(); + secretManagerNull = true; + SecretManagerProvider.instance.set(secretManager); + } try { Thread.currentThread().setContextClassLoader(EServiceHandler.class.getClassLoader()); Secret secret = SecretUtility.getSecretByTokenString(token); @@ -204,6 +201,9 @@ public class EServiceHandler extends ApplicationLifecycleHandler { secretManager.getContext(), e); } finally { secretManager.endSession(); + if(secretManagerNull) { + SecretManagerProvider.instance.reset(); + } Thread.currentThread().setContextClassLoader(contextCL); } } @@ -212,6 +212,12 @@ public class EServiceHandler extends ApplicationLifecycleHandler { void removeFrom(String token) { ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); SecretManager secretManager = SecretManagerProvider.instance.get(); + boolean secretManagerNull = false; + if(secretManager==null) { + secretManager = new SecretManager(); + secretManagerNull = true; + SecretManagerProvider.instance.set(secretManager); + } try { Thread.currentThread().setContextClassLoader(EServiceHandler.class.getClassLoader()); Secret secret = SecretUtility.getSecretByTokenString(token); @@ -222,6 +228,9 @@ public class EServiceHandler extends ApplicationLifecycleHandler { EService.NAME, secretManager.getContext(), e); } finally { secretManager.endSession(); + if(secretManagerNull) { + SecretManagerProvider.instance.reset(); + } Thread.currentThread().setContextClassLoader(contextCL); } @@ -258,6 +267,12 @@ public class EServiceHandler extends ApplicationLifecycleHandler { final Runnable updateTask = new Runnable() { public void run() { SecretManager secretManager = SecretManagerProvider.instance.get(); + boolean secretManagerNull = false; + if(secretManager==null) { + secretManager = new SecretManager(); + secretManagerNull = true; + SecretManagerProvider.instance.set(secretManager); + } try { SortedSet secrets = secretManager.getCurrentSecretHolder().getSecrets(); if (secrets==null || secrets.size()==0) { @@ -270,6 +285,9 @@ public class EServiceHandler extends ApplicationLifecycleHandler { logger.error("Cannot complete periodic update of {}", EService.NAME, e); } finally { secretManager.endSession(); + if(secretManagerNull) { + SecretManagerProvider.instance.reset(); + } } } }; diff --git a/src/main/java/org/gcube/smartgears/handler/resourceregistry/HostingNodeHandler.java b/src/main/java/org/gcube/smartgears/handler/resourceregistry/HostingNodeHandler.java index 5886c85..dfb9d44 100644 --- a/src/main/java/org/gcube/smartgears/handler/resourceregistry/HostingNodeHandler.java +++ b/src/main/java/org/gcube/smartgears/handler/resourceregistry/HostingNodeHandler.java @@ -12,9 +12,7 @@ import static org.gcube.smartgears.lifecycle.container.ContainerLifecycle.stop; import static org.gcube.smartgears.lifecycle.container.ContainerState.active; import static org.gcube.smartgears.utils.Utils.rethrowUnchecked; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.SortedSet; import java.util.UUID; import java.util.concurrent.Executors; @@ -31,8 +29,6 @@ import org.gcube.common.events.Observes; import org.gcube.informationsystem.model.reference.entities.Facet; import org.gcube.informationsystem.model.reference.entities.Resource; import org.gcube.informationsystem.model.reference.relations.ConsistsOf; -import org.gcube.informationsystem.resourceregistry.api.contexts.ContextCache; -import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; import org.gcube.resourcemanagement.model.reference.entities.facets.StateFacet; import org.gcube.resourcemanagement.model.reference.entities.resources.HostingNode; import org.gcube.smartgears.context.Property; @@ -88,14 +84,6 @@ public class HostingNodeHandler extends ContainerHandler { logger.error("onStart failed", re); } } - - protected void removeResourceFromOldContexts(Set startContexts, Set resourceContexts) throws ResourceRegistryException { - Set contextsToRemove = new HashSet<>(resourceContexts); - contextsToRemove.removeAll(startContexts); - for(UUID contextToRemove : contextsToRemove) { - hostingNodeManager.removeFromContext(contextToRemove); - } - } private void init() { ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); @@ -112,23 +100,11 @@ public class HostingNodeHandler extends ContainerHandler { List startTokens = containerContext.configuration().startTokens(); - ContextCache contextCache = null; - Secret firstSecret = null; - - Set startContextsUUID = new HashSet<>(); for (String token : startTokens) { try { Secret secret = SecretUtility.getSecretByTokenString(token); - if(firstSecret==null) { - firstSecret = secret; - } secretManager.startSession(secret); - if(contextCache == null) { - contextCache = ContextCache.getInstance(); - } - String contextFullName = secret.getContext(); - UUID contextUUID = contextCache.getUUIDByFullName(contextFullName); - startContextsUUID.add(contextUUID); + if (create) { hostingNodeManager = new HostingNodeManager(containerContext); hostingNodeManager.createHostingNode(); @@ -147,11 +123,6 @@ public class HostingNodeHandler extends ContainerHandler { } } - secretManager.startSession(firstSecret); - Set resourceContextsUUID = hostingNodeManager.getContextsUUID().keySet(); - removeResourceFromOldContexts(startContextsUUID, resourceContextsUUID); - secretManager.endSession(); - } catch (Throwable e) { rethrowUnchecked(e); } finally { @@ -172,6 +143,12 @@ public class HostingNodeHandler extends ContainerHandler { void onChanged(ContainerLifecycle cl) { ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); SecretManager secretManager = SecretManagerProvider.instance.get(); + boolean secretManagerNull = false; + if(secretManager==null) { + secretManager = new SecretManager(); + secretManagerNull = true; + SecretManagerProvider.instance.set(secretManager); + } try { Thread.currentThread().setContextClassLoader(HostingNodeHandler.class.getClassLoader()); SortedSet secrets = secretManager.getCurrentSecretHolder().getSecrets(); @@ -194,6 +171,9 @@ public class HostingNodeHandler extends ContainerHandler { logger.error("Failed to update {} State", HostingNode.NAME, e); } finally { secretManager.endSession(); + if(secretManagerNull) { + SecretManagerProvider.instance.reset(); + } Thread.currentThread().setContextClassLoader(contextCL); } } @@ -202,6 +182,12 @@ public class HostingNodeHandler extends ContainerHandler { void addTo(String token) { ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); SecretManager secretManager = SecretManagerProvider.instance.get(); + boolean secretManagerNull = false; + if(secretManager==null) { + secretManager = new SecretManager(); + secretManagerNull = true; + SecretManagerProvider.instance.set(secretManager); + } try { Thread.currentThread().setContextClassLoader(HostingNodeHandler.class.getClassLoader()); Secret secret = SecretUtility.getSecretByTokenString(token); @@ -211,6 +197,9 @@ public class HostingNodeHandler extends ContainerHandler { logger.error("Failed to update Service State", e); } finally { secretManager.endSession(); + if(secretManagerNull) { + SecretManagerProvider.instance.reset(); + } Thread.currentThread().setContextClassLoader(contextCL); } } @@ -219,6 +208,12 @@ public class HostingNodeHandler extends ContainerHandler { void removeFrom(String token) { ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); SecretManager secretManager = SecretManagerProvider.instance.get(); + boolean secretManagerNull = false; + if(secretManager==null) { + secretManager = new SecretManager(); + secretManagerNull = true; + SecretManagerProvider.instance.set(secretManager); + } try { Thread.currentThread().setContextClassLoader(HostingNodeHandler.class.getClassLoader()); Secret secret = SecretUtility.getSecretByTokenString(token); @@ -228,6 +223,9 @@ public class HostingNodeHandler extends ContainerHandler { logger.error("Failed to update Service State", e); } finally { secretManager.endSession(); + if(secretManagerNull) { + SecretManagerProvider.instance.reset(); + } Thread.currentThread().setContextClassLoader(contextCL); } } @@ -262,6 +260,12 @@ public class HostingNodeHandler extends ContainerHandler { final Runnable updateTask = new Runnable() { public void run() { SecretManager secretManager = SecretManagerProvider.instance.get(); + boolean secretManagerNull = false; + if(secretManager==null) { + secretManager = new SecretManager(); + secretManagerNull = true; + SecretManagerProvider.instance.set(secretManager); + } try { SortedSet secrets = secretManager.getCurrentSecretHolder().getSecrets(); if (secrets==null || secrets.size()==0) { @@ -274,6 +278,9 @@ public class HostingNodeHandler extends ContainerHandler { logger.error("Cannot complete periodic update of {}", HostingNode.NAME, e); }finally { secretManager.endSession(); + if(secretManagerNull) { + SecretManagerProvider.instance.reset(); + } } } }; diff --git a/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/EServiceManager.java b/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/EServiceManager.java index 9e1edbd..23aa972 100644 --- a/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/EServiceManager.java +++ b/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/EServiceManager.java @@ -57,7 +57,7 @@ import org.slf4j.LoggerFactory; */ public class EServiceManager { - private static Logger logger = LoggerFactory.getLogger(HostingNodeManager.class); + private static Logger logger = LoggerFactory.getLogger(EServiceManager.class); private static List servletExcludes = Arrays.asList("default", "jsp"); @@ -78,6 +78,17 @@ public class EServiceManager { return eService; } + public void addEServiceToCurrentContext() throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException { + UUID uuid = UUID.fromString(applicationContext.id()); + SecretManager secretManager = SecretManagerProvider.instance.get(); + try { + resourceRegistryPublisher.addResourceToCurrentContext(EService.NAME, uuid, false); + logger.info("{} with UUID {} successfully added to current context ({})", EService.NAME, uuid, secretManager.getContext()); + } catch (Exception e) { + logger.error("Unable to add {} with UUID {} to current context ({})", EService.NAME, uuid, secretManager.getContext(), e); + } + } + public void addToContext() throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException { UUID uuid = UUID.fromString(applicationContext.container().id()); SecretManager secretManager = SecretManagerProvider.instance.get(); @@ -203,17 +214,7 @@ public class EServiceManager { ResourceRegistryClientFactory.includeContextsInInstanceHeader(true); eService = resourceRegistryClient.getInstance(EService.class, eServiceUUID); stateFacet = eService.getFacets(StateFacet.class).get(0); - if (stateFacet == null) { - stateFacet = new StateFacetImpl(); - String state = getState(); - stateFacet.setValue(state); - Date date = Calendar.getInstance().getTime(); - stateFacet.setAdditionalProperty("date", date); - eService.addFacet(stateFacet); - resourceRegistryPublisher.update(eService); - } else { - updateServiceStateFacet(); - } + updateServiceStateFacet(); } catch (NotFoundException e) { eService = instantiateEService(); createActivatesRelation(eService); @@ -223,7 +224,8 @@ public class EServiceManager { try { eService = resourceRegistryClient.getInstance(EService.class, eServiceUUID); } catch (AvailableInAnotherContextException ex) { - resourceRegistryPublisher.addResourceToCurrentContext(eService, false); + addEServiceToCurrentContext(); + eService = resourceRegistryClient.getInstance(EService.class, eServiceUUID); // addToContext() is executed on HostingNode. // If the EService is still not available we need to create activates // relation because does not exists otherwise the EService should @@ -231,17 +233,7 @@ public class EServiceManager { createActivatesRelation(eService); } stateFacet = eService.getFacets(StateFacet.class).get(0); - if (stateFacet == null) { - stateFacet = new StateFacetImpl(); - String state = getState(); - stateFacet.setValue(state); - Date date = Calendar.getInstance().getTime(); - stateFacet.setAdditionalProperty("date", date); - eService.addFacet(stateFacet); - resourceRegistryPublisher.update(eService); - } else { - updateServiceStateFacet(); - } + updateServiceStateFacet(); } catch (ResourceRegistryException e) { throw e; }