diff --git a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/AbstractProfiledDocumentClient.java b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/AbstractProfiledDocumentClient.java new file mode 100644 index 0000000..0e2c004 --- /dev/null +++ b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/AbstractProfiledDocumentClient.java @@ -0,0 +1,256 @@ +package org.gcube.application.geoportal.client; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.bson.Document; +import org.gcube.application.geoportal.client.utils.Serialization; +import org.gcube.application.geoportal.common.model.document.ProfiledDocument; +import org.gcube.application.geoportal.common.model.legacy.Concessione; +import org.gcube.application.geoportal.common.model.rest.Configuration; +import org.gcube.application.geoportal.common.model.rest.QueryRequest; +import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; +import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest; +import org.gcube.application.geoportal.common.rest.InterfaceConstants; +import org.gcube.application.geoportal.common.rest.ProfiledDocumentsI; +import org.gcube.common.clients.Call; +import org.gcube.common.clients.delegates.ProxyDelegate; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.rmi.Remote; +import java.rmi.RemoteException; +import java.util.Iterator; + +@RequiredArgsConstructor +@Slf4j +public abstract class AbstractProfiledDocumentClient implements ProfiledDocumentsI { + + @NonNull + protected final ProxyDelegate delegate; + @NonNull + protected final String profileID; + + protected abstract Class getManagedClass(); + + @Override + public T createNew(Document toCreate) throws RemoteException { + try { + log.debug("Creating Profiled Document (class {}, profile {}) with content {} ", + getManagedClass(),profileID, toCreate); + Call call = endpoint -> { + return check(endpoint.path(profileID).request(MediaType.APPLICATION_JSON). + post(Entity.entity(toCreate, MediaType.APPLICATION_JSON)),getManagedClass()); + }; + T toReturn = delegate.make(call); + log.info("Registered {} profiled {} ",toReturn.get_id(),profileID); + return toReturn; + }catch(RemoteException e){ + log.error("Unexpected error ",e); + throw e; + }catch(Exception e){ + log.error("Unexpected error ",e); + throw new RemoteException("Unexpected Error", e); + } + } + + @Override + public void deleteById(String id) throws RemoteException { + deleteById(id,false); + } + + @Override + public void deleteById(String id, Boolean force) throws RemoteException { + try { + log.debug("Deleting ID {}  profile {}  force {} ", id, profileID, force); + Call call = endpoint -> { + return check(endpoint.path(profileID).path(id). + queryParam(InterfaceConstants.Parameters.FORCE,force). + request(MediaType.APPLICATION_JSON).delete(),getManagedClass()); + }; + delegate.make(call); + log.info("Deleted ID {}  profile {}  force {} ", id, profileID, force); + }catch(RemoteException e){ + log.error("Unexpected error ",e); + throw e; + }catch(Exception e){ + log.error("Unexpected error ",e); + throw new RemoteException("Unexpected Error", e); + } + } + + @Override + public T getById(String id) throws RemoteException { + try { + log.info("Loading Document ID {} (class {}, profile {})", + id, getManagedClass(),profileID); + Call call = endpoint -> { + return check(endpoint.path(profileID).path(id). + request(MediaType.APPLICATION_JSON).get(), getManagedClass()); + }; + return delegate.make(call); + }catch(RemoteException e){ + log.error("Unexpected error ",e); + throw e; + }catch(Exception e){ + log.error("Unexpected error ",e); + throw new RemoteException("Unexpected Error", e); + } + } + + @Override + public Configuration getConfiguration() throws RemoteException { + try { + log.info("Loading Configuration for profile {}", profileID); + Call call = endpoint -> { + return check(endpoint.path(profileID).path(InterfaceConstants.Methods.CONFIGURATION_PATH). + request(MediaType.APPLICATION_JSON).get(), Configuration.class); + }; + return delegate.make(call); + }catch(RemoteException e){ + log.error("Unexpected error ",e); + throw e; + }catch(Exception e){ + log.error("Unexpected error ",e); + throw new RemoteException("Unexpected Error", e); + } + } + + @Override + public Iterator query(QueryRequest request) throws RemoteException { + return queryForClass(request,getManagedClass()); + } + + @Override + public Iterator queryForClass(QueryRequest request,Class clazz) throws RemoteException { + String jsonString=queryForJSON(request); + log.debug("Deserializing query Result as {} ",clazz); + try { + return Serialization.readCollection(jsonString,clazz); + } catch (IOException e) { + log.error("Unable to deserialize result as "+clazz,e); + log.debug("Query request was ",request); + throw new RemoteException("Invalid format for submitted query"); + } + } + + @Override + public String queryForJSON(QueryRequest request) throws RemoteException { + try { + log.debug("Querying profile {}  for {}",profileID,request); + Call call = endpoint -> { + return check(endpoint.path(profileID).path(InterfaceConstants.Methods.CONFIGURATION_PATH). + request(MediaType.APPLICATION_JSON).get(), String.class); + }; + return delegate.make(call); + }catch(RemoteException e){ + log.error("Unexpected error ",e); + throw e; + }catch(Exception e){ + log.error("Unexpected error ",e); + throw new RemoteException("Unexpected Error", e); + } + } + + @Override + public T performStep(String id, StepExecutionRequest request) throws RemoteException{ + try { + log.debug("Executing step on {} (class {}, profile {}) with request {} ", + id, getManagedClass(),profileID, request); + Call call = endpoint -> { + return check(endpoint.path(profileID).path(id).request(MediaType.APPLICATION_JSON). + post(Entity.entity(request, MediaType.APPLICATION_JSON)),getManagedClass()); + }; + T toReturn = delegate.make(call); + log.info("Executed STEP {} on {} [profile {}, class {}] ",request.getStepID(), + id,profileID,getManagedClass()); + return toReturn; + }catch(RemoteException e){ + log.error("Unexpected error ",e); + throw e; + }catch(Exception e){ + log.error("Unexpected error ",e); + throw new RemoteException("Unexpected Error", e); + } + } + + @Override + public T registerFileSet(String id, RegisterFileSetRequest req) throws RemoteException { + try { + log.debug("Registering FileSet on {} (class {}, profile {}) with request {} ", + id, getManagedClass(),profileID, req); + Call call = endpoint -> { + return check(endpoint.path(profileID).path(InterfaceConstants.Methods.REGISTER_FILES_PATH) + .path(id).request(MediaType.APPLICATION_JSON). + post(Entity.entity(req, MediaType.APPLICATION_JSON)),getManagedClass()); + }; + T toReturn = delegate.make(call); + log.info("Registered FileSet on {} [profile {}, class {}]  with {}", + id,profileID,getManagedClass(),req); + return toReturn; + }catch(RemoteException e){ + log.error("Unexpected error ",e); + throw e; + }catch(Exception e){ + log.error("Unexpected error ",e); + throw new RemoteException("Unexpected Error", e); + } + } + + @Override + public T deleteFileSet(String id, String path, Boolean force) throws RemoteException { + try { + log.debug("Deleting Fileset for ID {}  [profile {}  , class {}] at {} (force {} )", + id, profileID,getManagedClass(),path, force); + Call call = endpoint -> { + return check(endpoint.path(profileID).path(InterfaceConstants.Methods.DELETE_FILES_PATH). + path(id).queryParam(InterfaceConstants.Parameters.FORCE,force). + request(MediaType.APPLICATION_JSON). + post(Entity.entity(path, MediaType.APPLICATION_JSON)),getManagedClass()); + }; + T toReturn=delegate.make(call); + log.info("Deleted ID {}  profile {}  force {} ", id, profileID, force); + return toReturn; + }catch(RemoteException e){ + log.error("Unexpected error ",e); + throw e; + }catch(Exception e){ + log.error("Unexpected error ",e); + throw new RemoteException("Unexpected Error", e); + } + } + + @Override + public T updateDocument(String id, Document updatedDocument) throws RemoteException { + try { + log.debug("Updateing {}  [profile {}  , class {}] with ", + id, profileID,getManagedClass(),updatedDocument); + Call call = endpoint -> { + return check(endpoint.path(profileID).path(id). + request(MediaType.APPLICATION_JSON). + put(Entity.entity(updatedDocument, MediaType.APPLICATION_JSON)),getManagedClass()); + }; + T toReturn=delegate.make(call); + log.info("Updated ID {}  profile {}  ", id, profileID); + return toReturn; + }catch(RemoteException e){ + log.error("Unexpected error ",e); + throw e; + }catch(Exception e){ + log.error("Unexpected error ",e); + throw new RemoteException("Unexpected Error", e); + } + } + + protected static R check(Response resp, Class clazz) throws IOException { + String resString=resp.readEntity(String.class); + if(resp.getStatus()<200||resp.getStatus()>=300) + throw new RemoteException("RESP STATUS IS "+resp.getStatus()+". Message : "+resString); + if(clazz!=null) + return Serialization.read(resString, clazz); + else return null; + } +} diff --git a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/DefaultProfiledDocuments.java b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/DefaultProfiledDocuments.java index df7e07f..45966e8 100644 --- a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/DefaultProfiledDocuments.java +++ b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/DefaultProfiledDocuments.java @@ -3,60 +3,34 @@ package org.gcube.application.geoportal.client; import lombok.NonNull; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.geoportal.common.model.document.ProfiledDocument; +import org.gcube.application.geoportal.common.model.legacy.Concessione; import org.gcube.application.geoportal.common.model.rest.Configuration; import org.gcube.application.geoportal.common.model.rest.QueryRequest; +import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; import org.gcube.application.geoportal.common.rest.ProfiledDocumentsI; +import org.gcube.common.clients.Call; import org.gcube.common.clients.delegates.ProxyDelegate; +import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; import java.rmi.RemoteException; import java.util.Iterator; -@RequiredArgsConstructor -public class DefaultProfiledDocuments implements ProfiledDocumentsI { +@Slf4j +public class DefaultProfiledDocuments extends AbstractProfiledDocumentClient { - @NonNull - private final ProxyDelegate delegate; - @Override - public ProfiledDocument createNew(Document toCreate) throws RemoteException { - return null; + public DefaultProfiledDocuments(@NonNull ProxyDelegate delegate, @NonNull String profileID) { + super(delegate, profileID); } @Override - public void deleteById(String id) throws RemoteException { - - } - - @Override - public void deleteById(String id, Boolean force) throws RemoteException { - - } - - @Override - public ProfiledDocument getById(String id) throws RemoteException { - return null; - } - - @Override - public Configuration getConfiguration() throws RemoteException { - return null; - } - - @Override - public Iterator query(QueryRequest request) throws RemoteException { - return null; - } - - @Override - public String querForJSON(QueryRequest request) throws RemoteException { - return null; - } - - @Override - public ProfiledDocument performStep(String id, String step, Document request) { - return null; + protected Class getManagedClass() { + return ProfiledDocument.class; } } diff --git a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/GeoPortalClient.java b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/GeoPortalClient.java deleted file mode 100644 index f3a0a83..0000000 --- a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/GeoPortalClient.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.gcube.application.geoportal.client; - -public class GeoPortalClient { - - - - -} diff --git a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/GeoportalAbstractPlugin.java b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/GeoportalAbstractPlugin.java index abbe88d..bce5b47 100644 --- a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/GeoportalAbstractPlugin.java +++ b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/GeoportalAbstractPlugin.java @@ -10,6 +10,7 @@ import org.gcube.application.geoportal.client.legacy.StatefulMongoConcessioniPlu 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.application.geoportal.common.rest.ProfiledDocumentsI; import org.gcube.common.clients.Plugin; import org.gcube.common.clients.ProxyBuilder; import org.gcube.common.clients.ProxyBuilderImpl; @@ -27,7 +28,20 @@ public abstract class GeoportalAbstractPlugin implements Plugin{ private static MongoConcessioniPlugin mongo_concessioni_plugin=new MongoConcessioniPlugin(); private static StatefulMongoConcessioniPlugin stateful_mongo_concessioni_plugin=new StatefulMongoConcessioniPlugin(); - + + public static ProxyBuilder profiledDocuments(String profileID) { + ProjectsPlugin plugin=new ProjectsPlugin(profileID); + return new ProxyBuilderImpl(plugin); + } + + public static ProxyBuilder profiledDocuments(String profileID, + Class> customClient) { + ProjectsPlugin plugin=new ProjectsPlugin(profileID); + plugin.setCustomClientImplementation(customClient); + return new ProxyBuilderImpl(plugin); + } + + public static ProxyBuilder concessioni() { return new ProxyBuilderImpl(concessioni_plugin); } diff --git a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/ProjectsPlugin.java b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/ProjectsPlugin.java index 53637e4..0b23e97 100644 --- a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/ProjectsPlugin.java +++ b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/ProjectsPlugin.java @@ -5,6 +5,11 @@ import javax.xml.namespace.QName; import javax.xml.transform.dom.DOMResult; import javax.xml.ws.EndpointReference; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.common.rest.ProfiledDocumentsI; import org.gcube.common.calls.jaxrs.GcubeService; @@ -13,17 +18,29 @@ import org.gcube.common.clients.config.ProxyConfig; import org.gcube.common.clients.delegates.ProxyDelegate; import org.w3c.dom.Node; +import java.lang.reflect.InvocationTargetException; + +@Slf4j +@RequiredArgsConstructor public class ProjectsPlugin extends GeoportalAbstractPlugin{ - + @NonNull + private String profileID; + + @Setter + private Class> + customClientImplementation=DefaultProfiledDocuments.class; + @Override public Exception convert(Exception fault, ProxyConfig config) { return fault; } + @SneakyThrows @Override public ProfiledDocumentsI newProxy(ProxyDelegate delegate) { - return new DefaultProfiledDocuments(delegate); + return customClientImplementation.getConstructor(ProxyDelegate.class,String.class). + newInstance(delegate,profileID); } @Override diff --git a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioni.java b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioni.java index 3460bbc..9d43cad 100644 --- a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioni.java +++ b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioni.java @@ -3,10 +3,13 @@ package org.gcube.application.geoportal.client.legacy; import java.util.ArrayList; import javax.ws.rs.client.WebTarget; +import javax.xml.ws.soap.Addressing; import lombok.Getter; import org.gcube.application.geoportal.client.DefaultMongoConcessioni; +import org.gcube.application.geoportal.client.utils.Serialization; import org.gcube.application.geoportal.common.model.legacy.*; +import org.gcube.application.geoportal.common.model.rest.AddSectionToConcessioneRequest; import org.gcube.application.geoportal.common.utils.FileSets; import org.gcube.application.geoportal.common.model.legacy.Concessione.Paths; import org.gcube.application.geoportal.common.model.rest.TempFile; @@ -64,7 +67,9 @@ public class StatefulMongoConcessioni extends DefaultMongoConcessioni implements current =super.registerFileSet(current.getMongo_id(), - FileSets.build(Paths.imgByIndex(current.getImmaginiRappresentative().size()-1),f).getTheRequest()); + Serialization.convert( + FileSets.build(Paths.imgByIndex(current.getImmaginiRappresentative().size()-1),f).getTheRequest(), + AddSectionToConcessioneRequest.class)); return current; } @@ -77,7 +82,8 @@ public class StatefulMongoConcessioni extends DefaultMongoConcessioni implements current =super.registerFileSet(current.getMongo_id(), - FileSets.build(Paths.piantaByIndex(current.getPianteFineScavo().size()-1),files).getTheRequest()); + Serialization.convert( + FileSets.build(Paths.piantaByIndex(current.getPianteFineScavo().size()-1),files).getTheRequest(),AddSectionToConcessioneRequest.class)); return current; } @@ -89,7 +95,7 @@ public class StatefulMongoConcessioni extends DefaultMongoConcessioni implements current =super.registerFileSet(current.getMongo_id(), - FileSets.build(Paths.POSIZIONAMENTO,files).getTheRequest()); + Serialization.convert(FileSets.build(Paths.POSIZIONAMENTO,files).getTheRequest(),AddSectionToConcessioneRequest.class)); return current; } @@ -101,7 +107,7 @@ public class StatefulMongoConcessioni extends DefaultMongoConcessioni implements current =super.registerFileSet(current.getMongo_id(), - FileSets.build(Paths.RELAZIONE,files).getTheRequest()); + Serialization.convert(FileSets.build(Paths.RELAZIONE,files).getTheRequest(),AddSectionToConcessioneRequest.class)); return current; } @@ -112,7 +118,7 @@ public class StatefulMongoConcessioni extends DefaultMongoConcessioni implements current =replace(current); current =super.registerFileSet(current.getMongo_id(), - FileSets.build(Paths.ABSTRACT_RELAZIONE,files).getTheRequest()); + Serialization.convert(FileSets.build(Paths.ABSTRACT_RELAZIONE,files).getTheRequest(),AddSectionToConcessioneRequest.class)); return current; } diff --git a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/utils/Serialization.java b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/utils/Serialization.java index e4f45ef..240c06f 100644 --- a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/utils/Serialization.java +++ b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/utils/Serialization.java @@ -5,37 +5,126 @@ import java.io.InputStream; import java.time.format.DateTimeFormatter; import java.util.Iterator; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.vdurmont.semver4j.Semver; +import org.bson.Document; +import org.bson.types.ObjectId; +import org.gcube.application.geoportal.common.model.document.ComparableVersion; +import org.gcube.application.geoportal.common.model.document.ProfiledDocument; +import org.gcube.application.geoportal.common.model.rest.QueryRequest; 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); - } - - - public static String write(Object obj) throws JsonProcessingException, IOException { - return mapper.writeValueAsString(obj); - } + 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.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + mapper.registerModule(new JavaTimeModule()); + + SimpleModule s=new SimpleModule(); + s.addDeserializer(ObjectId.class,new ObjectIdDeserializer()); + s.addSerializer(ObjectId.class,new ObjectIdSerializer()); + + s.addDeserializer(Semver.class,new SemverDeserializer()); + s.addSerializer(Semver.class,new SemverSerializer()); + + + mapper.registerModule(s); + } + + public static T read(String jsonString,Class clazz) throws JsonProcessingException, IOException { + return mapper.readerFor(clazz).readValue(jsonString); + } + + public static Iterator readCollection(String jsonString, Class clazz) throws IOException { + return mapper.readerFor(clazz).readValues(jsonString); + } - public static Iterator readCollection(String jsonString, Class clazz) throws IOException { - return mapper.readerFor(clazz).readValues(jsonString); - } public static Iterator readCollection(InputStream is, Class clazz) throws IOException { return mapper.readerFor(clazz).readValues(is); } + + public static String write(Object toWrite) throws JsonProcessingException { + String toReturn= mapper.writeValueAsString(toWrite); + return toReturn; + } + + //**** PROFILED DOCUMENTS + + public static final T convert(Object d,Class clazz){ + return mapper.convertValue(d,clazz); + } + + public static final Document asDocument(Object obj) throws JsonProcessingException { + return Document.parse(mapper.writeValueAsString(obj)); + } + + + // ***** Serialization Exceptions + + // OBJECT ID + private static class ObjectIdSerializer extends JsonSerializer { + @Override + public void serialize(ObjectId objectId, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { + if (objectId == null) jsonGenerator.writeNull(); + else jsonGenerator.writeString(objectId.toString()); + } + + @Override + public Class handledType() { + return ObjectId.class; + } + } + private static class ObjectIdDeserializer extends JsonDeserializer { + + @Override + public ObjectId deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + String value=jsonParser.getValueAsString(); + if(value==null || value.isEmpty() || value.equals("null")) + return null; + else return new ObjectId(value); + } + @Override + public Class handledType() { + return ObjectId.class; + } + } + + //Sem Version + private static class SemverSerializer extends JsonSerializer { + @Override + public void serialize(Semver semver, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { + if (semver == null) jsonGenerator.writeNull(); + else jsonGenerator.writeString(semver.getValue()); + } + + @Override + public Class handledType() { + return Semver.class; + } + } + private static class SemverDeserializer extends JsonDeserializer { + + @Override + public Semver deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + String value=jsonParser.getValueAsString(); + if(value==null || value.isEmpty() || value.equals("null")) + return null; + else return new Semver(value); + } + @Override + public Class handledType() { + return Semver.class; + } + } } diff --git a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/BasicVreTests.java b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/BasicVreTests.java index 6764444..151c7fa 100644 --- a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/BasicVreTests.java +++ b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/BasicVreTests.java @@ -7,9 +7,9 @@ public class BasicVreTests { @BeforeClass public static void setScope(){ - TokenSetter.set("/pred4s/preprod/preVRE"); +// TokenSetter.set("/pred4s/preprod/preVRE"); // TokenSetter.set("/d4science.research-infrastructures.eu/D4OS/GeoNA-Prototype"); - // TokenSetter.set("/gcube/devsec/devVRE"); + TokenSetter.set("/gcube/devsec/devVRE"); } diff --git a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledDocumentsTest.java b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledDocumentsTest.java new file mode 100644 index 0000000..4e6708d --- /dev/null +++ b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledDocumentsTest.java @@ -0,0 +1,23 @@ +package org.gcube.application.geoportal.clients; + +import org.gcube.application.geoportal.common.model.document.ProfiledDocument; +import org.gcube.application.geoportal.common.rest.MongoConcessioni; +import org.gcube.application.geoportal.common.rest.ProfiledDocumentsI; +import org.junit.Test; + +import static org.gcube.application.geoportal.client.GeoportalAbstractPlugin.mongoConcessioni; +import static org.gcube.application.geoportal.client.GeoportalAbstractPlugin.profiledDocuments; + +public class ProfiledDocumentsTest extends BasicVreTests{ + + + private ProfiledDocumentsI client= + profiledDocuments("profiledConcessioni").build(); + + @Test + public void getConfiguration() throws Exception { + System.out.println(client.getConfiguration()); + } + + +} diff --git a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledDocumentsTests.java b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledDocumentsTests.java new file mode 100644 index 0000000..257c845 --- /dev/null +++ b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledDocumentsTests.java @@ -0,0 +1,4 @@ +package org.gcube.application.geoportal.clients; + +public class ProfiledDocumentsTests { +} diff --git a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/StatelessClientTests.java b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/StatelessClientTests.java index c9f953b..32f9ae2 100644 --- a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/StatelessClientTests.java +++ b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/StatelessClientTests.java @@ -11,6 +11,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.concurrent.atomic.AtomicLong; +import com.sun.xml.internal.ws.api.addressing.AddressingPropertySet; import org.bson.Document; import org.gcube.application.cms.tests.model.concessioni.TestConcessioniFilters; import org.gcube.application.cms.tests.model.concessioni.TestConcessioniModel; @@ -118,10 +119,11 @@ public class StatelessClientTests extends BasicVreTests{ public void testUploadFileSet() throws Exception { Concessione testObject= client.createNew(TestConcessioniModel.prepareConcessione()); AddSectionToConcessioneRequest request= + Serialization.convert( // FileSets.prepareRequest(new StorageUtils(),Paths.RELAZIONE,new File(TestConcessioniModel.getBaseFolder(),"relazione.pdf")); FileSets.build(Paths.ABSTRACT_RELAZIONE).add( new StorageUtils().putOntoStorage(new File(TestConcessioniModel.getBaseFolder(),"relazione.pdf"),"San Mauro_drone totale.JPG")) - .getTheRequest(); + .getTheRequest(),AddSectionToConcessioneRequest.class); testObject= client.registerFileSet(testObject.getMongo_id(), request); @@ -190,30 +192,37 @@ public class StatelessClientTests extends BasicVreTests{ assertEquals(AccessPolicy.EMBARGOED,c.getRelazioneScavo().getPolicy()); c=client.registerFileSet(mongoId, - FileSets.prepareRequest(storage,Paths.RELAZIONE,new File(TestConcessioniModel.getBaseFolder(),"relazione.pdf"))); + Serialization.convert(FileSets.prepareRequest(storage,Paths.RELAZIONE, + new File(TestConcessioniModel.getBaseFolder(),"relazione.pdf")), AddSectionToConcessioneRequest.class)); assertEquals(AccessPolicy.EMBARGOED,c.getRelazioneScavo().getPolicy()); c=client.registerFileSet(mongoId, - FileSets.prepareRequest(storage,Paths.ABSTRACT_RELAZIONE,new File(TestConcessioniModel.getBaseFolder(),"relazione.pdf"))); + Serialization.convert( + FileSets.prepareRequest(storage,Paths.ABSTRACT_RELAZIONE,new File(TestConcessioniModel.getBaseFolder(),"relazione.pdf")),AddSectionToConcessioneRequest.class)); assertEquals(AccessPolicy.EMBARGOED,c.getRelazioneScavo().getPolicy()); for(int i=0;i { // CRUD public P createNew(Document toCreate)throws RemoteException; + public P getById(String id) throws RemoteException; + public P updateDocument(String id,Document updatedDocument) throws RemoteException; public void deleteById(String id) throws RemoteException; public void deleteById(String id,Boolean force) throws RemoteException; - public P getById(String id) throws RemoteException; + + // CONFIG public Configuration getConfiguration() throws RemoteException; // QUERY public Iterator

query (QueryRequest request) throws RemoteException; - public String querForJSON(QueryRequest request)throws RemoteException; + public Iterator queryForClass (QueryRequest request,Class clazz) throws RemoteException; + public String queryForJSON(QueryRequest request)throws RemoteException; //Execution - public P performStep(String id, String step, Document request); + public P performStep(String id, StepExecutionRequest request) throws RemoteException; + + //FileSets + public P registerFileSet(String id, RegisterFileSetRequest req) throws RemoteException; + //FileSets + public P deleteFileSet(String id, String path, Boolean force) throws RemoteException; } diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java index a75e364..3ef0936 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java @@ -182,6 +182,7 @@ public class ConcessioniMongoManager extends MongoManager{ delete(asId(id), collectionName); }catch(DeletionException e) { //storing updated - partially deleted + log.error("Error while trying to delete",e); concessione=onUpdate(concessione); replace(asDocument(concessione),new ObjectId(concessione.getMongo_id()), collectionName); throw e; diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java index ab83fc4..5d45fb1 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java @@ -1,5 +1,6 @@ package org.gcube.application.geoportal.service; +import org.bson.Document; import org.gcube.application.cms.tests.TokenSetter; import org.gcube.application.cms.tests.model.concessioni.TestConcessioniFilters; @@ -16,6 +17,7 @@ import org.gcube.application.geoportal.common.utils.FileSets; import org.gcube.application.geoportal.common.utils.Files; import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.cms.serialization.Serialization; +import org.geotoolkit.referencing.operation.provider.PolarStereographic; import org.json.JSONObject; import org.junit.Assert; import org.junit.Before; @@ -26,6 +28,7 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.File; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -208,9 +211,31 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{ public void handlePrecise() throws Exception { //Republishing WebTarget target=target(PATH); - String id="610415af02ad3d05b5f81ee3"; - publish(target,unpublish(target,id).getMongo_id()); - target.path(id).queryParam(InterfaceConstants.Parameters.FORCE,true).request(MediaType.APPLICATION_JSON).delete(); + //String id="61e6d5212f7b172ac9874879"; + + // Query & delete + QueryRequest req = new QueryRequest(); +// req.setFilter(Document.parse("{ \"report.objectName\" : { \"$eq\" : \"Unpublish report\" },\n" + +// " \"report.status\" : { \"$eq\" : \"PASSED\" } }")); + + req.setFilter(Document.parse("{ \"creationUser\" : { \"$eq\" : \"francesco.mangiacrapa\" }}")); + Iterator it= Serialization.readCollection(check(target.path(InterfaceConstants.Methods.QUERY_PATH).request(MediaType.APPLICATION_JSON_TYPE).post( + Entity.entity(Serialization.write(req),MediaType.APPLICATION_JSON)),String.class),Concessione.class); + + AtomicLong totCount=new AtomicLong(0); + List errMessages=new ArrayList<>(); + it.forEachRemaining(c->{ + try { + totCount.incrementAndGet(); + check(target.path(c.getMongo_id()). + queryParam(InterfaceConstants.Parameters.FORCE,false).request(MediaType.APPLICATION_JSON).delete(),String.class); + } catch (Exception e) { + errMessages.add("ERROR with "+c.getMongo_id()+" folder : "+c.getFolderId()+" author : "+c.getCreationUser()+". Message : "+e.getMessage()); + } + }); + System.out.println(errMessages.size()+" errors out of "+totCount.get()+" found items"); + errMessages.forEach(s -> { System.err.println(s); }); + //publish(target,unpublish(target,id).getMongo_id()); }