diff --git a/src/main/java/org/gcube/application/geoportal/service/engine/WorkspaceManager.java b/src/main/java/org/gcube/application/geoportal/service/engine/WorkspaceManager.java index a8ba056..e83f90d 100644 --- a/src/main/java/org/gcube/application/geoportal/service/engine/WorkspaceManager.java +++ b/src/main/java/org/gcube/application/geoportal/service/engine/WorkspaceManager.java @@ -111,7 +111,7 @@ public class WorkspaceManager { // STATIC SYNCH METHODS @Synchronized - private static FolderContainer getApplicationBaseFolder(StorageHubClient sgClient) throws StorageHubException { + public static FolderContainer getApplicationBaseFolder(StorageHubClient sgClient) throws StorageHubException { FolderContainer vre=sgClient.openVREFolder(); try { return vre.openByRelativePath(APP_FOLDER).asFolder(); diff --git a/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java b/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java index e2e3f79..1bbfdbf 100644 --- a/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java +++ b/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java @@ -100,7 +100,7 @@ public class ConcessioniMongoManager extends MongoManager{ public Iterable list(){ LinkedBlockingQueue queue=new LinkedBlockingQueue(); - iterate(null, collectionName).forEach( + iterate(null,null, collectionName).forEach( new Consumer() { @Override public void accept(Document d) { @@ -115,10 +115,10 @@ public class ConcessioniMongoManager extends MongoManager{ return queue; } - public Iterable search(String filter){ + public Iterable search(Document filter){ log.info("Searching concessione for filter {} ",filter); LinkedBlockingQueue queue=new LinkedBlockingQueue(); - iterate(filter,collectionName).forEach( + iterate(filter,null,collectionName).forEach( (Consumer) (Document d)->{try{ queue.put(asConcessione(d)); }catch(Throwable t){log.warn("Unable to translate "+d);}}); @@ -126,12 +126,12 @@ public class ConcessioniMongoManager extends MongoManager{ return queue; } - public Iterable query(QueryRequest queryRequest){ + public Iterable query(QueryRequest queryRequest){ log.info("Searching concessione for filter {} ",queryRequest); LinkedBlockingQueue queue=new LinkedBlockingQueue(); query(queryRequest,collectionName).forEach( (Consumer) (Document d)->{try{ - queue.put(asConcessione(d)); + queue.put(d); }catch(Throwable t){log.warn("Unable to translate "+d);}}); log.info("Returned {} elements ",queue.size()); return queue; @@ -301,7 +301,7 @@ public class ConcessioniMongoManager extends MongoManager{ } private static Concessione removeFromIndex(Concessione record) { - log.info("Removing from index {} ",record.getId()); + log.info("Removing from index {} ",record.getMongo_id()); ValidationReport report= new ValidationReport("Remove From Index Report "); PostgisIndex index; try { @@ -372,7 +372,6 @@ public class ConcessioniMongoManager extends MongoManager{ list.addAll(concessione.getPianteFineScavo()); for(AssociatedContent c:list) { if(c instanceof LayerConcessione) { - //TODO actually delete List contents=c.getActualContent(); List toRemove=new ArrayList<>(); for(PersistedContent p:contents){ diff --git a/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManager.java b/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManager.java index 4fa84d6..d5e0c61 100644 --- a/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManager.java +++ b/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManager.java @@ -1,6 +1,7 @@ package org.gcube.application.geoportal.service.engine.mongo; +import com.mongodb.Block; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; @@ -80,23 +81,27 @@ public abstract class MongoManager { } - public FindIterable iterate(String filterString,String collectionName) { + public FindIterable iterate(Document filter, Document projection, String collectionName) { + log.debug("Iterate over {} ",collectionName); MongoDatabase database=getDatabase(); MongoCollection coll=database.getCollection(collectionName); - if(filterString == null || filterString.isEmpty()) - return coll.find(); - else - return coll.find(Document.parse(filterString)); + + if(filter == null) filter=new Document(); + + log.debug("Applying Filter "+filter.toJson()); + + + if(projection != null ) { + log.debug("Applying projection "+projection.toJson()); + return coll.find(filter).projection(projection); + }else return coll.find(filter); + } public FindIterable query(QueryRequest request, String collectionName){ - MongoDatabase database=getDatabase(); - MongoCollection coll=database.getCollection(collectionName); - FindIterable toReturn=iterate(request.getFilter(), collectionName); - if(request.getTransformation()!=null&&!request.getTransformation().isEmpty()){ - log.warn("Transformation not YET Supported"); - } + FindIterable toReturn=iterate(request.getFilter(), request.getProjection(),collectionName); + if(request.getOrdering()!=null){ diff --git a/src/main/java/org/gcube/application/geoportal/service/rest/ConcessioniOverMongo.java b/src/main/java/org/gcube/application/geoportal/service/rest/ConcessioniOverMongo.java index b8f0bdf..623435f 100644 --- a/src/main/java/org/gcube/application/geoportal/service/rest/ConcessioniOverMongo.java +++ b/src/main/java/org/gcube/application/geoportal/service/rest/ConcessioniOverMongo.java @@ -1,6 +1,7 @@ package org.gcube.application.geoportal.service.rest; import lombok.extern.slf4j.Slf4j; +import org.bson.Document; import org.gcube.application.geoportal.common.model.legacy.Concessione; import org.gcube.application.geoportal.common.model.rest.AddSectionToConcessioneRequest; import org.gcube.application.geoportal.common.model.rest.Configuration; @@ -9,6 +10,7 @@ import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.service.engine.mongo.ConcessioniMongoManager; import org.gcube.application.geoportal.service.engine.postgis.PostgisIndex; import org.gcube.application.geoportal.service.model.internal.faults.DeletionException; +import org.gcube.application.geoportal.service.utils.Serialization; import org.json.JSONArray; import javax.ws.rs.*; @@ -208,7 +210,7 @@ public class ConcessioniOverMongo { @Override protected Iterable run() throws Exception, WebApplicationException { ConcessioniMongoManager manager=new ConcessioniMongoManager(); - return manager.search(filter); + return manager.search(Document.parse(filter)); } }.execute().getResult(); } @@ -217,13 +219,29 @@ public class ConcessioniOverMongo { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @Path("/"+InterfaceConstants.Methods.QUERY_PATH) - public Iterable search(QueryRequest queryRequest){ - return new GuardedMethod>() { + public String query(String queryString){ + return new GuardedMethod() { @Override - protected Iterable run() throws Exception, WebApplicationException { + protected String run() throws Exception, WebApplicationException { ConcessioniMongoManager manager=new ConcessioniMongoManager(); - return manager.query(queryRequest); + + Document queryDocument=Document.parse(queryString); + QueryRequest req=new QueryRequest(); + if(queryDocument.containsKey("ordering")) + req.setOrdering(Serialization.read(((Document)queryDocument.get("ordering")).toJson(),QueryRequest.OrderedRequest.class)); + if(queryDocument.containsKey("paging")) + req.setPaging(Serialization.read(((Document)queryDocument.get("paging")).toJson(),QueryRequest.PagedRequest.class)); + req.setProjection(queryDocument.get("projection",Document.class)); + req.setFilter(queryDocument.get("filter",Document.class)); + + StringBuilder builder=new StringBuilder("["); + manager.query(req).forEach(d->{builder.append(d.toJson()+",");}); + builder.deleteCharAt(builder.length()-1); + builder.append("]"); + return builder.toString(); } }.execute().getResult(); } + + } diff --git a/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java b/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java index 2ff063f..3fc52d9 100644 --- a/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java +++ b/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java @@ -10,6 +10,7 @@ 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.application.geoportal.service.utils.Serialization; +import org.json.JSONObject; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -97,15 +98,18 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{ return search(query,target); } - private static Iterator queryFile(String filename, WebTarget target) throws Exception { + private static Iterator queryFile(String filename, WebTarget target, Class clazz) throws Exception { String queryString= Files.readFileAsString(Files.getFileFromResources( "concessioni/jsonQueries/"+filename).getAbsolutePath(), Charset.defaultCharset()); String result = check(target.path(InterfaceConstants.Methods.QUERY_PATH).request(MediaType.APPLICATION_JSON_TYPE).post( Entity.entity(queryString,MediaType.APPLICATION_JSON)),String.class); - return Serialization.readCollection(result,Concessione.class); + return Serialization.readCollection(result,clazz); } + private static Iterator queryFile(String filename, WebTarget target) throws Exception { + return queryFile(filename,target,Concessione.class); + } // ********** TESTS @@ -128,8 +132,12 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{ public void query() throws Exception { WebTarget target=target(PATH); try { - System.out.println("Last Registered : " + queryFile("lastRegistered.json", target).next().getCreationTime()); - System.out.println("First Registered : " + queryFile("firstRegistered.json", target).next().getCreationTime()); +// System.out.println("Last Registered : " + queryFile("lastRegistered.json", target).next().getCreationTime()); +// System.out.println("First Registered : " + queryFile("firstRegistered.json", target).next().getCreationTime()); + System.out.println("Last Names by Fabio : "); + queryFile("lastNamesRegisteredByFabio.json", target, JSONObject.class).forEachRemaining(c -> {System.out.println(c);}); + System.out.println("Publication warning messages : "); + queryFile("publicationWarningMessages.json", target, JSONObject.class).forEachRemaining(c -> {System.out.println(c);}); }catch(NoSuchElementException e){ System.out.println("NO element found, probably empty DB"); } diff --git a/src/test/java/org/gcube/application/geoportal/service/legacy/MongoTests.java b/src/test/java/org/gcube/application/geoportal/service/MongoTests.java similarity index 55% rename from src/test/java/org/gcube/application/geoportal/service/legacy/MongoTests.java rename to src/test/java/org/gcube/application/geoportal/service/MongoTests.java index dc3d286..302fe7c 100644 --- a/src/test/java/org/gcube/application/geoportal/service/legacy/MongoTests.java +++ b/src/test/java/org/gcube/application/geoportal/service/MongoTests.java @@ -1,11 +1,14 @@ -package org.gcube.application.geoportal.service.legacy; +package org.gcube.application.geoportal.service; import com.fasterxml.jackson.core.JsonProcessingException; import com.mongodb.Block; import com.mongodb.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.Projections; import org.bson.Document; -import org.gcube.application.geoportal.service.TokenSetter; import org.gcube.application.geoportal.service.engine.ImplementationProvider; +import org.gcube.application.geoportal.service.engine.mongo.MongoManager; import org.gcube.application.geoportal.service.engine.providers.MongoClientProvider; import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; import org.junit.BeforeClass; @@ -15,12 +18,26 @@ import java.io.IOException; public class MongoTests { + public static class MongoTester extends MongoManager { + + public MongoTester() throws ConfigurationException { + } + + public MongoCollection getCollection(){return getDatabase().getCollection("legacyConcessioni");} + + @Override + protected MongoDatabase getDatabase() { + return client.getDatabase("gna_dev"); + } + } + + @BeforeClass public static final void init() { ImplementationProvider.get().setMongoClientProvider(new MongoClientProvider() { @Override public MongoClient getObject() throws ConfigurationException { - TokenSetter.set("/gcube/devNext/NextNext"); + TokenSetter.set("/gcube/devsec/devVRE"); return super.getObject(); } }); @@ -39,10 +56,27 @@ public class MongoTests { // MongoManager manager=new MongoManager(); // Profile f=Serialization.mapper.readerFor(Profile.class).readValue( // Files.getFileFromResources("fakeProfile.json")); -// +// // manager.iterate(new Document(),f).forEach(printBlock); } - + + + @Test + public void queries() throws ConfigurationException { + MongoTester tester=new MongoTester(); + System.out.println("Using builders.."); + tester.getCollection().find(Document.parse("{\"report.status\" : \"WARNING\"}")). + projection(Projections.include("nome")).forEach(printBlock); + System.out.println("Deserializing documents"); + tester.getCollection().find(Document.parse("{\"report.status\" : \"WARNING\"}")). + projection(Document.parse("{\"nome\" : 1}")).forEach(printBlock); + } + + @Test + public void checkQuerySerialization(){ + System.out.println(Projections.include("nome")); + } + // @Test // public void writeProject() { // MongoManager manager=new MongoManager(); diff --git a/src/test/java/org/gcube/application/geoportal/service/ws/DescribeWSFolder.java b/src/test/java/org/gcube/application/geoportal/service/ws/DescribeWSFolder.java new file mode 100644 index 0000000..9b88c51 --- /dev/null +++ b/src/test/java/org/gcube/application/geoportal/service/ws/DescribeWSFolder.java @@ -0,0 +1,31 @@ +package org.gcube.application.geoportal.service.ws; + +import org.gcube.application.geoportal.service.TokenSetter; +import org.gcube.common.storagehub.client.dsl.StorageHubClient; +import org.gcube.common.storagehub.model.exceptions.StorageHubException; +import org.gcube.common.storagehub.model.items.*; + +public class DescribeWSFolder { + + public static void main(String[] args) throws StorageHubException { + String context="/gcube/devsec/devVRE"; + String folderID="fea4a885-7e60-4294-83d0-82162e7462f4"; + + + TokenSetter.set(context); + StorageHubClient shc = new StorageHubClient(); + FolderItem folder=shc.open(folderID).asFolder().get(); + + System.out.println("PATH : "+folder.getPath()); + System.out.println("HIDDEN : "+folder.isHidden()); + System.out.println("Description : "+folder.getDescription()); + + System.out.println("Listing... "); + for (Item item : shc.open(folderID).asFolder().list().getItems()) { + System.out.println("name:" + item.getName() + " is a File?: " + (item instanceof AbstractFileItem)); + System.out.println("name:" + item.getName() + " is a folder?: " + (item instanceof FolderItem)); + System.out.println("name:" + item.getName() + " is a shared folder?: " + (item instanceof SharedFolder)); + System.out.println("name:" + item.getName() + " is a VRE folder?: " + (item instanceof VreFolder)); + } + } +} diff --git a/src/test/java/org/gcube/application/geoportal/service/ws/DisplayWorkspaceTree.java b/src/test/java/org/gcube/application/geoportal/service/ws/DisplayWorkspaceTree.java new file mode 100644 index 0000000..b5f56b0 --- /dev/null +++ b/src/test/java/org/gcube/application/geoportal/service/ws/DisplayWorkspaceTree.java @@ -0,0 +1,12 @@ +package org.gcube.application.geoportal.service.ws; + +public class DisplayWorkspaceTree { + + public static void main(String[] args) { + String context="/gcube/devsec/devVRE"; + + String folderId=null; // NB null == + + } + +} diff --git a/src/test/java/org/gcube/application/geoportal/service/ws/SetWSFolderVisibility.java b/src/test/java/org/gcube/application/geoportal/service/ws/SetWSFolderVisibility.java new file mode 100644 index 0000000..8c0084b --- /dev/null +++ b/src/test/java/org/gcube/application/geoportal/service/ws/SetWSFolderVisibility.java @@ -0,0 +1,28 @@ +package org.gcube.application.geoportal.service.ws; + +import org.gcube.application.geoportal.service.TokenSetter; +import org.gcube.application.geoportal.service.engine.WorkspaceManager; +import org.gcube.common.storagehub.client.dsl.FolderContainer; +import org.gcube.common.storagehub.client.dsl.StorageHubClient; +import org.gcube.common.storagehub.model.exceptions.StorageHubException; + +public class SetWSFolderVisibility { + + public static void main(String[] args) throws StorageHubException { + + String context="/gcube/devsec/devVRE"; + Boolean setVisible=true; + + + + TokenSetter.set(context); + StorageHubClient shc = new StorageHubClient(); + FolderContainer folderContainer = WorkspaceManager.getApplicationBaseFolder(shc); + if(setVisible) + folderContainer.setVisible(); + else + folderContainer.setHidden(); //will not appear in the workspace GUI + System.out.println("Done, children count "+folderContainer.list().getItems().size()); + + } +} diff --git a/src/test/resources/concessioni/jsonQueries/lastNamesRegisteredByFabio.json b/src/test/resources/concessioni/jsonQueries/lastNamesRegisteredByFabio.json new file mode 100644 index 0000000..668175a --- /dev/null +++ b/src/test/resources/concessioni/jsonQueries/lastNamesRegisteredByFabio.json @@ -0,0 +1,18 @@ +{ + "paging" : { + "offset" : 0, + "limit" : 1 + }, + "ordering" : { + "direction" : "DESCENDING", + "fields" : ["creationTime","nome"] + }, + "filter" : { + "creationUser" : {$eq : "fabio.sinibaldi"} + }, + "projection" : { + "nome" : 1 + } + + +} \ No newline at end of file diff --git a/src/test/resources/concessioni/jsonQueries/lastRegistered.json b/src/test/resources/concessioni/jsonQueries/lastRegistered.json index a047254..3324a3a 100644 --- a/src/test/resources/concessioni/jsonQueries/lastRegistered.json +++ b/src/test/resources/concessioni/jsonQueries/lastRegistered.json @@ -7,4 +7,5 @@ "direction" : "DESCENDING", "fields" : ["creationTime","nome"] } + } \ No newline at end of file diff --git a/src/test/resources/concessioni/jsonQueries/publicationWarningMessages.json b/src/test/resources/concessioni/jsonQueries/publicationWarningMessages.json new file mode 100644 index 0000000..514bb64 --- /dev/null +++ b/src/test/resources/concessioni/jsonQueries/publicationWarningMessages.json @@ -0,0 +1,10 @@ +{ + "ordering" : { + "direction" : "DESCENDING", + "fields" : ["nome"] + }, + + "filter" : {"report.status" : {"$eq" : "WARNING"}}, + "projection" : {"report.warningMessages" : 1} + +} \ No newline at end of file