From f9f3217cb82a56060f04f35f7f2d68d9260631ec Mon Sep 17 00:00:00 2001
From: Luca Frosini
Date: Wed, 29 Jun 2022 09:11:29 +0200
Subject: [PATCH] Implementing connector
---
pom.xml | 44 ++-
.../resourceregistry/ContextUtility.java | 66 +----
.../resourceregistry/EServiceHandler.java | 275 ------------------
.../resourceregistry/HostingNodeHandler.java | 263 -----------------
.../resourcemanager/EServiceManager.java | 83 +++---
.../resourcemanager/HostingNodeManager.java | 52 ++--
.../resourceregistry/FacetBasedPublisher.java | 137 +++++++++
7 files changed, 246 insertions(+), 674 deletions(-)
delete mode 100644 src/main/java/org/gcube/smartgears/handler/resourceregistry/EServiceHandler.java
delete mode 100644 src/main/java/org/gcube/smartgears/handler/resourceregistry/HostingNodeHandler.java
create mode 100644 src/main/java/org/gcube/smartgears/publisher/resourceregistry/FacetBasedPublisher.java
diff --git a/pom.xml b/pom.xml
index 61450cb..7ea6486 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,14 +38,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
org.gcube.information-system
- resource-registry-publisher
+ information-system-model
+ [5.0.0-SNAPSHOT,6.0.0-SNAPSHOT)
+
+
+ org.gcube.resource-management
+ gcube-model
+ [4.0.0-SNAPSHOT,5.0.0-SNAPSHOT)
org.gcube.information-system
resource-registry-client
+ [4.1.0,5.0.0-SNAPSHOT)
+
+ org.gcube.information-system
+ resource-registry-publisher
+ [4.1.0,5.0.0-SNAPSHOT)
+
+
+
org.gcube.core
common-smartgears
@@ -54,14 +88,6 @@
org.gcube.core
common-events
-
- org.gcube.information-system
- information-system-model
-
-
- org.gcube.resource-management
- gcube-model
-
javax.servlet
javax.servlet-api
diff --git a/src/main/java/org/gcube/smartgears/handler/resourceregistry/ContextUtility.java b/src/main/java/org/gcube/smartgears/handler/resourceregistry/ContextUtility.java
index 500ea0d..6ca4a7b 100644
--- a/src/main/java/org/gcube/smartgears/handler/resourceregistry/ContextUtility.java
+++ b/src/main/java/org/gcube/smartgears/handler/resourceregistry/ContextUtility.java
@@ -1,16 +1,9 @@
package org.gcube.smartgears.handler.resourceregistry;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
import java.util.UUID;
-import org.gcube.common.authorization.client.proxy.AuthorizationProxy;
-import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
-import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.informationsystem.resourceregistry.api.contexts.ContextCache;
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
-import org.gcube.smartgears.provider.ProviderFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -21,67 +14,10 @@ public class ContextUtility {
private static Logger logger = LoggerFactory.getLogger(ContextUtility.class);
- private static AuthorizationProxy authorizationProxy;
-
- static {
- authorizationProxy = ProviderFactory.provider().authorizationProxy();
- }
-
- public static void resetContex() {
- SecurityTokenProvider.instance.reset();
- ScopeProvider.instance.reset();
- }
-
- public static void setContextFromToken(String token) {
- if (token == null || token.compareTo("") == 0) {
- resetContex();
- } else {
- SecurityTokenProvider.instance.set(token);
- String scope = getContextName(token);
- ScopeProvider.instance.set(scope);
- }
-
- }
-
- public static String getCurrentContextName() {
- String token = SecurityTokenProvider.instance.get();
- return getContextName(token);
- }
-
- public static UUID getContextUUID(String token) throws ResourceRegistryException {
+ public static UUID getContextUUID(String contextFullName) throws ResourceRegistryException {
ContextCache contextCache = ContextCache.getInstance();
- String contextFullName = getContextName(token);
UUID contextUUID = contextCache.getUUIDByFullName(contextFullName);
return contextUUID;
}
-
- public static String getContextName(String token) {
- try {
- return authorizationProxy.get(token).getContext();
- } catch (Exception e) {
- logger.error("Error retrieving context form token {}, it should never happen", token, e);
- return null;
- }
- }
-
- public static SortedSet getContextFullNamesFromTokens(Set tokens){
- SortedSet contextFullNames = new TreeSet<>();
- for(String token : tokens) {
- String contextFullName = getContextName(token);
- contextFullNames.add(contextFullName);
- }
- return contextFullNames;
- }
-
- public static SortedSet getContextUUIDFromTokens(Set tokens) throws ResourceRegistryException {
- SortedSet contextsUUID = new TreeSet<>();
- ContextCache contextCache = ContextCache.getInstance();
- for(String token : tokens) {
- String contextFullName = getContextName(token);
- UUID contextUUID = contextCache.getUUIDByFullName(contextFullName);
- contextsUUID.add(contextUUID);
- }
- return contextsUUID;
- }
}
diff --git a/src/main/java/org/gcube/smartgears/handler/resourceregistry/EServiceHandler.java b/src/main/java/org/gcube/smartgears/handler/resourceregistry/EServiceHandler.java
deleted file mode 100644
index a84e7ea..0000000
--- a/src/main/java/org/gcube/smartgears/handler/resourceregistry/EServiceHandler.java
+++ /dev/null
@@ -1,275 +0,0 @@
-package org.gcube.smartgears.handler.resourceregistry;
-
-import static org.gcube.common.events.Observes.Kind.resilient;
-import static org.gcube.smartgears.handlers.ProfileEvents.addToContext;
-import static org.gcube.smartgears.handlers.ProfileEvents.removeFromContext;
-import static org.gcube.smartgears.lifecycle.application.ApplicationLifecycle.activation;
-import static org.gcube.smartgears.lifecycle.application.ApplicationLifecycle.failure;
-import static org.gcube.smartgears.lifecycle.application.ApplicationLifecycle.stop;
-import static org.gcube.smartgears.utils.Utils.rethrowUnchecked;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
-
-import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
-import org.gcube.common.events.Observes;
-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.resourcemanagement.model.reference.entities.facets.StateFacet;
-import org.gcube.resourcemanagement.model.reference.entities.resources.EService;
-import org.gcube.smartgears.context.application.ApplicationContext;
-import org.gcube.smartgears.handler.resourceregistry.resourcemanager.EServiceManager;
-import org.gcube.smartgears.handlers.application.ApplicationLifecycleEvent.Start;
-import org.gcube.smartgears.lifecycle.application.ApplicationLifecycle;
-import org.gcube.smartgears.lifecycle.application.ApplicationState;
-import org.gcube.smartgears.lifecycle.container.ContainerLifecycle;
-import org.gcube.smartgears.utils.Utils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Manages the {@link EService} {@link Resource} of the application.
- *
- * The manager:
- *
- * - creates the {@link EService} {@link Resource} and the facets it
- * {@link ConsistsOf} when the application starts for the first time;
- * - update the {@link StateFacet} when the application becomes active,
- * and at any lifecycle change thereafter;
- *
- *
- *
- * @author Luca Frosini (ISTI-CNR)
- */
-public class EServiceHandler {
-
- private static final Logger logger = LoggerFactory.getLogger(EServiceHandler.class);
-
- private ApplicationContext applicationContext;
- private ScheduledFuture> periodicUpdates;
-
- protected EServiceManager eServiceManager;
-
- public EServiceHandler() {
- super();
- }
-
- public void onStart(Start event) {
- try {
- logger.info("{} onStart started", this.getClass().getSimpleName());
- this.applicationContext = event.context();
- init();
- registerObservers();
- schedulePeriodicUpdates();
- logger.info("{} onStart terminated", this.getClass().getSimpleName());
- } catch (Throwable re) {
- logger.error("onStart failed", re);
- }
- }
-
- protected void removeResourceFromOldContexts(Set startContexts, Set resourceContexts) {
- Set contextsToRemove = new HashSet<>(resourceContexts);
- contextsToRemove.removeAll(startContexts);
- for(UUID contextToRemove : contextsToRemove) {
- try {
- eServiceManager.removeFromContext(contextToRemove);
- }catch (Exception e) {
- try {
- String contextFullName = ContextCache.getInstance().getContextFullNameByUUID(contextToRemove);
- logger.warn("Unable to remove {} from Context {} UUID {}", EService.NAME, contextFullName, contextsToRemove, e);
- }catch (Exception ex) {
- logger.warn("Unable to remove {} from Context with UUID {}.", EService.NAME, contextsToRemove, e);
- }
- }
- }
- }
-
- private void init() {
- ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
- String previousToken = SecurityTokenProvider.instance.get();
- try {
- Thread.currentThread().setContextClassLoader(EServiceHandler.class.getClassLoader());
- boolean create = true;
-
- Set startTokens = applicationContext.configuration().startTokens();
-
- String firstToken = startTokens.iterator().next();
- ContextUtility.setContextFromToken(firstToken);
- eServiceManager = new EServiceManager(applicationContext);
-
-
- Set startContextsUUID = new HashSet<>();
- for (String token : startTokens) {
- UUID contextUUID = ContextUtility.getContextUUID(token);
- startContextsUUID.add(contextUUID);
- if (create) {
- eServiceManager.createEService();
- create = false;
- } else {
- eServiceManager.addToContext(contextUUID);
- }
- }
-
- Set resourceContextsUUID = eServiceManager.getContextsUUID().keySet();
- removeResourceFromOldContexts(startContextsUUID, resourceContextsUUID);
-
- } catch (Throwable e) {
- rethrowUnchecked(e);
- } finally {
- ContextUtility.setContextFromToken(previousToken);
- Thread.currentThread().setContextClassLoader(contextCL);
- }
- logger.info("{} init() terminated", this.getClass().getSimpleName());
- }
-
- private void registerObservers() {
-
- applicationContext.events().subscribe(new Object() {
-
- @Observes({ activation, stop, failure })
- void onChanged(ApplicationLifecycle lc) {
- ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
- String previousToken = SecurityTokenProvider.instance.get();
- try {
- Thread.currentThread().setContextClassLoader(EServiceHandler.class.getClassLoader());
- if(previousToken==null) {
- String token = applicationContext.configuration().startTokens().iterator().next();
- ContextUtility.setContextFromToken(token);
- }
- eServiceManager.updateFacets();
- } catch (Exception e) {
- logger.error("Failed to update {} State", EService.NAME, e);
- } finally {
- ContextUtility.setContextFromToken(previousToken);
- Thread.currentThread().setContextClassLoader(contextCL);
- }
- }
-
- @Observes(value = addToContext)
- void addTo(String token) {
- ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
- String previousToken = SecurityTokenProvider.instance.get();
- try {
- Thread.currentThread().setContextClassLoader(EServiceHandler.class.getClassLoader());
- ContextUtility.setContextFromToken(token);
- UUID contextUUID = ContextUtility.getContextUUID(token);
- eServiceManager.addToContext(contextUUID);
- } catch (Exception e) {
- logger.error("Failed to add {} to current context ({})", EService.NAME,
- ContextUtility.getCurrentContextName(), e);
- } finally {
- ContextUtility.setContextFromToken(previousToken);
- Thread.currentThread().setContextClassLoader(contextCL);
- }
- }
-
- @Observes(value = removeFromContext)
- void removeFrom(String token) {
- ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
- String previousToken = SecurityTokenProvider.instance.get();
- try {
- Thread.currentThread().setContextClassLoader(EServiceHandler.class.getClassLoader());
- eServiceManager.removeFromCurrentContext();
- } catch (Exception e) {
- logger.error("Failed to remove {} from current context ({})",
- EService.NAME, ContextUtility.getCurrentContextName(), e);
- } finally {
- ContextUtility.setContextFromToken(previousToken);
- Thread.currentThread().setContextClassLoader(contextCL);
- }
-
- }
-
- });
- }
-
- private void schedulePeriodicUpdates() {
-
- // register to cancel updates
- applicationContext.events().subscribe(
-
- new Object() {
-
- // we register it in response to lifecycle events so that we can
- // stop and resume along with application
- @Observes(value = { activation }, kind = resilient)
- synchronized void restartPeriodicUpdates(final ApplicationLifecycle lc) {
-
- // already running
- if (periodicUpdates != null) {
- return;
- }
-
- String applicationName = applicationContext.name();
-
- if (lc.state() == ApplicationState.active) {
- logger.info("Scheduling periodic updates of {} for application {}",
- EService.NAME, applicationName);
- } else {
- logger.info("Resuming periodic updates of {} for application {}",
- EService.NAME, applicationName);
- }
-
- final Runnable updateTask = new Runnable() {
- public void run() {
- String previousToken = SecurityTokenProvider.instance.get();
- if (previousToken == null) {
- String token = applicationContext.configuration().startTokens().iterator().next();
- ContextUtility.setContextFromToken(token);
- }
- try {
- eServiceManager.updateFacets();
- } catch (Exception e) {
- logger.error("Cannot complete periodic update of {} for application {}", EService.NAME, applicationName, e);
- } finally {
- ContextUtility.setContextFromToken(previousToken);
- }
- }
- };
-
- periodicUpdates = Utils.scheduledServicePool.scheduleAtFixedRate(updateTask,
- Constants.application_republish_frequency_in_minutes,
- Constants.application_republish_frequency_in_minutes, TimeUnit.MINUTES);
-
- /*
- * The following line is used for testing purposes during development.
- * If you uncomment this, you need to comment the line above
- */
-// periodicUpdates = Utils.scheduledServicePool.scheduleAtFixedRate(updateTask, 120, 120, TimeUnit.SECONDS);
-
- }
-
- @Observes(value = { stop, failure }, kind = resilient)
- synchronized void cancelPeriodicUpdates(ContainerLifecycle ignore) {
-
- if (periodicUpdates != null) {
-
- String applicationName = applicationContext.name();
-
- logger.trace("Stopping periodic updates of {} for application {} ",
- EService.NAME, applicationName);
-
- try {
- periodicUpdates.cancel(true);
- periodicUpdates = null;
- } catch (Exception e) {
- logger.warn("Could not stop periodic updates of {} for application {}",
- EService.NAME, applicationName, e);
- }
- }
- }
-
- });
-
- }
-
- @Override
- public String toString() {
- return Constants.RESOURCE_MANAGEMENT;
- }
-
-}
diff --git a/src/main/java/org/gcube/smartgears/handler/resourceregistry/HostingNodeHandler.java b/src/main/java/org/gcube/smartgears/handler/resourceregistry/HostingNodeHandler.java
deleted file mode 100644
index 1dd0893..0000000
--- a/src/main/java/org/gcube/smartgears/handler/resourceregistry/HostingNodeHandler.java
+++ /dev/null
@@ -1,263 +0,0 @@
-package org.gcube.smartgears.handler.resourceregistry;
-
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.gcube.common.events.Observes.Kind.resilient;
-import static org.gcube.smartgears.handlers.ProfileEvents.addToContext;
-import static org.gcube.smartgears.handlers.ProfileEvents.removeFromContext;
-import static org.gcube.smartgears.lifecycle.container.ContainerLifecycle.activation;
-import static org.gcube.smartgears.lifecycle.container.ContainerLifecycle.failure;
-import static org.gcube.smartgears.lifecycle.container.ContainerLifecycle.part_activation;
-import static org.gcube.smartgears.lifecycle.container.ContainerLifecycle.shutdown;
-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.UUID;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-
-import javax.xml.bind.annotation.XmlRootElement;
-
-import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
-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;
-import org.gcube.smartgears.context.container.ContainerContext;
-import org.gcube.smartgears.handler.resourceregistry.resourcemanager.HostingNodeManager;
-import org.gcube.smartgears.handlers.container.ContainerHandler;
-import org.gcube.smartgears.handlers.container.ContainerLifecycleEvent.Start;
-import org.gcube.smartgears.lifecycle.container.ContainerLifecycle;
-import org.gcube.smartgears.lifecycle.container.ContainerState;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Manages the {@link HostingNode} {@link Resource} of the application.
- *
- * The manager:
- *
- * - creates the {@link HostingNode} {@link Resource} and the facets it
- * {@link ConsistsOf} when the container starts for the first time;
- * - update the {@link StateFacet} when the application becomes
- * active, and at any lifecycle change thereafter;
- * - schedule a periodic update of {@link Facet}s containing variables
- * information.
- *
- *
- *
- * @author Luca Frosini (ISTI-CNR)
- */
-public class HostingNodeHandler {
-
- private static Logger logger = LoggerFactory.getLogger(HostingNodeHandler.class);
-
- private ContainerContext containerContext;
- private ScheduledFuture> periodicUpdates;
-
- protected HostingNodeManager hostingNodeManager;
-
- public HostingNodeHandler() {
- super();
-
- }
-
- public void onStart(Start event) {
- try {
- logger.info("{} onStart started", this.getClass().getSimpleName());
- this.containerContext = event.context();
- init();
- registerObservers();
- schedulePeriodicUpdates();
- logger.info("{} onStart terminated", this.getClass().getSimpleName());
- } catch (Throwable re) {
- 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();
- String previousToken = SecurityTokenProvider.instance.get();
- try {
- Thread.currentThread().setContextClassLoader(HostingNodeHandler.class.getClassLoader());
- boolean create = true;
-
- List startTokens = containerContext.configuration().startTokens();
-
- String firstToken = startTokens.iterator().next();
- ContextUtility.setContextFromToken(firstToken);
- hostingNodeManager = new HostingNodeManager(containerContext);
-
- Set startContextsUUID = new HashSet<>();
- for (String token : startTokens) {
- UUID contextUUID = ContextUtility.getContextUUID(token);
- startContextsUUID.add(contextUUID);
- if (create) {
- hostingNodeManager.createHostingNode();
- containerContext.properties().add(new Property(Constants.HOSTING_NODE_MANAGER_PROPERTY, hostingNodeManager));
- create = false;
- } else {
- hostingNodeManager.addToContext(contextUUID);
- }
- }
-
- Set resourceContextsUUID = hostingNodeManager.getContextsUUID().keySet();
- removeResourceFromOldContexts(startContextsUUID, resourceContextsUUID);
-
- } catch (Throwable e) {
- rethrowUnchecked(e);
- } finally {
- ContextUtility.setContextFromToken(previousToken);
- Thread.currentThread().setContextClassLoader(contextCL);
- }
- logger.info("{} init() terminated", this.getClass().getSimpleName());
- }
-
- private void registerObservers() {
-
- containerContext.events().subscribe(new Object() {
-
- @Observes({ activation, part_activation, shutdown, stop, failure })
- void onChanged(ContainerLifecycle cl) {
- ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
- String previousToken = SecurityTokenProvider.instance.get();
- try {
- Thread.currentThread().setContextClassLoader(HostingNodeHandler.class.getClassLoader());
- if (previousToken == null) {
- String token = containerContext.configuration().startTokens().iterator().next();
- ContextUtility.setContextFromToken(token);
- }
- hostingNodeManager.updateFacets();
- } catch (Exception e) {
- logger.error("Failed to update {} State", HostingNode.NAME, e);
- } finally {
- ContextUtility.setContextFromToken(previousToken);
- Thread.currentThread().setContextClassLoader(contextCL);
- }
- }
-
- @Observes(value = addToContext)
- void addTo(String token) {
- ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
- String previousToken = SecurityTokenProvider.instance.get();
- try {
- Thread.currentThread().setContextClassLoader(HostingNodeHandler.class.getClassLoader());
- ContextUtility.setContextFromToken(token);
- UUID contextUUID = ContextUtility.getContextUUID(token);
- hostingNodeManager.addToContext(contextUUID);
- } catch (Exception e) {
- logger.error("Failed to update Service State", e);
- } finally {
- ContextUtility.setContextFromToken(previousToken);
- Thread.currentThread().setContextClassLoader(contextCL);
- }
- }
-
- @Observes(value = removeFromContext)
- void removeFrom(String token) {
- ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
- String previousToken = SecurityTokenProvider.instance.get();
- try {
- Thread.currentThread().setContextClassLoader(HostingNodeHandler.class.getClassLoader());
- ContextUtility.setContextFromToken(token);
- UUID contextUUID = ContextUtility.getContextUUID(token);
- hostingNodeManager.removeFromContext(contextUUID);
- } catch (Exception e) {
- logger.error("Failed to update Service State", e);
- } finally {
- ContextUtility.setContextFromToken(previousToken);
- Thread.currentThread().setContextClassLoader(contextCL);
- }
- }
-
- });
- }
-
- private void schedulePeriodicUpdates() {
- // register to cancel updates
- containerContext.events().subscribe(
-
- new Object() {
-
- final ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
-
- // we register it in response to lifecycle events so that we can
- // stop and resume along with application
- @Observes(value = { activation, part_activation }, kind = resilient)
- synchronized void restartPeriodicUpdates(ContainerLifecycle cl) {
-
- // already running
- if (periodicUpdates != null) {
- return;
- }
-
- if (cl.state() == active) {
- logger.info("Scheduling periodic updates of {}", HostingNode.NAME);
- } else {
- logger.info("Resuming periodic updates of {}", HostingNode.NAME);
- }
-
- final Runnable updateTask = new Runnable() {
- public void run() {
- String previousToken = SecurityTokenProvider.instance.get();
- if (previousToken == null) {
- String token = containerContext.configuration().startTokens().iterator().next();
- ContextUtility.setContextFromToken(token);
- }
- try {
- hostingNodeManager.updateFacets();
- } catch (Exception e) {
- logger.error("Cannot complete periodic update of {}", HostingNode.NAME, e);
- }finally {
- ContextUtility.setContextFromToken(previousToken);
- }
- }
- };
-
- periodicUpdates = service.scheduleAtFixedRate(updateTask, 3,
- containerContext.configuration().publicationFrequency(), SECONDS);
-
- }
-
- @Observes(value = { stop, failure, shutdown }, kind = resilient)
- synchronized void cancelPeriodicUpdates(ContainerLifecycle cl) {
-
- if (periodicUpdates != null) {
- logger.trace("Stopping periodic updates of {}", HostingNode.NAME);
- try {
- periodicUpdates.cancel(true);
- service.shutdownNow();
- periodicUpdates = null;
- } catch (Exception e) {
- logger.warn("Could not stop periodic updates of {}", HostingNode.NAME, e);
- }
- }
- }
-
- });
-
- }
-
- @Override
- public String toString() {
- return Constants.RESOURCE_MANAGEMENT;
- }
-
-}
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 0e45143..06f9ce5 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
@@ -12,7 +12,8 @@ import java.util.UUID;
import javax.servlet.ServletRegistration;
-import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
+import org.gcube.common.security.providers.SecretManagerProvider;
+import org.gcube.common.security.secrets.Secret;
import org.gcube.informationsystem.model.impl.properties.HeaderImpl;
import org.gcube.informationsystem.model.impl.properties.PropagationConstraintImpl;
import org.gcube.informationsystem.model.reference.entities.Facet;
@@ -58,6 +59,7 @@ import org.gcube.smartgears.configuration.container.ContainerConfiguration;
import org.gcube.smartgears.context.application.ApplicationContext;
import org.gcube.smartgears.handler.resourceregistry.Constants;
import org.gcube.smartgears.handler.resourceregistry.ContextUtility;
+import org.gcube.smartgears.security.AuthorizationProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -82,98 +84,101 @@ public class EServiceManager {
}
public void addEServiceToCurrentContext() throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException {
- String currentToken = SecurityTokenProvider.instance.get();
- UUID contextUUID = ContextUtility.getContextUUID(currentToken);
+ Secret secret = SecretManagerProvider.instance.get();
+ String context = secret.getContext();
+ UUID contextUUID = ContextUtility.getContextUUID(context);
/* Trying to get a context which is not the current to properly invoke the addToContext without forcing the operation using addResourceToCurrentContext */
+ AuthorizationProvider authorizationProvider = applicationContext.container().configuration().authorizationProvider();
+ Set contexts = authorizationProvider.getContexts();
boolean anotherContextSet = false;
- Set startTokens = applicationContext.configuration().startTokens();
- for (String token : startTokens) {
- UUID anotherContextUUID = ContextUtility.getContextUUID(token);
- if(anotherContextUUID.compareTo(contextUUID)!=0) {
- ContextUtility.setContextFromToken(token);
+ for (String c : contexts) {
+ if(c.compareTo(context)!=0) {
+ Secret s = authorizationProvider.getSecretForContext(c);
+ SecretManagerProvider.instance.set(s);
anotherContextSet = true;
break;
}
}
- UUID uuid = UUID.fromString(applicationContext.id());
+ UUID uuid = UUID.fromString(applicationContext.id());
try {
if(anotherContextSet) {
resourceRegistryPublisher.addResourceToContext(EService.NAME, uuid, contextUUID, false);
}else {
- resourceRegistryPublisher.addResourceToCurrentContext(HostingNode.NAME, uuid, false);
+ resourceRegistryPublisher.addResourceToCurrentContext(EService.NAME, uuid, false);
}
- logger.info("{} with UUID {} successfully added to context ({})", EService.NAME, uuid, ContextUtility.getCurrentContextName());
+ logger.info("{} with UUID {} successfully added to context ({})", EService.NAME, uuid, context);
} catch (Exception e) {
- logger.error("Unable to add {} with UUID {} to context ({})", EService.NAME, uuid, ContextUtility.getCurrentContextName(), e);
- }finally {
- ContextUtility.setContextFromToken(currentToken);
+ logger.error("Unable to add {} with UUID {} to context ({})", EService.NAME, uuid, context, e);
}
}
+
public void addHostingNodeToCurrentContext() throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException {
- String currentToken = SecurityTokenProvider.instance.get();
- UUID contextUUID = ContextUtility.getContextUUID(currentToken);
+ Secret secret = SecretManagerProvider.instance.get();
+ String context = secret.getContext();
+ UUID contextUUID = ContextUtility.getContextUUID(context);
/* Trying to get a context which is not the current to properly invoke the addToContext without forcing the operation using addResourceToCurrentContext */
+ AuthorizationProvider authorizationProvider = applicationContext.container().configuration().authorizationProvider();
+ Set contexts = authorizationProvider.getContexts();
boolean anotherContextSet = false;
- Set startTokens = applicationContext.configuration().startTokens();
- for (String token : startTokens) {
- UUID anotherContextUUID = ContextUtility.getContextUUID(token);
- if(anotherContextUUID.compareTo(contextUUID)!=0) {
- ContextUtility.setContextFromToken(token);
+ for (String c : contexts) {
+ if(c.compareTo(context)!=0) {
+ Secret s = authorizationProvider.getSecretForContext(c);
+ SecretManagerProvider.instance.set(s);
anotherContextSet = true;
break;
}
}
- UUID uuid = UUID.fromString(applicationContext.container().id());
+ UUID uuid = UUID.fromString(applicationContext.container().id());
try {
if(anotherContextSet) {
- resourceRegistryPublisher.addResourceToContext(HostingNode.NAME, uuid, contextUUID, false);
+ resourceRegistryPublisher.addToContext(HostingNode.NAME, uuid, contextUUID, false);
}else {
resourceRegistryPublisher.addResourceToCurrentContext(HostingNode.NAME, uuid, false);
}
- logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName());
+ logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, context);
} catch (Exception e) {
- logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName(), e);
- }finally {
- ContextUtility.setContextFromToken(currentToken);
+ logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, context, e);
}
}
public void addToContext(UUID contextUUID) throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException {
+ String context = ContextCache.getInstance().getContextFullNameByUUID(contextUUID);
UUID uuid = UUID.fromString(applicationContext.container().id());
try {
resourceRegistryPublisher.addToContext(HostingNode.NAME, uuid, contextUUID, false);
- logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName());
+ logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, context);
} catch (Exception e) {
- logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName(), e);
+ logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, context, e);
}
}
public void removeFromCurrentContext()
throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException {
+ Secret secret = SecretManagerProvider.instance.get();
+ String context = secret.getContext();
UUID uuid = UUID.fromString(applicationContext.container().id());
try {
resourceRegistryPublisher.removeResourceFromCurrentContext(HostingNode.NAME, uuid, false);
- logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid,
- ContextUtility.getCurrentContextName());
+ logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, context);
} catch (Exception e) {
- logger.error("Unable to remove {} with UUID {} from context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName(), e);
+ logger.error("Unable to remove {} with UUID {} from context ({})", HostingNode.NAME, uuid, context, e);
}
}
public void removeFromContext(UUID contextUUID)
throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException {
- String contextFullName = ContextCache.getInstance().getContextFullNameByUUID(contextUUID);
+ String context = ContextCache.getInstance().getContextFullNameByUUID(contextUUID);
UUID uuid = UUID.fromString(applicationContext.container().id());
try {
resourceRegistryPublisher.removeResourceFromContext(HostingNode.NAME, uuid, contextUUID, false);
- logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, contextFullName);
+ logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, context);
} catch (Exception e) {
- logger.error("Unable to remove {} from context ({})", HostingNode.NAME, uuid, contextFullName, e);
+ logger.error("Unable to remove {} from context ({})", HostingNode.NAME, uuid, context, e);
}
}
@@ -181,11 +186,11 @@ public class EServiceManager {
ApplicationConfiguration configuration = applicationContext.configuration();
ContainerConfiguration container = applicationContext.container().configuration();
String baseAddress;
- if (configuration.proxied()) {
- String protocol = configuration.proxyAddress().protocol();
- String port = configuration.proxyAddress().port() != null ? ":" + configuration.proxyAddress().port() : "";
+ if (configuration.proxable()) {
+ String protocol = configuration.proxyAddress().getProtocol();
+ String port = configuration.proxyAddress().getPort() != null ? ":" + configuration.proxyAddress().getPort() : "";
- baseAddress = String.format("%s://%s%s%s", protocol, configuration.proxyAddress().hostname(), port,
+ baseAddress = String.format("%s://%s%s%s", protocol, configuration.proxyAddress().getHostname(), port,
applicationContext.application().getContextPath());
} else {
String protocol = container.protocol();
diff --git a/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/HostingNodeManager.java b/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/HostingNodeManager.java
index 59a60ae..15c6f10 100644
--- a/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/HostingNodeManager.java
+++ b/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/HostingNodeManager.java
@@ -33,7 +33,8 @@ import javax.management.ObjectName;
import javax.management.ReflectionException;
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
-import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
+import org.gcube.common.security.providers.SecretManagerProvider;
+import org.gcube.common.security.secrets.Secret;
import org.gcube.informationsystem.model.impl.properties.HeaderImpl;
import org.gcube.informationsystem.model.reference.entities.Facet;
import org.gcube.informationsystem.model.reference.entities.Resource;
@@ -82,6 +83,7 @@ import org.gcube.smartgears.context.container.ContainerContext;
import org.gcube.smartgears.handler.resourceregistry.ContextUtility;
import org.gcube.smartgears.lifecycle.container.ContainerState;
import org.gcube.smartgears.provider.ProviderFactory;
+import org.gcube.smartgears.security.AuthorizationProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -113,16 +115,18 @@ public class HostingNodeManager {
}
public void addToCurrentContext() throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException {
- String currentToken = SecurityTokenProvider.instance.get();
- UUID contextUUID = ContextUtility.getContextUUID(currentToken);
+ Secret secret = SecretManagerProvider.instance.get();
+ String context = secret.getContext();
+ UUID contextUUID = ContextUtility.getContextUUID(context);
/* Trying to get a context which is not the current to properly invoke the addToContext without forcing the operation using addResourceToCurrentContext */
+ AuthorizationProvider authorizationProvider = containerContext.configuration().authorizationProvider();
+ Set contexts = authorizationProvider.getContexts();
boolean anotherContextSet = false;
- List startTokens = containerContext.configuration().startTokens();
- for (String token : startTokens) {
- UUID anotherContextUUID = ContextUtility.getContextUUID(token);
- if(anotherContextUUID.compareTo(contextUUID)!=0) {
- ContextUtility.setContextFromToken(token);
+ for (String c : contexts) {
+ if(c.compareTo(context)!=0) {
+ Secret s = authorizationProvider.getSecretForContext(c);
+ SecretManagerProvider.instance.set(s);
anotherContextSet = true;
break;
}
@@ -135,43 +139,45 @@ public class HostingNodeManager {
}else {
resourceRegistryPublisher.addResourceToCurrentContext(HostingNode.NAME, uuid, false);
}
- logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName());
+ logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, context);
} catch (Exception e) {
- logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName(), e);
+ logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, context, e);
}
}
public void addToContext(UUID contextUUID) throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException {
+ String context = ContextCache.getInstance().getContextFullNameByUUID(contextUUID);
UUID uuid = UUID.fromString(containerContext.id());
try {
resourceRegistryPublisher.addToContext(HostingNode.NAME, uuid, contextUUID, false);
- logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName());
+ logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, context);
} catch (Exception e) {
- logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName(), e);
+ logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, context, e);
}
}
public void removeFromCurrentContext()
throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException {
+ Secret secret = SecretManagerProvider.instance.get();
+ String context = secret.getContext();
UUID uuid = UUID.fromString(containerContext.id());
try {
resourceRegistryPublisher.removeResourceFromCurrentContext(HostingNode.NAME, uuid, false);
- logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid,
- ContextUtility.getCurrentContextName());
+ logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, context);
} catch (Exception e) {
- logger.error("Unable to remove {} with UUID {} from context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName(), e);
+ logger.error("Unable to remove {} with UUID {} from context ({})", HostingNode.NAME, uuid, context, e);
}
}
public void removeFromContext(UUID contextUUID)
throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException {
- String contextFullName = ContextCache.getInstance().getContextFullNameByUUID(contextUUID);
+ String context = ContextCache.getInstance().getContextFullNameByUUID(contextUUID);
UUID uuid = UUID.fromString(containerContext.id());
try {
resourceRegistryPublisher.removeResourceFromContext(HostingNode.NAME, uuid, contextUUID, false);
- logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, contextFullName);
+ logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, context);
} catch (Exception e) {
- logger.error("Unable to remove {} from context ({})", HostingNode.NAME, uuid, contextFullName, e);
+ logger.error("Unable to remove {} from context ({})", HostingNode.NAME, uuid, context, e);
}
}
@@ -374,10 +380,10 @@ public class HostingNodeManager {
LocationFacet locationFacet = new LocationFacetImpl();
Site site = containerConfiguration.site();
- locationFacet.setCountry(site.country());
- locationFacet.setLocation(site.location());
- locationFacet.setLatitude(site.latitude());
- locationFacet.setLongitude(site.longitude());
+ locationFacet.setCountry(site.getCountry());
+ locationFacet.setLocation(site.getLocation());
+ locationFacet.setLatitude(site.getLatitude());
+ locationFacet.setLongitude(site.getLongitude());
hostingNode.addFacet(locationFacet);
logger.info("{} with UUID {} instantiated", HostingNode.NAME, uuid);
@@ -434,7 +440,7 @@ public class HostingNodeManager {
long total = 0;
try {
FileStore fileStore = Files
- .getFileStore(Paths.get(containerContext.configuration().persistence().location()));
+ .getFileStore(Paths.get(containerContext.configuration().persistence().getLocation()));
free = fileStore.getUsableSpace() / 1048576; // 1048576 = 1024*1024
// user to convert
// bytes in MByte
diff --git a/src/main/java/org/gcube/smartgears/publisher/resourceregistry/FacetBasedPublisher.java b/src/main/java/org/gcube/smartgears/publisher/resourceregistry/FacetBasedPublisher.java
new file mode 100644
index 0000000..2d88788
--- /dev/null
+++ b/src/main/java/org/gcube/smartgears/publisher/resourceregistry/FacetBasedPublisher.java
@@ -0,0 +1,137 @@
+package org.gcube.smartgears.publisher.resourceregistry;
+
+import java.util.Set;
+import java.util.UUID;
+
+import org.gcube.common.clients.config.Property;
+import org.gcube.smartgears.context.application.ApplicationContext;
+import org.gcube.smartgears.context.container.ContainerContext;
+import org.gcube.smartgears.handler.resourceregistry.Constants;
+import org.gcube.smartgears.handler.resourceregistry.ContextUtility;
+import org.gcube.smartgears.handler.resourceregistry.resourcemanager.HostingNodeManager;
+import org.gcube.smartgears.publishing.Publisher;
+import org.gcube.smartgears.publishing.SmartgearsProfilePublisher;
+import org.gcube.smartgears.security.AuthorizationProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SmartgearsProfilePublisher
+public class FacetBasedPublisher implements Publisher {
+
+
+ private static Logger logger = LoggerFactory.getLogger(FacetBasedPublisher.class);
+
+ @Override
+ public boolean create(ContainerContext containerContext, Set contexts) {
+ // Used at startup and in add to context
+ HostingNodeManager hostingNodeManager = new HostingNodeManager(containerContext);
+ AuthorizationProvider authorizationProvider = containerContext.configuration().authorizationProvider();
+ boolean first = true;
+ for (String context : contexts) {
+ UUID contextUUID = ContextUtility.getContextUUID(context);
+ if(first) {
+ hostingNodeManager.createHostingNode();
+ containerContext.properties().add(new Property(Constants.HOSTING_NODE_MANAGER_PROPERTY, hostingNodeManager));
+ first = false;
+ }else {
+
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean create(ApplicationContext applicationContext, Set contexts) {
+ // Used at startup and in add to context
+ return false;
+ }
+
+ @Override
+ public boolean remove(ApplicationContext applicationContext, Set contexts) {
+ // Remove from contexts
+ return false;
+ }
+
+ @Override
+ public boolean remove(ContainerContext containerContext, Set contexts) {
+ // Remove from contexts
+ return false;
+ }
+
+ @Override
+ public boolean update(ApplicationContext applicationContext) {
+ // Periodic updates
+ return false;
+ }
+
+ @Override
+ public boolean update(ContainerContext containerContext) {
+ // Periodic updates
+ return false;
+ }
+
+
+
+// @Override
+// public boolean publishContainer(ContainerContext containerContext, Set contexts) {
+// HostingNodeManager hostingNodeManager = new HostingNodeManager(containerContext);
+//
+// AuthorizationProvider authorizationProvider = containerContext.configuration().authorizationProvider();
+// Set authorizedContexts = authorizationProvider.getContexts();
+// for (String context : authorizedContexts) {
+//
+// }
+// return true;
+// }
+//
+// @Override
+// public boolean publishApplication(ApplicationContext applicationContext, Set contexts) {
+// EServiceManager eServiceManager = new EServiceManager(applicationContext);
+//
+// AuthorizationProvider provider = applicationContext.container().configuration().authorizationProvider();
+//
+// for (String context : provider.getContexts())
+// try {
+// logger.info("publishing application in context {}", context);
+// AuthorizedTasks.executeSafely(new Runnable() {
+//
+// @Override
+// public void run() {
+// try {
+// logger.info("(inside task)publishing application in context {}", context);
+// String resource = toXml(enpoint);
+// registry.getStubs().create(resource, enpoint.type().toString());
+// logger.debug("publisher resource in context {} : {}",context, resource);
+// }catch (Exception e) {
+// logger.error("erro publishing application", e);
+// throw new RuntimeException(e);
+// }
+//
+// }
+// }, provider.getSecretForContext(context));
+// }catch (Throwable e) {
+// logger.error("error publisshing application profile in context {}", context, e);
+// }
+//
+// return true;
+// }
+//
+// @Override
+// public boolean unpublishContainer(ContainerContext container, Set contexts) {
+// // TODO Auto-generated method stub
+// return false;
+// }
+//
+// @Override
+// public boolean unpublishApplication(ApplicationContext application, Set contexts) {
+// // TODO Auto-generated method stub
+// return false;
+// }
+//
+// private String toXml(Resource resource){
+// StringWriter writer = new StringWriter();
+// Resources.marshal(resource, writer);
+// return writer.toString();
+// }
+
+}