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