Publishing Concessioni - legacy

This commit is contained in:
Fabio Sinibaldi 2020-11-19 17:38:56 +01:00
parent 28499b6a2b
commit 6dc433b834
19 changed files with 448 additions and 112 deletions

View File

@ -21,6 +21,8 @@ public class GeoportalService extends ResourceConfig{
registerClasses(Projects.class);
registerClasses(Sections.class);
registerClasses(Profiles.class);
}

View File

@ -0,0 +1,58 @@
package org.gcube.application.geoportal.service.engine;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAmount;
import java.util.concurrent.ConcurrentHashMap;
import org.gcube.application.geoportal.model.fault.ConfigurationException;
import org.gcube.application.geoportal.service.utils.ContextUtils;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RequiredArgsConstructor
public abstract class AbstractScopedMap<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.putIfAbsent(currentScope, new TTLObject<T>(LocalDateTime.now(),retrieveObject()));
if(TTL!=null) {
if(!found.getCreationTime().plus(TTL).isBefore(LocalDateTime.now())) {
log.debug(name+" : elapsed TTL, disposing..");
dispose(found.getTheObject());
found=scopeMap.put(currentScope, new TTLObject<T>(LocalDateTime.now(),retrieveObject()));
}
}
return found.getTheObject();
}
@Override
public void shustdown() {
log.warn(name + ": shutting down");
scopeMap.forEach((String s,TTLObject<T> o)->{
dispose(o.getTheObject());
});
}
protected abstract T retrieveObject() throws ConfigurationException;
protected abstract void dispose(T toDispose);
}

View File

@ -1,7 +1,11 @@
package org.gcube.application.geoportal.service.engine;
public interface Engine {
import org.gcube.application.geoportal.model.fault.ConfigurationException;
public interface Engine <T> {
public void init();
public void shustdown();
public T getObject() throws ConfigurationException;
}

View File

@ -1,7 +1,8 @@
package org.gcube.application.geoportal.service.engine;
import org.gcube.application.geoportal.managers.AbstractRecordManager;
import org.gcube.application.geoportal.service.engine.mongo.MongoClientProvider;
import org.gcube.application.geoportal.service.engine.cache.MongoClientProvider;
import org.gcube.application.geoportal.service.engine.cache.MongoConnectionProvider;
import lombok.Getter;
import lombok.Setter;
@ -22,15 +23,26 @@ public class ImplementationProvider {
@Getter
@Setter
private MongoClientProvider mongoClientProvider=null;
private MongoConnectionProvider mongoConnectionProvider=new MongoConnectionProvider();
@Getter
@Setter
private MongoClientProvider mongoClientProvider=new MongoClientProvider();
@Getter
@Setter
private StorageClientProvider storageProvider=new StorageClientProvider();
public void shutdown() {
// Stop JPA
AbstractRecordManager.shutdown();
mongoConnectionProvider.shustdown();
mongoClientProvider.shustdown();
}
public void startup() {
mongoConnectionProvider.init();
mongoClientProvider.init();
}
}

View File

@ -0,0 +1,36 @@
package org.gcube.application.geoportal.service.engine;
import java.util.Collections;
import java.util.Map;
import org.gcube.application.geoportal.common.model.profile.Profile;
import org.gcube.application.geoportal.model.fault.ConfigurationException;
public class ProfileMapCache extends AbstractScopedMap<Map<String,Profile>> {
public ProfileMapCache(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void init() {
// TODO Auto-generated method stub
}
@Override
protected void dispose(Map<String, Profile> toDispose) {
// TODO Auto-generated method stub
}
@Override
protected Map<String, Profile> retrieveObject() throws ConfigurationException {
//TODO load from IS
// Profile fakeProfile=new Profile();
return Collections.singletonMap(null, null);
}
}

View File

@ -0,0 +1,43 @@
package org.gcube.application.geoportal.service.engine;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import org.gcube.application.geoportal.common.rest.InterfaceConstants;
import org.gcube.application.geoportal.model.fault.ConfigurationException;
import org.gcube.application.geoportal.service.utils.ContextUtils;
import org.gcube.contentmanagement.blobstorage.service.IClient;
import org.gcube.contentmanagement.blobstorage.transport.backend.RemoteBackendException;
import org.gcube.contentmanager.storageclient.wrapper.AccessType;
import org.gcube.contentmanager.storageclient.wrapper.MemoryType;
import org.gcube.contentmanager.storageclient.wrapper.StorageClient;
public class StorageClientProvider implements Engine<IClient>{
@Override
public IClient getObject() throws ConfigurationException {
return new StorageClient(InterfaceConstants.SERVICE_CLASS, InterfaceConstants.SERVICE_NAME, ContextUtils.getCurrentCaller(), AccessType.SHARED, MemoryType.VOLATILE).getClient();
}
@Override
public void shustdown() {
// TODO Auto-generated method stub
}
@Override
public void init() {
// TODO Auto-generated method stub
}
//wrapping methods
public InputStream open(String id) throws MalformedURLException, RemoteBackendException, IOException, ConfigurationException {
return new URL(getObject().getHttpsUrl().RFileById(id)).openConnection().getInputStream();
}
}

View File

@ -0,0 +1,17 @@
package org.gcube.application.geoportal.service.engine;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
@Getter
@ToString
@AllArgsConstructor
public class TTLObject<T> {
private LocalDateTime creationTime;
private T theObject;
}

View File

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

View File

@ -0,0 +1,43 @@
package org.gcube.application.geoportal.service.engine.cache;
import org.gcube.application.geoportal.model.fault.ConfigurationException;
import org.gcube.application.geoportal.service.engine.AbstractScopedMap;
import org.gcube.application.geoportal.service.engine.ImplementationProvider;
import org.gcube.application.geoportal.service.model.internal.db.MongoConnection;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
public class MongoClientProvider extends AbstractScopedMap<MongoClient>{
public MongoClientProvider() {
super("MongoClient cache");
// setTTL(Duration.of(10,ChronoUnit.MINUTES));
}
@Override
protected MongoClient retrieveObject() throws ConfigurationException {
MongoConnection conn=ImplementationProvider.get().getMongoConnectionProvider().getObject();
MongoCredential credential = MongoCredential.createCredential(conn.getUser(), conn.getDatabase(),
conn.getPassword().toCharArray());
MongoClientOptions options = MongoClientOptions.builder().sslEnabled(true).build();
return new MongoClient(new ServerAddress(conn.getHosts().get(0),conn.getPort()),
credential,
options);
}
@Override
protected void dispose(MongoClient toDispose) {
toDispose.close();
}
@Override
public void init() {
// TODO Auto-generated method stub
}
}

View File

@ -0,0 +1,33 @@
package org.gcube.application.geoportal.service.engine.cache;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import org.gcube.application.geoportal.model.fault.ConfigurationException;
import org.gcube.application.geoportal.service.ServiceConstants;
import org.gcube.application.geoportal.service.engine.AbstractScopedMap;
import org.gcube.application.geoportal.service.model.internal.db.MongoConnection;
import org.gcube.application.geoportal.service.utils.ISUtils;
public class MongoConnectionProvider extends AbstractScopedMap<MongoConnection>{
public MongoConnectionProvider() {
super("MongoDBInfo Cache");
setTTL(Duration.of(2,ChronoUnit.MINUTES));
}
@Override
protected MongoConnection retrieveObject() throws ConfigurationException {
return ISUtils.queryForMongoDB(ServiceConstants.MONGO_SE_PLATFORM, ServiceConstants.MONGO_SE_GNA_FLAG);
}
@Override
protected void dispose(MongoConnection toDispose) {
}
@Override
public void init() {
// TODO Auto-generated method stub
}
}

View File

@ -1,56 +0,0 @@
package org.gcube.application.geoportal.service.engine.mongo;
import java.util.Arrays;
import org.gcube.application.geoportal.model.fault.ConfigurationException;
import org.gcube.application.geoportal.service.ServiceConstants;
import org.gcube.application.geoportal.service.model.internal.db.MongoConnection;
import org.gcube.application.geoportal.service.utils.ISUtils;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import lombok.Synchronized;
public class DefaultMongoProvider implements MongoClientProvider {
public DefaultMongoProvider() {
// TODO Auto-generated constructor stub
}
@Override
public void init() {
}
@Override
public void shustdown() {
// TODO Auto-generated method stub
}
private static MongoClient instance=null;
@Override
@Synchronized
public MongoClient getClient() throws ConfigurationException{
if(instance==null) {
MongoConnection conn= ISUtils.queryForMongoDB(ServiceConstants.MONGO_SE_PLATFORM, ServiceConstants.MONGO_SE_GNA_FLAG);
MongoCredential credential = MongoCredential.createCredential(conn.getUser(), conn.getDatabase(),
conn.getPassword().toCharArray());
MongoClientOptions options = MongoClientOptions.builder().sslEnabled(true).build();
instance = new MongoClient(new ServerAddress(conn.getHosts().get(0),conn.getPort()),
credential,
options);
}
return instance;
}
}

View File

@ -1,14 +0,0 @@
package org.gcube.application.geoportal.service.engine.mongo;
import org.gcube.application.geoportal.model.fault.ConfigurationException;
import org.gcube.application.geoportal.service.engine.Engine;
import com.mongodb.MongoClient;
public interface MongoClientProvider extends Engine{
public MongoClient getClient() throws ConfigurationException;
}

View File

@ -15,8 +15,11 @@ public class MongoManager {
private MongoClient client=null;
public MongoManager() throws ConfigurationException {
client=ImplementationProvider.get().getMongoClientProvider().getClient();
client=ImplementationProvider.get().getMongoClientProvider().getObject();
// init profile
}

View File

@ -0,0 +1,32 @@
package org.gcube.application.geoportal.service.model.internal.rest;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
import org.gcube.application.geoportal.model.content.AssociatedContent;
import lombok.Data;
@XmlRootElement
@Data
public class AddSectionToConcessioneRequest {
public static enum Section{
RELAZIONE,UPLOADED_IMG,PIANTA,POSIZIONAMENTO,OTHER
}
@XmlRootElement
@Data
public static class SHUBFileDescriptor {
private String filename;
private String shubID;
}
private Section section;
private String concessioneID;
private AssociatedContent toRegister;
private List<SHUBFileDescriptor> streams;
}

View File

@ -14,11 +14,18 @@ import javax.ws.rs.core.MediaType;
import org.gcube.application.geoportal.common.rest.InterfaceConstants;
import org.gcube.application.geoportal.managers.ConcessioneManager;
import org.gcube.application.geoportal.managers.ManagerFactory;
import org.gcube.application.geoportal.model.InputStreamDescriptor;
import org.gcube.application.geoportal.model.concessioni.Concessione;
import org.gcube.application.geoportal.model.concessioni.LayerConcessione;
import org.gcube.application.geoportal.model.concessioni.RelazioneScavo;
import org.gcube.application.geoportal.model.content.UploadedImage;
import org.gcube.application.geoportal.model.report.PublicationReport;
import org.gcube.application.geoportal.utils.Serialization;
import org.gcube.application.geoportal.service.engine.ImplementationProvider;
import org.gcube.application.geoportal.service.engine.StorageClientProvider;
import org.gcube.application.geoportal.service.model.internal.rest.AddSectionToConcessioneRequest;
import org.gcube.application.geoportal.service.model.internal.rest.AddSectionToConcessioneRequest.SHUBFileDescriptor;
import org.gcube.application.geoportal.service.utils.Serialization;
import org.json.JSONArray;
import org.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
@ -26,13 +33,14 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Concessioni {
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("{"+InterfaceConstants.Parameters.PROJECT_ID+"}")
public String getById(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id) {
try {
log.info("Loading Concessione by id {} ",id);
Concessione toReturn=(Concessione) ManagerFactory.getByRecordID(Long.parseLong(id)).getRecord();
Concessione toReturn=(Concessione) ConcessioneManager.getByID(Long.parseLong(id));
log.debug("Loaded object {} ",toReturn);
return toReturn.asJson();
}catch(WebApplicationException e){
@ -43,14 +51,61 @@ public class Concessioni {
throw new WebApplicationException("Unable to serve request", e);
}
}
@PUT
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String registerNew(Concessione toRegister) {
public String registerNew(String toRegister) {
try {
log.info("Registering new Concessione "+toRegister);
ConcessioneManager manager=ManagerFactory.registerNew(toRegister);
Concessione conc=Serialization.read(toRegister, Concessione.class);
ConcessioneManager manager=ManagerFactory.registerNew(conc);
manager.commitSafely(false);
return manager.getRecord().asJson();
}catch(WebApplicationException e){
log.warn("Unable to serve request",e);
throw e;
}catch(Throwable e){
log.warn("Unable to serve request",e);
throw new WebApplicationException("Unable to serve request", e);
}
}
@PUT
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("{"+InterfaceConstants.Parameters.PROJECT_ID+"}")
public String modify(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id,
AddSectionToConcessioneRequest request) {
try {
log.info("Adding section to Concessione {} ",id);
Concessione toReturn=(Concessione) ConcessioneManager.getByID(Long.parseLong(id));
ConcessioneManager manager=ManagerFactory.getByRecord(toReturn);
log.debug("Loaded object {} ",toReturn);
InputStreamDescriptor[] streams=new InputStreamDescriptor[request.getStreams().size()];
StorageClientProvider storage=ImplementationProvider.get().getStorageProvider();
for(int i=0;i<streams.length;i++) {
SHUBFileDescriptor sent=request.getStreams().get(i);
streams[i]=new InputStreamDescriptor(storage.open(sent.getShubID()), sent.getFilename());
}
switch(request.getSection()) {
case PIANTA :manager.addPiantaFineScavo((LayerConcessione) request.getToRegister(),streams);
break;
case POSIZIONAMENTO : manager.setPosizionamento((LayerConcessione) request.getToRegister(),streams);
break;
case RELAZIONE : manager.setRelazioneScavo((RelazioneScavo)request.getToRegister(), streams[0]);
break;
case UPLOADED_IMG : manager.addImmagineRappresentativa((UploadedImage)request.getToRegister(), streams[0]);
break;
default : throw new Exception("Unrecognized section");
}
PublicationReport report=manager.commitSafely(false);
return report.prettyPrint();
}catch(WebApplicationException e){
@ -61,23 +116,9 @@ public class Concessioni {
throw new WebApplicationException("Unable to serve request", e);
}
}
@PUT
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("{"+InterfaceConstants.Parameters.PROJECT_ID+"}")
public String modify(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id) {
try {
log.info("Add Section");
throw new RuntimeException("Feature not yet available");
}catch(WebApplicationException e){
log.warn("Unable to serve request",e);
throw e;
}catch(Throwable e){
log.warn("Unable to serve request",e);
throw new WebApplicationException("Unable to serve request", e);
}
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@ -98,6 +139,5 @@ public class Concessioni {
throw new WebApplicationException("Unable to serve request", e);
}
}
}

View File

@ -0,0 +1,39 @@
package org.gcube.application.geoportal.service.utils;
import static org.gcube.common.authorization.client.Constants.authorizationService;
import org.gcube.common.authorization.library.AuthorizationEntry;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.scope.api.ScopeProvider;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ContextUtils {
public static String getCurrentScope(){
try{
String token=SecurityTokenProvider.instance.get();
log.debug("Token is : "+token);
if(token==null) throw new Exception("Security Token is null");
AuthorizationEntry entry = authorizationService().get(token);
return entry.getContext();
}catch(Exception e ){
log.debug("Unable to resolve token, checking scope provider..",e);
return ScopeProvider.instance.get();
}
}
public static String getCurrentCaller(){
try{
String token=SecurityTokenProvider.instance.get();
log.debug("Token is : "+token);
if(token==null) throw new Exception("Security Token is null");
AuthorizationEntry entry = authorizationService().get(token);
return entry.getClientInfo().getId();
}catch(Exception e ){
log.debug("Unable to resolve token, checking scope provider..",e);
return "Unidentified data-transfer user";
}
}
}

View File

@ -20,5 +20,7 @@ public class Serialization {
public static <T> T read(String jsonString,Class<T> clazz) throws JsonProcessingException, IOException {
return mapper.readerFor(clazz).readValue(jsonString);
}
public static String write(Object toWrite) throws JsonProcessingException {
return mapper.writeValueAsString(toWrite);
}
}

View File

@ -16,17 +16,23 @@ import javax.persistence.spi.ClassTransformer;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.persistence.spi.PersistenceUnitTransactionType;
import javax.sql.DataSource;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.gcube.application.geoportal.common.rest.InterfaceConstants;
import org.gcube.application.geoportal.managers.AbstractRecordManager;
import org.gcube.application.geoportal.managers.DefatulEMFProvider;
import org.gcube.application.geoportal.model.concessioni.Concessione;
import org.gcube.application.geoportal.model.fault.ConfigurationException;
import org.gcube.application.geoportal.service.GeoportalService;
import org.gcube.application.geoportal.utils.Serialization;
import org.gcube.application.geoportal.service.engine.ImplementationProvider;
import org.gcube.application.geoportal.service.engine.StorageClientProvider;
import org.gcube.application.geoportal.service.utils.Serialization;
import org.gcube.com.fasterxml.jackson.core.JsonProcessingException;
import org.gcube.contentmanagement.blobstorage.service.IClient;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.BeforeClass;
import org.junit.Test;
@ -44,15 +50,25 @@ public class Concessioni extends JerseyTest {
@BeforeClass
public static void init() {
String scope="/gcube/devNext/NextNext";
AbstractRecordManager.setDefaultProvider(new DefatulEMFProvider(){
@Override
public EntityManagerFactory getFactory() {
System.err.println("***********************SETTING DEBUG CONTEXT******************");
TokenSetter.set("/gcube/devNext/NextNext");
// System.err.println("***********************SETTING DEBUG CONTEXT******************");
TokenSetter.set(scope);
return super.getFactory();
}
});
});
ImplementationProvider.get().setStorageProvider(new StorageClientProvider() {
@Override
public IClient getObject() throws ConfigurationException {
TokenSetter.set(scope);
return super.getObject();
}
});
}
@ -67,7 +83,7 @@ public class Concessioni extends JerseyTest {
System.out.println("Iterating through objects.. ");
for(Object o:coll) {
System.out.println("Object class is "+o.getClass());
Concessione c=Serialization.readObject(o.toString(), Concessione.class);
Concessione c=Serialization.read(o.toString(), Concessione.class);
System.out.println("Concessione is : "+c.asJson());
}
@ -75,11 +91,29 @@ public class Concessioni extends JerseyTest {
@Test
public void createNew() {
public void createNew() throws IOException {
Concessione toCreate=TestModel.prepareEmptyConcessione();
WebTarget target=target(InterfaceConstants.Methods.CONCESSIONI);
// target.
Response resp=target.request(MediaType.APPLICATION_JSON).put(Entity.entity(toCreate.asJson(), MediaType.APPLICATION_JSON));
String resString=resp.readEntity(String.class);
System.out.println("Resp String is "+resString);
Concessione registered=Serialization.read(resString, Concessione.class);
System.out.println("Registered concessione at : "+registered);
}
@Test
public void publishNew() throws IOException {
Concessione toCreate=TestModel.prepareEmptyConcessione();
WebTarget target=target(InterfaceConstants.Methods.CONCESSIONI);
Response resp=target.request(MediaType.APPLICATION_JSON).put(Entity.entity(toCreate.asJson(), MediaType.APPLICATION_JSON));
String resString=resp.readEntity(String.class);
System.out.println("Resp String is "+resString);
Concessione registered=Serialization.read(resString, Concessione.class);
System.out.println("Registered concessione at : "+registered);
}

View File

@ -3,12 +3,11 @@ package org.gcube.application.geoportal.service.legacy;
import java.io.IOException;
import org.bson.Document;
import org.gcube.application.geoportal.common.model.legacy.Concessione;
import org.gcube.application.geoportal.common.model.profile.Profile;
import org.gcube.application.geoportal.common.utils.Files;
import org.gcube.application.geoportal.model.fault.ConfigurationException;
import org.gcube.application.geoportal.service.engine.ImplementationProvider;
import org.gcube.application.geoportal.service.engine.mongo.DefaultMongoProvider;
import org.gcube.application.geoportal.service.engine.cache.MongoClientProvider;
import org.gcube.application.geoportal.service.engine.mongo.MongoManager;
import org.gcube.application.geoportal.service.utils.Serialization;
import org.junit.BeforeClass;
@ -22,11 +21,11 @@ public class MongoTests {
@BeforeClass
public static final void init() {
ImplementationProvider.get().setMongoClientProvider(new DefaultMongoProvider() {
ImplementationProvider.get().setMongoClientProvider(new MongoClientProvider() {
@Override
public MongoClient getClient() throws ConfigurationException {
public MongoClient getObject() throws ConfigurationException {
TokenSetter.set("/gcube/devNext/NextNext");
return super.getClient();
return super.getObject();
}
});
}