Configuration

This commit is contained in:
Fabio Sinibaldi 2022-03-10 18:15:10 +01:00
parent 6afc72b304
commit b827ba2f13
48 changed files with 395 additions and 235 deletions

View File

@ -14,45 +14,25 @@ import java.time.temporal.TemporalAmount;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@RequiredArgsConstructor
public abstract class AbstractScopedMap<T> implements Engine<T>{
/**
* TTL Map Context -> T
*
*/
public abstract class AbstractScopedMap<T> extends TimedMap<String,T> implements Engine<T>{
// scope-> object
private ConcurrentHashMap<String, TTLObject<T>> scopeMap=new ConcurrentHashMap<String,TTLObject<T>>();
@Setter
private TemporalAmount TTL=null;
@NonNull
private String name;
@Synchronized
public T getObject() throws ConfigurationException {
String currentScope= ContextUtils.getCurrentScope();
log.debug(name+" : obtaining object for context "+currentScope);
TTLObject<T> found=scopeMap.get(currentScope);
if(found== null){
log.debug(name+" : init object for context "+currentScope);
TTLObject<T> toPut=new TTLObject<T>(LocalDateTime.now(),retrieveObject());
scopeMap.put(currentScope, toPut);
return toPut.getTheObject();
}
if(TTL!=null) {
if(found.getCreationTime().plus(TTL).isBefore(LocalDateTime.now())) {
log.debug(name+" : elapsed TTL, disposing..");
dispose(found.getTheObject());
TTLObject<T> newer=new TTLObject<T>(LocalDateTime.now(),retrieveObject());
scopeMap.put(currentScope, newer);
found=scopeMap.get(currentScope);
}
}else {log.debug(name+" : TTL is null, never disposing..");}
log.debug(name+"Returning {} ",found);
return found.getTheObject();
public AbstractScopedMap(@NonNull String name) {
super(name);
}
@Override
public T getObject() throws ConfigurationException {
return get(ContextUtils.getCurrentScope());
}
@Override
public void init() {}
@Override
public void shutdown() {
log.warn(name + ": shutting down");
@ -60,15 +40,9 @@ public abstract class AbstractScopedMap<T> implements Engine<T>{
try{if(o!=null&&o.getTheObject()!=null)
dispose(o.getTheObject());
}catch(Throwable t) {
log.warn(name +": unable to dispose ",t);
log.warn(name +": unable to dispose ",t);
}
});
}
protected abstract T retrieveObject() throws ConfigurationException;
protected void dispose(T toDispose){};
@Override
public void init() {}
}

View File

@ -0,0 +1,8 @@
package org.gcube.application.cms.caches;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
public interface Cache<K,V>{
public V get(K key) throws ConfigurationException;
}

View File

@ -0,0 +1,58 @@
package org.gcube.application.cms.caches;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
import org.gcube.application.geoportal.common.utils.ContextUtils;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAmount;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@RequiredArgsConstructor
public abstract class TimedMap <K,V> implements Cache<K,V> {
protected ConcurrentHashMap<K, TTLObject<V>> scopeMap=new ConcurrentHashMap<K,TTLObject<V>>();
@Setter
@Getter
protected TemporalAmount TTL=null;
@NonNull
protected String name;
@Override
public V get(K key) throws ConfigurationException {
log.trace(name+" : obtaining object by "+key);
TTLObject<V> found=scopeMap.get(key);
if(found== null){
log.debug(name+" : init object for key "+key);
TTLObject<V> toPut=new TTLObject<V>(LocalDateTime.now(),retrieveObject(key));
scopeMap.put(key, toPut);
return toPut.getTheObject();
}
if(getTTL()!=null) {
if(found.getCreationTime().plus(getTTL()).isBefore(LocalDateTime.now())) {
log.debug(name+" : elapsed TTL, disposing..");
dispose(found.getTheObject());
TTLObject<V> newer=new TTLObject<V>(LocalDateTime.now(),retrieveObject(key));
scopeMap.put(key, newer);
found=scopeMap.get(key);
}
}else {log.debug(name+" : TTL is null, never disposing..");}
log.debug(name+"Returning {} ",found);
return found.getTheObject();
}
protected abstract V retrieveObject(K key) throws ConfigurationException;
protected void dispose(V toDispose){};
}

View File

@ -2,6 +2,7 @@ package org.gcube.application.cms.implementations;
import lombok.Synchronized;
import org.gcube.application.cms.caches.Cache;
import org.gcube.application.cms.caches.Engine;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
@ -24,13 +25,13 @@ public class ImplementationProvider {
return (T) implementationsRegistry.get(clazz).getObject();
}
private ConcurrentHashMap<Class,Engine> implementationsRegistry=new ConcurrentHashMap<>();
public <T> void setEngine(Engine<T> engine, Class<T> clazz){
implementationsRegistry.put(clazz,engine);
}
private ImplementationProvider(){
//Defaults
setEngine(new DefaultISProvider(),ISInterface.class);

View File

@ -7,7 +7,7 @@ import org.gcube.application.cms.plugins.reports.EventExecutionReport;
import org.gcube.application.cms.plugins.reports.StepExecutionReport;
import org.gcube.application.cms.plugins.requests.EventExecutionRequest;
import org.gcube.application.cms.plugins.requests.StepExecutionRequest;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;

View File

@ -9,7 +9,6 @@ import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException;
import org.gcube.application.cms.plugins.faults.PluginExecutionException;
import org.gcube.application.cms.plugins.requests.IndexDocumentRequest;
import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.document.spatial.SpatialReference;
import org.gcube.application.geoportal.common.model.document.temporal.TemporalReference;
@Getter

View File

@ -12,7 +12,7 @@ import org.gcube.application.cms.plugins.requests.EventExecutionRequest;
import org.gcube.application.cms.plugins.requests.IndexDocumentRequest;
import org.gcube.application.cms.plugins.requests.MaterializationRequest;
import org.gcube.application.cms.plugins.requests.StepExecutionRequest;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
public class DummyPlugin implements LifecycleManager, IndexerPluginInterface, MaterializationPlugin {

View File

@ -27,7 +27,7 @@ import org.gcube.application.geoportal.common.model.document.filesets.Registered
import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation;
import org.gcube.application.geoportal.common.model.document.lifecycle.TriggeredEvents;
import org.gcube.application.geoportal.common.model.legacy.report.ConstraintCheck;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
import org.gcube.application.geoportal.common.utils.ContextUtils;
import org.gcube.application.geoportal.common.utils.Files;

View File

@ -6,7 +6,7 @@ import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.gcube.application.geoportal.client.utils.Serialization;
import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest;
import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest;
@ -18,7 +18,6 @@ import org.gcube.common.clients.delegates.ProxyDelegate;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.Iterator;

View File

@ -7,7 +7,7 @@ import lombok.extern.slf4j.Slf4j;
import org.gcube.application.geoportal.client.utils.Serialization;
import org.gcube.application.geoportal.common.model.legacy.Concessione;
import org.gcube.application.geoportal.common.model.rest.AddSectionToConcessioneRequest;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.rest.InterfaceConstants;
import org.gcube.application.geoportal.common.rest.MongoConcessioni;

View File

@ -2,7 +2,7 @@ package org.gcube.application.geoportal.client;
import org.gcube.application.geoportal.common.model.legacy.Concessione;
import org.gcube.application.geoportal.common.model.rest.AddSectionToConcessioneRequest;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.rest.MongoConcessioni;

View File

@ -12,6 +12,8 @@ public class ResponseCommons {
String resString=resp.readEntity(String.class);
if(resp.getStatus()<200||resp.getStatus()>=300)
throw new RemoteException("RESP STATUS IS "+resp.getStatus()+". Message : "+resString);
if(clazz.equals(String.class))
return (R) resString;
if(clazz!=null)
return Serialization.read(resString, clazz);
else return null;

View File

@ -2,7 +2,7 @@ package org.gcube.application.geoportal.clients;
import org.gcube.application.geoportal.client.DefaultDocumentsClient;
import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.rest.Projects;
import org.gcube.application.geoportal.common.utils.tests.GCubeTest;

View File

@ -1,6 +1,8 @@
package org.gcube.application.geoportal.clients;
import org.bson.Document;
import org.gcube.application.cms.tests.TokenSetter;
import org.gcube.application.geoportal.client.UseCaseDescriptors;
import org.gcube.application.geoportal.client.utils.Queries;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.rest.UseCaseDescriptorsI;
@ -14,18 +16,20 @@ import java.util.concurrent.atomic.AtomicLong;
import static org.gcube.application.geoportal.client.plugins.GeoportalAbstractPlugin.useCaseDescriptors;
import static org.junit.Assume.assumeTrue;
public class UCDTests {
public class UCDTests{
UseCaseDescriptorsI client =null;
@Before
public void getClient(){
public UseCaseDescriptorsI getClient(){
assumeTrue(GCubeTest.isTestInfrastructureEnabled());
client =useCaseDescriptors().build();
TokenSetter.set(GCubeTest.getContext());
return useCaseDescriptors().build();
}
@Test
public void query() throws Exception {
UseCaseDescriptorsI client =getClient();
QueryRequest request = new QueryRequest();
// All
AtomicLong counter = new AtomicLong(0l);
@ -38,19 +42,26 @@ public class UCDTests {
}
@Test
public void getById() throws Exception {
UseCaseDescriptorsI client = useCaseDescriptors().build();
public void getByIdAll() throws Exception {
UseCaseDescriptorsI client =getClient();
QueryRequest request = new QueryRequest();
// All
client.query(request).forEachRemaining(u -> {
try {
client.getById(u.getId());
System.out.println("Obtained "+client.getById(u.getId()).getId());
} catch (Exception e) {
e.printStackTrace(System.err);
Assert.fail("Unable to get "+u.getId());
}
});
}
@Test
public void getById() throws Exception {
UseCaseDescriptorsI client =getClient();
System.out.println(client.getById("profiledConcessioni"));
}
}

View File

@ -1,7 +0,0 @@
package org.gcube.application.geoportal.common.model;
public class BasicJSONObject {
}

View File

@ -0,0 +1,22 @@
package org.gcube.application.geoportal.common.model.configuration;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.bson.Document;
public class Archive extends Document {
public static final String TYPE = "_type";
@JsonIgnore
public String getType() {
return super.getString(TYPE);
}
public Archive() {
super();
}
@JsonIgnore
public Archive(String type) {
this.put(TYPE, type);
}
}

View File

@ -0,0 +1,37 @@
package org.gcube.application.geoportal.common.model.configuration;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.xml.bind.annotation.XmlRootElement;
import java.time.LocalDateTime;
import java.util.List;
@XmlRootElement
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Configuration{
public static final String PROFILE_ID="profile_id";
public static final String CONTEXT = "context";
public static final String LAST_UPDATED_TIME = "last_updated_time";
public static final String INDEXES = "indexes";
public static final String ARCHIVES = "archives";
@JsonProperty(PROFILE_ID)
private String profileId;
@JsonProperty(CONTEXT)
private String context;
@JsonProperty(LAST_UPDATED_TIME)
private LocalDateTime lastUpdatedTime;
@JsonProperty(INDEXES)
private List<Index> indexes;
@JsonProperty(ARCHIVES)
private List<Archive> archives;
}

View File

@ -1,6 +1,22 @@
package org.gcube.application.geoportal.common.model.configuration;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.bson.Document;
public class Index extends Document {
public static final String TYPE = "_type";
@JsonIgnore
public String getType() {
return super.getString(TYPE);
}
public Index() {
super();
}
@JsonIgnore
public Index(String type) {
this.put(TYPE, type);
}
}

View File

@ -6,7 +6,6 @@ import lombok.*;
import org.bson.Document;
import org.gcube.application.geoportal.common.model.document.accounting.PublicationInfo;
import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation;
import org.gcube.application.geoportal.common.model.document.spatial.SpatialReference;
import org.gcube.application.geoportal.common.model.document.temporal.TemporalReference;

View File

@ -1,6 +0,0 @@
package org.gcube.application.geoportal.common.model.document.spatial;
import org.bson.Document;
public class SpatialReference extends Document {
}

View File

@ -1,41 +0,0 @@
package org.gcube.application.geoportal.common.model.rest;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.Document;
import javax.xml.bind.annotation.XmlRootElement;
import java.time.LocalDateTime;
import java.util.List;
@XmlRootElement
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Configuration{
public class Index extends Document {
}
public class Archive extends Document {
}
public static String PROFILE_ID="profile_id";
public static String CONTEXT = "context";
public static String LAST_UPDATED_TIME = "";
public static String INDEXES = "indexes";
public static String ARCHIVES = "archives";
private String profile_id;
private String context;
private LocalDateTime lastUpdatedTime;
private List<Index> indexes;
private List<Archive> archives;
}

View File

@ -2,7 +2,7 @@ package org.gcube.application.geoportal.common.rest;
import org.gcube.application.geoportal.common.model.legacy.Concessione;
import org.gcube.application.geoportal.common.model.rest.AddSectionToConcessioneRequest;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import java.util.Iterator;

View File

@ -2,7 +2,7 @@ package org.gcube.application.geoportal.common.rest;
import org.bson.Document;
import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest;
import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest;

View File

@ -11,8 +11,8 @@ public class GCubeTest {
}
testContext = "/pred4s/preprod/preVRE";
// testContext = "/gcube/devsec/devVRE";
//testContext = "/pred4s/preprod/preVRE";
testContext = "/gcube/devsec/devVRE";
System.out.println("TEST CONTEXT = "+testContext);

View File

@ -44,6 +44,7 @@ public class GeoPortalService extends ResourceConfig{
ImplementationProvider.get().setEngine(new PluginManager(), PluginManager.PluginMap.class);
ImplementationProvider.get().setEngine(new StorageHubProvider(), StorageHubClient.class);
ImplementationProvider.get().setEngine(new UCDManager(),UCDManagerI.class);
ImplementationProvider.get().setEngine(new ConfigurationCache(), ConfigurationCache.ConfigurationMap.class);
JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();

View File

@ -3,6 +3,7 @@ package org.gcube.application.geoportal.service.engine;
import lombok.*;
import lombok.extern.slf4j.Slf4j;
import org.gcube.application.cms.implementations.ImplementationProvider;
import org.gcube.application.geoportal.common.model.configuration.Archive;
import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFile;
import org.gcube.application.geoportal.common.model.legacy.WorkspaceContent;
import org.gcube.application.geoportal.common.utils.Files;
@ -51,6 +52,11 @@ public class WorkspaceManager {
}
public Archive getConfiguration(){
Archive toReturn = new Archive("W-STORAGE");
toReturn.put("folder_id",appBase.getId());
return toReturn;
}
public WorkspaceManager() throws ConfigurationException, StorageHubException {
sgClient= ImplementationProvider.get().getEngineByManagedClass(StorageHubClient.class);

View File

@ -1,9 +0,0 @@
package org.gcube.application.geoportal.service.engine.cache;
public class Cache {
public Cache() {
// TODO Auto-generated constructor stub
}
}

View File

@ -14,7 +14,7 @@ import org.gcube.application.cms.plugins.reports.InitializationReport;
import org.gcube.application.cms.plugins.requests.EventExecutionRequest;
import org.gcube.application.cms.plugins.requests.StepExecutionRequest;
import org.gcube.application.cms.plugins.model.ComparableVersion;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
@Slf4j

View File

@ -5,7 +5,7 @@ import org.bson.Document;
import org.gcube.application.cms.plugins.faults.EventException;
import org.gcube.application.cms.plugins.faults.StepException;
import org.gcube.application.geoportal.common.faults.StorageException;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;

View File

@ -1,6 +1,7 @@
package org.gcube.application.geoportal.service.engine.mongo;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.vdurmont.semver4j.Semver;
import lombok.Getter;
@ -17,6 +18,7 @@ import org.gcube.application.cms.plugins.reports.StepExecutionReport;
import org.gcube.application.cms.plugins.requests.EventExecutionRequest;
import org.gcube.application.cms.plugins.requests.StepExecutionRequest;
import org.gcube.application.geoportal.common.faults.StorageException;
import org.gcube.application.geoportal.common.model.configuration.Archive;
import org.gcube.application.geoportal.common.model.document.*;
import org.gcube.application.geoportal.common.model.document.access.Access;
import org.gcube.application.geoportal.common.model.document.access.AccessPolicy;
@ -25,22 +27,21 @@ import org.gcube.application.geoportal.common.model.document.accounting.Publicat
import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFile;
import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet;
import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation;
import org.gcube.application.geoportal.common.model.legacy.Concessione;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.Field;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.HandlerDeclaration;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest;
import org.gcube.application.geoportal.common.model.rest.TempFile;
import org.gcube.application.geoportal.common.model.JSONPathWrapper;
import org.gcube.application.geoportal.common.utils.ContextUtils;
import org.gcube.application.geoportal.common.utils.StorageUtils;
import org.gcube.application.cms.implementations.ImplementationProvider;
import org.gcube.application.geoportal.service.engine.WorkspaceManager;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
import org.gcube.application.geoportal.service.engine.providers.PluginManager;
import org.gcube.application.geoportal.service.engine.providers.ProfileMapCache;
import org.gcube.application.geoportal.service.engine.providers.UCDManager;
import org.gcube.application.geoportal.service.model.internal.faults.DeletionException;
import org.gcube.application.cms.serialization.Serialization;
import org.gcube.application.geoportal.service.model.internal.faults.RegistrationException;
@ -54,6 +55,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.InvalidParameterException;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.function.Consumer;
@ -392,7 +394,29 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI<
@Override
public Configuration getConfiguration() throws ConfigurationException {
log.debug("Asking configuration for {} in {} ", useCaseDescriptor.getId(), UserUtils.getCurrent().getContext());
Configuration toReturn= getManager().getCurrentConfiguration();
Configuration toReturn= new Configuration();
List<Archive> archives = new ArrayList<>();
// Set Basic Info
toReturn.setArchives(archives);
toReturn.setProfileId(this.getUseCaseDescriptor().getId());
toReturn.setContext(ContextUtils.getCurrentScope());
toReturn.setLastUpdatedTime(LocalDateTime.now());
// Add Mongo Info
Archive mongoArchive = new Archive("DOCUMENT-STORE-COLLECTION");
MongoCollection coll=getDatabase().getCollection(getCollectionName());
mongoArchive.put("count",coll.count());
mongoArchive.put("collection_name",getCollectionName());
archives.add(mongoArchive);
// Set WS Info
try {
archives.add(new WorkspaceManager().getConfiguration());
}catch (StorageHubException e) {
throw new ConfigurationException("Unable to get WS Configuration",e);
}
log.debug("Returning current configuration {}",toReturn);
return toReturn;
}

View File

@ -0,0 +1,64 @@
package org.gcube.application.geoportal.service.engine.providers;
import jdk.nashorn.internal.runtime.regexp.joni.Config;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.gcube.application.cms.caches.AbstractScopedMap;
import org.gcube.application.cms.caches.Cache;
import org.gcube.application.cms.caches.TimedMap;
import org.gcube.application.cms.implementations.ImplementationProvider;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
import org.gcube.application.geoportal.service.engine.mongo.ProfiledMongoManager;
import org.gcube.application.geoportal.service.model.internal.faults.RegistrationException;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAmount;
import java.time.temporal.TemporalUnit;
@Slf4j
public class ConfigurationCache extends AbstractScopedMap<ConfigurationCache.ConfigurationMap> {
public static class ConfigurationMap extends TimedMap<String, Configuration>{
public ConfigurationMap(@NonNull String name) {
super(name);
}
@Override
public TemporalAmount getTTL(){
return Duration.of(2, ChronoUnit.MINUTES);
}
@Override
protected Configuration retrieveObject(String key) throws ConfigurationException {
return getForProfile(key);
}
}
public ConfigurationCache() {
super("Configuration Cache");
}
@Override
protected ConfigurationMap retrieveObject(String key) throws ConfigurationException {
return new ConfigurationMap(key+"_configuration_cache") {
};
}
private static Configuration getForProfile(String profileID) throws ConfigurationException{
log.info("Evaluating Configuration for profile {} ",profileID);
try{
return new ProfiledMongoManager(profileID).getConfiguration();
} catch (ConfigurationException e) {
log.error("Unable to get configuration for {} ",profileID,e);
throw e;
} catch (Throwable t){
log.error("Unable to get configuration for {} ",profileID,t);
throw new ConfigurationException("Unable to get configuration for "+profileID,t);
}
}
}

View File

@ -23,7 +23,7 @@ public class MongoClientProvider extends AbstractScopedMap<Mongo> {
}
@Override
protected Mongo retrieveObject() throws ConfigurationException {
protected Mongo retrieveObject(String context) throws ConfigurationException {
MongoConnection conn=performQueryForMongoDB(ImplementationProvider.get().
getEngineByManagedClass(ISInterface.class),
ServiceConstants.SE_GNA_DB_CATEGORY,
@ -40,11 +40,6 @@ public class MongoClientProvider extends AbstractScopedMap<Mongo> {
toDispose.close();
}
@Override
public void init() {
// TODO Auto-generated method stub
}
private static MongoConnection performQueryForMongoDB(ISInterface is,String category, String platform,String flagName, String flagValue) throws ConfigurationException {

View File

@ -56,8 +56,7 @@ public class PluginManager extends AbstractScopedMap<PluginManager.PluginMap> im
@Override
protected PluginMap retrieveObject() throws ConfigurationException {
String context=ContextUtils.getCurrentScope();
protected PluginMap retrieveObject(String context) throws ConfigurationException {
log.warn("PLUGIN INITIALIZTIONS IN CONTEXT {} ",context);
// Init plugins
implementations.forEach((id,p)->{

View File

@ -14,7 +14,7 @@ public class PostgisConnectionProvider extends AbstractScopedMap<PostgisDBManage
}
@Override
protected PostgisDBManager retrieveObject() throws ConfigurationException {
protected PostgisDBManager retrieveObject(String context) throws ConfigurationException {
try {
return PostgisDBManager.get();
} catch (SQLException throwables) {

View File

@ -36,7 +36,7 @@ public class ProfileMapCache extends AbstractScopedMap<ProfileMapCache.ProfileMa
}
@Override
protected ProfileMap retrieveObject() throws ConfigurationException {
protected ProfileMap retrieveObject(String context) throws ConfigurationException {
// Load from resources

View File

@ -17,7 +17,7 @@ public class StorageClientProvider extends AbstractScopedMap<StorageUtils> {
}
@Override
protected StorageUtils retrieveObject() throws ConfigurationException {
protected StorageUtils retrieveObject(String Context) throws ConfigurationException {
try{
return new StorageUtils();
}catch(Throwable t){

View File

@ -94,7 +94,7 @@ public class UCDManager extends AbstractScopedMap<UCDManagerI> implements UCDMan
@Override
protected UCDManagerI retrieveObject() throws ConfigurationException {
protected UCDManagerI retrieveObject(String context) throws ConfigurationException {
forceUpdateCache();
return this;
}

View File

@ -4,10 +4,9 @@ import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.gcube.application.geoportal.common.model.legacy.Concessione;
import org.gcube.application.geoportal.common.model.rest.AddSectionToConcessioneRequest;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.rest.InterfaceConstants;
import org.gcube.application.geoportal.service.engine.mongo.ConcessioniMongoManager;
import org.gcube.application.geoportal.service.engine.postgis.PostgisIndex;
import org.gcube.application.geoportal.service.model.internal.faults.DeletionException;
import org.gcube.application.cms.serialization.Serialization;
import org.json.JSONArray;

View File

@ -0,0 +1,9 @@
package org.gcube.application.geoportal.service.rest;
public class Plugins {
// get status (configuration + report)
// force reinitialization
}

View File

@ -2,8 +2,9 @@ package org.gcube.application.geoportal.service.rest;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.gcube.application.cms.implementations.ImplementationProvider;
import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.rest.InterfaceConstants;
import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest;
@ -11,6 +12,7 @@ import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest;
import org.gcube.application.geoportal.service.engine.mongo.ProfiledMongoManager;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
import org.gcube.application.cms.serialization.Serialization;
import org.gcube.application.geoportal.service.engine.providers.ConfigurationCache;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
@ -22,7 +24,7 @@ public class ProfiledDocuments {
private ProfiledMongoManager manager;
public ProfiledDocuments(@PathParam(InterfaceConstants.Parameters.UCID) String profileID) throws ConfigurationException {
log.info("Accessing profiles "+profileID);
log.info("Accessing profile "+profileID);
manager=new GuardedMethod<ProfiledMongoManager>(){
@Override
protected ProfiledMongoManager run() throws Exception {
@ -34,12 +36,12 @@ public class ProfiledDocuments {
@GET
@Path(InterfaceConstants.Methods.CONFIGURATION_PATH)
@Produces(MediaType.APPLICATION_JSON)
public Configuration getConfiguration(){
public Configuration getConfiguration(@PathParam(InterfaceConstants.Parameters.UCID) String profileID){
return new GuardedMethod<Configuration>(){
@Override
protected Configuration run() throws Exception, WebApplicationException {
return manager.getConfiguration();
return ImplementationProvider.get().getEngineByManagedClass(ConfigurationCache.ConfigurationMap.class).get(profileID);
}
}.execute().getResult();
}

View File

@ -0,0 +1,56 @@
package org.gcube.application.geoportal.service;
import lombok.extern.slf4j.Slf4j;
import org.gcube.application.cms.serialization.Serialization;
import org.gcube.application.cms.tests.TokenSetter;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor;
import org.gcube.application.geoportal.common.rest.InterfaceConstants;
import org.gcube.application.geoportal.common.utils.tests.GCubeTest;
import org.junit.Before;
import org.junit.Test;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import java.util.Iterator;
import java.util.concurrent.atomic.AtomicLong;
import static org.junit.Assume.assumeTrue;
@Slf4j
public class UCDTests extends BasicServiceTestUnit{
@Before
public void setContext(){
assumeTrue(GCubeTest.isTestInfrastructureEnabled());
TokenSetter.set(GCubeTest.getContext());
}
protected WebTarget baseTarget(){
return super.target(InterfaceConstants.Methods.UCD);
}
private Iterator<UseCaseDescriptor> query(QueryRequest request) throws Exception {
String json = check(baseTarget().path(InterfaceConstants.Methods.QUERY_PATH).
request(MediaType.APPLICATION_JSON).post(Entity.entity(request,MediaType.APPLICATION_JSON)),
String.class);
try{
return Serialization.readCollection(json, UseCaseDescriptor.class);
}catch(Throwable t){
log.error("Unable to query UCD with {} ",request,t);
throw new Exception("Unable to parse collection. Check projection settings.",t);
}
}
@Test
public void queryAll() throws Exception {
QueryRequest request=new QueryRequest();
AtomicLong l = new AtomicLong();
query(request).forEachRemaining(u->l.incrementAndGet());
assumeTrue(l.get()>0);
}
}

View File

@ -15,7 +15,7 @@ public class DummyCache extends AbstractScopedMap<LocalDateTime> {
}
@Override
protected LocalDateTime retrieveObject() throws ConfigurationException {
protected LocalDateTime retrieveObject(String context) throws ConfigurationException {
return LocalDateTime.now();
}

View File

@ -7,7 +7,7 @@ import org.gcube.application.cms.tests.TokenSetter;
import org.gcube.application.cms.tests.model.concessioni.TestConcessioniModel;
import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation;
import org.gcube.application.geoportal.common.model.rest.Configuration;
import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest;
import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest;

View File

@ -32,7 +32,7 @@ public abstract class SDIAbstractPlugin extends AbstractPlugin implements Initia
log.info("Creating internal caches.. ");
sdiCache = new AbstractScopedMap<SDIManagerWrapper>("SDI-CACHE") {
@Override
protected SDIManagerWrapper retrieveObject() throws ConfigurationException {
protected SDIManagerWrapper retrieveObject(String context) throws ConfigurationException {
try {
return new SDIManagerWrapper();
} catch (Exception e) {
@ -45,11 +45,11 @@ public abstract class SDIAbstractPlugin extends AbstractPlugin implements Initia
if(postgisCache==null) {
postgisCache = new AbstractScopedMap<DatabaseConnection>("POSTGIS-CREDENTIALS") {
@Override
protected DatabaseConnection retrieveObject() throws ConfigurationException {
protected DatabaseConnection retrieveObject(String context) throws ConfigurationException {
try {
DatabaseConnection db = ImplementationProvider.get().getEngineByManagedClass(ISInterface.class).
queryForDatabase("Database","postgis", "GNA_DB","Concessioni");
log.debug("Postgis Connection in {} is {} ", ContextUtils.getCurrentScope(),db);
log.debug("Postgis Connection in {} is {} ", context,db);
return db;
} catch (Exception e) {
throw new ConfigurationException(e);

View File

@ -21,7 +21,6 @@ import org.gcube.application.geoportal.common.model.JSONPathWrapper;
import org.gcube.application.cms.plugins.model.ComparableVersion;
import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.document.filesets.GCubeSDILayer;
import org.gcube.application.geoportal.common.model.document.spatial.SpatialReference;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor;
import org.geojson.Crs;
import org.geojson.GeoJsonObject;

View File

@ -19,4 +19,8 @@
"count" : 10000,
"collection_name" : "...."}
]
}
}
TM k,v ABSM V
Vget(K) V get(String)

View File

@ -0,0 +1,4 @@
package org.gcube.application.cms.usecases;
public class ExportConcessioniAsProfiledDocuments {
}

View File

@ -1,6 +1,7 @@
package org.gcube.application.cms.usecases;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.gcube.application.cms.tests.TokenSetter;
import org.gcube.application.geoportal.client.legacy.ConcessioniManagerI;
import org.gcube.application.geoportal.client.utils.Serialization;
@ -28,7 +29,7 @@ import static org.gcube.application.geoportal.client.plugins.GeoportalAbstractPl
/*
Pushes concessioni JSON from folder to geoportal-service
*/
public class Export {
public class ExportMongoConcessioni {
public static void main(String[] args) {
@ -63,8 +64,9 @@ public class Export {
for (Concessione c : found) {
try {
log.info("Using {} {}",c.getNome(),c.getMongo_id());
Concessione result = push(c, targetManager, new File(dir.getAbsolutePath(),
c.getId() + ""), storage);
if (!result.getReport().getStatus().equals(ValidationReport.ValidationStatus.PASSED))
warnCount.incrementAndGet();
} catch (Throwable throwable) {
@ -78,77 +80,7 @@ public class Export {
System.out.println("Done "+count.get()+" [warn : "+warnCount.get()+", err : "+errCount.get()+"]");
}
public static Concessione push(Concessione c, ConcessioniManagerI manager, File dir, StorageUtils storage) throws Exception {
// remove GIS references
LayerConcessione posizionamento= c.getPosizionamentoScavo();
c.setPosizionamentoScavo(null);
List<LayerConcessione> piante=c.getPianteFineScavo();
c.setPianteFineScavo(new ArrayList<LayerConcessione>());
List<UploadedImage> imgs=c.getImmaginiRappresentative();
c.setImmaginiRappresentative(new ArrayList<UploadedImage>());
List<OtherContent> other=c.getGenericContent();
c.setGenericContent(new ArrayList<OtherContent>());
RelazioneScavo rel=c.getRelazioneScavo();
c.setRelazioneScavo(null);
c.setAbstractRelazione(null);
// remove source folder id
c.setFolderId(null);
c.setMongo_id(null);
// PUSH PROJECT
manager.createNew(c);
// UPLOAD WOrKSPaCE content
// Relazione
removeContent(rel);
manager.setRelazioneScavo(rel, fromPath(dir.toPath().toAbsolutePath()+File.separator+"rel",storage)[0]);
//Abstract
manager.setRelazioneScavo(rel, fromPath(dir.toPath().toAbsolutePath()+File.separator+"rel",storage)[0]);
// Posizionamento
removeContent(posizionamento);
manager.setPosizionamento(posizionamento,
fromPath(dir.toPath().toAbsolutePath()+File.separator+"pos", storage));
//Piante
for(int i=0; i<piante.size();i++) {
LayerConcessione l=piante.get(i);
removeContent(l);
manager.addPiantaFineScavo(l,
fromPath(dir.toPath().toAbsolutePath()+File.separator+"pianta_"+i, storage));
}
//Immagini Rappresentative
for(int i=0; i<imgs.size();i++) {
UploadedImage img=imgs.get(i);
removeContent(img);
manager.addImmagineRappresentativa(img,
fromPath(dir.toPath().toAbsolutePath()+File.separator+"imgs_"+i, storage)[0]);
}
//Other content
// for(int i=0; i<other.size();i++) {
// OtherContent otherContent=other.get(i);
// removeContent(otherContent);
// manager.a(otherContent,
// fromPath(dir.toPath().toAbsolutePath()+File.separator+"imgs_"+i));
// }
// publish
return manager.publish();
}
private static TempFile[] fromPath(String path, StorageUtils storage) throws FileNotFoundException {
Path baseDir= Paths.get(path);
@ -161,6 +93,9 @@ public class Export {
}
private static void removeContent(AssociatedContent c){ c.setActualContent(new ArrayList<>());}
private static Document getCleanDocument(Concessione c){
Document toReturn = new Document();
}
}