new features for configuration file type changing
This commit is contained in:
parent
cf3c134953
commit
08b3cd590a
|
@ -1,2 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<smartgears version="${project.version}" />
|
|
24
pom.xml
24
pom.xml
|
@ -28,8 +28,8 @@
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<distroDirectory>distro</distroDirectory>
|
<distroDirectory>distro</distroDirectory>
|
||||||
<tomcat.version>7.0.42</tomcat.version>
|
<tomcat.version>8.0.42</tomcat.version>
|
||||||
<jersey.version>1.17.1</jersey.version>
|
<jersey.version>2.25.1</jersey.version>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
@ -154,9 +154,8 @@
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sun.jersey</groupId>
|
<groupId>org.glassfish.jersey.core</groupId>
|
||||||
<artifactId>jersey-client</artifactId>
|
<artifactId>jersey-client</artifactId>
|
||||||
<version>${jersey.version}</version>
|
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
@ -227,6 +226,20 @@
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<property>
|
||||||
|
<name>projectVersion</name>
|
||||||
|
<value>${project.version}</value>
|
||||||
|
</property>
|
||||||
|
</systemPropertyVariables>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
|
||||||
<!-- include probe in attached war -->
|
<!-- include probe in attached war -->
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
@ -280,9 +293,6 @@
|
||||||
<resources>
|
<resources>
|
||||||
<resource>
|
<resource>
|
||||||
<directory>${distroDirectory}</directory>
|
<directory>${distroDirectory}</directory>
|
||||||
<includes>
|
|
||||||
<include>smartgears-config.xml</include>
|
|
||||||
</includes>
|
|
||||||
<filtering>true</filtering>
|
<filtering>true</filtering>
|
||||||
</resource>
|
</resource>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -90,7 +90,7 @@ public class Bootstrap implements ServletContainerInitializer {
|
||||||
* using gcube facilities annotation based
|
* using gcube facilities annotation based
|
||||||
* ( i.e org.gcube.common.validator.annotations)
|
* ( i.e org.gcube.common.validator.annotations)
|
||||||
*/
|
*/
|
||||||
//context.configuration().validate();
|
context.configuration().validate();
|
||||||
|
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
|
|
||||||
|
|
|
@ -115,6 +115,9 @@ public interface ApplicationConfiguration {
|
||||||
*/
|
*/
|
||||||
ApplicationConfiguration persistence(PersistenceWriter manager);
|
ApplicationConfiguration persistence(PersistenceWriter manager);
|
||||||
|
|
||||||
|
void authorizedContexts(Set<String> authorizedContexts);
|
||||||
|
|
||||||
|
Set<String> authorizedContexts();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validates this configuration.
|
* Validates this configuration.
|
||||||
|
|
|
@ -134,5 +134,16 @@ public class BridgedApplicationConfiguration implements ApplicationConfiguration
|
||||||
return application.proxyAddress(proxyaddress);
|
return application.proxyAddress(proxyaddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void authorizedContexts(Set<String> authorizedContexts) {
|
||||||
|
application.authorizedContexts(authorizedContexts);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> authorizedContexts() {
|
||||||
|
return application.authorizedContexts();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,7 @@ public class DefaultApplicationConfiguration implements ApplicationConfiguration
|
||||||
@XmlElementRef
|
@XmlElementRef
|
||||||
Set<Include> includes= new LinkedHashSet<Include>();
|
Set<Include> includes= new LinkedHashSet<Include>();
|
||||||
|
|
||||||
|
Set<String> authorizedContexts;
|
||||||
|
|
||||||
@NotNull @IsValid
|
@NotNull @IsValid
|
||||||
private PersistenceWriter persistenceManager;
|
private PersistenceWriter persistenceManager;
|
||||||
|
@ -169,6 +170,16 @@ public class DefaultApplicationConfiguration implements ApplicationConfiguration
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void authorizedContexts(Set<String> authorizedContexts) {
|
||||||
|
this.authorizedContexts = authorizedContexts;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> authorizedContexts() {
|
||||||
|
return this.authorizedContexts;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void validate() {
|
public void validate() {
|
||||||
|
@ -198,4 +209,5 @@ public class DefaultApplicationConfiguration implements ApplicationConfiguration
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -16,14 +16,10 @@ public class Site {
|
||||||
@NotNull
|
@NotNull
|
||||||
String location;
|
String location;
|
||||||
|
|
||||||
@NotNull
|
|
||||||
String latitude;
|
String latitude;
|
||||||
|
|
||||||
@NotNull
|
|
||||||
String longitude;
|
String longitude;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public String getCountry() {
|
public String getCountry() {
|
||||||
return country;
|
return country;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,18 +3,14 @@ package org.gcube.smartgears.configuration.library;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.xml.bind.annotation.XmlAttribute;
|
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
|
||||||
|
|
||||||
import org.gcube.common.validator.ValidationError;
|
import org.gcube.common.validator.ValidationError;
|
||||||
import org.gcube.common.validator.Validator;
|
import org.gcube.common.validator.Validator;
|
||||||
import org.gcube.common.validator.ValidatorFactory;
|
import org.gcube.common.validator.ValidatorFactory;
|
||||||
import org.gcube.common.validator.annotations.NotEmpty;
|
import org.gcube.common.validator.annotations.NotEmpty;
|
||||||
|
|
||||||
@XmlRootElement(name="smartgears")
|
|
||||||
public class SmartGearsConfiguration {
|
public class SmartGearsConfiguration {
|
||||||
|
|
||||||
@XmlAttribute @NotEmpty
|
@NotEmpty
|
||||||
private String version;
|
private String version;
|
||||||
|
|
||||||
public SmartGearsConfiguration(){
|
public SmartGearsConfiguration(){
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.gcube.smartgears.context.application;
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
|
|
||||||
import org.gcube.common.events.Hub;
|
import org.gcube.common.events.Hub;
|
||||||
|
import org.gcube.common.resources.gcore.GCoreEndpoint;
|
||||||
import org.gcube.smartgears.configuration.application.ApplicationConfiguration;
|
import org.gcube.smartgears.configuration.application.ApplicationConfiguration;
|
||||||
import org.gcube.smartgears.context.Properties;
|
import org.gcube.smartgears.context.Properties;
|
||||||
import org.gcube.smartgears.context.container.ContainerContext;
|
import org.gcube.smartgears.context.container.ContainerContext;
|
||||||
|
@ -35,7 +36,7 @@ public interface ApplicationContext {
|
||||||
ApplicationConfiguration configuration();
|
ApplicationConfiguration configuration();
|
||||||
|
|
||||||
|
|
||||||
<T> T profile(Class<T> type);
|
GCoreEndpoint profile();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the lifecycle of the application.
|
* Returns the lifecycle of the application.
|
||||||
|
@ -79,4 +80,5 @@ public interface ApplicationContext {
|
||||||
*/
|
*/
|
||||||
Properties properties();
|
Properties properties();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,13 +66,8 @@ public class DefaultApplicationContext implements ApplicationContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("all")
|
public GCoreEndpoint profile() {
|
||||||
public <T> T profile(Class<T> type) {
|
return properties().lookup(profile_property).value(GCoreEndpoint.class);
|
||||||
|
|
||||||
if (type==GCoreEndpoint.class)
|
|
||||||
return (T) properties().lookup(profile_property).value(GCoreEndpoint.class);
|
|
||||||
|
|
||||||
throw new IllegalArgumentException("unsupported profile type: "+type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.gcube.smartgears.context.container;
|
package org.gcube.smartgears.context.container;
|
||||||
|
|
||||||
import org.gcube.common.events.Hub;
|
import org.gcube.common.events.Hub;
|
||||||
|
import org.gcube.common.resources.gcore.HostingNode;
|
||||||
import org.gcube.smartgears.configuration.container.ContainerConfiguration;
|
import org.gcube.smartgears.configuration.container.ContainerConfiguration;
|
||||||
import org.gcube.smartgears.context.Properties;
|
import org.gcube.smartgears.context.Properties;
|
||||||
import org.gcube.smartgears.lifecycle.container.ContainerLifecycle;
|
import org.gcube.smartgears.lifecycle.container.ContainerLifecycle;
|
||||||
|
@ -25,7 +26,7 @@ public interface ContainerContext {
|
||||||
* Returns the resource profile of a given type of the container.
|
* Returns the resource profile of a given type of the container.
|
||||||
* @return the profile
|
* @return the profile
|
||||||
*/
|
*/
|
||||||
<T> T profile(Class<T> type);
|
HostingNode profile();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the lifecycle of the container
|
* Returns the lifecycle of the container
|
||||||
|
|
|
@ -38,13 +38,8 @@ public class DefaultContainerContext implements ContainerContext {
|
||||||
this.properties=properties;
|
this.properties=properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("all")
|
public HostingNode profile() {
|
||||||
public <T> T profile(Class<T> type) {
|
return properties().lookup(container_profile_property).value(HostingNode.class);
|
||||||
|
|
||||||
if (type==HostingNode.class)
|
|
||||||
return (T) properties().lookup(container_profile_property).value(HostingNode.class);
|
|
||||||
|
|
||||||
throw new IllegalArgumentException("unsupported profile type: "+type);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -23,7 +23,6 @@ import javax.servlet.ServletException;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.gcube.common.resources.gcore.GCoreEndpoint;
|
|
||||||
import org.gcube.common.scope.impl.ScopeBean;
|
import org.gcube.common.scope.impl.ScopeBean;
|
||||||
import org.gcube.smartgears.extensions.ApiResource;
|
import org.gcube.smartgears.extensions.ApiResource;
|
||||||
import org.gcube.smartgears.extensions.ApiSignature;
|
import org.gcube.smartgears.extensions.ApiSignature;
|
||||||
|
@ -95,7 +94,7 @@ public class FrontPageResource extends ApiResource {
|
||||||
String infrastructure = context().container().configuration().infrastructure();
|
String infrastructure = context().container().configuration().infrastructure();
|
||||||
StringBuilder voValue = new StringBuilder();
|
StringBuilder voValue = new StringBuilder();
|
||||||
|
|
||||||
Collection<String> scopes = context().profile(GCoreEndpoint.class).scopes().asCollection();
|
Collection<String> scopes = context().profile().scopes().asCollection();
|
||||||
Set<String> vos = new HashSet<String>();
|
Set<String> vos = new HashSet<String>();
|
||||||
|
|
||||||
//pre-process
|
//pre-process
|
||||||
|
|
|
@ -9,7 +9,6 @@ import javax.servlet.ServletException;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.gcube.common.resources.gcore.GCoreEndpoint;
|
|
||||||
import org.gcube.common.resources.gcore.Resources;
|
import org.gcube.common.resources.gcore.Resources;
|
||||||
import org.gcube.smartgears.extensions.ApiResource;
|
import org.gcube.smartgears.extensions.ApiResource;
|
||||||
import org.gcube.smartgears.extensions.ApiSignature;
|
import org.gcube.smartgears.extensions.ApiSignature;
|
||||||
|
@ -36,7 +35,7 @@ public class ProfileResource extends ApiResource {
|
||||||
@Override
|
@Override
|
||||||
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||||
|
|
||||||
Resources.marshal(context().profile(GCoreEndpoint.class),resp.getWriter());
|
Resources.marshal(context().profile(),resp.getWriter());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
package org.gcube.smartgears.handlers;
|
||||||
|
|
||||||
|
import static org.gcube.smartgears.utils.Utils.notEmpty;
|
||||||
|
import static org.gcube.smartgears.utils.Utils.rethrowUnchecked;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
|
||||||
|
import org.gcube.common.resources.gcore.Resource;
|
||||||
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.gcube.informationsystem.publisher.ScopedPublisher;
|
||||||
|
import org.gcube.smartgears.provider.ProviderFactory;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public abstract class AbstractProfilePublisher<P extends Resource> implements ProfilePublisher {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(AbstractProfilePublisher.class);
|
||||||
|
|
||||||
|
//the underlying IS publisher
|
||||||
|
private final ScopedPublisher publisher;
|
||||||
|
|
||||||
|
//private AuthorizationProvider authProvider ;
|
||||||
|
|
||||||
|
public AbstractProfilePublisher() {
|
||||||
|
this.publisher=ProviderFactory.provider().publisher();
|
||||||
|
//this.authProvider = ProviderFactory.provider().authorizationProvider();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract P getProfile();
|
||||||
|
protected abstract boolean isRoot();
|
||||||
|
protected abstract void sharePublished(P profile);
|
||||||
|
protected abstract Set<String> getAllowedContexts();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the application from one or more scopes.
|
||||||
|
* @param scopes the scopes
|
||||||
|
*/
|
||||||
|
public void removeFrom(Collection<String> contexts) {
|
||||||
|
P profile = getProfile();
|
||||||
|
ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
|
||||||
|
|
||||||
|
log.debug("using context {}",contextCL.getClass().getSimpleName());
|
||||||
|
|
||||||
|
String previousToken = SecurityTokenProvider.instance.get();
|
||||||
|
String previousScope = ScopeProvider.instance.get();
|
||||||
|
try{//This classloader set is needed for the jaxb context
|
||||||
|
if (previousToken!=null)
|
||||||
|
SecurityTokenProvider.instance.reset();
|
||||||
|
if (isRoot())
|
||||||
|
Thread.currentThread().setContextClassLoader(AbstractProfilePublisher.class.getClassLoader());
|
||||||
|
profile = publisher.remove(profile, new ArrayList<String>(contexts));
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
rethrowUnchecked(e);
|
||||||
|
} finally{
|
||||||
|
SecurityTokenProvider.instance.set(previousToken);
|
||||||
|
ScopeProvider.instance.set(previousScope);
|
||||||
|
if (isRoot())
|
||||||
|
Thread.currentThread().setContextClassLoader(contextCL);
|
||||||
|
}
|
||||||
|
log.debug("after remove application profile contains scopes {}",profile.scopes().asCollection());
|
||||||
|
sharePublished(profile);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void addToAll(){
|
||||||
|
this.addTo(getAllowedContexts());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds for the first time the current resource profile of the application in one or more scopes.
|
||||||
|
* @param contexts the contexts
|
||||||
|
*/
|
||||||
|
public void addTo(Collection<String> contexts) {
|
||||||
|
notEmpty("contexts",contexts);
|
||||||
|
|
||||||
|
P profile = getProfile();
|
||||||
|
|
||||||
|
ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
|
||||||
|
|
||||||
|
log.debug("using context {}",contextCL.getClass().getSimpleName());
|
||||||
|
|
||||||
|
String previousToken = SecurityTokenProvider.instance.get();
|
||||||
|
String previousScope = ScopeProvider.instance.get();
|
||||||
|
try{//This classloader set is needed for the jaxb context
|
||||||
|
if (previousToken!=null)
|
||||||
|
SecurityTokenProvider.instance.reset();;
|
||||||
|
if (isRoot()) Thread.currentThread().setContextClassLoader(AbstractProfilePublisher.class.getClassLoader());
|
||||||
|
ScopeProvider.instance.set(contexts.stream().findFirst().get());
|
||||||
|
profile = publisher.create(profile, new ArrayList<String>(contexts));
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
rethrowUnchecked(e);
|
||||||
|
} finally{
|
||||||
|
SecurityTokenProvider.instance.set(previousToken);
|
||||||
|
ScopeProvider.instance.set(previousScope);
|
||||||
|
if (isRoot()) Thread.currentThread().setContextClassLoader(contextCL);
|
||||||
|
}
|
||||||
|
|
||||||
|
sharePublished(profile);
|
||||||
|
log.debug("shared profile with scopes {}", profile.scopes().asCollection());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void update() {
|
||||||
|
P profile = getProfile();
|
||||||
|
ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
|
||||||
|
|
||||||
|
log.debug("using context {}",contextCL.getClass().getSimpleName());
|
||||||
|
|
||||||
|
String previousToken = SecurityTokenProvider.instance.get();
|
||||||
|
String previousScope = ScopeProvider.instance.get();
|
||||||
|
try{//This classloader set is needed for the jaxb context
|
||||||
|
if (previousToken!=null)
|
||||||
|
SecurityTokenProvider.instance.reset();
|
||||||
|
|
||||||
|
if (isRoot())
|
||||||
|
Thread.currentThread().setContextClassLoader(AbstractProfilePublisher.class.getClassLoader());
|
||||||
|
profile = publisher.update(profile);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
rethrowUnchecked(e);
|
||||||
|
} finally{
|
||||||
|
SecurityTokenProvider.instance.set(previousToken);
|
||||||
|
ScopeProvider.instance.set(previousScope);
|
||||||
|
if (isRoot())
|
||||||
|
Thread.currentThread().setContextClassLoader(contextCL);
|
||||||
|
}
|
||||||
|
|
||||||
|
sharePublished(profile);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -4,20 +4,13 @@ import java.util.Collection;
|
||||||
|
|
||||||
public interface ProfilePublisher {
|
public interface ProfilePublisher {
|
||||||
|
|
||||||
/**
|
void addTo(Collection<String> contexts);
|
||||||
* Adds for the first time the current resource profile of the application in one or more scopes.
|
|
||||||
* @param scopes the scopes
|
|
||||||
*/
|
|
||||||
void addTo(Collection<String> tokens);
|
|
||||||
|
|
||||||
void addToAll();
|
void addToAll();
|
||||||
|
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
/**
|
void removeFrom(Collection<String> contexts);
|
||||||
* Removes the application from one or more scopes.
|
|
||||||
* @param scopes the scopes
|
|
||||||
*/
|
|
||||||
void removeFrom(Collection<String> tokens);
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -8,7 +8,6 @@ import java.util.List;
|
||||||
import javax.servlet.ServletRegistration;
|
import javax.servlet.ServletRegistration;
|
||||||
|
|
||||||
import org.gcube.common.resources.gcore.GCoreEndpoint;
|
import org.gcube.common.resources.gcore.GCoreEndpoint;
|
||||||
import org.gcube.common.resources.gcore.HostingNode;
|
|
||||||
import org.gcube.smartgears.configuration.application.ApplicationConfiguration;
|
import org.gcube.smartgears.configuration.application.ApplicationConfiguration;
|
||||||
import org.gcube.smartgears.configuration.container.ContainerConfiguration;
|
import org.gcube.smartgears.configuration.container.ContainerConfiguration;
|
||||||
import org.gcube.smartgears.context.application.ApplicationContext;
|
import org.gcube.smartgears.context.application.ApplicationContext;
|
||||||
|
@ -38,7 +37,7 @@ public class ProfileBuilder {
|
||||||
.serviceClass(configuration.serviceClass())
|
.serviceClass(configuration.serviceClass())
|
||||||
.version(configuration.version())
|
.version(configuration.version())
|
||||||
.serviceId(configuration.name() + configuration.serviceClass() + configuration.version())
|
.serviceId(configuration.name() + configuration.serviceClass() + configuration.version())
|
||||||
.ghnId(context.container().profile(HostingNode.class).id());
|
.ghnId(context.container().profile().id());
|
||||||
|
|
||||||
endpoint.profile().newDeploymentData()
|
endpoint.profile().newDeploymentData()
|
||||||
.activationTime(Calendar.getInstance())
|
.activationTime(Calendar.getInstance())
|
||||||
|
|
|
@ -94,7 +94,7 @@ public class ProfileManager extends ApplicationLifecycleHandler {
|
||||||
share(profile);
|
share(profile);
|
||||||
|
|
||||||
publisher = context.container().configuration().mode()!=Mode.offline?
|
publisher = context.container().configuration().mode()!=Mode.offline?
|
||||||
new ProfilePublisherImpl(context):
|
new ServicePublisher(context):
|
||||||
new OfflineProfilePublisher();
|
new OfflineProfilePublisher();
|
||||||
|
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ public class ProfileManager extends ApplicationLifecycleHandler {
|
||||||
@Observes({ activation, stop, failure })
|
@Observes({ activation, stop, failure })
|
||||||
void onChanged(ApplicationLifecycle lc) {
|
void onChanged(ApplicationLifecycle lc) {
|
||||||
|
|
||||||
GCoreEndpoint profile = context.profile(GCoreEndpoint.class);
|
GCoreEndpoint profile = context.profile();
|
||||||
|
|
||||||
profile.profile().deploymentData().status(lc.state().remoteForm());
|
profile.profile().deploymentData().status(lc.state().remoteForm());
|
||||||
|
|
||||||
|
@ -270,7 +270,7 @@ public class ProfileManager extends ApplicationLifecycleHandler {
|
||||||
|
|
||||||
final Runnable updateTask = new Runnable() {
|
final Runnable updateTask = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
GCoreEndpoint profile = context.profile(GCoreEndpoint.class);
|
GCoreEndpoint profile = context.profile();
|
||||||
|
|
||||||
//if handling of event generates failures these will be reported
|
//if handling of event generates failures these will be reported
|
||||||
//for resilience we do not fail the application
|
//for resilience we do not fail the application
|
||||||
|
|
|
@ -1,201 +0,0 @@
|
||||||
package org.gcube.smartgears.handlers.application.lifecycle;
|
|
||||||
|
|
||||||
import static org.gcube.smartgears.handlers.ProfileEvents.published;
|
|
||||||
import static org.gcube.smartgears.utils.Utils.notEmpty;
|
|
||||||
import static org.gcube.smartgears.utils.Utils.rethrowUnchecked;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
|
|
||||||
import org.gcube.common.resources.gcore.GCoreEndpoint;
|
|
||||||
import org.gcube.common.scope.api.ScopeProvider;
|
|
||||||
import org.gcube.informationsystem.publisher.ScopedPublisher;
|
|
||||||
import org.gcube.smartgears.configuration.Mode;
|
|
||||||
import org.gcube.smartgears.context.application.ApplicationContext;
|
|
||||||
import org.gcube.smartgears.handlers.ProfilePublisher;
|
|
||||||
import org.gcube.smartgears.provider.ProviderFactory;
|
|
||||||
import org.gcube.smartgears.security.AuthorizationProvider;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Publishes the current resource profile of the application.
|
|
||||||
* <p>
|
|
||||||
*Distinguishes publication in new scopes ({@link #addTo(List)} from publication updates in existing scopes ({@link #update()}.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @author Fabio Simeoni
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class ProfilePublisherImpl implements ProfilePublisher {
|
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(ProfilePublisherImpl.class);
|
|
||||||
|
|
||||||
//the underlying IS publisher
|
|
||||||
private final ScopedPublisher publisher;
|
|
||||||
|
|
||||||
private final ApplicationContext context;
|
|
||||||
|
|
||||||
private AuthorizationProvider authProxy ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance for a given application.
|
|
||||||
* @param context the context of the application
|
|
||||||
*/
|
|
||||||
public ProfilePublisherImpl(ApplicationContext context) {
|
|
||||||
this.context = context;
|
|
||||||
this.publisher=ProviderFactory.provider().publisherFor(context);
|
|
||||||
this.authProxy = context.container().configuration().authorizationProvider();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds for the first time the current resource profile of the application in one or more scopes.
|
|
||||||
* @param scopes the scopes
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void addTo(Collection<String> contexts) {
|
|
||||||
|
|
||||||
notEmpty("tokens",contexts);
|
|
||||||
|
|
||||||
GCoreEndpoint profile = context.profile(GCoreEndpoint.class);
|
|
||||||
|
|
||||||
/* TODO: reintroduce it when scope will be removed
|
|
||||||
//TODO: remove when move to new IS
|
|
||||||
Collection<String> retainedContexts = new ArrayList<String>(context.container().configuration().allowedContexts());
|
|
||||||
retainedContexts.removeAll(profile.scopes().asCollection());
|
|
||||||
profile.scopes().asCollection().addAll(retainedContexts);
|
|
||||||
|
|
||||||
|
|
||||||
String previousToken = SecurityTokenProvider.instance.get();
|
|
||||||
try {
|
|
||||||
for (String token: tokens){
|
|
||||||
log.info("creating profile with token {}", token);
|
|
||||||
SecurityTokenProvider.instance.set(token);
|
|
||||||
profile = publisher.create(profile);
|
|
||||||
SecurityTokenProvider.instance.reset();
|
|
||||||
}
|
|
||||||
}catch (Exception e) {
|
|
||||||
rethrowUnchecked(e);
|
|
||||||
} finally{
|
|
||||||
SecurityTokenProvider.instance.set(previousToken);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
|
|
||||||
|
|
||||||
log.debug("using context {}",contextCL.getClass().getSimpleName());
|
|
||||||
|
|
||||||
String previousToken = SecurityTokenProvider.instance.get();
|
|
||||||
String previousScope = ScopeProvider.instance.get();
|
|
||||||
try{//This classloader set is needed for the jaxb context
|
|
||||||
if (previousToken!=null)
|
|
||||||
SecurityTokenProvider.instance.reset();;
|
|
||||||
if (context.container().configuration().mode()!=Mode.root) Thread.currentThread().setContextClassLoader(ProfilePublisherImpl.class.getClassLoader());
|
|
||||||
ScopeProvider.instance.set(contexts.stream().findFirst().get());
|
|
||||||
profile = publisher.create(profile, new ArrayList<String>(contexts));
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
rethrowUnchecked(e);
|
|
||||||
} finally{
|
|
||||||
SecurityTokenProvider.instance.set(previousToken);
|
|
||||||
ScopeProvider.instance.set(previousScope);
|
|
||||||
if (context.container().configuration().mode()!=Mode.root) Thread.currentThread().setContextClassLoader(contextCL);
|
|
||||||
}
|
|
||||||
|
|
||||||
sharePublished(profile);
|
|
||||||
log.debug("shared profile with scopes {}", profile.scopes().asCollection());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addToAll() {
|
|
||||||
this.addTo(context.configuration().allowedContexts());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update() {
|
|
||||||
|
|
||||||
|
|
||||||
GCoreEndpoint profile = context.profile(GCoreEndpoint.class);
|
|
||||||
|
|
||||||
ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
|
|
||||||
|
|
||||||
log.debug("using context {}",contextCL.getClass().getSimpleName());
|
|
||||||
|
|
||||||
String previousToken = SecurityTokenProvider.instance.get();
|
|
||||||
String previousScope = ScopeProvider.instance.get();
|
|
||||||
try{//This classloader set is needed for the jaxb context
|
|
||||||
if (previousToken!=null)
|
|
||||||
SecurityTokenProvider.instance.reset();
|
|
||||||
|
|
||||||
if (context.container().configuration().mode()!=Mode.root)
|
|
||||||
Thread.currentThread().setContextClassLoader(ProfilePublisherImpl.class.getClassLoader());
|
|
||||||
profile = publisher.update(profile);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
rethrowUnchecked(e);
|
|
||||||
} finally{
|
|
||||||
SecurityTokenProvider.instance.set(previousToken);
|
|
||||||
ScopeProvider.instance.set(previousScope);
|
|
||||||
if (context.container().configuration().mode()!=Mode.root)
|
|
||||||
Thread.currentThread().setContextClassLoader(contextCL);
|
|
||||||
}
|
|
||||||
|
|
||||||
sharePublished(profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the application from one or more scopes.
|
|
||||||
* @param scopes the scopes
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void removeFrom(Collection<String> contexts) {
|
|
||||||
|
|
||||||
GCoreEndpoint profile = context.profile(GCoreEndpoint.class);
|
|
||||||
|
|
||||||
ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
|
|
||||||
|
|
||||||
log.debug("using context {}",contextCL.getClass().getSimpleName());
|
|
||||||
|
|
||||||
String previousToken = SecurityTokenProvider.instance.get();
|
|
||||||
String previousScope = ScopeProvider.instance.get();
|
|
||||||
try{//This classloader set is needed for the jaxb context
|
|
||||||
if (previousToken!=null)
|
|
||||||
SecurityTokenProvider.instance.reset();
|
|
||||||
if (context.container().configuration().mode()!=Mode.root)
|
|
||||||
Thread.currentThread().setContextClassLoader(ProfilePublisherImpl.class.getClassLoader());
|
|
||||||
profile = publisher.remove(profile, contexts);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
rethrowUnchecked(e);
|
|
||||||
} finally{
|
|
||||||
SecurityTokenProvider.instance.set(previousToken);
|
|
||||||
ScopeProvider.instance.set(previousScope);
|
|
||||||
if (context.container().configuration().mode()!=Mode.root)
|
|
||||||
Thread.currentThread().setContextClassLoader(contextCL);
|
|
||||||
}
|
|
||||||
log.debug("after remove application profile contains scopes {}",profile.scopes().asCollection());
|
|
||||||
sharePublished(profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void sharePublished(GCoreEndpoint profile) {
|
|
||||||
context.events().fire(profile,published);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> resolveScopesFromTokens(Collection<String> tokens){
|
|
||||||
List<String> scopes = new ArrayList<String>(tokens.size());
|
|
||||||
for (String token: tokens)
|
|
||||||
try{
|
|
||||||
scopes.add(this.authProxy.get(token).getContext());
|
|
||||||
}catch (Exception e) {
|
|
||||||
log.warn("error retrieving token {} , it should never happen",token);
|
|
||||||
}
|
|
||||||
return scopes;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
package org.gcube.smartgears.handlers.application.lifecycle;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.gcube.common.resources.gcore.GCoreEndpoint;
|
||||||
|
import org.gcube.common.resources.gcore.HostingNode;
|
||||||
|
import org.gcube.smartgears.configuration.Mode;
|
||||||
|
import org.gcube.smartgears.context.application.ApplicationContext;
|
||||||
|
import org.gcube.smartgears.handlers.AbstractProfilePublisher;
|
||||||
|
import org.gcube.smartgears.handlers.ProfileEvents;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Publishes the current resource profile of the application.
|
||||||
|
* <p>
|
||||||
|
*Distinguishes publication in new scopes ({@link #addTo(List)} from publication updates in existing scopes ({@link #update()}.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author Fabio Simeoni
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ServicePublisher extends AbstractProfilePublisher<GCoreEndpoint> {
|
||||||
|
|
||||||
|
private final ApplicationContext context;
|
||||||
|
|
||||||
|
public ServicePublisher(ApplicationContext context) {
|
||||||
|
super();
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected void sharePublished(HostingNode profile) {
|
||||||
|
context.events().fire(profile,ProfileEvents.published);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected GCoreEndpoint getProfile() {
|
||||||
|
return context.profile();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isRoot() {
|
||||||
|
return context.container().configuration().mode()!=Mode.root;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void sharePublished(GCoreEndpoint profile) {
|
||||||
|
context.events().fire(profile,ProfileEvents.published);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Set<String> getAllowedContexts() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
package org.gcube.smartgears.handlers.container.lifecycle;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.gcube.common.resources.gcore.HostingNode;
|
||||||
|
import org.gcube.smartgears.configuration.Mode;
|
||||||
|
import org.gcube.smartgears.context.container.ContainerContext;
|
||||||
|
import org.gcube.smartgears.handlers.AbstractProfilePublisher;
|
||||||
|
import org.gcube.smartgears.handlers.ProfileEvents;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Publishes the resource profile of the container.
|
||||||
|
* <p>
|
||||||
|
* Distinguishes publication in new scopes ({@link #addTo(List)} from publication updates in existing scopes ({@link #update(List)}.
|
||||||
|
*
|
||||||
|
* @author Fabio Simeoni
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ContainerPublisher extends AbstractProfilePublisher<HostingNode> {
|
||||||
|
|
||||||
|
|
||||||
|
private final ContainerContext context;
|
||||||
|
|
||||||
|
public ContainerPublisher(ContainerContext context) {
|
||||||
|
super();
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected void sharePublished(HostingNode profile) {
|
||||||
|
context.events().fire(profile,ProfileEvents.published);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected HostingNode getProfile() {
|
||||||
|
return context.profile();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isRoot() {
|
||||||
|
return context.configuration().mode()!=Mode.root;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Set<String> getAllowedContexts() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -9,8 +9,6 @@ import java.io.Reader;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -193,7 +191,7 @@ public class ProfileBuilder {
|
||||||
long free = 0;
|
long free = 0;
|
||||||
try {
|
try {
|
||||||
free = context.configuration().persistence().getFreeSpace()/1024;
|
free = context.configuration().persistence().getFreeSpace()/1024;
|
||||||
} catch (IOException ioe) {
|
} catch (Exception ioe) {
|
||||||
log.warn("unable to detect the free space on the disk", ioe);
|
log.warn("unable to detect the free space on the disk", ioe);
|
||||||
}
|
}
|
||||||
return free;
|
return free;
|
||||||
|
@ -241,8 +239,8 @@ public class ProfileBuilder {
|
||||||
|
|
||||||
ContainerConfiguration cfg = context.configuration();
|
ContainerConfiguration cfg = context.configuration();
|
||||||
|
|
||||||
node.profile().newSite().country(cfg.site().country()).location(cfg.site().location())
|
node.profile().newSite().country(cfg.site().getCountry()).location(cfg.site().getLocation())
|
||||||
.latitude(cfg.site().latitude()).longitude(cfg.site().longitude()).domain(domainIn(cfg.hostname()));
|
.latitude(cfg.site().getLatitude()).longitude(cfg.site().getLongitude()).domain(domainIn(cfg.hostname()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addVariablesTo(HostingNode node) {
|
private void addVariablesTo(HostingNode node) {
|
||||||
|
|
|
@ -87,7 +87,7 @@ public class ProfileManager extends ContainerHandler {
|
||||||
share(profile);
|
share(profile);
|
||||||
|
|
||||||
publisher = context.configuration().mode()!=Mode.offline?
|
publisher = context.configuration().mode()!=Mode.offline?
|
||||||
new ProfilePublisherImpl(context):
|
new ContainerPublisher(context):
|
||||||
new OfflineProfilePublisher();
|
new OfflineProfilePublisher();
|
||||||
|
|
||||||
registerObservers();
|
registerObservers();
|
||||||
|
@ -102,7 +102,7 @@ public class ProfileManager extends ContainerHandler {
|
||||||
@Observes({ activation, part_activation, shutdown, stop, failure })
|
@Observes({ activation, part_activation, shutdown, stop, failure })
|
||||||
void onChanged(ContainerLifecycle lc) {
|
void onChanged(ContainerLifecycle lc) {
|
||||||
|
|
||||||
HostingNode profile = context.profile(HostingNode.class);
|
HostingNode profile = context.profile();
|
||||||
|
|
||||||
profile.profile().description().status(lc.state().remoteForm());
|
profile.profile().description().status(lc.state().remoteForm());
|
||||||
|
|
||||||
|
@ -245,7 +245,7 @@ public class ProfileManager extends ContainerHandler {
|
||||||
|
|
||||||
final Runnable updateTask = new Runnable() {
|
final Runnable updateTask = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
HostingNode profile = context.profile(HostingNode.class);
|
HostingNode profile = context.profile();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
builder.update(profile, false);
|
builder.update(profile, false);
|
||||||
|
|
|
@ -1,241 +0,0 @@
|
||||||
package org.gcube.smartgears.handlers.container.lifecycle;
|
|
||||||
|
|
||||||
import static org.gcube.smartgears.utils.Utils.notEmpty;
|
|
||||||
import static org.gcube.smartgears.utils.Utils.rethrowUnchecked;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.gcube.common.authorization.client.proxy.AuthorizationProxy;
|
|
||||||
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
|
|
||||||
import org.gcube.common.resources.gcore.HostingNode;
|
|
||||||
import org.gcube.informationsystem.publisher.ScopedPublisher;
|
|
||||||
import org.gcube.smartgears.configuration.Mode;
|
|
||||||
import org.gcube.smartgears.context.container.ContainerContext;
|
|
||||||
import org.gcube.smartgears.handlers.ProfileEvents;
|
|
||||||
import org.gcube.smartgears.handlers.ProfilePublisher;
|
|
||||||
import org.gcube.smartgears.provider.ProviderFactory;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Publishes the resource profile of the container.
|
|
||||||
* <p>
|
|
||||||
* Distinguishes publication in new scopes ({@link #addTo(List)} from publication updates in existing scopes ({@link #update(List)}.
|
|
||||||
*
|
|
||||||
* @author Fabio Simeoni
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class ProfilePublisherImpl implements ProfilePublisher {
|
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(ProfilePublisherImpl.class);
|
|
||||||
|
|
||||||
//the underlying IS publisher
|
|
||||||
private final ScopedPublisher publisher;
|
|
||||||
//private final AuthorizationProvider authorization;
|
|
||||||
private final ContainerContext context;
|
|
||||||
|
|
||||||
private AuthorizationProxy authProxy ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance for the container.
|
|
||||||
* @param context the context of the application
|
|
||||||
*/
|
|
||||||
public ProfilePublisherImpl(ContainerContext context) {
|
|
||||||
this.context = context;
|
|
||||||
this.publisher=ProviderFactory.provider().publisherFor(context);
|
|
||||||
this.authProxy = ProviderFactory.provider().authorizationProxy();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the current resource profile of the application in one or more
|
|
||||||
* scopes. The scopes are retrieved from tokens
|
|
||||||
* @param tokens the tokens
|
|
||||||
*/
|
|
||||||
public void addTo(Collection<String> tokens) {
|
|
||||||
|
|
||||||
notEmpty("tokens",tokens);
|
|
||||||
|
|
||||||
log.info("publishing container with tokens {}", tokens);
|
|
||||||
|
|
||||||
HostingNode profile = context.profile(HostingNode.class);
|
|
||||||
|
|
||||||
/* TODO: reintroduce it when scope will be removed
|
|
||||||
//TODO: remove when move to new IS
|
|
||||||
Collection<String> retainedContexts = new ArrayList<String>(context.configuration().allowedContexts());
|
|
||||||
retainedContexts.removeAll(profile.scopes().asCollection());
|
|
||||||
profile.scopes().asCollection().addAll(retainedContexts);
|
|
||||||
|
|
||||||
log.trace("profile scopes on create are {} ",profile.scopes().asCollection());
|
|
||||||
|
|
||||||
String previousToken = SecurityTokenProvider.instance.get();
|
|
||||||
|
|
||||||
try {
|
|
||||||
for (String token: tokens){
|
|
||||||
log.info("creating profile with token {}", token);
|
|
||||||
SecurityTokenProvider.instance.set(token);
|
|
||||||
profile = publisher.create(profile);
|
|
||||||
SecurityTokenProvider.instance.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
update();
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.warn("error adding scopes",e);
|
|
||||||
rethrowUnchecked(e);
|
|
||||||
|
|
||||||
} finally{
|
|
||||||
SecurityTokenProvider.instance.set(previousToken);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
|
|
||||||
log.debug("using context {}",contextCL.getClass().getSimpleName());
|
|
||||||
String previousToken = SecurityTokenProvider.instance.get();
|
|
||||||
try{//This classloader set is needed for the jaxb context
|
|
||||||
if (previousToken==null)
|
|
||||||
SecurityTokenProvider.instance.set((String)tokens.toArray()[0]);
|
|
||||||
if (context.configuration().mode()!=Mode.root)
|
|
||||||
Thread.currentThread().setContextClassLoader(ProfilePublisherImpl.class.getClassLoader());
|
|
||||||
profile = publisher.create(profile, resolveScopesFromTokens(tokens));
|
|
||||||
} catch (Exception e) {
|
|
||||||
rethrowUnchecked(e);
|
|
||||||
} finally {
|
|
||||||
SecurityTokenProvider.instance.set(previousToken);
|
|
||||||
if (context.configuration().mode()!=Mode.root)
|
|
||||||
Thread.currentThread().setContextClassLoader(contextCL);
|
|
||||||
}
|
|
||||||
|
|
||||||
sharePublished(profile);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the current resource profile of the application in one or more scopes.
|
|
||||||
*/
|
|
||||||
public void addToAll() {
|
|
||||||
addTo(context.configuration().startTokens());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the current resource profile of the application in its current scopes.
|
|
||||||
*/
|
|
||||||
public void update() {
|
|
||||||
|
|
||||||
HostingNode profile = context.profile(HostingNode.class);
|
|
||||||
/* TODO: reintroduce it when scope will be removed
|
|
||||||
Collection<String> tokens = context.configuration().startTokens();
|
|
||||||
|
|
||||||
log.info("updating container with tokens {}", tokens);
|
|
||||||
|
|
||||||
String previousToken = SecurityTokenProvider.instance.get();
|
|
||||||
|
|
||||||
try {
|
|
||||||
for (String token: tokens){
|
|
||||||
SecurityTokenProvider.instance.set(token);
|
|
||||||
profile = publisher.update(profile);
|
|
||||||
SecurityTokenProvider.instance.reset();
|
|
||||||
}
|
|
||||||
sharePublished(profile);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
log.warn("error updating container",e);
|
|
||||||
rethrowUnchecked(e);
|
|
||||||
|
|
||||||
} finally{
|
|
||||||
SecurityTokenProvider.instance.set(previousToken);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
log.debug("[update] resource scopes are : {} ",profile.scopes().asCollection());
|
|
||||||
|
|
||||||
ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
|
|
||||||
log.debug("using context {}",contextCL.getClass().getSimpleName());
|
|
||||||
String previousToken = SecurityTokenProvider.instance.get();
|
|
||||||
try{//This classloader set is needed for the jaxb context
|
|
||||||
if (previousToken==null)
|
|
||||||
SecurityTokenProvider.instance.set((String)context.configuration().startTokens().toArray()[0]);
|
|
||||||
|
|
||||||
if (context.configuration().mode()!=Mode.root)
|
|
||||||
Thread.currentThread().setContextClassLoader(ProfilePublisherImpl.class.getClassLoader());
|
|
||||||
profile = publisher.update(profile);
|
|
||||||
} catch (Exception e) {
|
|
||||||
rethrowUnchecked(e);
|
|
||||||
} finally {
|
|
||||||
SecurityTokenProvider.instance.set(previousToken);
|
|
||||||
if (context.configuration().mode()!=Mode.root)
|
|
||||||
Thread.currentThread().setContextClassLoader(contextCL);
|
|
||||||
}
|
|
||||||
|
|
||||||
sharePublished(profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the container from one or more scopes.
|
|
||||||
* @param tokens the tokens
|
|
||||||
*/
|
|
||||||
public void removeFrom(Collection<String> tokens) {
|
|
||||||
|
|
||||||
HostingNode profile = context.profile(HostingNode.class);
|
|
||||||
|
|
||||||
log.info("removing container with tokens {}", tokens);
|
|
||||||
|
|
||||||
/* TODO: reintroduce it when scope will be removed
|
|
||||||
String previousToken = SecurityTokenProvider.instance.get();
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
for (String token: tokens){
|
|
||||||
SecurityTokenProvider.instance.set(token);
|
|
||||||
profile = publisher.remove(profile);
|
|
||||||
SecurityTokenProvider.instance.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
update();
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
log.warn("error removing scopes",e);
|
|
||||||
rethrowUnchecked(e);
|
|
||||||
|
|
||||||
} finally{
|
|
||||||
SecurityTokenProvider.instance.set(previousToken);
|
|
||||||
} */
|
|
||||||
|
|
||||||
ClassLoader contextCL = Thread.currentThread().getContextClassLoader();
|
|
||||||
log.debug("using context {}",contextCL.getClass().getSimpleName());
|
|
||||||
String previousToken = SecurityTokenProvider.instance.get();
|
|
||||||
try{//This classloader set is needed for the jaxb context
|
|
||||||
if (previousToken==null)
|
|
||||||
SecurityTokenProvider.instance.set((String)tokens.toArray()[0]);
|
|
||||||
if (context.configuration().mode()!=Mode.root)
|
|
||||||
Thread.currentThread().setContextClassLoader(ProfilePublisherImpl.class.getClassLoader());
|
|
||||||
profile = publisher.remove(profile, resolveScopesFromTokens(tokens));
|
|
||||||
} catch (Exception e) {
|
|
||||||
rethrowUnchecked(e);
|
|
||||||
} finally {
|
|
||||||
SecurityTokenProvider.instance.set(previousToken);
|
|
||||||
if (context.configuration().mode()!=Mode.root)
|
|
||||||
Thread.currentThread().setContextClassLoader(contextCL);
|
|
||||||
}
|
|
||||||
|
|
||||||
log.debug("after remove container profile contains scopes {}",profile.scopes().asCollection());
|
|
||||||
sharePublished(profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sharePublished(HostingNode profile) {
|
|
||||||
context.events().fire(profile,ProfileEvents.published);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> resolveScopesFromTokens(Collection<String> tokens){
|
|
||||||
List<String> scopes = new ArrayList<String>(tokens.size());
|
|
||||||
for (String token: tokens)
|
|
||||||
try{
|
|
||||||
scopes.add(this.authProxy.get(token).getContext());
|
|
||||||
}catch (Exception e) {
|
|
||||||
log.warn("error retrieving token {} , it should never happen",token);
|
|
||||||
}
|
|
||||||
return scopes;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -15,7 +15,6 @@ import java.io.ObjectOutputStream;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import javax.servlet.FilterRegistration;
|
import javax.servlet.FilterRegistration;
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
|
@ -70,17 +69,10 @@ public class ApplicationManager {
|
||||||
for (Entry<String,? extends ServletRegistration> servlet : application.getServletRegistrations().entrySet())
|
for (Entry<String,? extends ServletRegistration> servlet : application.getServletRegistrations().entrySet())
|
||||||
log.trace("servlet {} : {} {} ", application.getServletContextName(),servlet.getKey(), servlet.getValue().getMappings());
|
log.trace("servlet {} : {} {} ", application.getServletContextName(),servlet.getKey(), servlet.getValue().getMappings());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* if (context.configuration().secure() &&
|
|
||||||
container.configuration().securePort()==null)
|
|
||||||
throw new IllegalStateException(
|
|
||||||
String.format("Application %s cannot be managed because is declared as secure without a secure connector port declared in the container", context.application().getContextPath()));
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (context.container().configuration().mode()!=Mode.offline) {
|
if (context.container().configuration().mode()!=Mode.offline) {
|
||||||
context.configuration().startTokens(generateTokensForApplication(container).stream().collect(Collectors.toSet()));
|
context.configuration().authorizedContexts(context.container().configuration().allowedContexts());
|
||||||
context.configuration().validate();
|
context.configuration().validate();
|
||||||
|
//TODO take information from container to configure application
|
||||||
}
|
}
|
||||||
saveApplicationState();
|
saveApplicationState();
|
||||||
|
|
||||||
|
@ -93,8 +85,6 @@ public class ApplicationManager {
|
||||||
ApplicationHandlers handlers = provider().handlersFor(context);
|
ApplicationHandlers handlers = provider().handlersFor(context);
|
||||||
handlers.validate();
|
handlers.validate();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ApplicationExtensions extensions = provider().extensionsFor(context);
|
ApplicationExtensions extensions = provider().extensionsFor(context);
|
||||||
extensions.validate();
|
extensions.validate();
|
||||||
|
|
||||||
|
|
|
@ -10,29 +10,21 @@ import static org.gcube.smartgears.provider.ProviderFactory.provider;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.ObjectOutputStream;
|
import java.io.ObjectOutputStream;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.gcube.common.authorization.client.exceptions.ObjectNotFound;
|
|
||||||
import org.gcube.common.authorization.client.proxy.AuthorizationProxy;
|
|
||||||
import org.gcube.common.authorization.library.AuthorizationEntry;
|
|
||||||
import org.gcube.common.authorization.library.provider.ClientInfo;
|
|
||||||
import org.gcube.common.authorization.library.provider.ContainerInfo;
|
|
||||||
import org.gcube.common.events.Observes;
|
import org.gcube.common.events.Observes;
|
||||||
import org.gcube.common.events.Observes.Kind;
|
import org.gcube.common.events.Observes.Kind;
|
||||||
import org.gcube.smartgears.configuration.Mode;
|
import org.gcube.smartgears.configuration.Mode;
|
||||||
import org.gcube.smartgears.configuration.container.ContainerHandlers;
|
import org.gcube.smartgears.configuration.container.ContainerHandlers;
|
||||||
import org.gcube.smartgears.context.application.ApplicationContext;
|
import org.gcube.smartgears.context.application.ApplicationContext;
|
||||||
import org.gcube.smartgears.context.container.ContainerContext;
|
import org.gcube.smartgears.context.container.ContainerContext;
|
||||||
import org.gcube.smartgears.handlers.ProfileEvents;
|
|
||||||
import org.gcube.smartgears.handlers.container.ContainerHandler;
|
import org.gcube.smartgears.handlers.container.ContainerHandler;
|
||||||
import org.gcube.smartgears.handlers.container.ContainerLifecycleEvent;
|
import org.gcube.smartgears.handlers.container.ContainerLifecycleEvent;
|
||||||
import org.gcube.smartgears.handlers.container.ContainerPipeline;
|
import org.gcube.smartgears.handlers.container.ContainerPipeline;
|
||||||
import org.gcube.smartgears.lifecycle.application.ApplicationLifecycle;
|
import org.gcube.smartgears.lifecycle.application.ApplicationLifecycle;
|
||||||
import org.gcube.smartgears.lifecycle.container.ContainerState;
|
import org.gcube.smartgears.lifecycle.container.ContainerState;
|
||||||
import org.gcube.smartgears.security.AuthorizationProvider;
|
import org.gcube.smartgears.security.AuthorizationProvider;
|
||||||
import org.gcube.smartgears.security.Credentials;
|
|
||||||
import org.gcube.smartgears.utils.Utils;
|
import org.gcube.smartgears.utils.Utils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -49,8 +41,6 @@ public class ContainerManager {
|
||||||
|
|
||||||
public static ContainerManager instance = new ContainerManager();
|
public static ContainerManager instance = new ContainerManager();
|
||||||
|
|
||||||
private AuthorizationProvider authProvider = provider().authorizationProxy();
|
|
||||||
|
|
||||||
private ContainerContext context;
|
private ContainerContext context;
|
||||||
|
|
||||||
private ContainerPipeline pipeline;
|
private ContainerPipeline pipeline;
|
||||||
|
@ -113,57 +103,26 @@ public class ContainerManager {
|
||||||
private void validateContainer(ContainerContext context) {
|
private void validateContainer(ContainerContext context) {
|
||||||
//List<String> tokensToRemove = new ArrayList<String>();
|
//List<String> tokensToRemove = new ArrayList<String>();
|
||||||
context.configuration().validate();
|
context.configuration().validate();
|
||||||
Set<String> foundContexts= new HashSet<String>();
|
Set<String> foundContexts;
|
||||||
|
|
||||||
Credentials credential = context.configuration().credentials();
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
List<AuthorizationEntry> entries = authProvider.get(context.configuration().startTokens());
|
foundContexts = context.configuration().allowedContexts();
|
||||||
|
|
||||||
log.info("requesting auth on {} tokens returned {} entries", context.configuration().startTokens().size(),entries.size());
|
|
||||||
|
|
||||||
for (AuthorizationEntry entry : entries ) {
|
|
||||||
log.info("the container will be started in context {}",entry.getContext());
|
|
||||||
foundContexts.add(entry.getContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("error contacting auth service on container",e);
|
log.error("error authorizing container",e);
|
||||||
|
throw new RuntimeException("error authorizing container, moving the container to failed",e);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (foundContexts.isEmpty()){
|
if (foundContexts.isEmpty()){
|
||||||
log.error("no valid starting token are specified, moving the container to failed");
|
log.error("no valid contexts found, moving the container to failed");
|
||||||
throw new RuntimeException("no valid starting token are specified");
|
throw new RuntimeException("no valid contexts found, moving the container to failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//context.configuration().startTokens().removeAll(tokensToRemove);
|
//context.configuration().startTokens().removeAll(tokensToRemove);
|
||||||
context.configuration().allowedContexts(foundContexts);
|
context.configuration().allowedContexts(foundContexts);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String resolveTokenForAdd(Set<String> alreadyAddedContext, String token){
|
|
||||||
try {
|
|
||||||
AuthorizationEntry entry = authProvider.get(token);
|
|
||||||
ClientInfo info = entry.getClientInfo();
|
|
||||||
log.info("resolved authorization entry for container {}",entry);
|
|
||||||
if (alreadyAddedContext.contains(entry.getContext())){
|
|
||||||
log.warn("the token {} cannot be used, another token with the same context {} found ", entry.getContext());
|
|
||||||
} else if(!entry.getContext().startsWith("/"+context.configuration().infrastructure())){
|
|
||||||
log.warn("the token {} cannot be used, is not in the infrastructure {} of the container ", token,context.configuration().infrastructure());
|
|
||||||
}else if (!(info instanceof ContainerInfo)){
|
|
||||||
log.warn("the token {} cannot be used, is not for a container token ", token);
|
|
||||||
} else if (!((ContainerInfo)info).getHost().equals(context.configuration().hostname())
|
|
||||||
|| context.configuration().port()!=((ContainerInfo)info).getPort()){
|
|
||||||
log.warn("the token {} cannot be used, the client id {} resolved with the token is not the same of the one specified in this container ", token, info.getId());
|
|
||||||
} else
|
|
||||||
return entry.getContext();
|
|
||||||
}catch(ObjectNotFound onf){
|
|
||||||
log.error("token {} not valid", token);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("error contacting authorization for token {}",token,e);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void manage(ApplicationContext app) {
|
public void manage(ApplicationContext app) {
|
||||||
|
|
||||||
app.events().subscribe(this);
|
app.events().subscribe(this);
|
||||||
|
@ -175,40 +134,15 @@ public class ContainerManager {
|
||||||
context.lifecycle().tryMoveTo(ContainerState.partActive);
|
context.lifecycle().tryMoveTo(ContainerState.partActive);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Observes(value=ContextEvents.ADD_TOKEN_TO_CONTAINER,kind=Kind.critical)
|
@Observes(value=ContextEvents.ADD_CONTEXT_TO_CONTAINER,kind=Kind.critical)
|
||||||
void addToken(String token) {
|
void addContext(String context) {
|
||||||
log.trace("adding token {} to container", token);
|
log.trace("adding context {} to container", context);
|
||||||
String newContext;
|
|
||||||
if ((newContext = resolveTokenForAdd(context.configuration().allowedContexts(), token))!=null) {
|
|
||||||
context.configuration().startTokens().add(token);
|
|
||||||
context.configuration().allowedContexts().add(newContext);
|
|
||||||
saveContainerState();
|
|
||||||
//loadKeyForToken(Arrays.asList(token));
|
|
||||||
context.events().fire(token, ContextEvents.ADD_TOKEN_TO_APPLICATION);
|
|
||||||
context.events().fire(token, ProfileEvents.addToContext);
|
|
||||||
log.trace("token added and event fired");
|
|
||||||
} else log.warn("trying to add an invalid token");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Observes(value=ContextEvents.REMOVE_TOKEN_FROM_CONTAINER,kind=Kind.critical)
|
@Observes(value=ContextEvents.REMOVE_CONTEXT_FROM_CONTAINER,kind=Kind.critical)
|
||||||
void removeToken(String token) {
|
void removeContext(String context) {
|
||||||
log.trace("removing token {} from container", token);
|
log.trace("removing context {} from container", context);
|
||||||
AuthorizationEntry entry;
|
|
||||||
try {
|
|
||||||
entry = authProvider.get(token);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("error resolving token to remove");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (context.configuration().startTokens().contains(token)) {
|
|
||||||
context.configuration().startTokens().remove(token);
|
|
||||||
context.configuration().allowedContexts().remove(entry.getContext());
|
|
||||||
saveContainerState();
|
|
||||||
context.events().fire(token, ContextEvents.REMOVE_TOKEN_FROM_APPLICATION);
|
|
||||||
context.events().fire(token, ProfileEvents.removeFromContext);
|
|
||||||
log.trace("token removed and event fired");
|
|
||||||
} else log.warn("cannot remove token, it is not present in the container");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -5,6 +5,8 @@ import static org.gcube.smartgears.utils.Utils.fileAt;
|
||||||
import static org.gcube.smartgears.utils.Utils.notNull;
|
import static org.gcube.smartgears.utils.Utils.notNull;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
import org.gcube.common.validator.annotations.NotEmpty;
|
import org.gcube.common.validator.annotations.NotEmpty;
|
||||||
import org.gcube.common.validator.annotations.NotNull;
|
import org.gcube.common.validator.annotations.NotNull;
|
||||||
|
@ -50,9 +52,6 @@ public class LocalPersistence implements PersistenceWriter {
|
||||||
return fileAt(new File(location, path).getAbsolutePath()).toRead();
|
return fileAt(new File(location, path).getAbsolutePath()).toRead();
|
||||||
}
|
}
|
||||||
|
|
||||||
void initialize(){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void validate() {
|
public void validate() {
|
||||||
|
|
||||||
|
@ -62,4 +61,13 @@ public class LocalPersistence implements PersistenceWriter {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getFreeSpace() {
|
||||||
|
try {
|
||||||
|
return Files.getFileStore(Paths.get(location)).getUsableSpace();
|
||||||
|
}catch (Exception e) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
package org.gcube.smartgears.provider;
|
package org.gcube.smartgears.provider;
|
||||||
|
|
||||||
import static org.gcube.common.authorization.client.Constants.authorizationService;
|
import static org.gcube.smartgears.Constants.application_handlers_file_name;
|
||||||
import static org.gcube.smartgears.Constants.configuration_file_path;
|
import static org.gcube.smartgears.Constants.configuration_file_path;
|
||||||
import static org.gcube.smartgears.Constants.container_configuraton_file_path;
|
import static org.gcube.smartgears.Constants.container_configuraton_file_path;
|
||||||
import static org.gcube.smartgears.Constants.container_handlers_file_name;
|
import static org.gcube.smartgears.Constants.container_handlers_file_name;
|
||||||
import static org.gcube.smartgears.Constants.application_handlers_file_name;
|
|
||||||
import static org.gcube.smartgears.Constants.container_handlers_file_path;
|
import static org.gcube.smartgears.Constants.container_handlers_file_path;
|
||||||
import static org.gcube.smartgears.Constants.container_profile_file_path;
|
import static org.gcube.smartgears.Constants.container_profile_file_path;
|
||||||
import static org.gcube.smartgears.Constants.default_extensions_file_path;
|
import static org.gcube.smartgears.Constants.default_extensions_file_path;
|
||||||
|
@ -25,11 +24,10 @@ import java.net.URLClassLoader;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
import org.gcube.common.authorization.client.proxy.AuthorizationProxy;
|
|
||||||
import org.gcube.common.events.Hub;
|
import org.gcube.common.events.Hub;
|
||||||
import org.gcube.common.events.impl.DefaultHub;
|
import org.gcube.common.events.impl.DefaultHub;
|
||||||
import org.gcube.common.scan.ClasspathScanner;
|
import org.gcube.common.scan.ClasspathScanner;
|
||||||
|
@ -56,7 +54,7 @@ import org.gcube.smartgears.context.container.ContainerContext;
|
||||||
import org.gcube.smartgears.context.container.DefaultContainerContext;
|
import org.gcube.smartgears.context.container.DefaultContainerContext;
|
||||||
import org.gcube.smartgears.lifecycle.application.ApplicationLifecycle;
|
import org.gcube.smartgears.lifecycle.application.ApplicationLifecycle;
|
||||||
import org.gcube.smartgears.lifecycle.container.ContainerLifecycle;
|
import org.gcube.smartgears.lifecycle.container.ContainerLifecycle;
|
||||||
import org.gcube.smartgears.persistence.DefaultPersistence;
|
import org.gcube.smartgears.security.AuthorizationProvider;
|
||||||
import org.gcube.smartgears.utils.Utils;
|
import org.gcube.smartgears.utils.Utils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -74,24 +72,33 @@ public class DefaultProvider implements Provider {
|
||||||
private ContainerContext containerContext;
|
private ContainerContext containerContext;
|
||||||
//TODO: do the same with applicationContext (with a map)
|
//TODO: do the same with applicationContext (with a map)
|
||||||
|
|
||||||
|
|
||||||
|
private File configFile = null;
|
||||||
|
|
||||||
|
protected DefaultProvider(File configFile) {
|
||||||
|
this.configFile = configFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected DefaultProvider(){};
|
protected DefaultProvider(){};
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Override
|
@Override
|
||||||
public ContainerContext containerContext() {
|
public ContainerContext containerContext() {
|
||||||
|
|
||||||
if(containerContext==null){
|
if(containerContext==null){
|
||||||
ContainerConfiguration configuration = containerConfiguration();
|
ContainerConfiguration configuration = containerConfiguration();
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
if (configuration.persistence()==null) {
|
if (configuration.persistence()==null) {
|
||||||
String location = Utils.home()+"/state";
|
String location = Utils.home()+"/state";
|
||||||
File dir = new File(location);
|
File dir = new File(location);
|
||||||
if (!dir.exists())
|
if (!dir.exists())
|
||||||
dir.mkdirs();
|
dir.mkdirs();
|
||||||
configuration.persistence(new DefaultPersistence(location));
|
configuration.persistence(new LocalPersistence(location));
|
||||||
|
|
||||||
log.trace("setting persistence location for container @ {}",dir.getAbsolutePath());
|
log.trace("setting persistence location for container @ {}",dir.getAbsolutePath());
|
||||||
}
|
}*/
|
||||||
|
|
||||||
Hub hub = new DefaultHub();
|
Hub hub = new DefaultHub();
|
||||||
|
|
||||||
|
@ -100,12 +107,10 @@ public class DefaultProvider implements Provider {
|
||||||
File file = configuration.persistence().file(container_profile_file_path);
|
File file = configuration.persistence().file(container_profile_file_path);
|
||||||
|
|
||||||
String id = null;
|
String id = null;
|
||||||
List<String> tokens = null;
|
|
||||||
if (file.exists()){
|
if (file.exists()){
|
||||||
log.info("loading persisted state for container");
|
log.info("loading persisted state for container");
|
||||||
try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))){
|
try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))){
|
||||||
id = (String)ois.readObject();
|
id = (String)ois.readObject();
|
||||||
tokens = (List<String>) ois.readObject();
|
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
log.error("error loading persisted state, creating new uuid",e);
|
log.error("error loading persisted state, creating new uuid",e);
|
||||||
}
|
}
|
||||||
|
@ -117,9 +122,6 @@ public class DefaultProvider implements Provider {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tokens!=null)
|
|
||||||
configuration.startTokens(tokens);
|
|
||||||
|
|
||||||
containerContext = new DefaultContainerContext(id, configuration, hub, lifecycle, new Properties());
|
containerContext = new DefaultContainerContext(id, configuration, hub, lifecycle, new Properties());
|
||||||
}
|
}
|
||||||
return containerContext;
|
return containerContext;
|
||||||
|
@ -190,8 +192,6 @@ public class DefaultProvider implements Provider {
|
||||||
ApplicationConfiguration embedded = configurationFor(application);
|
ApplicationConfiguration embedded = configurationFor(application);
|
||||||
ApplicationConfiguration external = context.configuration().app(application.getContextPath());
|
ApplicationConfiguration external = context.configuration().app(application.getContextPath());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//shouldn't happen: management shouldn't have started at all
|
//shouldn't happen: management shouldn't have started at all
|
||||||
if (embedded==null && external==null)
|
if (embedded==null && external==null)
|
||||||
throw new AssertionError("application @ "+application.getContextPath()+" is not distributed with "
|
throw new AssertionError("application @ "+application.getContextPath()+" is not distributed with "
|
||||||
|
@ -349,14 +349,8 @@ public class DefaultProvider implements Provider {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
InputStream config = getClass().getResourceAsStream(library_configuration_file_path);
|
SmartGearsConfiguration configuration = new SmartGearsConfiguration();
|
||||||
|
configuration.version(System.getProperty("projectVersion"));
|
||||||
if (config == null)
|
|
||||||
throw new IllegalStateException("invalid distribution: cannot find " + library_configuration_file_path);
|
|
||||||
|
|
||||||
SmartGearsConfigurationBinder binder = new SmartGearsConfigurationBinder();
|
|
||||||
|
|
||||||
SmartGearsConfiguration configuration = binder.bind(config);
|
|
||||||
|
|
||||||
configuration.validate();
|
configuration.validate();
|
||||||
|
|
||||||
|
@ -371,7 +365,6 @@ public class DefaultProvider implements Provider {
|
||||||
}
|
}
|
||||||
|
|
||||||
// helpers
|
// helpers
|
||||||
|
|
||||||
private ApplicationConfiguration configurationFor(ServletContext application) {
|
private ApplicationConfiguration configurationFor(ServletContext application) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -394,6 +387,8 @@ public class DefaultProvider implements Provider {
|
||||||
|
|
||||||
private ContainerConfiguration containerConfiguration() {
|
private ContainerConfiguration containerConfiguration() {
|
||||||
|
|
||||||
|
if (configFile==null) {
|
||||||
|
|
||||||
String home = Utils.home();
|
String home = Utils.home();
|
||||||
|
|
||||||
if (home == null)
|
if (home == null)
|
||||||
|
@ -405,65 +400,35 @@ public class DefaultProvider implements Provider {
|
||||||
if (!(homeDir.exists() && homeDir.isDirectory() && homeDir.canRead() && homeDir.canWrite()))
|
if (!(homeDir.exists() && homeDir.isDirectory() && homeDir.canRead() && homeDir.canWrite()))
|
||||||
throw new IllegalStateException("invalid node configuration: home "+home+" does not exist or is not a directory or cannot be accessed in read/write mode");
|
throw new IllegalStateException("invalid node configuration: home "+home+" does not exist or is not a directory or cannot be accessed in read/write mode");
|
||||||
|
|
||||||
File config = new File(homeDir,container_configuraton_file_path);
|
configFile = new File(homeDir,container_configuraton_file_path);
|
||||||
|
|
||||||
if (!(config.exists() && config.canRead()))
|
|
||||||
throw new IllegalStateException("invalid node configuration: file "+config.getAbsolutePath()+" does not exist or cannot be accessed");
|
|
||||||
|
|
||||||
|
|
||||||
log.trace("reading container configuration @ {} ", config.getAbsolutePath());
|
log.trace("reading container configuration @ {} ", configFile.getAbsolutePath());
|
||||||
|
|
||||||
ContainerConfigurationBinder binder = new ContainerConfigurationBinder();
|
|
||||||
|
|
||||||
FileInputStream stream = null;
|
|
||||||
try {
|
|
||||||
|
|
||||||
stream = new FileInputStream(config);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch(Exception e) {
|
|
||||||
throw new RuntimeException("unexpected exception reading container configuration file see cause)",e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ContainerConfiguration configuration = binder.bind(stream);
|
if (!(configFile.exists() && configFile.canRead()))
|
||||||
|
throw new IllegalStateException("invalid node configuration: file "+configFile.getAbsolutePath()+" does not exist or cannot be accessed");
|
||||||
|
|
||||||
try {
|
ContainerConfiguration configuration;
|
||||||
stream.close();
|
try (InputStream stream = new FileInputStream(configFile)){
|
||||||
}
|
configuration= ContainerConfiguration.load(stream);
|
||||||
catch(Exception e) {
|
}catch (Exception e) {
|
||||||
log.warn("could not close stream when reading container configuration @ "+config.getAbsolutePath()+" (see cause)",e);
|
throw new IllegalStateException("invalid node configuration: file "+configFile.getAbsolutePath()+" is invalid");
|
||||||
}
|
}
|
||||||
|
|
||||||
return configuration;
|
return configuration;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
@Override
|
|
||||||
public RegistryPublisher publisherFor(ContainerContext context) {
|
|
||||||
return context.configuration().mode()==Mode.online?
|
|
||||||
RegistryPublisherFactory.create(): new OfflinePublisher();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RegistryPublisher publisherFor(ApplicationContext context) {
|
public ScopedPublisher publisher() {
|
||||||
return context.configuration().mode()==Mode.online?
|
return containerContext.configuration().mode()==Mode.online? RegistryPublisherFactory.scopedPublisher()
|
||||||
RegistryPublisherFactory.create(): new OfflinePublisher();
|
|
||||||
}*/
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ScopedPublisher publisherFor(ContainerContext context) {
|
|
||||||
return context.configuration().mode()==Mode.online? RegistryPublisherFactory.scopedPublisher()
|
|
||||||
: new OfflinePublisher();
|
: new OfflinePublisher();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ScopedPublisher publisherFor(ApplicationContext context) {
|
|
||||||
return context.configuration().mode()==Mode.online? RegistryPublisherFactory.scopedPublisher()
|
|
||||||
: new OfflinePublisher();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AuthorizationProxy authorizationProxy() {
|
public AuthorizationProvider authorizationProvider() {
|
||||||
return authorizationService();
|
return containerContext.configuration().authorizationProvider();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package org.gcube.smartgears.provider;
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
|
|
||||||
import org.gcube.common.authorization.client.proxy.AuthorizationProxy;
|
|
||||||
import org.gcube.informationsystem.publisher.ScopedPublisher;
|
import org.gcube.informationsystem.publisher.ScopedPublisher;
|
||||||
import org.gcube.smartgears.configuration.application.ApplicationExtensions;
|
import org.gcube.smartgears.configuration.application.ApplicationExtensions;
|
||||||
import org.gcube.smartgears.configuration.application.ApplicationHandlers;
|
import org.gcube.smartgears.configuration.application.ApplicationHandlers;
|
||||||
|
@ -43,10 +42,9 @@ public interface Provider {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an implementation of the IS publisher for the container
|
* Returns an implementation of the IS publisher for the container
|
||||||
* @param application the context of the container
|
|
||||||
* @return the publisher implementation
|
* @return the publisher implementation
|
||||||
*/
|
*/
|
||||||
ScopedPublisher publisherFor(ContainerContext application);
|
ScopedPublisher publisher();
|
||||||
|
|
||||||
//application-level dependencies
|
//application-level dependencies
|
||||||
|
|
||||||
|
@ -74,17 +72,9 @@ public interface Provider {
|
||||||
ApplicationExtensions extensionsFor(ApplicationContext application);
|
ApplicationExtensions extensionsFor(ApplicationContext application);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an implementation of the IS publisher for a given application
|
* Returns the authorization provider for this node
|
||||||
* @param application the context of the application
|
* @return the AuthorizationProvider implementation
|
||||||
* @return the publisher implementation
|
|
||||||
*/
|
*/
|
||||||
ScopedPublisher publisherFor(ApplicationContext application);
|
AuthorizationProvider authorizationProvider();
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an implementation of the IS publisher for a given application
|
|
||||||
* @param application the context of the application
|
|
||||||
* @return the publisher implementation
|
|
||||||
*/
|
|
||||||
AuthorizationProvider authorizationProxy();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
package org.gcube.smartgears.security;
|
package org.gcube.smartgears.security;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Set;
|
||||||
|
|
||||||
public interface AuthorizationProvider {
|
public interface AuthorizationProvider {
|
||||||
|
|
||||||
void connect(Credentials credentials) throws Exception;
|
void connect(Credentials credentials) throws Exception;
|
||||||
|
|
||||||
Collection<String> getAllowedContexts();
|
Set<String> getAllowedContexts();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package org.gcube.smartgears.security;
|
package org.gcube.smartgears.security;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class DefaultAuthorizationProvider implements AuthorizationProvider {
|
public class DefaultAuthorizationProvider implements AuthorizationProvider {
|
||||||
|
|
||||||
|
@ -11,4 +11,9 @@ public class DefaultAuthorizationProvider implements AuthorizationProvider {
|
||||||
this.credentials = (SimpleCredentials)credentials;
|
this.credentials = (SimpleCredentials)credentials;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getAllowedContexts() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,41 +1,38 @@
|
||||||
package app;
|
package app;
|
||||||
|
|
||||||
import static com.sun.jersey.api.client.Client.create;
|
|
||||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
|
||||||
import static org.gcube.smartgears.Constants.scope_header;
|
|
||||||
import static org.gcube.smartgears.extensions.HttpExtension.Method.DELETE;
|
|
||||||
import static org.gcube.smartgears.extensions.HttpExtension.Method.GET;
|
|
||||||
import static utils.TestUtils.context_root;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import javax.ws.rs.HttpMethod;
|
||||||
|
import javax.ws.rs.client.Client;
|
||||||
|
import javax.ws.rs.client.ClientBuilder;
|
||||||
|
import javax.ws.rs.client.Invocation.Builder;
|
||||||
|
|
||||||
import org.gcube.common.authorization.library.provider.AuthorizationProvider;
|
import org.gcube.common.authorization.library.provider.AuthorizationProvider;
|
||||||
import org.gcube.common.authorization.library.provider.UserInfo;
|
import org.gcube.common.authorization.library.provider.UserInfo;
|
||||||
import org.gcube.common.authorization.library.utils.Caller;
|
import org.gcube.common.authorization.library.utils.Caller;
|
||||||
import org.gcube.smartgears.extensions.HttpExtension.Method;
|
import org.glassfish.jersey.client.ClientConfig;
|
||||||
|
import org.glassfish.jersey.client.ClientResponse;
|
||||||
|
import org.glassfish.jersey.logging.LoggingFeature;
|
||||||
|
|
||||||
import utils.TestUtils;
|
import utils.TestUtils;
|
||||||
|
|
||||||
import com.sun.jersey.api.client.Client;
|
|
||||||
import com.sun.jersey.api.client.ClientResponse;
|
|
||||||
import com.sun.jersey.api.client.UniformInterfaceException;
|
|
||||||
import com.sun.jersey.api.client.WebResource.Builder;
|
|
||||||
import com.sun.jersey.api.client.filter.LoggingFilter;
|
|
||||||
import com.sun.jersey.core.header.OutBoundHeaders;
|
|
||||||
|
|
||||||
|
|
||||||
public class Request {
|
public class Request {
|
||||||
|
|
||||||
private String path="";
|
private String path="";
|
||||||
private String scope = TestUtils.scope;
|
private String scope = TestUtils.scope;
|
||||||
|
|
||||||
private OutBoundHeaders headers = new OutBoundHeaders();
|
//private OutBoundHeaders headers = new OutBoundHeaders();
|
||||||
private Method method = GET;
|
private String method = HttpMethod.GET;
|
||||||
private String body = null;
|
private String body = null;
|
||||||
private boolean logged = false;
|
private boolean logged = false;
|
||||||
|
Map<String, List<Object>> headers = new HashMap<>();
|
||||||
|
|
||||||
public static Request request() {
|
public static Request request() {
|
||||||
return new Request();
|
return new Request();
|
||||||
|
@ -66,11 +63,11 @@ public class Request {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Request with(String name, String value) {
|
public Request with(String name, String value) {
|
||||||
this.headers.add(name, value);
|
this.headers.put(name, value);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Request using(Method method) {
|
public Request using(String method) {
|
||||||
this.method=method;
|
this.method=method;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -83,7 +80,7 @@ public class Request {
|
||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Method method() {
|
public String method() {
|
||||||
return method;
|
return method;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +98,7 @@ public class Request {
|
||||||
|
|
||||||
class Box {
|
class Box {
|
||||||
|
|
||||||
volatile UniformInterfaceException failure;
|
volatile Exception failure;
|
||||||
volatile ClientResponse response;
|
volatile ClientResponse response;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -116,35 +113,43 @@ public class Request {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
Client client = create();
|
ClientConfig config = new ClientConfig();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Client client = ClientBuilder.newClient();
|
||||||
|
|
||||||
|
|
||||||
if (logged)
|
if (logged)
|
||||||
client.addFilter(new LoggingFilter(System.err));
|
client.register(new LoggingFeature(Logger.getLogger(getClass().getName())));
|
||||||
|
|
||||||
|
Builder builder = client.target(address(path,port)).request();
|
||||||
|
builder.header("gcube-scope", scope);
|
||||||
|
|
||||||
|
|
||||||
Builder builder = client.resource(address(path,port))
|
|
||||||
.entity(body).header(scope_header, scope);
|
|
||||||
|
|
||||||
for (Entry<String,List<Object>> header : headers.entrySet())
|
for (Entry<String,List<Object>> header : headers.entrySet())
|
||||||
for (Object value : header.getValue())
|
for (Object value : header.getValue())
|
||||||
builder.header(header.getKey(), value);
|
builder.header(header.getKey(), value);
|
||||||
|
|
||||||
if (method==DELETE)
|
if (method.equals(HttpMethod.DELETE))
|
||||||
builder.delete();
|
builder.delete();
|
||||||
else {
|
else {
|
||||||
|
|
||||||
System.err.println("making request @ "+address(path,port));
|
System.err.println("making request @ "+address(path,port));
|
||||||
|
|
||||||
ClientResponse response = builder.method(method.name(),ClientResponse.class);
|
ClientResponse response = builder.method(method,ClientResponse.class);
|
||||||
|
|
||||||
//throws an exception if there response has error status
|
//throws an exception if there response has error status
|
||||||
if (response.getStatus()>300)
|
if (response.getStatus()>300)
|
||||||
throw new UniformInterfaceException(response);
|
throw new Exception(response.getStatus());
|
||||||
|
|
||||||
box.response=response;
|
box.response=response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} catch (UniformInterfaceException t) {
|
} catch (Exception t) {
|
||||||
box.failure=t;
|
box.failure=t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,7 +159,7 @@ public class Request {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (!latch.await(2000, MILLISECONDS))
|
if (!latch.await(2000, TimeUnit.MILLISECONDS))
|
||||||
throw new RuntimeException("application has not responded in time");
|
throw new RuntimeException("application has not responded in time");
|
||||||
|
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
|
|
|
@ -65,7 +65,7 @@ public class SomeApp {
|
||||||
private ApplicationConfiguration configuration;
|
private ApplicationConfiguration configuration;
|
||||||
private ApplicationHandlers handlers = new ApplicationHandlers();
|
private ApplicationHandlers handlers = new ApplicationHandlers();
|
||||||
private ApplicationExtensions extensions = new ApplicationExtensions();
|
private ApplicationExtensions extensions = new ApplicationExtensions();
|
||||||
private TestProvider provider = new TestProvider();
|
private TestProvider provider = new TestProvider(new File("src/test/resources/test-configuration.ini"));
|
||||||
private boolean deployHandlers = true;
|
private boolean deployHandlers = true;
|
||||||
private boolean deployExtensions = true;
|
private boolean deployExtensions = true;
|
||||||
private boolean deployConfiguration = true;
|
private boolean deployConfiguration = true;
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
package test;
|
|
||||||
|
|
||||||
import static junit.framework.Assert.*;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
|
|
||||||
import org.gcube.smartgears.configuration.library.SmartGearsConfiguration;
|
|
||||||
import org.gcube.smartgears.configuration.library.SmartGearsConfigurationBinder;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
public class SmartgearsConfigurationTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void configurationBinds() throws Exception {
|
|
||||||
|
|
||||||
String xml = "<smartgears version='1.0.0-SNAPSHOT'/>";
|
|
||||||
|
|
||||||
SmartGearsConfigurationBinder binder = new SmartGearsConfigurationBinder();
|
|
||||||
|
|
||||||
SmartGearsConfiguration bound = binder.bind(new ByteArrayInputStream(xml.getBytes()));
|
|
||||||
|
|
||||||
bound.validate();
|
|
||||||
|
|
||||||
String version = bound.version();
|
|
||||||
assertEquals("1.0.0-SNAPSHOT",version);
|
|
||||||
|
|
||||||
assertEquals(sampleSmartgearsConfiguration(),bound);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private SmartGearsConfiguration sampleSmartgearsConfiguration() {
|
|
||||||
|
|
||||||
return new SmartGearsConfiguration().version("1.0.0-SNAPSHOT");
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -33,7 +33,7 @@ public class ProfileManagementTest {
|
||||||
@Test
|
@Test
|
||||||
public void createsStoresAndPublishesAValidProfile() throws Exception {
|
public void createsStoresAndPublishesAValidProfile() throws Exception {
|
||||||
|
|
||||||
GCoreEndpoint profile = ctx.profile(GCoreEndpoint.class);
|
GCoreEndpoint profile = ctx.profile();
|
||||||
|
|
||||||
assertNotNull(profile);
|
assertNotNull(profile);
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ public class ProfileManagementTest {
|
||||||
ApplicationContext ctx = runtwice.start();
|
ApplicationContext ctx = runtwice.start();
|
||||||
|
|
||||||
|
|
||||||
GCoreEndpoint profile = ctx.profile(GCoreEndpoint.class);
|
GCoreEndpoint profile = ctx.profile();
|
||||||
|
|
||||||
assertNotNull(profile);
|
assertNotNull(profile);
|
||||||
|
|
||||||
|
|
|
@ -81,8 +81,8 @@ public class RemoteResourceTest {
|
||||||
|
|
||||||
GCoreEndpoint profile = Resources.unmarshal(GCoreEndpoint.class, new StringReader(outcome));
|
GCoreEndpoint profile = Resources.unmarshal(GCoreEndpoint.class, new StringReader(outcome));
|
||||||
|
|
||||||
assertEquals(context.profile(GCoreEndpoint.class).id(), profile.id());
|
assertEquals(context.profile().id(), profile.id());
|
||||||
assertEquals(context.profile(GCoreEndpoint.class).profile().deploymentData().status(), profile.profile().deploymentData().status());
|
assertEquals(context.profile().profile().deploymentData().status(), profile.profile().deploymentData().status());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ import org.gcube.smartgears.handlers.application.ApplicationEvent;
|
||||||
import org.gcube.smartgears.handlers.application.ApplicationLifecycleEvent.Start;
|
import org.gcube.smartgears.handlers.application.ApplicationLifecycleEvent.Start;
|
||||||
import org.gcube.smartgears.handlers.application.ApplicationLifecycleHandler;
|
import org.gcube.smartgears.handlers.application.ApplicationLifecycleHandler;
|
||||||
import org.gcube.smartgears.handlers.application.RequestHandler;
|
import org.gcube.smartgears.handlers.application.RequestHandler;
|
||||||
import org.gcube.smartgears.persistence.DefaultPersistence;
|
import org.gcube.smartgears.persistence.LocalPersistence;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mockito.Matchers;
|
import org.mockito.Matchers;
|
||||||
|
@ -162,7 +162,7 @@ public class StartupTest {
|
||||||
public void canUseMergedConfiguration() {
|
public void canUseMergedConfiguration() {
|
||||||
|
|
||||||
ApplicationConfiguration config = new DefaultApplicationConfiguration();
|
ApplicationConfiguration config = new DefaultApplicationConfiguration();
|
||||||
config.persistence(new DefaultPersistence(new File(".").getAbsolutePath()));
|
config.persistence(new LocalPersistence(new File(".").getAbsolutePath()));
|
||||||
|
|
||||||
ApplicationContext context = app.start();
|
ApplicationContext context = app.start();
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,5 @@ public class ConfigurationTest {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
ini.store(sw);
|
ini.store(sw);
|
||||||
|
|
||||||
System.out.println(sw.toString());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ public class ProfileManagementTest {
|
||||||
|
|
||||||
ContainerContext ctx = startAppAndGetContainerContext();
|
ContainerContext ctx = startAppAndGetContainerContext();
|
||||||
|
|
||||||
HostingNode node = ctx.profile(HostingNode.class);
|
HostingNode node = ctx.profile();
|
||||||
|
|
||||||
assertNotNull(node);
|
assertNotNull(node);
|
||||||
|
|
||||||
|
@ -49,9 +49,9 @@ public class ProfileManagementTest {
|
||||||
|
|
||||||
ContainerContext ctx = runtwice.start().container();
|
ContainerContext ctx = runtwice.start().container();
|
||||||
|
|
||||||
assertNotNull(ctx.profile(HostingNode.class));
|
assertNotNull(ctx.profile());
|
||||||
|
|
||||||
HostingNode node = ctx.profile(HostingNode.class);
|
HostingNode node = ctx.profile();
|
||||||
|
|
||||||
Resources.validate(node);
|
Resources.validate(node);
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ public class ProfileManagementTest {
|
||||||
|
|
||||||
SomeApp app = new SomeApp();
|
SomeApp app = new SomeApp();
|
||||||
|
|
||||||
app.containerConfiguration().publicationFrequency(1);
|
//app.containerConfiguration().publicationFrequency(1);
|
||||||
|
|
||||||
ContainerContext ctx = app.start().container();
|
ContainerContext ctx = app.start().container();
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ public class StartupTest {
|
||||||
@Test(expected=RuntimeException.class)
|
@Test(expected=RuntimeException.class)
|
||||||
public void failsIfConfigurationIsInvalid() {
|
public void failsIfConfigurationIsInvalid() {
|
||||||
|
|
||||||
app.containerConfiguration().hostname(null);
|
//app.containerConfiguration().hostname(null);
|
||||||
|
|
||||||
app.start();
|
app.start();
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package test.container;
|
package utils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
|
@ -13,12 +13,12 @@ public class PersistenceWriterTest implements PersistenceWriter{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public File file(String path) {
|
public File file(String path) {
|
||||||
return null;
|
return new File(location+"/"+path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public File writefile(String path) {
|
public File writefile(String path) {
|
||||||
return null;
|
return new File(location+"/"+path);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLocation() {
|
public String getLocation() {
|
||||||
|
@ -29,4 +29,9 @@ public class PersistenceWriterTest implements PersistenceWriter{
|
||||||
this.location = location;
|
this.location = location;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getFreeSpace() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,17 +1,24 @@
|
||||||
package utils;
|
package utils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
|
|
||||||
import org.gcube.informationsystem.publisher.ScopedPublisher;
|
import org.gcube.informationsystem.publisher.ScopedPublisher;
|
||||||
import org.gcube.smartgears.configuration.application.ApplicationConfiguration;
|
import org.gcube.smartgears.configuration.application.ApplicationConfiguration;
|
||||||
import org.gcube.smartgears.configuration.application.ApplicationExtensions;
|
import org.gcube.smartgears.configuration.application.ApplicationExtensions;
|
||||||
import org.gcube.smartgears.configuration.application.ApplicationHandlers;
|
import org.gcube.smartgears.configuration.application.ApplicationHandlers;
|
||||||
|
import org.gcube.smartgears.configuration.library.SmartGearsConfiguration;
|
||||||
import org.gcube.smartgears.context.application.ApplicationContext;
|
import org.gcube.smartgears.context.application.ApplicationContext;
|
||||||
import org.gcube.smartgears.context.container.ContainerContext;
|
import org.gcube.smartgears.context.container.ContainerContext;
|
||||||
import org.gcube.smartgears.provider.DefaultProvider;
|
import org.gcube.smartgears.provider.DefaultProvider;
|
||||||
|
|
||||||
public class TestProvider extends DefaultProvider {
|
public class TestProvider extends DefaultProvider {
|
||||||
|
|
||||||
|
public TestProvider(File configFile) {
|
||||||
|
super(configFile);
|
||||||
|
}
|
||||||
|
|
||||||
public ApplicationContext context;
|
public ApplicationContext context;
|
||||||
public ApplicationConfiguration configuration;
|
public ApplicationConfiguration configuration;
|
||||||
public ApplicationHandlers handlers;
|
public ApplicationHandlers handlers;
|
||||||
|
@ -34,9 +41,18 @@ public class TestProvider extends DefaultProvider {
|
||||||
this.extensions=extensions;
|
this.extensions=extensions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ScopedPublisher publisherFor(ApplicationContext context) {
|
public SmartGearsConfiguration smartgearsConfiguration() {
|
||||||
return publisher==null?super.publisherFor(context):publisher;
|
SmartGearsConfiguration conf = new SmartGearsConfiguration();
|
||||||
|
conf.version("0.0.1-TEST");
|
||||||
|
return conf ;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ScopedPublisher publisher() {
|
||||||
|
return publisher==null?super.publisher():publisher;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[node]
|
[node]
|
||||||
; mandatory
|
; mandatory
|
||||||
; optional fields: mode (online), publication-frequency-seconds (=60), authorizeChildrenContext (=false)
|
; optional fields: mode (=online), publication-frequency-seconds (=60), authorizeChildrenContext (=false)
|
||||||
mode = offline
|
mode = offline
|
||||||
hostname = localhost
|
hostname = localhost
|
||||||
protocol= https
|
protocol= https
|
||||||
|
@ -16,10 +16,9 @@ SmartGearsDistributionBundle = UnBundled
|
||||||
|
|
||||||
[site]
|
[site]
|
||||||
; mandatory
|
; mandatory
|
||||||
|
; optional fields: latitude, logitude
|
||||||
country = it
|
country = it
|
||||||
location = rome
|
location = rome
|
||||||
latitude = 41.9000
|
|
||||||
longitude = 12.5000
|
|
||||||
|
|
||||||
[proxy]
|
[proxy]
|
||||||
; not mandatory
|
; not mandatory
|
||||||
|
@ -29,7 +28,7 @@ port = 80
|
||||||
|
|
||||||
[authorization]
|
[authorization]
|
||||||
; mandatory
|
; mandatory
|
||||||
; optional fields: provider (org.gcube.smartgears.security.DefaultAuthorizationProvider)
|
; optional fields: provider (=org.gcube.smartgears.security.DefaultAuthorizationProvider)
|
||||||
provider = org.gcube.smartgears.security.DefaultAuthorizationProvider
|
provider = org.gcube.smartgears.security.DefaultAuthorizationProvider
|
||||||
credentials.class = org.gcube.smartgears.security.SimpleCredentials
|
credentials.class = org.gcube.smartgears.security.SimpleCredentials
|
||||||
credentials.clientID = testClient
|
credentials.clientID = testClient
|
||||||
|
@ -37,5 +36,5 @@ credentials.secret = testSecret
|
||||||
|
|
||||||
[persistence]
|
[persistence]
|
||||||
; not mandatory (default is LocalPersistence writing in the ghn home)
|
; not mandatory (default is LocalPersistence writing in the ghn home)
|
||||||
class = test.container.PersistenceWriterTest
|
class = utils.PersistenceWriterTest
|
||||||
location = /state
|
location = /tmp
|
||||||
|
|
Loading…
Reference in New Issue