diff --git a/CHANGELOG.md b/CHANGELOG.md index b235580..048dc31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm # Changelog for org.gcube.application.geoportal-client +## [v1.0.3] - 2020-11-11 +Stateful Concessioni Manager client over mongo + ## [v1.0.2] - 2020-11-11 Fixed dulicate dependency declaration diff --git a/pom.xml b/pom.xml index 84909fd..ec1c689 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.gcube.application geoportal-client - 1.0.2 + 1.0.3 Geoportal Client diff --git a/src/main/java/org/gcube/application/geoportal/client/DefaultMongoConcessioni.java b/src/main/java/org/gcube/application/geoportal/client/DefaultMongoConcessioni.java new file mode 100644 index 0000000..03741c6 --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/client/DefaultMongoConcessioni.java @@ -0,0 +1,159 @@ +package org.gcube.application.geoportal.client; + +import java.io.InputStream; +import java.util.ArrayList; + +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 org.gcube.application.geoportal.client.utils.Serialization; +import org.gcube.application.geoportal.common.model.legacy.Concessione; +import org.gcube.application.geoportal.common.rest.AddSectionToConcessioneRequest; +import org.gcube.application.geoportal.common.rest.InterfaceConstants; +import org.gcube.application.geoportal.common.rest.MongoConcessioni; +import org.gcube.common.clients.Call; +import org.gcube.common.clients.delegates.ProxyDelegate; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RequiredArgsConstructor +@Slf4j +public class DefaultMongoConcessioni implements MongoConcessioni{ + + @NonNull + private final ProxyDelegate delegate; + + private ObjectMapper mapper=Serialization.mapper; + + @Override + public Concessione createNew(Concessione c) throws Exception { + log.debug("Serializing {} ",c); + final String serialized=mapper.writeValueAsString(c); + Call call= new Call(){ + @Override + public Concessione call(WebTarget endpoint) throws Exception { + Response resp= endpoint.request(MediaType.APPLICATION_JSON).post(Entity.entity(serialized, MediaType.APPLICATION_JSON)); + return check(resp,Concessione.class); + } + }; + Concessione toReturn = delegate.make(call); + log.info("Registered {}",toReturn); + return toReturn; + } + + @Override + public void deleteById(String id) throws Exception { + log.debug("Deleting by id {}",id); + delegate.make(new Call(){ + @Override + public String call(WebTarget endpoint) throws Exception { + check(endpoint.path(id).request(MediaType.APPLICATION_JSON).delete(),null); + log.info("Deleted by id {}",id); + return null; + } + }); + } + + @Override + public Concessione getById(String id) throws Exception { + log.debug("Loading by id {}",id); + Call call= new Call(){ + @Override + public Concessione call(WebTarget endpoint) throws Exception { + Response resp= endpoint.path(id).request(MediaType.APPLICATION_JSON).get(); + return check(resp,Concessione.class); + } + }; + Concessione toReturn = delegate.make(call); + log.debug("Loaded {}",toReturn); + return toReturn; + } + + @Override + public Iterable getList() throws Exception { + log.debug("Getting list"); + Call> call=new Call>(){ + @Override + public Iterable call(WebTarget endpoint) throws Exception { + Iterable toReturn=new ArrayList(); + return (Iterable) mapper.readerFor(Concessione.class).readValues( + endpoint.request(MediaType.APPLICATION_JSON).get(InputStream.class)); + } + }; + return delegate.make(call); + } + + @Override + public Concessione publish(String id) throws Exception { + log.info("Publishing {} ",id); + Call call= new Call(){ + @Override + public Concessione call(WebTarget endpoint) throws Exception { + Response resp= endpoint.path(InterfaceConstants.Methods.PUBLISH_PATH). + path(id).request(MediaType.APPLICATION_JSON).put(Entity.entity(id, MediaType.APPLICATION_JSON)); + return check(resp,Concessione.class); + } + }; + Concessione toReturn = delegate.make(call); + log.debug("Published {} ",toReturn); + return toReturn; + } + + @Override + public Concessione registerFile(String id, AddSectionToConcessioneRequest request) throws Exception { + log.info("Registering {} in {}",request,id); + Call call= new Call(){ + @Override + public Concessione call(WebTarget endpoint) throws Exception { + Response resp= endpoint.path(InterfaceConstants.Methods.REGISTER_FILES_PATH). + path(id).request(MediaType.APPLICATION_JSON).post(Entity.entity(mapper.writeValueAsString(request), + MediaType.APPLICATION_JSON)); + return check(resp,Concessione.class); + } + }; + Concessione toReturn = delegate.make(call); + log.debug("Published {} ",toReturn); + return toReturn; + } + + @Override + public Concessione update(String id, String jsonUpdate) throws Exception { + // TODO Auto-generated method stub + return null; + } + + @Override + public Concessione replace(Concessione replacement) throws Exception { + log.info("Replacing {}",replacement); + Call call= new Call(){ + @Override + public Concessione call(WebTarget endpoint) throws Exception { + Response resp= endpoint. + request(MediaType.APPLICATION_JSON). + put(Entity.entity(mapper.writeValueAsString(replacement), + MediaType.APPLICATION_JSON)); + return check(resp,Concessione.class); + } + }; + Concessione toReturn = delegate.make(call); + log.debug("Reloaded {} ",toReturn); + return toReturn; + } + + + protected static T check(Response resp, Class clazz) throws Exception { + String resString=resp.readEntity(String.class); + if(resp.getStatus()<200||resp.getStatus()>=300) + throw new Exception("RESP STATUS IS "+resp.getStatus()+". Message : "+resString); + System.out.println("Resp String is "+resString); + if(clazz!=null) + return Serialization.read(resString, clazz); + else return null; + } +} diff --git a/src/main/java/org/gcube/application/geoportal/client/DefaultProjects.java b/src/main/java/org/gcube/application/geoportal/client/DefaultProjects.java new file mode 100644 index 0000000..2fa91d0 --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/client/DefaultProjects.java @@ -0,0 +1,88 @@ +package org.gcube.application.geoportal.client; + +import java.rmi.RemoteException; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import org.gcube.application.geoportal.common.model.project.Project; +import org.gcube.application.geoportal.common.rest.ProjectsI; +import org.gcube.common.clients.Call; +import org.gcube.common.clients.delegates.ProxyDelegate; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class DefaultProjects implements ProjectsI{ + + @NonNull + private final ProxyDelegate delegate; + + @Override + public void deleteById(String profileId, String projectId) throws RemoteException { +// Call call= new Call() { +// +// @Override +// public String call(WebTarget endpoint) throws Exception { +// endpoint.path(profileId).path(projectId).request(MediaType.APPLICATION_JSON).delete(); +// } +// }; +// try{ +// delegate.make(call); +// }catch(Exception e) { +//// throw new RemoteException(e); +// } + } + + @Override + public Iterable getAll() throws RemoteException { + Call> call=new Call>(){ + @Override + public Iterable call(WebTarget endpoint) throws Exception { + throw new Exception("Client method not ready"); + } + }; + try{ + return delegate.make(call); + }catch(Exception e) { + throw new RemoteException(e.getMessage()); + } + } + + @Override + public Iterable getByFilter(String filter) throws RemoteException { + // TODO Auto-generated method stub + return null; + } + + @Override + public Iterable getByFilter(String filter, String profileId) throws RemoteException { + // TODO Auto-generated method stub + return null; + } + + @Override + public Project getById(String profileId, String id) throws RemoteException { + // TODO Auto-generated method stub + return null; + } + + @Override + public Iterable getByProfile(String profileId) throws RemoteException { + // TODO Auto-generated method stub + return null; + } + + @Override + public Project registrNew(String profileId, String jsonDocument) throws RemoteException { + // TODO Auto-generated method stub + return null; + } + + @Override + public Project update(String profileId, String projectId, String jsonDocument) throws RemoteException { + // TODO Auto-generated method stub + return null; + } +} diff --git a/src/main/java/org/gcube/application/geoportal/client/GeoportalAbstractPlugin.java b/src/main/java/org/gcube/application/geoportal/client/GeoportalAbstractPlugin.java index fef5a4a..abbe88d 100644 --- a/src/main/java/org/gcube/application/geoportal/client/GeoportalAbstractPlugin.java +++ b/src/main/java/org/gcube/application/geoportal/client/GeoportalAbstractPlugin.java @@ -2,12 +2,18 @@ package org.gcube.application.geoportal.client; import javax.ws.rs.client.WebTarget; +import org.gcube.application.geoportal.client.legacy.ConcessioniManagerI; import org.gcube.application.geoportal.client.legacy.ConcessioniPlugin; +import org.gcube.application.geoportal.client.legacy.MongoConcessioniPlugin; +import org.gcube.application.geoportal.client.legacy.StatefulMongoConcessioni; +import org.gcube.application.geoportal.client.legacy.StatefulMongoConcessioniPlugin; import org.gcube.application.geoportal.common.rest.ConcessioniI; import org.gcube.application.geoportal.common.rest.InterfaceConstants; +import org.gcube.application.geoportal.common.rest.MongoConcessioni; import org.gcube.common.clients.Plugin; import org.gcube.common.clients.ProxyBuilder; import org.gcube.common.clients.ProxyBuilderImpl; +import org.gcube.common.clients.config.ProxyConfig; import lombok.AllArgsConstructor; @@ -15,19 +21,35 @@ import lombok.AllArgsConstructor; public abstract class GeoportalAbstractPlugin implements Plugin{ + private static ConcessioniPlugin concessioni_plugin=new ConcessioniPlugin(); + private static MongoConcessioniPlugin mongo_concessioni_plugin=new MongoConcessioniPlugin(); + + private static StatefulMongoConcessioniPlugin stateful_mongo_concessioni_plugin=new StatefulMongoConcessioniPlugin(); + public static ProxyBuilder concessioni() { return new ProxyBuilderImpl(concessioni_plugin); } - - private String name; + public static ProxyBuilder mongoConcessioni(){ + return new ProxyBuilderImpl(mongo_concessioni_plugin); + } + + public static ProxyBuilder statefulMongoConcessioni(){ + return new ProxyBuilderImpl(stateful_mongo_concessioni_plugin); + } + @Override + public Exception convert(Exception fault, ProxyConfig config) { + return fault; + } + + @Override public String name() { - return this.name; + return InterfaceConstants.APPLICATION_BASE_PATH+InterfaceConstants.APPLICATION_PATH; } @Override diff --git a/src/main/java/org/gcube/application/geoportal/client/ProjectsPlugin.java b/src/main/java/org/gcube/application/geoportal/client/ProjectsPlugin.java new file mode 100644 index 0000000..aaa17a5 --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/client/ProjectsPlugin.java @@ -0,0 +1,41 @@ +package org.gcube.application.geoportal.client; + +import javax.ws.rs.client.WebTarget; +import javax.xml.namespace.QName; +import javax.xml.transform.dom.DOMResult; +import javax.xml.ws.EndpointReference; + +import org.gcube.application.geoportal.common.rest.InterfaceConstants; +import org.gcube.application.geoportal.common.rest.ProjectsI; +import org.gcube.common.calls.jaxrs.GcubeService; +import org.gcube.common.calls.jaxrs.TargetFactory; +import org.gcube.common.clients.config.ProxyConfig; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.w3c.dom.Node; + +public class ProjectsPlugin extends GeoportalAbstractPlugin{ + + + @Override + public Exception convert(Exception fault, ProxyConfig config) { + return fault; + } + + @Override + public ProjectsI newProxy(ProxyDelegate delegate) { + return new DefaultProjects(delegate); + } + + @Override + public WebTarget resolve(EndpointReference address, ProxyConfig config) throws Exception { + DOMResult result = new DOMResult(); + address.writeTo(result); + Node node =result.getNode(); + Node child=node.getFirstChild(); + String addressString = child.getTextContent(); + GcubeService service = GcubeService.service(). + withName(new QName(InterfaceConstants.NAMESPACE,InterfaceConstants.Methods.PROJECTS)). + andPath(InterfaceConstants.Methods.PROJECTS); + return TargetFactory.stubFor(service).at(addressString); + } +} diff --git a/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniManager.java b/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniManager.java index 3a4943e..083b445 100644 --- a/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniManager.java +++ b/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniManager.java @@ -26,7 +26,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import lombok.extern.slf4j.Slf4j; @Slf4j -public class ConcessioniManager { +public class ConcessioniManager{ private static ObjectMapper mapper = new ObjectMapper(); @@ -47,11 +47,19 @@ public class ConcessioniManager { } private ConcessioniI service; + + private static enum ImplementationType{ + + } public ConcessioniManager() { service=concessioni().build(); } + + + + public Concessione getById(String id) throws Exception { log.info("Reading by ID "+id); try { diff --git a/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniManagerI.java b/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniManagerI.java new file mode 100644 index 0000000..ef36464 --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniManagerI.java @@ -0,0 +1,29 @@ +package org.gcube.application.geoportal.client.legacy; + +import org.gcube.application.geoportal.common.model.legacy.Concessione; +import org.gcube.application.geoportal.common.model.legacy.InputStreamDescriptor; +import org.gcube.application.geoportal.common.model.legacy.LayerConcessione; +import org.gcube.application.geoportal.common.model.legacy.RelazioneScavo; +import org.gcube.application.geoportal.common.model.legacy.UploadedImage; +import org.gcube.application.geoportal.common.rest.MongoConcessioni; +import org.gcube.application.geoportal.common.rest.TempFile; + +public interface ConcessioniManagerI extends MongoConcessioni{ + + + public Concessione addImmagineRappresentativa(UploadedImage toAdd,TempFile f) throws Exception; + public Concessione addPiantaFineScavo(LayerConcessione toAdd,TempFile...files)throws Exception; + public Concessione setPosizionamento(LayerConcessione toSet,TempFile...files)throws Exception; + public Concessione setRelazioneScavo(RelazioneScavo toSet,TempFile f)throws Exception; + + + + public Concessione addImmagineRappresentativa(UploadedImage toAdd,InputStreamDescriptor f) throws Exception; + public Concessione addPiantaFineScavo(LayerConcessione toAdd,InputStreamDescriptor...files)throws Exception; + public Concessione setPosizionamento(LayerConcessione toSet,InputStreamDescriptor...files)throws Exception; + public Concessione setRelazioneScavo(RelazioneScavo toSet,InputStreamDescriptor f)throws Exception; + + + public Concessione publish() throws Exception; + public void delete() throws Exception; +} diff --git a/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniPlugin.java b/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniPlugin.java index 41a48dd..1325637 100644 --- a/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniPlugin.java +++ b/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniPlugin.java @@ -16,9 +16,7 @@ import org.w3c.dom.Node; public class ConcessioniPlugin extends GeoportalAbstractPlugin{ - public ConcessioniPlugin() { - super(InterfaceConstants.APPLICATION_BASE_PATH+InterfaceConstants.APPLICATION_PATH); - } + @Override public Exception convert(Exception fault, ProxyConfig config) { diff --git a/src/main/java/org/gcube/application/geoportal/client/legacy/MongoConcessioniPlugin.java b/src/main/java/org/gcube/application/geoportal/client/legacy/MongoConcessioniPlugin.java new file mode 100644 index 0000000..0b16b7d --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/client/legacy/MongoConcessioniPlugin.java @@ -0,0 +1,41 @@ +package org.gcube.application.geoportal.client.legacy; + +import javax.ws.rs.client.WebTarget; +import javax.xml.namespace.QName; +import javax.xml.transform.dom.DOMResult; +import javax.xml.ws.EndpointReference; + +import org.gcube.application.geoportal.client.DefaultMongoConcessioni; +import org.gcube.application.geoportal.client.GeoportalAbstractPlugin; +import org.gcube.application.geoportal.common.rest.InterfaceConstants; +import org.gcube.application.geoportal.common.rest.MongoConcessioni; +import org.gcube.common.calls.jaxrs.GcubeService; +import org.gcube.common.calls.jaxrs.TargetFactory; +import org.gcube.common.clients.config.ProxyConfig; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.w3c.dom.Node; + +public class MongoConcessioniPlugin extends GeoportalAbstractPlugin{ + + + + @Override + public WebTarget resolve(EndpointReference address, ProxyConfig config) throws Exception { + DOMResult result = new DOMResult(); + address.writeTo(result); + Node node =result.getNode(); + Node child=node.getFirstChild(); + String addressString = child.getTextContent(); + GcubeService service = GcubeService.service(). + withName(new QName(InterfaceConstants.NAMESPACE,InterfaceConstants.Methods.MONGO_CONCESSIONI)). + andPath(InterfaceConstants.Methods.MONGO_CONCESSIONI); + return TargetFactory.stubFor(service).at(addressString); + } + + @Override + public MongoConcessioni newProxy(ProxyDelegate delegate) { + return new DefaultMongoConcessioni(delegate); + } + + +} diff --git a/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioni.java b/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioni.java new file mode 100644 index 0000000..8079b31 --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioni.java @@ -0,0 +1,157 @@ +package org.gcube.application.geoportal.client.legacy; + +import java.io.FileNotFoundException; +import java.util.ArrayList; + +import javax.ws.rs.client.WebTarget; + +import org.gcube.application.geoportal.client.DefaultMongoConcessioni; +import org.gcube.application.geoportal.common.model.legacy.Concessione; +import org.gcube.application.geoportal.common.model.legacy.Concessione.Paths; +import org.gcube.application.geoportal.common.model.legacy.InputStreamDescriptor; +import org.gcube.application.geoportal.common.model.legacy.LayerConcessione; +import org.gcube.application.geoportal.common.model.legacy.RelazioneScavo; +import org.gcube.application.geoportal.common.model.legacy.UploadedImage; +import org.gcube.application.geoportal.common.rest.AddSectionToConcessioneRequest; +import org.gcube.application.geoportal.common.rest.TempFile; +import org.gcube.application.geoportal.common.utils.StorageUtils; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.gcube.contentmanagement.blobstorage.transport.backend.RemoteBackendException; + + +public class StatefulMongoConcessioni extends DefaultMongoConcessioni implements ConcessioniManagerI{ + + + + public StatefulMongoConcessioni(ProxyDelegate delegate) { + super(delegate); + } + + private Concessione currentC=null; + private StorageUtils storage=new StorageUtils(); + + + // Override methods to handle state + @Override + public Concessione createNew(Concessione c) throws Exception { + currentC=super.createNew(c); + return currentC; + } + + @Override + public Concessione getById(String id) throws Exception { + currentC= super.getById(id); + return currentC; + } + + @Override + public Concessione publish() throws Exception { + if(currentC==null) throw new Exception("Invalid operation : current Concessione is null."); + currentC=super.publish(currentC.getMongo_id()); + return currentC; + } + + + @Override + public void delete() throws Exception { + if(currentC==null) throw new Exception("Invalid operation : current Concessione is null."); + super.deleteById(currentC.getMongo_id()); + currentC=null; + } + + @Override + public Concessione addImmagineRappresentativa(UploadedImage toAdd, TempFile f) throws Exception { + if(currentC==null) throw new Exception("Invalid operation : current Concessione is null."); + if(currentC.getImmaginiRappresentative()==null) currentC.setImmaginiRappresentative(new ArrayList()); + currentC.getImmaginiRappresentative().add(toAdd); + currentC=replace(currentC); + + + currentC=super.registerFile(currentC.getMongo_id(), + request(Paths.imgByIndex(currentC.getImmaginiRappresentative().size()-1),f)); + return currentC; + } + + @Override + public Concessione addPiantaFineScavo(LayerConcessione toAdd, TempFile... files) throws Exception { + if(currentC==null) throw new Exception("Invalid operation : current Concessione is null."); + if(currentC.getPianteFineScavo()==null) currentC.setPianteFineScavo(new ArrayList<>()); + currentC.getPianteFineScavo().add(toAdd); + currentC=replace(currentC); + + + currentC=super.registerFile(currentC.getMongo_id(), + request(Paths.piantaByIndex(currentC.getPianteFineScavo().size()-1),files)); + return currentC; + } + + @Override + public Concessione setPosizionamento(LayerConcessione toSet, TempFile... files) throws Exception { + if(currentC==null) throw new Exception("Invalid operation : current Concessione is null."); + currentC.setPosizionamentoScavo(toSet); + currentC=replace(currentC); + + + currentC=super.registerFile(currentC.getMongo_id(), + request(Paths.POSIZIONAMENTO,files)); + return currentC; + } + + @Override + public Concessione setRelazioneScavo(RelazioneScavo toSet, TempFile f) throws Exception { + if(currentC==null) throw new Exception("Invalid operation : current Concessione is null."); + currentC.setRelazioneScavo(toSet); + currentC=replace(currentC); + + + currentC=super.registerFile(currentC.getMongo_id(), + request(Paths.RELAZIONE,f)); + return currentC; + } + + + + @Override + public Concessione addImmagineRappresentativa(UploadedImage toAdd, InputStreamDescriptor f) throws Exception { + return addImmagineRappresentativa(toAdd,asTemp(f)); + } + + @Override + public Concessione addPiantaFineScavo(LayerConcessione toAdd, InputStreamDescriptor... files) throws Exception { + return addPiantaFineScavo(toAdd, asTemp(files)); + } + + @Override + public Concessione setPosizionamento(LayerConcessione toSet, InputStreamDescriptor... files) throws Exception { + return setPosizionamento(toSet,asTemp(files)); + } + + @Override + public Concessione setRelazioneScavo(RelazioneScavo toSet, InputStreamDescriptor f) throws Exception { + return setRelazioneScavo(toSet,asTemp(f)); + } + + + + + + protected static AddSectionToConcessioneRequest request(String path,TempFile...files) { + AddSectionToConcessioneRequest req=new AddSectionToConcessioneRequest(); + req.setDestinationPath(path); + req.setStreams(new ArrayList()); + for(TempFile f:files) + req.getStreams().add(f); + return req; + } + + protected TempFile asTemp(InputStreamDescriptor descriptor) throws RemoteBackendException, FileNotFoundException { + return storage.putOntoStorage(descriptor.getStream(), descriptor.getFilename()); + } + + protected TempFile[] asTemp(InputStreamDescriptor... descriptors) throws RemoteBackendException, FileNotFoundException { + ArrayList toReturn=new ArrayList(); + for(InputStreamDescriptor desc:descriptors) + toReturn.add(storage.putOntoStorage(desc.getStream(), desc.getFilename())); + return toReturn.toArray(new TempFile[toReturn.size()]); + } +} diff --git a/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioniPlugin.java b/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioniPlugin.java new file mode 100644 index 0000000..e3df770 --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioniPlugin.java @@ -0,0 +1,38 @@ +package org.gcube.application.geoportal.client.legacy; + +import javax.ws.rs.client.WebTarget; +import javax.xml.namespace.QName; +import javax.xml.transform.dom.DOMResult; +import javax.xml.ws.EndpointReference; + +import org.gcube.application.geoportal.client.GeoportalAbstractPlugin; +import org.gcube.application.geoportal.common.rest.InterfaceConstants; +import org.gcube.common.calls.jaxrs.GcubeService; +import org.gcube.common.calls.jaxrs.TargetFactory; +import org.gcube.common.clients.config.ProxyConfig; +import org.gcube.common.clients.delegates.ProxyDelegate; +import org.w3c.dom.Node; + +public class StatefulMongoConcessioniPlugin extends GeoportalAbstractPlugin{ + + + @Override + public WebTarget resolve(EndpointReference address, ProxyConfig config) throws Exception { + DOMResult result = new DOMResult(); + address.writeTo(result); + Node node =result.getNode(); + Node child=node.getFirstChild(); + String addressString = child.getTextContent(); + GcubeService service = GcubeService.service(). + withName(new QName(InterfaceConstants.NAMESPACE,InterfaceConstants.Methods.MONGO_CONCESSIONI)). + andPath(InterfaceConstants.Methods.MONGO_CONCESSIONI); + return TargetFactory.stubFor(service).at(addressString); + } + + @Override + public ConcessioniManagerI newProxy(ProxyDelegate delegate) { + return new StatefulMongoConcessioni(delegate); + } + + +} diff --git a/src/main/java/org/gcube/application/geoportal/client/utils/Serialization.java b/src/main/java/org/gcube/application/geoportal/client/utils/Serialization.java new file mode 100644 index 0000000..93426de --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/client/utils/Serialization.java @@ -0,0 +1,27 @@ +package org.gcube.application.geoportal.client.utils; + +import java.io.IOException; +import java.time.format.DateTimeFormatter; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +public class Serialization { + +public static final DateTimeFormatter FULL_FORMATTER=DateTimeFormatter.ofPattern("uuuuMMdd_HH-mm-ss"); + + public static ObjectMapper mapper; + + static { + mapper=new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); + mapper.registerModule(new JavaTimeModule()); + } + + public static T read(String jsonString,Class clazz) throws JsonProcessingException, IOException { + return mapper.readerFor(clazz).readValue(jsonString); + } + +} diff --git a/src/test/java/org/gcube/application/geoportal/common/model/BasicVreTests.java b/src/test/java/org/gcube/application/geoportal/common/model/BasicVreTests.java new file mode 100644 index 0000000..aa598e5 --- /dev/null +++ b/src/test/java/org/gcube/application/geoportal/common/model/BasicVreTests.java @@ -0,0 +1,15 @@ +package org.gcube.application.geoportal.common.model; + +import org.junit.Before; +import org.junit.BeforeClass; + +public class BasicVreTests { + + @BeforeClass + public static void setScope(){ +// TokenSetter.set("/gcube/devNext/NextNext"); + TokenSetter.set("/gcube/devsec/devVRE"); + } + + +} diff --git a/src/test/java/org/gcube/application/geoportal/common/model/ConcessioniTests.java b/src/test/java/org/gcube/application/geoportal/common/model/ConcessioniTests.java index 12a7be5..735dcc5 100644 --- a/src/test/java/org/gcube/application/geoportal/common/model/ConcessioniTests.java +++ b/src/test/java/org/gcube/application/geoportal/common/model/ConcessioniTests.java @@ -12,15 +12,11 @@ import org.gcube.application.geoportal.common.model.legacy.report.ValidationRepo import org.junit.Before; import org.junit.Test; -public class ConcessioniTests { +public class ConcessioniTests extends BasicVreTests{ static boolean STOP_ON_FAIL=true; - @Before - public void setScope(){ -// TokenSetter.set("/gcube/devNext/NextNext"); - TokenSetter.set("/gcube/devsec/devVRE"); - } + @Test public void readAll() throws Exception { diff --git a/src/test/java/org/gcube/application/geoportal/common/model/StatefulClientTests.java b/src/test/java/org/gcube/application/geoportal/common/model/StatefulClientTests.java new file mode 100644 index 0000000..a97ad28 --- /dev/null +++ b/src/test/java/org/gcube/application/geoportal/common/model/StatefulClientTests.java @@ -0,0 +1,110 @@ +package org.gcube.application.geoportal.common.model; + +import static org.gcube.application.geoportal.client.GeoportalAbstractPlugin.statefulMongoConcessioni; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +import org.gcube.application.geoportal.client.legacy.ConcessioniManagerI; +import org.gcube.application.geoportal.common.model.legacy.Concessione; +import org.gcube.application.geoportal.common.model.legacy.InputStreamDescriptor; +import org.gcube.application.geoportal.common.model.legacy.LayerConcessione; +import org.gcube.application.geoportal.common.model.legacy.UploadedImage; +import org.gcube.application.geoportal.common.model.legacy.report.ValidationReport.ValidationStatus; +import org.gcube.application.geoportal.common.rest.TempFile; +import org.gcube.application.geoportal.common.utils.Files; +import org.gcube.application.geoportal.common.utils.StorageUtils; +import org.gcube.contentmanagement.blobstorage.transport.backend.RemoteBackendException; +import org.junit.Before; +import org.junit.Test; + + +public class StatefulClientTests extends BasicVreTests{ + + + + private Concessione publishNew() throws Exception { + ConcessioniManagerI manager=statefulMongoConcessioni().build(); + StorageUtils storage=new StorageUtils(); + + + Concessione toRegister=TestModel.prepareEmptyConcessione(); + + manager.createNew(toRegister); + + UploadedImage toRegisterImg=TestModel.prepareConcessione().getImmaginiRappresentative().get(0); + + // TEMP Files are hosted in INFRASTRUCTURE's VOLATILE AREA + TempFile toUpload=storage.putOntoStorage(new FileInputStream(Files.getFileFromResources("concessioni/immagine.png")), "immagine.png"); + manager.addImmagineRappresentativa(toRegisterImg, toUpload); + + //Alternative Method + InputStreamDescriptor isDesc=new InputStreamDescriptor(new FileInputStream(Files.getFileFromResources("concessioni/immagine.png")), "immagine.png"); + manager.addImmagineRappresentativa(toRegisterImg, isDesc); + + + + //Relazione + manager.setRelazioneScavo(TestModel.prepareConcessione().getRelazioneScavo(), + storage.putOntoStorage(new FileInputStream(Files.getFileFromResources("concessioni/relazione.pdf")), "relazione.pdf")); + + // Posizionamento scavo + manager.setPosizionamento(TestModel.prepareConcessione().getPosizionamentoScavo(), + storage.putOntoStorage(new FileInputStream(Files.getFileFromResources("concessioni/pos.shp")), "pos.shp")); + + // Piante + manager.addPiantaFineScavo(TestModel.prepareConcessione().getPianteFineScavo().get(0), + storage.putOntoStorage(new FileInputStream(Files.getFileFromResources("concessioni/pianta.shp")), "pianta.shp"), + storage.putOntoStorage(new FileInputStream(Files.getFileFromResources("concessioni/pianta.shx")), "pianta.shx")); + + return manager.publish(); + } + + + + @Test + public void testRegisterNew() throws RemoteBackendException, FileNotFoundException, Exception { + Concessione published=publishNew(); + + + // VARIOUS CHECKS + assertNotNull(published.getReport()); + assertEquals(published.getReport().getStatus(),ValidationStatus.PASSED); + + assertEquals(published.getImmaginiRappresentative().size(),2); + assertEquals(published.getPianteFineScavo().size(),1); + assertNotNull(published.getPosizionamentoScavo().getWmsLink()); + for(LayerConcessione l : published.getPianteFineScavo()) + assertNotNull(l.getWmsLink()); + assertNotNull(published.getCentroidLat()); + assertNotNull(published.getCentroidLong()); + } + + @Test + public void delete() throws Exception { + ConcessioniManagerI manager=statefulMongoConcessioni().build(); + StorageUtils storage=new StorageUtils(); + + manager.createNew(TestModel.prepareEmptyConcessione()); + + + manager.delete(); + } + + @Test + public void replace() { + + } + + @Test + public void getById() { + + } + + @Test + public void list() { + + } +} diff --git a/src/test/java/org/gcube/application/geoportal/common/model/StatelessClientTests.java b/src/test/java/org/gcube/application/geoportal/common/model/StatelessClientTests.java new file mode 100644 index 0000000..a3cca34 --- /dev/null +++ b/src/test/java/org/gcube/application/geoportal/common/model/StatelessClientTests.java @@ -0,0 +1,112 @@ +package org.gcube.application.geoportal.common.model; + +import static org.gcube.application.geoportal.client.GeoportalAbstractPlugin.mongoConcessioni; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.FileInputStream; +import java.util.Collections; +import java.util.concurrent.atomic.AtomicLong; + +import org.gcube.application.geoportal.common.model.legacy.Concessione; +import org.gcube.application.geoportal.common.model.legacy.Concessione.Paths; +import org.gcube.application.geoportal.common.model.legacy.report.ValidationReport.ValidationStatus; +import org.gcube.application.geoportal.common.rest.AddSectionToConcessioneRequest; +import org.gcube.application.geoportal.common.rest.MongoConcessioni; +import org.gcube.application.geoportal.common.utils.Files; +import org.gcube.application.geoportal.common.utils.StorageUtils; +import org.junit.Test; + +public class StatelessClientTests extends BasicVreTests{ + + + private MongoConcessioni client=mongoConcessioni().build(); + + @Test + public void testCreateNew() throws Exception { + Concessione c= client.createNew(TestModel.prepareEmptyConcessione()); + assertNotNull(c); + assertNotNull(c.getMongo_id()); + } + + @Test + public void testDeleteById() throws Exception { + Concessione c= client.createNew(TestModel.prepareEmptyConcessione()); + client.deleteById(c.getMongo_id()); + } + + @Test + public void testList() throws Exception { + final AtomicLong counter=new AtomicLong(); + long before=System.currentTimeMillis(); + client.getList().forEach((Concessione c)-> {counter.addAndGet(1);}); + System.out.println("Loaded "+counter+" in "+(System.currentTimeMillis()-before)+" ms"); + } + + @Test + public void testReplace() throws Exception { + Concessione c= client.createNew(TestModel.prepareEmptyConcessione()); + + String title="My new shiny Title"; + c.setNome(title); + Concessione c1=client.replace(c); + assertEquals(title, c1.getNome()); + } + + @Test + public void testUploadFileSet() throws Exception { + Concessione c= client.createNew(TestModel.prepareConcessione()); + assertNotNull(c.getRelazioneScavo()); + AddSectionToConcessioneRequest request= + new AddSectionToConcessioneRequest(Paths.RELAZIONE, + Collections.singletonList(new StorageUtils().putOntoStorage( + new FileInputStream(Files.getFileFromResources("concessioni/relazione.pdf")), "relazione.pdf"))); + + c= client.registerFile(c.getMongo_id(), request); + + assertNotNull(c.getRelazioneScavo().getActualContent()); + assertNotNull(c.getRelazioneScavo().getActualContent().get(0)); + } + + @Test + public void publish() throws Exception { + Concessione c= client.createNew(TestModel.prepareConcessione()); + + String mongoId=c.getMongo_id(); + + AddSectionToConcessioneRequest request= + new AddSectionToConcessioneRequest(Paths.RELAZIONE, + Collections.singletonList(new StorageUtils().putOntoStorage( + new FileInputStream(Files.getFileFromResources("concessioni/relazione.pdf")), "relazione.pdf"))); + + client.registerFile(mongoId, request); + + request= + new AddSectionToConcessioneRequest(Paths.imgByIndex(0), + Collections.singletonList(new StorageUtils().putOntoStorage( + new FileInputStream(Files.getFileFromResources("concessioni/immagine.png")), "immagine.png"))); + + client.registerFile(mongoId, request); + + + request= + new AddSectionToConcessioneRequest(Paths.POSIZIONAMENTO, + Collections.singletonList(new StorageUtils().putOntoStorage( + new FileInputStream(Files.getFileFromResources("concessioni/pos.shp")), "pos.shp"))); + + client.registerFile(mongoId, request); + + request= + new AddSectionToConcessioneRequest(Paths.piantaByIndex(0), + Collections.singletonList(new StorageUtils().putOntoStorage( + new FileInputStream(Files.getFileFromResources("concessioni/pianta.shp")), "pianta.shp"))); + + client.registerFile(mongoId, request); + + + c=client.publish(mongoId); + + assertTrue(c.getReport().getStatus().equals(ValidationStatus.PASSED)); + } +} diff --git a/src/test/java/org/gcube/application/geoportal/common/model/TestModel.java b/src/test/java/org/gcube/application/geoportal/common/model/TestModel.java new file mode 100644 index 0000000..1218ab1 --- /dev/null +++ b/src/test/java/org/gcube/application/geoportal/common/model/TestModel.java @@ -0,0 +1,130 @@ +package org.gcube.application.geoportal.common.model; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.UUID; + +import org.bson.types.ObjectId; +import org.gcube.application.geoportal.common.model.legacy.AccessPolicy; +import org.gcube.application.geoportal.common.model.legacy.Concessione; +import org.gcube.application.geoportal.common.model.legacy.LayerConcessione; +import org.gcube.application.geoportal.common.model.legacy.RelazioneScavo; +import org.gcube.application.geoportal.common.model.legacy.UploadedImage; + + + +public class TestModel { + + + public static Concessione prepareEmptyConcessione() { + Concessione concessione=new Concessione(); + + // Generic fields + + // Concessione fields + + concessione.setNome("MONGO Italia, forse, ma su "); + concessione.setIntroduzione("This is my MONGO project"); + concessione.setDescrizioneContenuto("It contains this and that"); + + concessione.setAuthors(Arrays.asList(new String[] {"Some one","Some, oneelse"})); + + concessione.setContributore("Contrib 1"); + concessione.setTitolari(Arrays.asList(new String[] {"Some one","Some, oneelse"})); + concessione.setResponsabile("Someone"); + concessione.setEditore("Editore"); + + concessione.setFontiFinanziamento(Arrays.asList(new String[] {"Big pharma","Pentagon"})); + + + concessione.setSoggetto(Arrays.asList(new String[] {"Research Excavation","Archeology"})); + + + concessione.setDataInizioProgetto(LocalDateTime.now()); + concessione.setDataFineProgetto(LocalDateTime.now()); + + concessione.setLicenzaID("CC-BY"); + + concessione.setTitolareLicenza(Arrays.asList(new String[] {"Qualcun altro"})); + concessione.setTitolareCopyright(Arrays.asList(new String[] {"Chiedilo in giro"})); + + concessione.setParoleChiaveLibere(Arrays.asList(new String[] {"Robba","Stuff"})); + concessione.setParoleChiaveICCD(Arrays.asList(new String[] {"vattelapesca","somthing something"})); + + + concessione.setCentroidLat(43.0); //N-S + concessione.setCentroidLong(9.0); //E-W + + return concessione; + } + + public static final Concessione setIds(Concessione c) { +// c.setMongo_id(rnd()); + c.getRelazioneScavo().setMongo_id(rnd()); + c.getPosizionamentoScavo().setMongo_id(rnd()); + c.getPianteFineScavo().forEach((LayerConcessione l)->{l.setMongo_id(rnd());}); + c.getImmaginiRappresentative().forEach((UploadedImage i)->{i.setMongo_id(rnd());}); + return c; + } + + public static final String rnd() { + return new ObjectId().toHexString(); + } + public static Concessione prepareConcessione() { + return prepareConcessione(4,2); + } + + public static Concessione prepareConcessione(int pianteCount ,int imgsCount) { + + Concessione concessione=prepareEmptyConcessione(); + + + + // Attachments + + // Relazione scavo + RelazioneScavo relScavo=new RelazioneScavo(); + + relScavo.setAbstractEng("simple abstract section"); + relScavo.setAbstractEng("semplice sezione abstract"); + relScavo.setResponsabili(concessione.getAuthors()); + + concessione.setRelazioneScavo(relScavo); + //Immagini rappresentative + ArrayList imgs=new ArrayList<>(); + for(int i=0;i piante=new ArrayList(); + for(int i=0;i