From 20336ea57a55c657683320e5d87b03e020562b3d Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 10 Jan 2023 11:42:09 +0100 Subject: [PATCH 01/18] Tests --- .../application/cms/tests/TestDocuments.java | 2 +- .../geoportal/clients/GenericUseCases.java | 11 +++-- .../clients/ProfiledConcessioniTest.java | 29 +++++++++++- .../clients/ProfiledDocumentsTest.java | 47 ++++++++++++++++++- .../engine/mongo/ProfiledMongoManager.java | 2 +- .../AbstractProfiledDocumentsTests.java | 8 +++- .../profiledDocuments/DummyProjectTest.java | 11 +++-- .../ProfiledConcessioniTests.java | 3 +- .../usecases/ExportConcessioniAsProjects.java | 3 ++ 9 files changed, 101 insertions(+), 15 deletions(-) diff --git a/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TestDocuments.java b/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TestDocuments.java index 009cb68..5b2dbf2 100644 --- a/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TestDocuments.java +++ b/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TestDocuments.java @@ -10,7 +10,7 @@ import java.nio.charset.Charset; import java.util.HashMap; public class TestDocuments { - public static File BASE_FOLDER =new File("test-data/profiledDocuments"); + public static File BASE_FOLDER =new File("../test-data/profiledDocuments"); public static final HashMap documentMap =new HashMap<>(); static{ diff --git a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/GenericUseCases.java b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/GenericUseCases.java index 0a23f67..c24da3f 100644 --- a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/GenericUseCases.java +++ b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/GenericUseCases.java @@ -52,16 +52,19 @@ public abstract class GenericUseCases extends BasicVreTests{ } protected Project prepareWithFileSet(Project project) throws FileNotFoundException, InvalidRequestException, RemoteException { + + return getClient().registerFileSet(project.getId(), prepareRequest()); + } + + protected RegisterFileSetRequest prepareRequest() throws FileNotFoundException { String parentPath = "$.section"; String fieldName = "fileset"; String fieldDefinition = "$.section._children[?(@.fileset)]"; // Prepare request - RegisterFileSetRequest fsRequest = FileSets. + return FileSets. prepareRequest(new StorageUtils(), parentPath,fieldName,fieldDefinition, new File(Tests.FOLDER_CONCESSIONI,"pos.shp")); - - - return getClient().registerFileSet(project.getId(),fsRequest); } + } diff --git a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledConcessioniTest.java b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledConcessioniTest.java index 8af8aae..e2a17cf 100644 --- a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledConcessioniTest.java +++ b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledConcessioniTest.java @@ -2,12 +2,17 @@ package org.gcube.application.geoportal.clients; import com.fasterxml.jackson.core.JsonProcessingException; import lombok.Data; +import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.cms.tests.TestDocuments; import org.gcube.application.cms.tests.Tests; import org.gcube.application.geoportal.client.utils.Serialization; import org.gcube.application.geoportal.common.faults.InvalidRequestException; +import org.gcube.application.geoportal.common.model.JSONPathWrapper; import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.access.Access; +import org.gcube.application.geoportal.common.model.document.access.AccessPolicy; +import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest; import org.gcube.application.geoportal.common.model.useCaseDescriptor.Field; @@ -25,6 +30,9 @@ import java.io.IOException; import java.nio.charset.Charset; import java.rmi.RemoteException; +import static org.junit.Assert.assertEquals; + +@Slf4j public class ProfiledConcessioniTest extends ProfiledDocumentsTest{ @Data @@ -78,11 +86,28 @@ public class ProfiledConcessioniTest extends ProfiledDocumentsTest{ // Set relazione - client.registerFileSet(project.getId(), FileSets. + + Access toSetAccess = new Access(); + toSetAccess.setPolicy(AccessPolicy.RESTRICTED); + toSetAccess.setLicense("CC0-1.0"); + + RegisterFileSetRequest request=FileSets. prepareRequest(new StorageUtils(), "$.relazioneScavo","fileset", "$.relazioneScavo."+Field.CHILDREN+"[?(@.fileset)]", - new File(Tests.FOLDER_CONCESSIONI,"relazione.pdf"))); + new File(Tests.FOLDER_CONCESSIONI,"relazione.pdf")); + request.setToSetAccess(toSetAccess); + + project=client.registerFileSet(project.getId(), request); + + String jsonDoc=project.getTheDocument().toJson(); + log.info("Registered fileset. Result is {}", jsonDoc); + RegisteredFileSet f= Serialization.convert(new JSONPathWrapper(jsonDoc).getByPath( + request.getParentPath()).get(0),RegisteredFileSet.class); + + assertEquals(Serialization.convert(f.getAccess(),Access.class).getPolicy(),toSetAccess.getPolicy()); + assertEquals(Serialization.convert(f.getAccess(),Access.class).getLicense(),toSetAccess.getLicense()); + // Set Abstract 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 index 5296118..606d7f4 100644 --- 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 @@ -3,22 +3,35 @@ package org.gcube.application.geoportal.clients; import com.fasterxml.jackson.core.JsonProcessingException; import lombok.extern.slf4j.Slf4j; import org.bson.Document; +import org.gcube.application.cms.tests.Tests; +import org.gcube.application.geoportal.client.utils.Serialization; +import org.gcube.application.geoportal.common.faults.InvalidRequestException; +import org.gcube.application.geoportal.common.model.JSONPathWrapper; import org.gcube.application.geoportal.common.model.configuration.Configuration; import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.access.Access; +import org.gcube.application.geoportal.common.model.document.access.AccessPolicy; +import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet; import org.gcube.application.geoportal.common.model.document.relationships.RelationshipNavigationObject; import org.gcube.application.geoportal.common.model.rest.CreateRelationshipRequest; import org.gcube.application.geoportal.common.model.rest.DeleteRelationshipRequest; 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.Projects; +import org.gcube.application.geoportal.common.utils.FileSets; +import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.common.utils.tests.GCubeTest; import org.junit.Test; +import java.io.File; +import java.io.FileNotFoundException; import java.rmi.RemoteException; import java.time.LocalDateTime; import java.util.Iterator; import java.util.concurrent.atomic.AtomicLong; import static org.gcube.application.geoportal.client.utils.Serialization.write; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; @@ -33,7 +46,7 @@ public class ProfiledDocumentsTest> exte @Test - public void registerNew() throws RemoteException, JsonProcessingException { + public void registerNew() throws RemoteException, JsonProcessingException, FileNotFoundException, InvalidRequestException { assumeTrue(GCubeTest.isTestInfrastructureEnabled()); Projects client = (Projects) getClient(); @@ -46,6 +59,38 @@ public class ProfiledDocumentsTest> exte Project p =client.createNew(theDoc); log.debug("Registered project (AS JSON) : {}", write(p)); + + + } + + + @Test + public void testAccess() throws FileNotFoundException, RemoteException, InvalidRequestException, JsonProcessingException { + assumeTrue(GCubeTest.isTestInfrastructureEnabled()); + Projects client = (Projects) getClient(); + + Document theDoc= Document.parse("{\n" + + "\"posizionamentoScavo\" :{\n" + + "\t\"titolo\" : \"mio titolo\"}}"); + + theDoc.put("startTime", LocalDateTime.now()); + + Project p =client.createNew(theDoc); + + RegisterFileSetRequest fsRequest = prepareRequest(); + + Access access = new Access(); + access.setLicense("CC0-1.0"); + access.setPolicy(AccessPolicy.RESTRICTED); + fsRequest.setToSetAccess(access); + + p=client.registerFileSet(p.getId(),fsRequest); + + log.info("Registered fileset. Result is {}", Serialization.write(p)); + RegisteredFileSet f= Serialization.convert(new JSONPathWrapper(p.getTheDocument().toJson()).getByPath(fsRequest.getParentPath()).get(0),RegisteredFileSet.class); + + assertEquals(Serialization.convert(f.getAccess(),Access.class).getPolicy(),AccessPolicy.RESTRICTED); + } @Test diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java index 3f52e50..0ff4e5f 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java @@ -953,7 +953,7 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< private static final RegisteredFileSet prepareRegisteredFileSet(Access toSetAccess,String docID, String profileID, Document attributes,List files, StorageUtils storage,WorkspaceManager ws) throws StorageHubException, StorageException { - log.debug("Preparing Registered FileSet.."); + log.debug("Preparing Registered FileSet {}"); RegisteredFileSet toReturn = new RegisteredFileSet(); if(attributes!=null) toReturn.putAll(attributes); String uuid = UUID.randomUUID().toString(); diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java index 1d87e55..7effc88 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java @@ -9,6 +9,7 @@ import org.gcube.application.cms.tests.TokenSetter; import org.gcube.application.cms.tests.model.BasicTests; import org.gcube.application.geoportal.common.model.configuration.Configuration; import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.access.Access; import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; @@ -29,6 +30,7 @@ import javax.ws.rs.core.MediaType; import java.io.File; import java.util.List; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; @@ -158,9 +160,12 @@ public abstract class AbstractProfiledDocumentsTests extends BasicServiceTestUni String fieldDefinitionPath, Document attributes, RegisterFileSetRequest.ClashOptions clashPolicy, - String ...files) throws Exception { + Access access, + String ...files) throws Exception { FileSets.RequestBuilder builder = FileSets.build(parentPath,fieldName,fieldDefinitionPath); + builder.setAccess(access); + builder.setClashPolicy(clashPolicy).setAttributes(attributes); for(String file:files) @@ -169,6 +174,7 @@ public abstract class AbstractProfiledDocumentsTests extends BasicServiceTestUni Project doc = check(baseTarget().path(InterfaceConstants.Methods.REGISTER_FILES_PATH).path(id).request(MediaType.APPLICATION_JSON). post(Entity.entity(Serialization.write(builder.getTheRequest()), MediaType.APPLICATION_JSON)), Project.class); + BasicTests.validate(doc); return doc; } diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java index 4852a0d..118ec4a 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java @@ -4,6 +4,8 @@ import org.bson.Document; import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.geoportal.common.model.JSONPathWrapper; import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.access.Access; +import org.gcube.application.geoportal.common.model.document.access.AccessPolicy; import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet; import org.gcube.application.geoportal.common.model.document.relationships.Relationship; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; @@ -89,7 +91,7 @@ public class DummyProjectTest extends AbstractProfiledDocumentsTests{ fieldDefinition, new Document("customField","customFieldValue"), RegisterFileSetRequest.ClashOptions.REPLACE_EXISTING, - filename); + new Access(),filename); wrapper = new JSONPathWrapper(doc.getTheDocument().toJson()); assertTrue("Relazione exists",wrapper.getMatchingPaths("section").size()==1); @@ -127,8 +129,9 @@ public class DummyProjectTest extends AbstractProfiledDocumentsTests{ Project doc = createNew(baseDoc); - - + Access access =new Access(); + access.setLicense("test-license"); + access.setPolicy(AccessPolicy.RESTRICTED); // INSERT ONE, MERGE INFO (NB default values already exist) doc = upload( @@ -138,7 +141,7 @@ public class DummyProjectTest extends AbstractProfiledDocumentsTests{ fieldDefinition, new Document("customField","customFieldValue"), RegisterFileSetRequest.ClashOptions.REPLACE_EXISTING, - filename); + access,filename); return doc; } diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java index c42b12c..11bfa66 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java @@ -8,6 +8,7 @@ import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.cms.tests.model.BasicTests; import org.gcube.application.geoportal.common.model.JSONPathWrapper; import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.access.Access; import org.gcube.application.geoportal.common.model.document.identification.SpatialReference; import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; @@ -70,7 +71,7 @@ public class ProfiledConcessioniTests extends AbstractProfiledDocumentsTests{ "fileset", "$.posizionamentoScavo."+ Field.CHILDREN+"[?(@.fileset)]", null, - RegisterFileSetRequest.ClashOptions.MERGE_EXISTING, + RegisterFileSetRequest.ClashOptions.MERGE_EXISTING,new Access(), "concessioni/pos.SHP"); diff --git a/use-cases/src/test/java/org/gcube/application/cms/usecases/ExportConcessioniAsProjects.java b/use-cases/src/test/java/org/gcube/application/cms/usecases/ExportConcessioniAsProjects.java index c265399..af49403 100644 --- a/use-cases/src/test/java/org/gcube/application/cms/usecases/ExportConcessioniAsProjects.java +++ b/use-cases/src/test/java/org/gcube/application/cms/usecases/ExportConcessioniAsProjects.java @@ -250,6 +250,9 @@ public class ExportConcessioniAsProjects { + "[?(@.fileset)]"); req.addAll(convertFiles(content)); req.setAccess(getAccess(rel)); + + + project = client.registerFileSet(project.getId(),req.getTheRequest()); } // upload fileset -- 2.17.1 From 2561da665f483755a6805a6f62e8ba1116e00d17 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 10 Jan 2023 15:57:40 +0100 Subject: [PATCH 02/18] UserUtils integration --- CHANGELOG.md | 3 + ckan-plugin/CHANGELOG.md | 3 + ckan-plugin/pom.xml | 4 +- cms-plugin-framework/CHANGELOG.md | 3 + cms-plugin-framework/pom.xml | 10 +- .../cms/caches/AbstractScopedMap.java | 6 +- .../cms/implementations}/utils/UserUtils.java | 2 +- cms-test-commons/CHANGELOG.md | 3 + cms-test-commons/pom.xml | 4 +- concessioni-lifecycle/CHANGELOG.md | 3 + concessioni-lifecycle/pom.xml | 4 +- concessioni-model/CHANGELOG.md | 3 + concessioni-model/pom.xml | 4 +- dataminer-plugins/CHANGELOG.md | 3 + dataminer-plugins/pom.xml | 4 +- default-lc-managers/CHANGELOG.md | 5 +- default-lc-managers/pom.xml | 4 +- .../AbstractLifeCycleManager.java | 6 +- geoportal-client/CHANGELOG.md | 3 + geoportal-client/pom.xml | 4 +- geoportal-common/CHANGELOG.md | 3 + geoportal-common/pom.xml | 4 +- .../geoportal/common/utils/ContextUtils.java | 21 +-- .../common/utils/tests/GCubeTest.java | 2 +- geoportal-service/CHANGELOG.md | 3 + geoportal-service/pom.xml | 9 +- .../engine/mongo/ProfiledMongoManager.java | 10 +- .../service/engine/mongo/UCDMongoManager.java | 6 +- .../engine/providers/ConfigurationCache.java | 3 + .../engine/providers/ucd/UCDManager.java | 4 +- .../service/engine/mongo/LockTests.java | 8 +- .../AbstractProfiledDocumentsTests.java | 1 + .../profiledDocuments/DummyProjectTest.java | 141 ++---------------- .../ProfiledConcessioniTests.java | 12 +- images-plugin/CHANGELOG.md | 3 + images-plugin/pom.xml | 4 +- notifications-plugins/CHANGELOG.md | 3 + notifications-plugins/pom.xml | 4 +- pom.xml | 14 +- sdi-plugins/CHANGELOG.md | 3 + sdi-plugins/pom.xml | 4 +- .../sdi/plugins/SDIMaterializerPlugin.java | 7 +- use-cases/CHANGELOG.md | 7 +- use-cases/pom.xml | 4 +- .../cms/usecases/GenericChecks.java | 56 +++++++ 45 files changed, 199 insertions(+), 218 deletions(-) rename {geoportal-service/src/main/java/org/gcube/application/geoportal/service => cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations}/utils/UserUtils.java (98%) create mode 100644 use-cases/src/test/java/org/gcube/application/cms/usecases/GenericChecks.java diff --git a/CHANGELOG.md b/CHANGELOG.md index a1929c5..1b686a3 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.spatial.data.gcube-sdi-suite +## [v1.0.4-SNAPSHOT] - 2023-01-10 +- Updated plugin framework + ## [v1.0.3] - 2022-12-07 - Updated plugin framework - Introduced module default-lc-managers diff --git a/ckan-plugin/CHANGELOG.md b/ckan-plugin/CHANGELOG.md index dc13fd4..e75d18f 100644 --- a/ckan-plugin/CHANGELOG.md +++ b/ckan-plugin/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains gcube-cms plugins for ckan materializations +## [v1.0.2-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.1] - 2022-12-07 - Pom updates diff --git a/ckan-plugin/pom.xml b/ckan-plugin/pom.xml index ce4336a..266f60c 100644 --- a/ckan-plugin/pom.xml +++ b/ckan-plugin/pom.xml @@ -5,14 +5,14 @@ 4.0.0 ckan-plugins - 1.0.1 + 1.0.2-SNAPSHOT gCube CMS - CKAN Plugins org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/cms-plugin-framework/CHANGELOG.md b/cms-plugin-framework/CHANGELOG.md index d9194ca..48fbb29 100644 --- a/cms-plugin-framework/CHANGELOG.md +++ b/cms-plugin-framework/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.cms-plugin-framework +## [v1.0.3-SNAPSHOT] - 2023-01-10 +- UserUtils in framework + ## [v1.0.2] 2022-01-17 - Fixes #2435 - Introduced module default-lc-managers diff --git a/cms-plugin-framework/pom.xml b/cms-plugin-framework/pom.xml index d78566d..b5130b9 100644 --- a/cms-plugin-framework/pom.xml +++ b/cms-plugin-framework/pom.xml @@ -4,12 +4,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 cms-plugin-framework - 1.0.2 + 1.0.3-SNAPSHOT org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT @@ -67,6 +67,12 @@ + + org.gcube.common + authorization-utils + [2.0.0, 3.0.0-SNAPSHOT) + + org.gcube.application.cms geoportal-common diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/AbstractScopedMap.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/AbstractScopedMap.java index 1a1a8cd..983503a 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/AbstractScopedMap.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/AbstractScopedMap.java @@ -2,6 +2,7 @@ package org.gcube.application.cms.caches; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import org.gcube.application.geoportal.common.utils.ContextUtils; @@ -18,7 +19,10 @@ public abstract class AbstractScopedMap extends TimedMap implements @Override public T getObject() throws ConfigurationException { - return get(ContextUtils.getCurrentScope()); + UserUtils.AuthenticatedUser user = UserUtils.getCurrent(); + String context = user.getContext(); + log.debug(" {} : Accessing object under context {} ",name,context); + return get(context); } diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/utils/UserUtils.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/utils/UserUtils.java similarity index 98% rename from geoportal-service/src/main/java/org/gcube/application/geoportal/service/utils/UserUtils.java rename to cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/utils/UserUtils.java index cc525cc..d810f01 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/utils/UserUtils.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/utils/UserUtils.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.service.utils; +package org.gcube.application.cms.implementations.utils; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/cms-test-commons/CHANGELOG.md b/cms-test-commons/CHANGELOG.md index 3bb048b..9b07913 100644 --- a/cms-test-commons/CHANGELOG.md +++ b/cms-test-commons/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.cms.cms-test-commons +## [v1.0.4-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.3] - 2022-12-07 - Pom updates diff --git a/cms-test-commons/pom.xml b/cms-test-commons/pom.xml index c66b0d0..c5bba41 100644 --- a/cms-test-commons/pom.xml +++ b/cms-test-commons/pom.xml @@ -5,14 +5,14 @@ 4.0.0 cms-test-commons - 1.0.3 + 1.0.4-SNAPSHOT CMS Test Commons org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/concessioni-lifecycle/CHANGELOG.md b/concessioni-lifecycle/CHANGELOG.md index 8e4aad8..9a95716 100644 --- a/concessioni-lifecycle/CHANGELOG.md +++ b/concessioni-lifecycle/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains custom extensions for the support of GNA "concessioni" use case +## [v1.0.3-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.2] - 2022-12-07 - Pom updates - Introduced module default-lc-managers diff --git a/concessioni-lifecycle/pom.xml b/concessioni-lifecycle/pom.xml index 6a7dcb8..ddee981 100644 --- a/concessioni-lifecycle/pom.xml +++ b/concessioni-lifecycle/pom.xml @@ -4,14 +4,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 concessioni-lifecycle - 1.0.2 + 1.0.3-SNAPSHOT GNA Concessioni Lifecycle org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/concessioni-model/CHANGELOG.md b/concessioni-model/CHANGELOG.md index 7b873d0..22ba985 100644 --- a/concessioni-model/CHANGELOG.md +++ b/concessioni-model/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains custom BEANS for the support of GNA "concessioni" use case +## [v1.0.3-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.2] - 2022-12-07 - Pom updates diff --git a/concessioni-model/pom.xml b/concessioni-model/pom.xml index 8916c04..60d5217 100644 --- a/concessioni-model/pom.xml +++ b/concessioni-model/pom.xml @@ -6,14 +6,14 @@ org.gcube.application.cms concessioni-model - 1.0.2 + 1.0.3-SNAPSHOT GNA Concessioni Model org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/dataminer-plugins/CHANGELOG.md b/dataminer-plugins/CHANGELOG.md index 6d1e27e..f80220f 100644 --- a/dataminer-plugins/CHANGELOG.md +++ b/dataminer-plugins/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains gcube-cms plugins for processing via gCube Dataminer +## [v1.0.2-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.1] - 2022-12-07 - Pom updates diff --git a/dataminer-plugins/pom.xml b/dataminer-plugins/pom.xml index 4c8b9e0..41b1f8f 100644 --- a/dataminer-plugins/pom.xml +++ b/dataminer-plugins/pom.xml @@ -5,14 +5,14 @@ 4.0.0 dataminer-plugins - 1.0.1 + 1.0.3-SNAPSHOT gCube CMS - Dataminer Plugins org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/default-lc-managers/CHANGELOG.md b/default-lc-managers/CHANGELOG.md index 6c80f00..acc13d8 100644 --- a/default-lc-managers/CHANGELOG.md +++ b/default-lc-managers/CHANGELOG.md @@ -4,5 +4,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains default Lifecycle Managers handlers -## [v1.0.0] - 2022-02-24 +## [v1.0.1-SNAPSHOT] - 2023-01-10 +- Pom updates + +- ## [v1.0.0] - 2022-02-24 - First release diff --git a/default-lc-managers/pom.xml b/default-lc-managers/pom.xml index 7351a94..4e7c601 100644 --- a/default-lc-managers/pom.xml +++ b/default-lc-managers/pom.xml @@ -5,14 +5,14 @@ 4.0.0 default-lc-managers - 1.0.0 + 1.0.1-SNAPSHOT gCube CMS - Default LC Managers org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java b/default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java index e718042..faddf7d 100644 --- a/default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java +++ b/default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java @@ -3,6 +3,7 @@ package org.gcube.application.cms.plugins.implementations; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.implementations.ProjectAccess; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.cms.plugins.LifecycleManager; import org.gcube.application.cms.plugins.PluginManagerInterface; import org.gcube.application.cms.plugins.faults.*; @@ -164,9 +165,10 @@ public abstract class AbstractLifeCycleManager extends AbstractPlugin implements try{ report.setStatus(Report.Status.OK); } catch (Throwable e) { - log.error("Unable to initialize plugins in {} ", ContextUtils.getCurrentScope(),e); + String context = UserUtils.getCurrent().getContext(); + log.error("Unable to initialize plugins in {} ", context,e); report.setStatus(Report.Status.WARNING); - report.putMessage("Unable to initialize plugins in "+ ContextUtils.getCurrentScope()+" : "+e.getMessage()); + report.putMessage("Unable to initialize plugins in "+ context +" : "+e.getMessage()); } return report; } diff --git a/geoportal-client/CHANGELOG.md b/geoportal-client/CHANGELOG.md index e27a637..18402ab 100644 --- a/geoportal-client/CHANGELOG.md +++ b/geoportal-client/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.1.2-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.1.1] - 2022-12-07 - Pom updates diff --git a/geoportal-client/pom.xml b/geoportal-client/pom.xml index c515295..13bac29 100644 --- a/geoportal-client/pom.xml +++ b/geoportal-client/pom.xml @@ -4,14 +4,14 @@ 4.0.0 org.gcube.application geoportal-client - 1.1.1 + 1.1.2-SNAPSHOT Geoportal Client org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/geoportal-common/CHANGELOG.md b/geoportal-common/CHANGELOG.md index b216451..6ce5fab 100644 --- a/geoportal-common/CHANGELOG.md +++ b/geoportal-common/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-common +## [v1.0.11-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.10] - 2022-12-07 - Pom updates diff --git a/geoportal-common/pom.xml b/geoportal-common/pom.xml index 5e0831c..33c1a50 100644 --- a/geoportal-common/pom.xml +++ b/geoportal-common/pom.xml @@ -3,14 +3,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 geoportal-common - 1.0.10 + 1.0.11-SNAPSHOT Geoportal Common org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/ContextUtils.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/ContextUtils.java index 6969202..c7f6d8c 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/ContextUtils.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/ContextUtils.java @@ -8,33 +8,20 @@ import org.gcube.common.scope.api.ScopeProvider; import static org.gcube.common.authorization.client.Constants.authorizationService; @Slf4j +@Deprecated public class ContextUtils { - public static String getCurrentScope(){ - try{ - String token=SecurityTokenProvider.instance.get(); - log.trace("Token is : "+token.substring(0,2)+"..."+token.substring(token.length()-3)); - if(token==null) throw new Exception("Security Token is null"); - AuthorizationEntry entry = authorizationService().get(token); - return entry.getContext(); - }catch(Exception e ){ - log.trace("Unable to resolve token, checking scope provider..",e); - return ScopeProvider.instance.get(); - } - } - - public static String getCurrentCaller(){ try{ String token=SecurityTokenProvider.instance.get(); - log.trace("Token is : "+token.substring(0,2)+"..."+token.substring(token.length()-3)); if(token==null) throw new Exception("Security Token is null"); + log.trace("Token is : "+token.substring(0,2)+"..."+token.substring(token.length()-3)); AuthorizationEntry entry = authorizationService().get(token); return entry.getClientInfo().getId(); }catch(Exception e ){ - log.trace("Unable to resolve token, checking scope provider..",e); - return "Unidentified data-transfer user"; + log.warn("Unable to resolve token using legacy utils, using default ..",e); + return "CMS_default_user"; } } } diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java index e8ce6e7..72f0be0 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java @@ -17,7 +17,7 @@ public class GCubeTest { testContext = "/pred4s/preprod/preVRE"; // testContext = "/d4science.research-infrastructures.eu/D4OS/GNA"; - testContext= "/gcube/devsec/devVRE"; + // testContext= "/gcube/devsec/devVRE"; System.out.println("TEST CONTEXT = "+testContext); return testContext; diff --git a/geoportal-service/CHANGELOG.md b/geoportal-service/CHANGELOG.md index c5e8286..6bbc54c 100644 --- a/geoportal-service/CHANGELOG.md +++ b/geoportal-service/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-service +## [v1.0.12-SNAPSHOT] - 2023-01-10 +- Refactored UserUtils into framework plugin + ## [v1.0.11] - 2022-12-07 - Pom updates - Introduced module default-lc-managers diff --git a/geoportal-service/pom.xml b/geoportal-service/pom.xml index 6b03a01..cb31ec2 100644 --- a/geoportal-service/pom.xml +++ b/geoportal-service/pom.xml @@ -4,14 +4,14 @@ 4.0.0 org.gcube.application geoportal-service - 1.0.11 + 1.0.13-SNAPSHOT Geoportal Service war org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT @@ -68,11 +68,6 @@ default-lc-managers - - org.gcube.common - authorization-utils - [2.0.0, 3.0.0-SNAPSHOT) - diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java index 0ff4e5f..ea09823 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java @@ -14,6 +14,7 @@ import org.bson.types.ObjectId; import org.gcube.application.cms.implementations.ImplementationProvider; import org.gcube.application.cms.implementations.WorkspaceManager; import org.gcube.application.cms.implementations.faults.*; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.cms.plugins.LifecycleManager; import org.gcube.application.cms.plugins.faults.EventException; import org.gcube.application.cms.plugins.faults.InsufficientPrivileges; @@ -50,7 +51,7 @@ import org.gcube.application.geoportal.common.model.useCaseDescriptor.*; import org.gcube.application.geoportal.common.utils.ContextUtils; import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.service.engine.providers.PluginManager; -import org.gcube.application.geoportal.service.utils.UserUtils; + import org.gcube.common.storagehub.client.dsl.FolderContainer; import org.gcube.common.storagehub.model.exceptions.StorageHubException; @@ -81,7 +82,7 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return ID; } - public ProfiledMongoManager(String profileId) throws ConfigurationException, RegistrationException { + public ProfiledMongoManager(String profileId) throws ConfigurationException, RegistrationException { // Check UseCaseDescriptor ID log.info("Loading useCaseDescriptor ID {} ",profileId); if(profileId==null) throw new InvalidParameterException("UseCaseDescriptor ID cannot be null"); @@ -821,7 +822,8 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< @Override public Configuration getConfiguration() throws ConfigurationException{ - log.debug("Asking configuration for {} in {} ", useCaseDescriptor.getId(), UserUtils.getCurrent().getContext()); + String context = UserUtils.getCurrent().getContext(); + log.debug("Asking configuration for {} in {} ", useCaseDescriptor.getId(), context); Configuration toReturn= new Configuration(); List archives = new ArrayList<>(); toReturn.setArchives(archives); @@ -829,7 +831,7 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< toReturn.setIndexes(indexes); // Set Basic Info toReturn.setProfileId(this.getUseCaseDescriptor().getId()); - toReturn.setContext(ContextUtils.getCurrentScope()); + toReturn.setContext(context); toReturn.setLastUpdatedTime(LocalDateTime.now()); // Add Mongo Info diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java index c6c48e5..e7eae6f 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java @@ -7,6 +7,7 @@ import com.mongodb.client.model.ReturnDocument; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.bson.types.ObjectId; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import org.gcube.application.geoportal.common.model.rest.QueryRequest; @@ -24,7 +25,10 @@ public class UCDMongoManager extends MongoManager implements UCDManagerI{ public UCDMongoManager() throws ConfigurationException { - init("UCD_"+ContextUtils.getCurrentScope().replaceAll("/","_")); + String context = UserUtils.getCurrent().getContext(); + String collectionName ="UCD_"+context.replaceAll("/","_"); + log.debug("Starting UCD mongo manager under {} with collection name {} ",context, collectionName); + init(collectionName); } public long deleteAll(){ diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ConfigurationCache.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ConfigurationCache.java index e939540..8912728 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ConfigurationCache.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ConfigurationCache.java @@ -4,10 +4,12 @@ import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.caches.AbstractScopedMap; import org.gcube.application.cms.caches.TimedMap; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.geoportal.common.model.configuration.Configuration; import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import org.gcube.application.geoportal.service.engine.mongo.ProfiledMongoManager; + import java.time.Duration; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAmount; @@ -45,6 +47,7 @@ public class ConfigurationCache extends AbstractScopedMap implements UCDMan log.warn("Unable to cache UCD {}",entry.getKey(),e); } } - log.info("Cached {} UCDs in {} ",memCache.size(),ContextUtils.getCurrentScope()); + String context = UserUtils.getCurrent().getContext(); + log.info("Cached {} UCDs in {} ",memCache.size(),context); cacheLock.writeLock().unlock(); } diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java index 6151d6e..14e2d3f 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java @@ -2,6 +2,7 @@ package org.gcube.application.geoportal.service.engine.mongo; import org.bson.Document; import org.gcube.application.cms.implementations.faults.*; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.cms.plugins.faults.EventException; import org.gcube.application.cms.plugins.faults.InsufficientPrivileges; import org.gcube.application.cms.plugins.faults.StepException; @@ -16,7 +17,6 @@ import org.gcube.application.geoportal.common.utils.FileSets; import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.common.utils.tests.GCubeTest; import org.gcube.application.geoportal.service.BasicServiceTestUnit; -import org.gcube.application.geoportal.service.utils.UserUtils; import org.gcube.common.storagehub.model.exceptions.StorageHubException; import org.junit.Before; import org.junit.BeforeClass; @@ -30,7 +30,7 @@ import static org.junit.Assume.assumeTrue; public class LockTests extends BasicServiceTestUnit { - String profileID = "rolesTesting"; + String profileID = "basic"; ProfiledMongoManager manager= null; @BeforeClass @@ -100,7 +100,7 @@ public class LockTests extends BasicServiceTestUnit { // register fileset FileSets.RequestBuilder builder = FileSets.build( - "$.relazioneScavo","fileset","relazioneScavo."+ Field.CHILDREN+"[?(@.fileset)]"); + "$.section","fileset","section."+ Field.CHILDREN+"[?(@.fileset)]"); StorageUtils s= new StorageUtils(); builder.add( s.putOntoStorage(new File(Tests.FOLDER_CONCESSIONI,"pos.shp"),"pos.shp")); @@ -109,7 +109,7 @@ public class LockTests extends BasicServiceTestUnit { checkIsLockCleaned(p.getId()); // delete fileset - p=managerInterface.deleteFileSet(p.getId(),"$.relazioneScavo.fileset",false); + p=managerInterface.deleteFileSet(p.getId(),"$.section.fileset",false); checkIsLockCleaned(p.getId()); // perform step diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java index 7effc88..ef1f33f 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java @@ -24,6 +24,7 @@ import org.junit.Before; import org.junit.Test; import org.opengis.service.Interface; +import javax.ws.rs.WebApplicationException; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java index 118ec4a..47a10ed 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java @@ -33,7 +33,7 @@ public class DummyProjectTest extends AbstractProfiledDocumentsTests{ String fieldName="fileset"; String fieldDefinition="section."+Field.CHILDREN+"[?(@.fileset)]"; - String filename = "sample.tif"; + String filename = "concessioni/sample.tif"; @Override @@ -146,137 +146,16 @@ public class DummyProjectTest extends AbstractProfiledDocumentsTests{ return doc; } - @Test - public void testUnlock() throws Exception { - assumeTrue(GCubeTest.isTestInfrastructureEnabled()); - // Not automatic, needs generation of locked project - assumeTrue(false); - String id = "627e87bb02ad3d1a2e0e9e18"; - String ucd = "profiledConcessioni"; - Project p =check(target(InterfaceConstants.Methods.PROJECTS).path(ucd).path(InterfaceConstants.Methods.FORCE_UNLOCK).path(id).request(MediaType.APPLICATION_JSON). - put(Entity.entity("", MediaType.APPLICATION_JSON)), Project.class); - assertNull(p.getLock()); - } - - @Test - public void testRelationships() throws Exception { - assumeTrue(GCubeTest.isTestInfrastructureEnabled()); - Project a = createNew(new Document("key","value")); - Project b = createNew(new Document("key","value")); - - // set relation a -- precedes --> b - System.out.println("Setting relation.."); - String relId="precedes"; - a = check(baseTarget(). - path(InterfaceConstants.Methods.RELATIONSHIP). - path(a.getId()). - path(relId). - queryParam(InterfaceConstants.Parameters.TARGET_UCD,b.getProfileID()). - queryParam(InterfaceConstants.Parameters.TARGET_ID,b.getId()). - request(MediaType.APPLICATION_JSON). - put(Entity.json("")), Project.class); - // check set relation in a - System.out.println("Checking relation a->b"); - assertTrue(a.getRelationships()!=null && a.getRelationships().size()==1); - Relationship rel = a.getRelationships().get(0); - assertEquals(rel.getRelationshipName(),relId); - assertEquals(rel.getTargetUCD(),b.getProfileID()); - assertEquals(rel.getTargetID(),b.getId()); - - // TODO TBD check reciprocity : expected relation b -- follows -> a - - // delete relation - System.out.println("Deleting relation a->b"); - a = check(baseTarget(). - path(InterfaceConstants.Methods.RELATIONSHIP). - path(a.getId()). - path(relId). - queryParam(InterfaceConstants.Parameters.TARGET_UCD,b.getProfileID()). - queryParam(InterfaceConstants.Parameters.TARGET_ID,b.getId()). - request(MediaType.APPLICATION_JSON). - delete(), Project.class); - // check deleted - - System.out.println("Checking deleted relation"); - assertTrue(a.getRelationships()==null || a.getRelationships().isEmpty()); - - - } - - + // Not automatic, needs generation of locked project // @Test -// public void testSDI() throws Exception { -// // Create new -// Project doc = createNew(new Document("posizionamentoScavo",new Document("title","Mio pos"))); -// -// // register filesets -// doc = upload( -// new StorageUtils(), -// doc.getId(), -// "posizionamentoScavo","fileset", -// "posizionamentoScavo."+Field.CHILDREN+"[?(@.fileset)]", -// null, -// RegisterFileSetRequest.ClashOptions.REPLACE_EXISTING, -// "pos.shp","pos.shx"); -// -// System.out.println("Registered posizionamento, result is "+ Serialization.write(doc)); -// -// // invoke step SUBMIT-FOR-REVIEW -// StepExecutionRequest req=new StepExecutionRequest(); -// req.setStepID("SUBMIT-FOR-REVIEW"); -// doc=step(doc.getId(),req); -// System.out.println(doc); -// if(doc.getLifecycleInformation().getErrorMessages()!=null) { -// System.out.println("ERROR MESSAGES"); -// doc.getLifecycleInformation().getErrorMessages().forEach(s -> System.out.println(s)); -// } -// if(doc.getLifecycleInformation().getWarningMessages()!=null) { -// System.out.println("WARNING MESSAGES"); -// doc.getLifecycleInformation().getWarningMessages().forEach(s -> System.out.println(s)); -// } -// -// assertTrue(doc.getLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)); -// -// JSONPathWrapper wrapper = new JSONPathWrapper(doc.getTheDocument().toJson()); -// RegisteredFileSet fs = Serialization.convert(wrapper.getByPath("$..fileset").get(0),RegisteredFileSet.class); -// assertTrue(fs!=null); -// assertTrue(fs.getPayloads().size()==2); -// assertTrue(fs.getMaterializations().size()>0); -// -// -// for(Object matObj : wrapper.getByPath("$..[?(@."+ Materialization.TYPE +" == '"+GCubeSDILayer.GCUBE_SDY_LAYER_TYPE+"' )]")){ -// GCubeSDILayer layer = Serialization.convert(matObj, GCubeSDILayer.class); -// System.out.println("Checking Layer : "+layer); -// assertTrue(layer.getType().equals(GCubeSDILayer.GCUBE_SDY_LAYER_TYPE)); -// assertTrue(layer.getOGCLinks().size()>0); -// assertTrue(layer.getPlatformInfo().size()>0); -// assertTrue(layer.getBBox()!=null); -// } -// -// // Checking platform info GeoServer -// for(Object platformObj : wrapper.getByPath("$..[?(@."+ Materialization.TYPE +" == 'GeoServer' )]")){ -// Document platform=Serialization.asDocument(platformObj); -// assertTrue(platform.containsKey("layerName")); -// assertTrue(platform.containsKey("workspace")); -// assertTrue(platform.containsKey("storeName")); -// assertTrue(platform.containsKey("persistencePath")); -// assertTrue(platform.get("files",List.class).size()==2); -// } -// -// -// req.setStepID("APPROVE DRAFT"); -// doc=step(doc.getId(),req); -// if(doc.getLifecycleInformation().getErrorMessages()!=null) { -// System.out.println("ERROR MESSAGES"); -// doc.getLifecycleInformation().getErrorMessages().forEach(s -> System.out.println(s)); -// } -// if(doc.getLifecycleInformation().getWarningMessages()!=null) { -// System.out.println("WARNING MESSAGES"); -// doc.getLifecycleInformation().getWarningMessages().forEach(s -> System.out.println(s)); -// } -// -// assertTrue(doc.getLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)); -// +// public void testUnlock() throws Exception { +// assumeTrue(GCubeTest.isTestInfrastructureEnabled()); +// assumeTrue(false); +// String id = "627e87bb02ad3d1a2e0e9e18"; +// String ucd = "profiledConcessioni"; +// Project p =check(target(InterfaceConstants.Methods.PROJECTS).path(ucd).path(InterfaceConstants.Methods.FORCE_UNLOCK).path(id).request(MediaType.APPLICATION_JSON). +// put(Entity.entity("", MediaType.APPLICATION_JSON)), Project.class); +// assertNull(p.getLock()); // } } diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java index 11bfa66..97b91a8 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java @@ -2,11 +2,8 @@ package org.gcube.application.geoportal.service.profiledDocuments; import lombok.extern.slf4j.Slf4j; import org.bson.Document; -import org.gcube.application.cms.implementations.ImplementationProvider; -import org.gcube.application.cms.implementations.WorkspaceManager; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.cms.serialization.Serialization; -import org.gcube.application.cms.tests.model.BasicTests; -import org.gcube.application.geoportal.common.model.JSONPathWrapper; import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.document.access.Access; import org.gcube.application.geoportal.common.model.document.identification.SpatialReference; @@ -14,17 +11,12 @@ import org.gcube.application.geoportal.common.model.document.lifecycle.Lifecycle import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest; import org.gcube.application.geoportal.common.model.useCaseDescriptor.Field; -import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.common.utils.tests.GCubeTest; -import org.gcube.application.geoportal.service.utils.UserUtils; -import org.gcube.common.storagehub.model.exceptions.StorageHubException; + import org.junit.Test; -import javax.management.relation.Relation; -import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import java.time.LocalDateTime; import static org.junit.Assert.assertEquals; diff --git a/images-plugin/CHANGELOG.md b/images-plugin/CHANGELOG.md index 865c90c..c2c8a3a 100644 --- a/images-plugin/CHANGELOG.md +++ b/images-plugin/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains gcube-cms plugins for images materializations +## [v1.0.2-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.1] - 2022-12-07 - Pom updates diff --git a/images-plugin/pom.xml b/images-plugin/pom.xml index af0ba97..b772af5 100644 --- a/images-plugin/pom.xml +++ b/images-plugin/pom.xml @@ -5,14 +5,14 @@ 4.0.0 images-plugins - 1.0.1 + 1.0.2-SNAPSHOT gCube CMS - Images Plugins org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/notifications-plugins/CHANGELOG.md b/notifications-plugins/CHANGELOG.md index 086b04f..620aaae 100644 --- a/notifications-plugins/CHANGELOG.md +++ b/notifications-plugins/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains gcube-cms plugins for notitfications events +## [v1.0.2-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.1] - 2022-12-07 - Pom updates diff --git a/notifications-plugins/pom.xml b/notifications-plugins/pom.xml index 8a54506..91e1c98 100644 --- a/notifications-plugins/pom.xml +++ b/notifications-plugins/pom.xml @@ -5,14 +5,14 @@ 4.0.0 notifications-plugins - 1.0.1 + 1.0.2-SNAPSHOT gCube CMS - Notifications Plugins org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/pom.xml b/pom.xml index 69f7642..2aece86 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ org.gcube.application.cms gcube-cms-suite pom - 1.0.3 + 1.0.4-SNAPSHOT Gcube CMS Suite gCube CMS Suite is a set of components designed to manage complex space-temporal Documents defined by metadata Profiles. @@ -26,17 +26,15 @@ 2.1.1 3.6.3 [1.0.0,2.0.0-SNAPSHOT) - 1.0.1 - - - - - - + 2.1.0-SNAPSHOT + 2.2.0-SNAPSHOT + 3.7.0-SNAPSHOT + [2.0.0-SNAPSHOT,3.0.0-SNAPSHOT) + 1.0.3-SNAPSHOT diff --git a/sdi-plugins/CHANGELOG.md b/sdi-plugins/CHANGELOG.md index 5ee7859..acee1f6 100644 --- a/sdi-plugins/CHANGELOG.md +++ b/sdi-plugins/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains gcube-cms plugins for indexing and materializations in gCube SDI +## [v1.0.2-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.1] - 2022-12-07 - Pom updates - Introduced module default-lc-managers diff --git a/sdi-plugins/pom.xml b/sdi-plugins/pom.xml index d0f6fe8..4073801 100644 --- a/sdi-plugins/pom.xml +++ b/sdi-plugins/pom.xml @@ -5,14 +5,14 @@ 4.0.0 sdi-plugins - 1.0.1 + 1.0.2-SNAPSHOT gCube CMS - SDI Plugins org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/plugins/SDIMaterializerPlugin.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/plugins/SDIMaterializerPlugin.java index fede17c..e928aff 100644 --- a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/plugins/SDIMaterializerPlugin.java +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/plugins/SDIMaterializerPlugin.java @@ -5,6 +5,7 @@ import lombok.Data; import lombok.Synchronized; import lombok.extern.slf4j.Slf4j; import org.bson.Document; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.cms.plugins.MaterializationPlugin; import org.gcube.application.cms.plugins.faults.InitializationException; import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; @@ -47,7 +48,9 @@ public class SDIMaterializerPlugin extends AbstractPlugin implements Materializa private SDIManagerWrapper getSDIManager(){ - return sdiManagerMap.get(ContextUtils.getCurrentScope()); + String context = UserUtils.getCurrent().getContext(); + log.debug("Getting SDIManagerWrapper from cache map for context {}"); + return sdiManagerMap.get(context); } @Override @@ -55,7 +58,7 @@ public class SDIMaterializerPlugin extends AbstractPlugin implements Materializa public InitializationReport initInContext() throws InitializationException { InitializationReport report = new InitializationReport(); try{ - String context = ContextUtils.getCurrentScope(); + String context = UserUtils.getCurrent().getContext(); if(getSDIManager()==null) { log.info("Initializing in " + context); sdiManagerMap.put(context,new SDIManagerWrapper()); diff --git a/use-cases/CHANGELOG.md b/use-cases/CHANGELOG.md index b8294bf..6f75013 100644 --- a/use-cases/CHANGELOG.md +++ b/use-cases/CHANGELOG.md @@ -1,6 +1,11 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -# Changelog for org.gcube.application.geoportal-client +# Changelog for org.gcube.application.cms.use-cases + + + +## [v1.0.4-SNAPSHOT] - 2023-01-10 +- Pom updates ## [v1.0.3] - 2022-12-07 - Pom updates diff --git a/use-cases/pom.xml b/use-cases/pom.xml index 263ac22..0d5e6c8 100644 --- a/use-cases/pom.xml +++ b/use-cases/pom.xml @@ -4,12 +4,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 use-cases - 1.0.3 + 1.0.4-SNAPSHOT CMS Use cases gcube-cms-suite org.gcube.application.cms - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/use-cases/src/test/java/org/gcube/application/cms/usecases/GenericChecks.java b/use-cases/src/test/java/org/gcube/application/cms/usecases/GenericChecks.java new file mode 100644 index 0000000..345adae --- /dev/null +++ b/use-cases/src/test/java/org/gcube/application/cms/usecases/GenericChecks.java @@ -0,0 +1,56 @@ +package org.gcube.application.cms.usecases; + +import org.gcube.application.cms.tests.TokenSetter; +import org.gcube.application.geoportal.client.UseCaseDescriptors; +import org.gcube.application.geoportal.common.model.rest.QueryRequest; +import org.gcube.application.geoportal.common.rest.Projects; +import org.gcube.application.geoportal.common.rest.UseCaseDescriptorsI; +import org.gcube.application.geoportal.common.utils.tests.GCubeTest; +import org.junit.Assert; +import org.junit.Test; + +import java.util.concurrent.atomic.AtomicLong; + +import static org.gcube.application.geoportal.client.plugins.GeoportalAbstractPlugin.projects; +import static org.gcube.application.geoportal.client.plugins.GeoportalAbstractPlugin.useCaseDescriptors; +import static org.junit.Assume.assumeTrue; + +public class GenericChecks { + + + UseCaseDescriptorsI getClient(){ + assumeTrue(GCubeTest.isTestInfrastructureEnabled()); + TokenSetter.set(GCubeTest.getContext()); + return useCaseDescriptors().build(); + } + + @Test + public void getAll() throws Exception { + + UseCaseDescriptorsI client =getClient(); + + QueryRequest request = new QueryRequest(); + // All + + client.query(request).forEachRemaining(u -> { + try { + System.out.println("Obtained UCD "+u.getId()); + + client.getById(u.getId()).getId(); + + Projects pClient = (Projects)projects(u.getId()).build(); + + AtomicLong counter=new AtomicLong(0); + pClient.query(new QueryRequest()).forEachRemaining( M -> counter.incrementAndGet()); + System.out.println("Found "+counter.get()+" elements"); + + } catch (Exception e) { + e.printStackTrace(System.err); + Assert.fail("Unable to check "+u.getId()); + } + }); + + + } + +} -- 2.17.1 From 390402e00539839f901a583617ae8381b4f143e3 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 10 Jan 2023 16:14:14 +0100 Subject: [PATCH 03/18] Missing images --- .../docs/_static/imgs/architecture.png | Bin 0 -> 100363 bytes .../docs/_static/imgs/execution_schema.png | Bin 0 -> 34043 bytes .../docs/_static/imgs/plugin_interfaces.png | Bin 0 -> 45966 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 geoportal-service/docs/_static/imgs/architecture.png create mode 100644 geoportal-service/docs/_static/imgs/execution_schema.png create mode 100644 geoportal-service/docs/_static/imgs/plugin_interfaces.png diff --git a/geoportal-service/docs/_static/imgs/architecture.png b/geoportal-service/docs/_static/imgs/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..f324582fdb0f119175d5fff4dfb51f6cbfe3a6dd GIT binary patch literal 100363 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 UB8^hxSnx+xNmH>@-YWS20UD+7)Bpeg literal 0 HcmV?d00001 diff --git a/geoportal-service/docs/_static/imgs/plugin_interfaces.png b/geoportal-service/docs/_static/imgs/plugin_interfaces.png new file mode 100644 index 0000000000000000000000000000000000000000..21f580a5074339678257e68bc5fe6c5db8c0779a GIT binary patch literal 45966 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 Am;e9( literal 0 HcmV?d00001 -- 2.17.1 From 456a3d2baedc3a8a13ae366be3eb734f1fbaff74 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 10 Jan 2023 16:19:22 +0100 Subject: [PATCH 04/18] Fixed version --- geoportal-service/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoportal-service/pom.xml b/geoportal-service/pom.xml index cb31ec2..32f6852 100644 --- a/geoportal-service/pom.xml +++ b/geoportal-service/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.gcube.application geoportal-service - 1.0.13-SNAPSHOT + 1.0.12-SNAPSHOT Geoportal Service war -- 2.17.1 From a50c05a1f07b7ee1d7c450ac74df96a82a4890bc Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 10 Jan 2023 17:15:45 +0100 Subject: [PATCH 05/18] Fixed version --- dataminer-plugins/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataminer-plugins/pom.xml b/dataminer-plugins/pom.xml index 41b1f8f..99a270e 100644 --- a/dataminer-plugins/pom.xml +++ b/dataminer-plugins/pom.xml @@ -5,7 +5,7 @@ 4.0.0 dataminer-plugins - 1.0.3-SNAPSHOT + 1.0.2-SNAPSHOT gCube CMS - Dataminer Plugins -- 2.17.1 From c4e5423a26c0d9e229fe9d70fa1903e572e9a03e Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 10 Jan 2023 18:11:39 +0100 Subject: [PATCH 06/18] Fixes #24316 --- geoportal-service/enunciate.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoportal-service/enunciate.xml b/geoportal-service/enunciate.xml index 11c8453..3c3f8bb 100644 --- a/geoportal-service/enunciate.xml +++ b/geoportal-service/enunciate.xml @@ -19,7 +19,7 @@ - + -- 2.17.1 From eb3a5083b9e74f899bccc457b55309f68fe3084d Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Thu, 12 Jan 2023 15:53:25 +0100 Subject: [PATCH 07/18] Fixes #24412 --- .../application/geoportal/common/utils/Files.java | 8 ++++---- .../application/geoportal/common/FilesTests.java | 14 +++++++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java index 94c8826..7916f4f 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java @@ -92,12 +92,12 @@ public class Files { if(toFix.startsWith("\\.")) toFix=toFix.replaceFirst("\\.","_"); String extension=""; - if(toFix.contains(".")) { + int extensionIndex=toFix.lastIndexOf("."); + if(extensionIndex>0) { //preserve extension - int index=toFix.indexOf("."); - extension=toFix.substring(index); + extension=toFix.substring(extensionIndex); //only escape before extension - toFix=toFix.substring(0,toFix.indexOf(".")); + toFix=toFix.substring(0,extensionIndex); } return toFix.toLowerCase(). replaceAll("[\\-\\*\\+\\/\\\\ \\[\\]\\(\\)\\.\\\"\\:\\;\\|\\=]","_")+extension.toLowerCase(); diff --git a/geoportal-common/src/test/java/org/gcube/application/geoportal/common/FilesTests.java b/geoportal-common/src/test/java/org/gcube/application/geoportal/common/FilesTests.java index 2317dd3..0ec8885 100644 --- a/geoportal-common/src/test/java/org/gcube/application/geoportal/common/FilesTests.java +++ b/geoportal-common/src/test/java/org/gcube/application/geoportal/common/FilesTests.java @@ -6,6 +6,8 @@ import org.junit.Test; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -18,12 +20,18 @@ public class FilesTests { @Test public void testNames(){ - for(String name : baseFolder.list()){ + + ArrayList toTestStrings=new ArrayList<>(Arrays.asList(baseFolder.list())); + toTestStrings.add("e. gna_topografia_timponedellamotta.qmd"); + + for(String name : toTestStrings){ if(name.contains(".")) { - String originalExtension = name.substring(name.indexOf(".")); + int extensionIndex = name.lastIndexOf("."); + String originalExtension = extensionIndex>0?name.substring(extensionIndex):null; String obtained = Files.fixFilename(name); log.info(name + "->" + obtained + "[" + originalExtension + "]"); - assertTrue(obtained.endsWith(originalExtension)); + if(originalExtension!=null) + assertTrue(obtained.endsWith(originalExtension)); } } } -- 2.17.1 From 3d03e565b48c25ac0eabd246c8b4d72ea1f7b332 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Thu, 12 Jan 2023 18:03:55 +0100 Subject: [PATCH 08/18] Fixes #24380 --- .../plugins/ConcessioniLifeCycleManager.java | 32 +------------------ .../plugins/ConcessioniPluginTests.java | 20 ++++++------ .../engine/mongo/ProfiledMongoManager.java | 13 +++++--- 3 files changed, 20 insertions(+), 45 deletions(-) diff --git a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java index 349e612..527438c 100644 --- a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java +++ b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java @@ -82,12 +82,6 @@ public class ConcessioniLifeCycleManager extends Default3PhaseManager implements log.debug("Concessione {}, managing relazione {}",document.getId(),rel); rel.putIfAbsent(ProfiledConcessione.Sections.TITOLO,doc.getString(ProfiledConcessione.NOME)+" relazione di scavo"); rel.putIfAbsent(ProfiledConcessione.SOGGETTO,doc.get(ProfiledConcessione.SOGGETTO)); - rel.putIfAbsent(RegisteredFileSet.CREATION_INFO,c.getInfo().getCreationInfo()); - rel.putIfAbsent(RegisteredFileSet.ACCESS,c.getInfo().getAccess()); - Access relAccess=Serialization.convert(rel.get(RegisteredFileSet.ACCESS),Access.class); - relAccess.setLicense(ConstraintCheck.defaultFor(relAccess.getLicense(),"CC-BY-4.0").evaluate()); - relAccess.setPolicy(ConstraintCheck.defaultFor(relAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); - rel.put(RegisteredFileSet.ACCESS,relAccess); doc.put(ProfiledConcessione.RELAZIONE_SCAVO,rel); @@ -96,12 +90,6 @@ public class ConcessioniLifeCycleManager extends Default3PhaseManager implements Serialization.convert(doc.get(ProfiledConcessione.ABSTRACT_RELAZIONE), Document.class):new Document(); log.debug("Concessione {}, managing abstract relazione {}",document.getId(),abs); abs.putIfAbsent(ProfiledConcessione.Sections.TITOLO,doc.getString(ProfiledConcessione.NOME)+" abstract relazione di scavo"); - abs.putIfAbsent(RegisteredFileSet.CREATION_INFO,c.getInfo().getCreationInfo()); - abs.putIfAbsent(RegisteredFileSet.ACCESS,c.getInfo().getAccess()); - Access absAccess=Serialization.convert(abs.get(RegisteredFileSet.ACCESS),Access.class); - absAccess.setLicense(ConstraintCheck.defaultFor(absAccess.getLicense(),"CC-BY-4.0").evaluate()); - absAccess.setPolicy(ConstraintCheck.defaultFor(absAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); - abs.put(RegisteredFileSet.ACCESS,absAccess); doc.put(ProfiledConcessione.ABSTRACT_RELAZIONE,abs); @@ -120,13 +108,6 @@ public class ConcessioniLifeCycleManager extends Default3PhaseManager implements // BBOX in registered filesets pos.put(ProfiledConcessione.RESPONSABILE,doc.get(ProfiledConcessione.RESPONSABILE)); - - pos.putIfAbsent(RegisteredFileSet.CREATION_INFO,c.getInfo().getCreationInfo()); - pos.putIfAbsent(RegisteredFileSet.ACCESS,c.getInfo().getAccess()); - Access posAccess=Serialization.convert(rel.get(RegisteredFileSet.ACCESS),Access.class); - posAccess.setLicense(ConstraintCheck.defaultFor(posAccess.getLicense(),"CC-BY-4.0").evaluate()); - posAccess.setPolicy(ConstraintCheck.defaultFor(posAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); - pos.put(RegisteredFileSet.ACCESS,posAccess); doc.put(ProfiledConcessione.POSIZIONAMENTO_SCAVO,pos); } @@ -139,12 +120,7 @@ public class ConcessioniLifeCycleManager extends Default3PhaseManager implements for (int i = 0; i Date: Tue, 10 Jan 2023 11:42:09 +0100 Subject: [PATCH 09/18] Tests --- .../application/cms/tests/TestDocuments.java | 2 +- .../geoportal/clients/GenericUseCases.java | 11 +++-- .../clients/ProfiledConcessioniTest.java | 29 +++++++++++- .../clients/ProfiledDocumentsTest.java | 47 ++++++++++++++++++- .../engine/mongo/ProfiledMongoManager.java | 2 +- .../AbstractProfiledDocumentsTests.java | 8 +++- .../profiledDocuments/DummyProjectTest.java | 11 +++-- .../ProfiledConcessioniTests.java | 3 +- .../usecases/ExportConcessioniAsProjects.java | 3 ++ 9 files changed, 101 insertions(+), 15 deletions(-) diff --git a/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TestDocuments.java b/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TestDocuments.java index 009cb68..5b2dbf2 100644 --- a/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TestDocuments.java +++ b/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TestDocuments.java @@ -10,7 +10,7 @@ import java.nio.charset.Charset; import java.util.HashMap; public class TestDocuments { - public static File BASE_FOLDER =new File("test-data/profiledDocuments"); + public static File BASE_FOLDER =new File("../test-data/profiledDocuments"); public static final HashMap documentMap =new HashMap<>(); static{ diff --git a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/GenericUseCases.java b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/GenericUseCases.java index 0a23f67..c24da3f 100644 --- a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/GenericUseCases.java +++ b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/GenericUseCases.java @@ -52,16 +52,19 @@ public abstract class GenericUseCases extends BasicVreTests{ } protected Project prepareWithFileSet(Project project) throws FileNotFoundException, InvalidRequestException, RemoteException { + + return getClient().registerFileSet(project.getId(), prepareRequest()); + } + + protected RegisterFileSetRequest prepareRequest() throws FileNotFoundException { String parentPath = "$.section"; String fieldName = "fileset"; String fieldDefinition = "$.section._children[?(@.fileset)]"; // Prepare request - RegisterFileSetRequest fsRequest = FileSets. + return FileSets. prepareRequest(new StorageUtils(), parentPath,fieldName,fieldDefinition, new File(Tests.FOLDER_CONCESSIONI,"pos.shp")); - - - return getClient().registerFileSet(project.getId(),fsRequest); } + } diff --git a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledConcessioniTest.java b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledConcessioniTest.java index 8af8aae..e2a17cf 100644 --- a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledConcessioniTest.java +++ b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/ProfiledConcessioniTest.java @@ -2,12 +2,17 @@ package org.gcube.application.geoportal.clients; import com.fasterxml.jackson.core.JsonProcessingException; import lombok.Data; +import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.cms.tests.TestDocuments; import org.gcube.application.cms.tests.Tests; import org.gcube.application.geoportal.client.utils.Serialization; import org.gcube.application.geoportal.common.faults.InvalidRequestException; +import org.gcube.application.geoportal.common.model.JSONPathWrapper; import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.access.Access; +import org.gcube.application.geoportal.common.model.document.access.AccessPolicy; +import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest; import org.gcube.application.geoportal.common.model.useCaseDescriptor.Field; @@ -25,6 +30,9 @@ import java.io.IOException; import java.nio.charset.Charset; import java.rmi.RemoteException; +import static org.junit.Assert.assertEquals; + +@Slf4j public class ProfiledConcessioniTest extends ProfiledDocumentsTest{ @Data @@ -78,11 +86,28 @@ public class ProfiledConcessioniTest extends ProfiledDocumentsTest{ // Set relazione - client.registerFileSet(project.getId(), FileSets. + + Access toSetAccess = new Access(); + toSetAccess.setPolicy(AccessPolicy.RESTRICTED); + toSetAccess.setLicense("CC0-1.0"); + + RegisterFileSetRequest request=FileSets. prepareRequest(new StorageUtils(), "$.relazioneScavo","fileset", "$.relazioneScavo."+Field.CHILDREN+"[?(@.fileset)]", - new File(Tests.FOLDER_CONCESSIONI,"relazione.pdf"))); + new File(Tests.FOLDER_CONCESSIONI,"relazione.pdf")); + request.setToSetAccess(toSetAccess); + + project=client.registerFileSet(project.getId(), request); + + String jsonDoc=project.getTheDocument().toJson(); + log.info("Registered fileset. Result is {}", jsonDoc); + RegisteredFileSet f= Serialization.convert(new JSONPathWrapper(jsonDoc).getByPath( + request.getParentPath()).get(0),RegisteredFileSet.class); + + assertEquals(Serialization.convert(f.getAccess(),Access.class).getPolicy(),toSetAccess.getPolicy()); + assertEquals(Serialization.convert(f.getAccess(),Access.class).getLicense(),toSetAccess.getLicense()); + // Set Abstract 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 index 5296118..606d7f4 100644 --- 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 @@ -3,22 +3,35 @@ package org.gcube.application.geoportal.clients; import com.fasterxml.jackson.core.JsonProcessingException; import lombok.extern.slf4j.Slf4j; import org.bson.Document; +import org.gcube.application.cms.tests.Tests; +import org.gcube.application.geoportal.client.utils.Serialization; +import org.gcube.application.geoportal.common.faults.InvalidRequestException; +import org.gcube.application.geoportal.common.model.JSONPathWrapper; import org.gcube.application.geoportal.common.model.configuration.Configuration; import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.access.Access; +import org.gcube.application.geoportal.common.model.document.access.AccessPolicy; +import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet; import org.gcube.application.geoportal.common.model.document.relationships.RelationshipNavigationObject; import org.gcube.application.geoportal.common.model.rest.CreateRelationshipRequest; import org.gcube.application.geoportal.common.model.rest.DeleteRelationshipRequest; 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.Projects; +import org.gcube.application.geoportal.common.utils.FileSets; +import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.common.utils.tests.GCubeTest; import org.junit.Test; +import java.io.File; +import java.io.FileNotFoundException; import java.rmi.RemoteException; import java.time.LocalDateTime; import java.util.Iterator; import java.util.concurrent.atomic.AtomicLong; import static org.gcube.application.geoportal.client.utils.Serialization.write; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; @@ -33,7 +46,7 @@ public class ProfiledDocumentsTest> exte @Test - public void registerNew() throws RemoteException, JsonProcessingException { + public void registerNew() throws RemoteException, JsonProcessingException, FileNotFoundException, InvalidRequestException { assumeTrue(GCubeTest.isTestInfrastructureEnabled()); Projects client = (Projects) getClient(); @@ -46,6 +59,38 @@ public class ProfiledDocumentsTest> exte Project p =client.createNew(theDoc); log.debug("Registered project (AS JSON) : {}", write(p)); + + + } + + + @Test + public void testAccess() throws FileNotFoundException, RemoteException, InvalidRequestException, JsonProcessingException { + assumeTrue(GCubeTest.isTestInfrastructureEnabled()); + Projects client = (Projects) getClient(); + + Document theDoc= Document.parse("{\n" + + "\"posizionamentoScavo\" :{\n" + + "\t\"titolo\" : \"mio titolo\"}}"); + + theDoc.put("startTime", LocalDateTime.now()); + + Project p =client.createNew(theDoc); + + RegisterFileSetRequest fsRequest = prepareRequest(); + + Access access = new Access(); + access.setLicense("CC0-1.0"); + access.setPolicy(AccessPolicy.RESTRICTED); + fsRequest.setToSetAccess(access); + + p=client.registerFileSet(p.getId(),fsRequest); + + log.info("Registered fileset. Result is {}", Serialization.write(p)); + RegisteredFileSet f= Serialization.convert(new JSONPathWrapper(p.getTheDocument().toJson()).getByPath(fsRequest.getParentPath()).get(0),RegisteredFileSet.class); + + assertEquals(Serialization.convert(f.getAccess(),Access.class).getPolicy(),AccessPolicy.RESTRICTED); + } @Test diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java index 3f52e50..0ff4e5f 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java @@ -953,7 +953,7 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< private static final RegisteredFileSet prepareRegisteredFileSet(Access toSetAccess,String docID, String profileID, Document attributes,List files, StorageUtils storage,WorkspaceManager ws) throws StorageHubException, StorageException { - log.debug("Preparing Registered FileSet.."); + log.debug("Preparing Registered FileSet {}"); RegisteredFileSet toReturn = new RegisteredFileSet(); if(attributes!=null) toReturn.putAll(attributes); String uuid = UUID.randomUUID().toString(); diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java index 1d87e55..7effc88 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java @@ -9,6 +9,7 @@ import org.gcube.application.cms.tests.TokenSetter; import org.gcube.application.cms.tests.model.BasicTests; import org.gcube.application.geoportal.common.model.configuration.Configuration; import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.access.Access; import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; @@ -29,6 +30,7 @@ import javax.ws.rs.core.MediaType; import java.io.File; import java.util.List; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; @@ -158,9 +160,12 @@ public abstract class AbstractProfiledDocumentsTests extends BasicServiceTestUni String fieldDefinitionPath, Document attributes, RegisterFileSetRequest.ClashOptions clashPolicy, - String ...files) throws Exception { + Access access, + String ...files) throws Exception { FileSets.RequestBuilder builder = FileSets.build(parentPath,fieldName,fieldDefinitionPath); + builder.setAccess(access); + builder.setClashPolicy(clashPolicy).setAttributes(attributes); for(String file:files) @@ -169,6 +174,7 @@ public abstract class AbstractProfiledDocumentsTests extends BasicServiceTestUni Project doc = check(baseTarget().path(InterfaceConstants.Methods.REGISTER_FILES_PATH).path(id).request(MediaType.APPLICATION_JSON). post(Entity.entity(Serialization.write(builder.getTheRequest()), MediaType.APPLICATION_JSON)), Project.class); + BasicTests.validate(doc); return doc; } diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java index 4852a0d..118ec4a 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java @@ -4,6 +4,8 @@ import org.bson.Document; import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.geoportal.common.model.JSONPathWrapper; import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.access.Access; +import org.gcube.application.geoportal.common.model.document.access.AccessPolicy; import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet; import org.gcube.application.geoportal.common.model.document.relationships.Relationship; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; @@ -89,7 +91,7 @@ public class DummyProjectTest extends AbstractProfiledDocumentsTests{ fieldDefinition, new Document("customField","customFieldValue"), RegisterFileSetRequest.ClashOptions.REPLACE_EXISTING, - filename); + new Access(),filename); wrapper = new JSONPathWrapper(doc.getTheDocument().toJson()); assertTrue("Relazione exists",wrapper.getMatchingPaths("section").size()==1); @@ -127,8 +129,9 @@ public class DummyProjectTest extends AbstractProfiledDocumentsTests{ Project doc = createNew(baseDoc); - - + Access access =new Access(); + access.setLicense("test-license"); + access.setPolicy(AccessPolicy.RESTRICTED); // INSERT ONE, MERGE INFO (NB default values already exist) doc = upload( @@ -138,7 +141,7 @@ public class DummyProjectTest extends AbstractProfiledDocumentsTests{ fieldDefinition, new Document("customField","customFieldValue"), RegisterFileSetRequest.ClashOptions.REPLACE_EXISTING, - filename); + access,filename); return doc; } diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java index c42b12c..11bfa66 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java @@ -8,6 +8,7 @@ import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.cms.tests.model.BasicTests; import org.gcube.application.geoportal.common.model.JSONPathWrapper; import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.access.Access; import org.gcube.application.geoportal.common.model.document.identification.SpatialReference; import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; @@ -70,7 +71,7 @@ public class ProfiledConcessioniTests extends AbstractProfiledDocumentsTests{ "fileset", "$.posizionamentoScavo."+ Field.CHILDREN+"[?(@.fileset)]", null, - RegisterFileSetRequest.ClashOptions.MERGE_EXISTING, + RegisterFileSetRequest.ClashOptions.MERGE_EXISTING,new Access(), "concessioni/pos.SHP"); diff --git a/use-cases/src/test/java/org/gcube/application/cms/usecases/ExportConcessioniAsProjects.java b/use-cases/src/test/java/org/gcube/application/cms/usecases/ExportConcessioniAsProjects.java index 5f7b362..fbe41e5 100644 --- a/use-cases/src/test/java/org/gcube/application/cms/usecases/ExportConcessioniAsProjects.java +++ b/use-cases/src/test/java/org/gcube/application/cms/usecases/ExportConcessioniAsProjects.java @@ -250,6 +250,9 @@ public class ExportConcessioniAsProjects { + "[?(@.fileset)]"); req.addAll(convertFiles(content)); req.setAccess(getAccess(rel)); + + + project = client.registerFileSet(project.getId(),req.getTheRequest()); } // upload fileset -- 2.17.1 From 5ea3d278ad7149b4d3581d44b0d2bd3968952d01 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 10 Jan 2023 15:57:40 +0100 Subject: [PATCH 10/18] UserUtils integration --- CHANGELOG.md | 3 + ckan-plugin/CHANGELOG.md | 3 + ckan-plugin/pom.xml | 4 +- cms-plugin-framework/CHANGELOG.md | 3 + cms-plugin-framework/pom.xml | 10 +- .../cms/caches/AbstractScopedMap.java | 6 +- .../cms/implementations}/utils/UserUtils.java | 2 +- cms-test-commons/CHANGELOG.md | 3 + cms-test-commons/pom.xml | 4 +- concessioni-lifecycle/CHANGELOG.md | 3 + concessioni-lifecycle/pom.xml | 4 +- concessioni-model/CHANGELOG.md | 3 + concessioni-model/pom.xml | 4 +- dataminer-plugins/CHANGELOG.md | 3 + dataminer-plugins/pom.xml | 4 +- default-lc-managers/CHANGELOG.md | 5 +- default-lc-managers/pom.xml | 4 +- .../AbstractLifeCycleManager.java | 6 +- geoportal-client/CHANGELOG.md | 3 + geoportal-client/pom.xml | 4 +- geoportal-common/CHANGELOG.md | 3 + geoportal-common/pom.xml | 4 +- .../geoportal/common/utils/ContextUtils.java | 21 +-- .../common/utils/tests/GCubeTest.java | 2 +- geoportal-service/CHANGELOG.md | 3 + geoportal-service/pom.xml | 9 +- .../engine/mongo/ProfiledMongoManager.java | 10 +- .../service/engine/mongo/UCDMongoManager.java | 6 +- .../engine/providers/ConfigurationCache.java | 3 + .../engine/providers/ucd/UCDManager.java | 4 +- .../service/engine/mongo/LockTests.java | 8 +- .../AbstractProfiledDocumentsTests.java | 1 + .../profiledDocuments/DummyProjectTest.java | 141 ++---------------- .../ProfiledConcessioniTests.java | 12 +- images-plugin/CHANGELOG.md | 3 + images-plugin/pom.xml | 4 +- notifications-plugins/CHANGELOG.md | 3 + notifications-plugins/pom.xml | 4 +- pom.xml | 14 +- sdi-plugins/CHANGELOG.md | 3 + sdi-plugins/pom.xml | 4 +- .../sdi/plugins/SDIMaterializerPlugin.java | 7 +- use-cases/CHANGELOG.md | 7 +- use-cases/pom.xml | 4 +- .../cms/usecases/GenericChecks.java | 56 +++++++ 45 files changed, 199 insertions(+), 218 deletions(-) rename {geoportal-service/src/main/java/org/gcube/application/geoportal/service => cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations}/utils/UserUtils.java (98%) create mode 100644 use-cases/src/test/java/org/gcube/application/cms/usecases/GenericChecks.java diff --git a/CHANGELOG.md b/CHANGELOG.md index a1929c5..1b686a3 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.spatial.data.gcube-sdi-suite +## [v1.0.4-SNAPSHOT] - 2023-01-10 +- Updated plugin framework + ## [v1.0.3] - 2022-12-07 - Updated plugin framework - Introduced module default-lc-managers diff --git a/ckan-plugin/CHANGELOG.md b/ckan-plugin/CHANGELOG.md index dc13fd4..e75d18f 100644 --- a/ckan-plugin/CHANGELOG.md +++ b/ckan-plugin/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains gcube-cms plugins for ckan materializations +## [v1.0.2-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.1] - 2022-12-07 - Pom updates diff --git a/ckan-plugin/pom.xml b/ckan-plugin/pom.xml index ce4336a..266f60c 100644 --- a/ckan-plugin/pom.xml +++ b/ckan-plugin/pom.xml @@ -5,14 +5,14 @@ 4.0.0 ckan-plugins - 1.0.1 + 1.0.2-SNAPSHOT gCube CMS - CKAN Plugins org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/cms-plugin-framework/CHANGELOG.md b/cms-plugin-framework/CHANGELOG.md index d9194ca..48fbb29 100644 --- a/cms-plugin-framework/CHANGELOG.md +++ b/cms-plugin-framework/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.cms-plugin-framework +## [v1.0.3-SNAPSHOT] - 2023-01-10 +- UserUtils in framework + ## [v1.0.2] 2022-01-17 - Fixes #2435 - Introduced module default-lc-managers diff --git a/cms-plugin-framework/pom.xml b/cms-plugin-framework/pom.xml index d78566d..b5130b9 100644 --- a/cms-plugin-framework/pom.xml +++ b/cms-plugin-framework/pom.xml @@ -4,12 +4,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 cms-plugin-framework - 1.0.2 + 1.0.3-SNAPSHOT org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT @@ -67,6 +67,12 @@ + + org.gcube.common + authorization-utils + [2.0.0, 3.0.0-SNAPSHOT) + + org.gcube.application.cms geoportal-common diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/AbstractScopedMap.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/AbstractScopedMap.java index 1a1a8cd..983503a 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/AbstractScopedMap.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/AbstractScopedMap.java @@ -2,6 +2,7 @@ package org.gcube.application.cms.caches; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import org.gcube.application.geoportal.common.utils.ContextUtils; @@ -18,7 +19,10 @@ public abstract class AbstractScopedMap extends TimedMap implements @Override public T getObject() throws ConfigurationException { - return get(ContextUtils.getCurrentScope()); + UserUtils.AuthenticatedUser user = UserUtils.getCurrent(); + String context = user.getContext(); + log.debug(" {} : Accessing object under context {} ",name,context); + return get(context); } diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/utils/UserUtils.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/utils/UserUtils.java similarity index 98% rename from geoportal-service/src/main/java/org/gcube/application/geoportal/service/utils/UserUtils.java rename to cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/utils/UserUtils.java index cc525cc..d810f01 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/utils/UserUtils.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/utils/UserUtils.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.service.utils; +package org.gcube.application.cms.implementations.utils; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/cms-test-commons/CHANGELOG.md b/cms-test-commons/CHANGELOG.md index 3bb048b..9b07913 100644 --- a/cms-test-commons/CHANGELOG.md +++ b/cms-test-commons/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.cms.cms-test-commons +## [v1.0.4-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.3] - 2022-12-07 - Pom updates diff --git a/cms-test-commons/pom.xml b/cms-test-commons/pom.xml index c66b0d0..c5bba41 100644 --- a/cms-test-commons/pom.xml +++ b/cms-test-commons/pom.xml @@ -5,14 +5,14 @@ 4.0.0 cms-test-commons - 1.0.3 + 1.0.4-SNAPSHOT CMS Test Commons org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/concessioni-lifecycle/CHANGELOG.md b/concessioni-lifecycle/CHANGELOG.md index 8e4aad8..9a95716 100644 --- a/concessioni-lifecycle/CHANGELOG.md +++ b/concessioni-lifecycle/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains custom extensions for the support of GNA "concessioni" use case +## [v1.0.3-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.2] - 2022-12-07 - Pom updates - Introduced module default-lc-managers diff --git a/concessioni-lifecycle/pom.xml b/concessioni-lifecycle/pom.xml index 6a7dcb8..ddee981 100644 --- a/concessioni-lifecycle/pom.xml +++ b/concessioni-lifecycle/pom.xml @@ -4,14 +4,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 concessioni-lifecycle - 1.0.2 + 1.0.3-SNAPSHOT GNA Concessioni Lifecycle org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/concessioni-model/CHANGELOG.md b/concessioni-model/CHANGELOG.md index 7b873d0..22ba985 100644 --- a/concessioni-model/CHANGELOG.md +++ b/concessioni-model/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains custom BEANS for the support of GNA "concessioni" use case +## [v1.0.3-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.2] - 2022-12-07 - Pom updates diff --git a/concessioni-model/pom.xml b/concessioni-model/pom.xml index 8916c04..60d5217 100644 --- a/concessioni-model/pom.xml +++ b/concessioni-model/pom.xml @@ -6,14 +6,14 @@ org.gcube.application.cms concessioni-model - 1.0.2 + 1.0.3-SNAPSHOT GNA Concessioni Model org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/dataminer-plugins/CHANGELOG.md b/dataminer-plugins/CHANGELOG.md index 6d1e27e..f80220f 100644 --- a/dataminer-plugins/CHANGELOG.md +++ b/dataminer-plugins/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains gcube-cms plugins for processing via gCube Dataminer +## [v1.0.2-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.1] - 2022-12-07 - Pom updates diff --git a/dataminer-plugins/pom.xml b/dataminer-plugins/pom.xml index 4c8b9e0..41b1f8f 100644 --- a/dataminer-plugins/pom.xml +++ b/dataminer-plugins/pom.xml @@ -5,14 +5,14 @@ 4.0.0 dataminer-plugins - 1.0.1 + 1.0.3-SNAPSHOT gCube CMS - Dataminer Plugins org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/default-lc-managers/CHANGELOG.md b/default-lc-managers/CHANGELOG.md index 6c80f00..acc13d8 100644 --- a/default-lc-managers/CHANGELOG.md +++ b/default-lc-managers/CHANGELOG.md @@ -4,5 +4,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains default Lifecycle Managers handlers -## [v1.0.0] - 2022-02-24 +## [v1.0.1-SNAPSHOT] - 2023-01-10 +- Pom updates + +- ## [v1.0.0] - 2022-02-24 - First release diff --git a/default-lc-managers/pom.xml b/default-lc-managers/pom.xml index 7351a94..4e7c601 100644 --- a/default-lc-managers/pom.xml +++ b/default-lc-managers/pom.xml @@ -5,14 +5,14 @@ 4.0.0 default-lc-managers - 1.0.0 + 1.0.1-SNAPSHOT gCube CMS - Default LC Managers org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java b/default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java index e718042..faddf7d 100644 --- a/default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java +++ b/default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java @@ -3,6 +3,7 @@ package org.gcube.application.cms.plugins.implementations; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.implementations.ProjectAccess; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.cms.plugins.LifecycleManager; import org.gcube.application.cms.plugins.PluginManagerInterface; import org.gcube.application.cms.plugins.faults.*; @@ -164,9 +165,10 @@ public abstract class AbstractLifeCycleManager extends AbstractPlugin implements try{ report.setStatus(Report.Status.OK); } catch (Throwable e) { - log.error("Unable to initialize plugins in {} ", ContextUtils.getCurrentScope(),e); + String context = UserUtils.getCurrent().getContext(); + log.error("Unable to initialize plugins in {} ", context,e); report.setStatus(Report.Status.WARNING); - report.putMessage("Unable to initialize plugins in "+ ContextUtils.getCurrentScope()+" : "+e.getMessage()); + report.putMessage("Unable to initialize plugins in "+ context +" : "+e.getMessage()); } return report; } diff --git a/geoportal-client/CHANGELOG.md b/geoportal-client/CHANGELOG.md index e27a637..18402ab 100644 --- a/geoportal-client/CHANGELOG.md +++ b/geoportal-client/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.1.2-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.1.1] - 2022-12-07 - Pom updates diff --git a/geoportal-client/pom.xml b/geoportal-client/pom.xml index c515295..13bac29 100644 --- a/geoportal-client/pom.xml +++ b/geoportal-client/pom.xml @@ -4,14 +4,14 @@ 4.0.0 org.gcube.application geoportal-client - 1.1.1 + 1.1.2-SNAPSHOT Geoportal Client org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/geoportal-common/CHANGELOG.md b/geoportal-common/CHANGELOG.md index b216451..6ce5fab 100644 --- a/geoportal-common/CHANGELOG.md +++ b/geoportal-common/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-common +## [v1.0.11-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.10] - 2022-12-07 - Pom updates diff --git a/geoportal-common/pom.xml b/geoportal-common/pom.xml index 5e0831c..33c1a50 100644 --- a/geoportal-common/pom.xml +++ b/geoportal-common/pom.xml @@ -3,14 +3,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 geoportal-common - 1.0.10 + 1.0.11-SNAPSHOT Geoportal Common org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/ContextUtils.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/ContextUtils.java index 6969202..c7f6d8c 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/ContextUtils.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/ContextUtils.java @@ -8,33 +8,20 @@ import org.gcube.common.scope.api.ScopeProvider; import static org.gcube.common.authorization.client.Constants.authorizationService; @Slf4j +@Deprecated public class ContextUtils { - public static String getCurrentScope(){ - try{ - String token=SecurityTokenProvider.instance.get(); - log.trace("Token is : "+token.substring(0,2)+"..."+token.substring(token.length()-3)); - if(token==null) throw new Exception("Security Token is null"); - AuthorizationEntry entry = authorizationService().get(token); - return entry.getContext(); - }catch(Exception e ){ - log.trace("Unable to resolve token, checking scope provider..",e); - return ScopeProvider.instance.get(); - } - } - - public static String getCurrentCaller(){ try{ String token=SecurityTokenProvider.instance.get(); - log.trace("Token is : "+token.substring(0,2)+"..."+token.substring(token.length()-3)); if(token==null) throw new Exception("Security Token is null"); + log.trace("Token is : "+token.substring(0,2)+"..."+token.substring(token.length()-3)); AuthorizationEntry entry = authorizationService().get(token); return entry.getClientInfo().getId(); }catch(Exception e ){ - log.trace("Unable to resolve token, checking scope provider..",e); - return "Unidentified data-transfer user"; + log.warn("Unable to resolve token using legacy utils, using default ..",e); + return "CMS_default_user"; } } } diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java index e8ce6e7..72f0be0 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java @@ -17,7 +17,7 @@ public class GCubeTest { testContext = "/pred4s/preprod/preVRE"; // testContext = "/d4science.research-infrastructures.eu/D4OS/GNA"; - testContext= "/gcube/devsec/devVRE"; + // testContext= "/gcube/devsec/devVRE"; System.out.println("TEST CONTEXT = "+testContext); return testContext; diff --git a/geoportal-service/CHANGELOG.md b/geoportal-service/CHANGELOG.md index c5e8286..6bbc54c 100644 --- a/geoportal-service/CHANGELOG.md +++ b/geoportal-service/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-service +## [v1.0.12-SNAPSHOT] - 2023-01-10 +- Refactored UserUtils into framework plugin + ## [v1.0.11] - 2022-12-07 - Pom updates - Introduced module default-lc-managers diff --git a/geoportal-service/pom.xml b/geoportal-service/pom.xml index 6b03a01..cb31ec2 100644 --- a/geoportal-service/pom.xml +++ b/geoportal-service/pom.xml @@ -4,14 +4,14 @@ 4.0.0 org.gcube.application geoportal-service - 1.0.11 + 1.0.13-SNAPSHOT Geoportal Service war org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT @@ -68,11 +68,6 @@ default-lc-managers - - org.gcube.common - authorization-utils - [2.0.0, 3.0.0-SNAPSHOT) - diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java index 0ff4e5f..ea09823 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java @@ -14,6 +14,7 @@ import org.bson.types.ObjectId; import org.gcube.application.cms.implementations.ImplementationProvider; import org.gcube.application.cms.implementations.WorkspaceManager; import org.gcube.application.cms.implementations.faults.*; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.cms.plugins.LifecycleManager; import org.gcube.application.cms.plugins.faults.EventException; import org.gcube.application.cms.plugins.faults.InsufficientPrivileges; @@ -50,7 +51,7 @@ import org.gcube.application.geoportal.common.model.useCaseDescriptor.*; import org.gcube.application.geoportal.common.utils.ContextUtils; import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.service.engine.providers.PluginManager; -import org.gcube.application.geoportal.service.utils.UserUtils; + import org.gcube.common.storagehub.client.dsl.FolderContainer; import org.gcube.common.storagehub.model.exceptions.StorageHubException; @@ -81,7 +82,7 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return ID; } - public ProfiledMongoManager(String profileId) throws ConfigurationException, RegistrationException { + public ProfiledMongoManager(String profileId) throws ConfigurationException, RegistrationException { // Check UseCaseDescriptor ID log.info("Loading useCaseDescriptor ID {} ",profileId); if(profileId==null) throw new InvalidParameterException("UseCaseDescriptor ID cannot be null"); @@ -821,7 +822,8 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< @Override public Configuration getConfiguration() throws ConfigurationException{ - log.debug("Asking configuration for {} in {} ", useCaseDescriptor.getId(), UserUtils.getCurrent().getContext()); + String context = UserUtils.getCurrent().getContext(); + log.debug("Asking configuration for {} in {} ", useCaseDescriptor.getId(), context); Configuration toReturn= new Configuration(); List archives = new ArrayList<>(); toReturn.setArchives(archives); @@ -829,7 +831,7 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< toReturn.setIndexes(indexes); // Set Basic Info toReturn.setProfileId(this.getUseCaseDescriptor().getId()); - toReturn.setContext(ContextUtils.getCurrentScope()); + toReturn.setContext(context); toReturn.setLastUpdatedTime(LocalDateTime.now()); // Add Mongo Info diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java index c6c48e5..e7eae6f 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java @@ -7,6 +7,7 @@ import com.mongodb.client.model.ReturnDocument; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.bson.types.ObjectId; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import org.gcube.application.geoportal.common.model.rest.QueryRequest; @@ -24,7 +25,10 @@ public class UCDMongoManager extends MongoManager implements UCDManagerI{ public UCDMongoManager() throws ConfigurationException { - init("UCD_"+ContextUtils.getCurrentScope().replaceAll("/","_")); + String context = UserUtils.getCurrent().getContext(); + String collectionName ="UCD_"+context.replaceAll("/","_"); + log.debug("Starting UCD mongo manager under {} with collection name {} ",context, collectionName); + init(collectionName); } public long deleteAll(){ diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ConfigurationCache.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ConfigurationCache.java index e939540..8912728 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ConfigurationCache.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ConfigurationCache.java @@ -4,10 +4,12 @@ import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.caches.AbstractScopedMap; import org.gcube.application.cms.caches.TimedMap; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.geoportal.common.model.configuration.Configuration; import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import org.gcube.application.geoportal.service.engine.mongo.ProfiledMongoManager; + import java.time.Duration; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAmount; @@ -45,6 +47,7 @@ public class ConfigurationCache extends AbstractScopedMap implements UCDMan log.warn("Unable to cache UCD {}",entry.getKey(),e); } } - log.info("Cached {} UCDs in {} ",memCache.size(),ContextUtils.getCurrentScope()); + String context = UserUtils.getCurrent().getContext(); + log.info("Cached {} UCDs in {} ",memCache.size(),context); cacheLock.writeLock().unlock(); } diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java index 6151d6e..14e2d3f 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java @@ -2,6 +2,7 @@ package org.gcube.application.geoportal.service.engine.mongo; import org.bson.Document; import org.gcube.application.cms.implementations.faults.*; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.cms.plugins.faults.EventException; import org.gcube.application.cms.plugins.faults.InsufficientPrivileges; import org.gcube.application.cms.plugins.faults.StepException; @@ -16,7 +17,6 @@ import org.gcube.application.geoportal.common.utils.FileSets; import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.common.utils.tests.GCubeTest; import org.gcube.application.geoportal.service.BasicServiceTestUnit; -import org.gcube.application.geoportal.service.utils.UserUtils; import org.gcube.common.storagehub.model.exceptions.StorageHubException; import org.junit.Before; import org.junit.BeforeClass; @@ -30,7 +30,7 @@ import static org.junit.Assume.assumeTrue; public class LockTests extends BasicServiceTestUnit { - String profileID = "rolesTesting"; + String profileID = "basic"; ProfiledMongoManager manager= null; @BeforeClass @@ -100,7 +100,7 @@ public class LockTests extends BasicServiceTestUnit { // register fileset FileSets.RequestBuilder builder = FileSets.build( - "$.relazioneScavo","fileset","relazioneScavo."+ Field.CHILDREN+"[?(@.fileset)]"); + "$.section","fileset","section."+ Field.CHILDREN+"[?(@.fileset)]"); StorageUtils s= new StorageUtils(); builder.add( s.putOntoStorage(new File(Tests.FOLDER_CONCESSIONI,"pos.shp"),"pos.shp")); @@ -109,7 +109,7 @@ public class LockTests extends BasicServiceTestUnit { checkIsLockCleaned(p.getId()); // delete fileset - p=managerInterface.deleteFileSet(p.getId(),"$.relazioneScavo.fileset",false); + p=managerInterface.deleteFileSet(p.getId(),"$.section.fileset",false); checkIsLockCleaned(p.getId()); // perform step diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java index 7effc88..ef1f33f 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java @@ -24,6 +24,7 @@ import org.junit.Before; import org.junit.Test; import org.opengis.service.Interface; +import javax.ws.rs.WebApplicationException; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java index 118ec4a..47a10ed 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java @@ -33,7 +33,7 @@ public class DummyProjectTest extends AbstractProfiledDocumentsTests{ String fieldName="fileset"; String fieldDefinition="section."+Field.CHILDREN+"[?(@.fileset)]"; - String filename = "sample.tif"; + String filename = "concessioni/sample.tif"; @Override @@ -146,137 +146,16 @@ public class DummyProjectTest extends AbstractProfiledDocumentsTests{ return doc; } - @Test - public void testUnlock() throws Exception { - assumeTrue(GCubeTest.isTestInfrastructureEnabled()); - // Not automatic, needs generation of locked project - assumeTrue(false); - String id = "627e87bb02ad3d1a2e0e9e18"; - String ucd = "profiledConcessioni"; - Project p =check(target(InterfaceConstants.Methods.PROJECTS).path(ucd).path(InterfaceConstants.Methods.FORCE_UNLOCK).path(id).request(MediaType.APPLICATION_JSON). - put(Entity.entity("", MediaType.APPLICATION_JSON)), Project.class); - assertNull(p.getLock()); - } - - @Test - public void testRelationships() throws Exception { - assumeTrue(GCubeTest.isTestInfrastructureEnabled()); - Project a = createNew(new Document("key","value")); - Project b = createNew(new Document("key","value")); - - // set relation a -- precedes --> b - System.out.println("Setting relation.."); - String relId="precedes"; - a = check(baseTarget(). - path(InterfaceConstants.Methods.RELATIONSHIP). - path(a.getId()). - path(relId). - queryParam(InterfaceConstants.Parameters.TARGET_UCD,b.getProfileID()). - queryParam(InterfaceConstants.Parameters.TARGET_ID,b.getId()). - request(MediaType.APPLICATION_JSON). - put(Entity.json("")), Project.class); - // check set relation in a - System.out.println("Checking relation a->b"); - assertTrue(a.getRelationships()!=null && a.getRelationships().size()==1); - Relationship rel = a.getRelationships().get(0); - assertEquals(rel.getRelationshipName(),relId); - assertEquals(rel.getTargetUCD(),b.getProfileID()); - assertEquals(rel.getTargetID(),b.getId()); - - // TODO TBD check reciprocity : expected relation b -- follows -> a - - // delete relation - System.out.println("Deleting relation a->b"); - a = check(baseTarget(). - path(InterfaceConstants.Methods.RELATIONSHIP). - path(a.getId()). - path(relId). - queryParam(InterfaceConstants.Parameters.TARGET_UCD,b.getProfileID()). - queryParam(InterfaceConstants.Parameters.TARGET_ID,b.getId()). - request(MediaType.APPLICATION_JSON). - delete(), Project.class); - // check deleted - - System.out.println("Checking deleted relation"); - assertTrue(a.getRelationships()==null || a.getRelationships().isEmpty()); - - - } - - + // Not automatic, needs generation of locked project // @Test -// public void testSDI() throws Exception { -// // Create new -// Project doc = createNew(new Document("posizionamentoScavo",new Document("title","Mio pos"))); -// -// // register filesets -// doc = upload( -// new StorageUtils(), -// doc.getId(), -// "posizionamentoScavo","fileset", -// "posizionamentoScavo."+Field.CHILDREN+"[?(@.fileset)]", -// null, -// RegisterFileSetRequest.ClashOptions.REPLACE_EXISTING, -// "pos.shp","pos.shx"); -// -// System.out.println("Registered posizionamento, result is "+ Serialization.write(doc)); -// -// // invoke step SUBMIT-FOR-REVIEW -// StepExecutionRequest req=new StepExecutionRequest(); -// req.setStepID("SUBMIT-FOR-REVIEW"); -// doc=step(doc.getId(),req); -// System.out.println(doc); -// if(doc.getLifecycleInformation().getErrorMessages()!=null) { -// System.out.println("ERROR MESSAGES"); -// doc.getLifecycleInformation().getErrorMessages().forEach(s -> System.out.println(s)); -// } -// if(doc.getLifecycleInformation().getWarningMessages()!=null) { -// System.out.println("WARNING MESSAGES"); -// doc.getLifecycleInformation().getWarningMessages().forEach(s -> System.out.println(s)); -// } -// -// assertTrue(doc.getLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)); -// -// JSONPathWrapper wrapper = new JSONPathWrapper(doc.getTheDocument().toJson()); -// RegisteredFileSet fs = Serialization.convert(wrapper.getByPath("$..fileset").get(0),RegisteredFileSet.class); -// assertTrue(fs!=null); -// assertTrue(fs.getPayloads().size()==2); -// assertTrue(fs.getMaterializations().size()>0); -// -// -// for(Object matObj : wrapper.getByPath("$..[?(@."+ Materialization.TYPE +" == '"+GCubeSDILayer.GCUBE_SDY_LAYER_TYPE+"' )]")){ -// GCubeSDILayer layer = Serialization.convert(matObj, GCubeSDILayer.class); -// System.out.println("Checking Layer : "+layer); -// assertTrue(layer.getType().equals(GCubeSDILayer.GCUBE_SDY_LAYER_TYPE)); -// assertTrue(layer.getOGCLinks().size()>0); -// assertTrue(layer.getPlatformInfo().size()>0); -// assertTrue(layer.getBBox()!=null); -// } -// -// // Checking platform info GeoServer -// for(Object platformObj : wrapper.getByPath("$..[?(@."+ Materialization.TYPE +" == 'GeoServer' )]")){ -// Document platform=Serialization.asDocument(platformObj); -// assertTrue(platform.containsKey("layerName")); -// assertTrue(platform.containsKey("workspace")); -// assertTrue(platform.containsKey("storeName")); -// assertTrue(platform.containsKey("persistencePath")); -// assertTrue(platform.get("files",List.class).size()==2); -// } -// -// -// req.setStepID("APPROVE DRAFT"); -// doc=step(doc.getId(),req); -// if(doc.getLifecycleInformation().getErrorMessages()!=null) { -// System.out.println("ERROR MESSAGES"); -// doc.getLifecycleInformation().getErrorMessages().forEach(s -> System.out.println(s)); -// } -// if(doc.getLifecycleInformation().getWarningMessages()!=null) { -// System.out.println("WARNING MESSAGES"); -// doc.getLifecycleInformation().getWarningMessages().forEach(s -> System.out.println(s)); -// } -// -// assertTrue(doc.getLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)); -// +// public void testUnlock() throws Exception { +// assumeTrue(GCubeTest.isTestInfrastructureEnabled()); +// assumeTrue(false); +// String id = "627e87bb02ad3d1a2e0e9e18"; +// String ucd = "profiledConcessioni"; +// Project p =check(target(InterfaceConstants.Methods.PROJECTS).path(ucd).path(InterfaceConstants.Methods.FORCE_UNLOCK).path(id).request(MediaType.APPLICATION_JSON). +// put(Entity.entity("", MediaType.APPLICATION_JSON)), Project.class); +// assertNull(p.getLock()); // } } diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java index 11bfa66..97b91a8 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java @@ -2,11 +2,8 @@ package org.gcube.application.geoportal.service.profiledDocuments; import lombok.extern.slf4j.Slf4j; import org.bson.Document; -import org.gcube.application.cms.implementations.ImplementationProvider; -import org.gcube.application.cms.implementations.WorkspaceManager; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.cms.serialization.Serialization; -import org.gcube.application.cms.tests.model.BasicTests; -import org.gcube.application.geoportal.common.model.JSONPathWrapper; import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.document.access.Access; import org.gcube.application.geoportal.common.model.document.identification.SpatialReference; @@ -14,17 +11,12 @@ import org.gcube.application.geoportal.common.model.document.lifecycle.Lifecycle import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest; import org.gcube.application.geoportal.common.model.useCaseDescriptor.Field; -import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.common.utils.tests.GCubeTest; -import org.gcube.application.geoportal.service.utils.UserUtils; -import org.gcube.common.storagehub.model.exceptions.StorageHubException; + import org.junit.Test; -import javax.management.relation.Relation; -import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import java.time.LocalDateTime; import static org.junit.Assert.assertEquals; diff --git a/images-plugin/CHANGELOG.md b/images-plugin/CHANGELOG.md index 865c90c..c2c8a3a 100644 --- a/images-plugin/CHANGELOG.md +++ b/images-plugin/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains gcube-cms plugins for images materializations +## [v1.0.2-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.1] - 2022-12-07 - Pom updates diff --git a/images-plugin/pom.xml b/images-plugin/pom.xml index af0ba97..b772af5 100644 --- a/images-plugin/pom.xml +++ b/images-plugin/pom.xml @@ -5,14 +5,14 @@ 4.0.0 images-plugins - 1.0.1 + 1.0.2-SNAPSHOT gCube CMS - Images Plugins org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/notifications-plugins/CHANGELOG.md b/notifications-plugins/CHANGELOG.md index 086b04f..620aaae 100644 --- a/notifications-plugins/CHANGELOG.md +++ b/notifications-plugins/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains gcube-cms plugins for notitfications events +## [v1.0.2-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.1] - 2022-12-07 - Pom updates diff --git a/notifications-plugins/pom.xml b/notifications-plugins/pom.xml index 8a54506..91e1c98 100644 --- a/notifications-plugins/pom.xml +++ b/notifications-plugins/pom.xml @@ -5,14 +5,14 @@ 4.0.0 notifications-plugins - 1.0.1 + 1.0.2-SNAPSHOT gCube CMS - Notifications Plugins org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/pom.xml b/pom.xml index 69f7642..2aece86 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ org.gcube.application.cms gcube-cms-suite pom - 1.0.3 + 1.0.4-SNAPSHOT Gcube CMS Suite gCube CMS Suite is a set of components designed to manage complex space-temporal Documents defined by metadata Profiles. @@ -26,17 +26,15 @@ 2.1.1 3.6.3 [1.0.0,2.0.0-SNAPSHOT) - 1.0.1 - - - - - - + 2.1.0-SNAPSHOT + 2.2.0-SNAPSHOT + 3.7.0-SNAPSHOT + [2.0.0-SNAPSHOT,3.0.0-SNAPSHOT) + 1.0.3-SNAPSHOT diff --git a/sdi-plugins/CHANGELOG.md b/sdi-plugins/CHANGELOG.md index 5ee7859..acee1f6 100644 --- a/sdi-plugins/CHANGELOG.md +++ b/sdi-plugins/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains gcube-cms plugins for indexing and materializations in gCube SDI +## [v1.0.2-SNAPSHOT] - 2023-01-10 +- Pom updates + ## [v1.0.1] - 2022-12-07 - Pom updates - Introduced module default-lc-managers diff --git a/sdi-plugins/pom.xml b/sdi-plugins/pom.xml index d0f6fe8..4073801 100644 --- a/sdi-plugins/pom.xml +++ b/sdi-plugins/pom.xml @@ -5,14 +5,14 @@ 4.0.0 sdi-plugins - 1.0.1 + 1.0.2-SNAPSHOT gCube CMS - SDI Plugins org.gcube.application.cms gcube-cms-suite - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/plugins/SDIMaterializerPlugin.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/plugins/SDIMaterializerPlugin.java index fede17c..e928aff 100644 --- a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/plugins/SDIMaterializerPlugin.java +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/plugins/SDIMaterializerPlugin.java @@ -5,6 +5,7 @@ import lombok.Data; import lombok.Synchronized; import lombok.extern.slf4j.Slf4j; import org.bson.Document; +import org.gcube.application.cms.implementations.utils.UserUtils; import org.gcube.application.cms.plugins.MaterializationPlugin; import org.gcube.application.cms.plugins.faults.InitializationException; import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; @@ -47,7 +48,9 @@ public class SDIMaterializerPlugin extends AbstractPlugin implements Materializa private SDIManagerWrapper getSDIManager(){ - return sdiManagerMap.get(ContextUtils.getCurrentScope()); + String context = UserUtils.getCurrent().getContext(); + log.debug("Getting SDIManagerWrapper from cache map for context {}"); + return sdiManagerMap.get(context); } @Override @@ -55,7 +58,7 @@ public class SDIMaterializerPlugin extends AbstractPlugin implements Materializa public InitializationReport initInContext() throws InitializationException { InitializationReport report = new InitializationReport(); try{ - String context = ContextUtils.getCurrentScope(); + String context = UserUtils.getCurrent().getContext(); if(getSDIManager()==null) { log.info("Initializing in " + context); sdiManagerMap.put(context,new SDIManagerWrapper()); diff --git a/use-cases/CHANGELOG.md b/use-cases/CHANGELOG.md index b8294bf..6f75013 100644 --- a/use-cases/CHANGELOG.md +++ b/use-cases/CHANGELOG.md @@ -1,6 +1,11 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -# Changelog for org.gcube.application.geoportal-client +# Changelog for org.gcube.application.cms.use-cases + + + +## [v1.0.4-SNAPSHOT] - 2023-01-10 +- Pom updates ## [v1.0.3] - 2022-12-07 - Pom updates diff --git a/use-cases/pom.xml b/use-cases/pom.xml index 263ac22..0d5e6c8 100644 --- a/use-cases/pom.xml +++ b/use-cases/pom.xml @@ -4,12 +4,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 use-cases - 1.0.3 + 1.0.4-SNAPSHOT CMS Use cases gcube-cms-suite org.gcube.application.cms - 1.0.3 + 1.0.4-SNAPSHOT diff --git a/use-cases/src/test/java/org/gcube/application/cms/usecases/GenericChecks.java b/use-cases/src/test/java/org/gcube/application/cms/usecases/GenericChecks.java new file mode 100644 index 0000000..345adae --- /dev/null +++ b/use-cases/src/test/java/org/gcube/application/cms/usecases/GenericChecks.java @@ -0,0 +1,56 @@ +package org.gcube.application.cms.usecases; + +import org.gcube.application.cms.tests.TokenSetter; +import org.gcube.application.geoportal.client.UseCaseDescriptors; +import org.gcube.application.geoportal.common.model.rest.QueryRequest; +import org.gcube.application.geoportal.common.rest.Projects; +import org.gcube.application.geoportal.common.rest.UseCaseDescriptorsI; +import org.gcube.application.geoportal.common.utils.tests.GCubeTest; +import org.junit.Assert; +import org.junit.Test; + +import java.util.concurrent.atomic.AtomicLong; + +import static org.gcube.application.geoportal.client.plugins.GeoportalAbstractPlugin.projects; +import static org.gcube.application.geoportal.client.plugins.GeoportalAbstractPlugin.useCaseDescriptors; +import static org.junit.Assume.assumeTrue; + +public class GenericChecks { + + + UseCaseDescriptorsI getClient(){ + assumeTrue(GCubeTest.isTestInfrastructureEnabled()); + TokenSetter.set(GCubeTest.getContext()); + return useCaseDescriptors().build(); + } + + @Test + public void getAll() throws Exception { + + UseCaseDescriptorsI client =getClient(); + + QueryRequest request = new QueryRequest(); + // All + + client.query(request).forEachRemaining(u -> { + try { + System.out.println("Obtained UCD "+u.getId()); + + client.getById(u.getId()).getId(); + + Projects pClient = (Projects)projects(u.getId()).build(); + + AtomicLong counter=new AtomicLong(0); + pClient.query(new QueryRequest()).forEachRemaining( M -> counter.incrementAndGet()); + System.out.println("Found "+counter.get()+" elements"); + + } catch (Exception e) { + e.printStackTrace(System.err); + Assert.fail("Unable to check "+u.getId()); + } + }); + + + } + +} -- 2.17.1 From febc806c10c92cda8e4fb83c0bf1339359aa6e1c Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 10 Jan 2023 16:14:14 +0100 Subject: [PATCH 11/18] Missing images --- .../docs/_static/imgs/architecture.png | Bin 0 -> 100363 bytes .../docs/_static/imgs/execution_schema.png | Bin 0 -> 34043 bytes .../docs/_static/imgs/plugin_interfaces.png | Bin 0 -> 45966 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 geoportal-service/docs/_static/imgs/architecture.png create mode 100644 geoportal-service/docs/_static/imgs/execution_schema.png create mode 100644 geoportal-service/docs/_static/imgs/plugin_interfaces.png diff --git a/geoportal-service/docs/_static/imgs/architecture.png b/geoportal-service/docs/_static/imgs/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..f324582fdb0f119175d5fff4dfb51f6cbfe3a6dd GIT binary patch literal 100363 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 UB8^hxSnx+xNmH>@-YWS20UD+7)Bpeg literal 0 HcmV?d00001 diff --git a/geoportal-service/docs/_static/imgs/plugin_interfaces.png b/geoportal-service/docs/_static/imgs/plugin_interfaces.png new file mode 100644 index 0000000000000000000000000000000000000000..21f580a5074339678257e68bc5fe6c5db8c0779a GIT binary patch literal 45966 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 Am;e9( literal 0 HcmV?d00001 -- 2.17.1 From 253b13e49bd1c76a2563dc357fa091bd818c8cd2 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 10 Jan 2023 16:19:22 +0100 Subject: [PATCH 12/18] Fixed version --- geoportal-service/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoportal-service/pom.xml b/geoportal-service/pom.xml index cb31ec2..32f6852 100644 --- a/geoportal-service/pom.xml +++ b/geoportal-service/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.gcube.application geoportal-service - 1.0.13-SNAPSHOT + 1.0.12-SNAPSHOT Geoportal Service war -- 2.17.1 From bff898c57dff604df021cc8183f73fd9739d4a28 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 10 Jan 2023 17:15:45 +0100 Subject: [PATCH 13/18] Fixed version --- dataminer-plugins/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataminer-plugins/pom.xml b/dataminer-plugins/pom.xml index 41b1f8f..99a270e 100644 --- a/dataminer-plugins/pom.xml +++ b/dataminer-plugins/pom.xml @@ -5,7 +5,7 @@ 4.0.0 dataminer-plugins - 1.0.3-SNAPSHOT + 1.0.2-SNAPSHOT gCube CMS - Dataminer Plugins -- 2.17.1 From b7788c063e8e2821fc8f534a5d70973e5746e509 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 10 Jan 2023 18:11:39 +0100 Subject: [PATCH 14/18] Fixes #24316 --- geoportal-service/enunciate.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoportal-service/enunciate.xml b/geoportal-service/enunciate.xml index 11c8453..3c3f8bb 100644 --- a/geoportal-service/enunciate.xml +++ b/geoportal-service/enunciate.xml @@ -19,7 +19,7 @@ - + -- 2.17.1 From a58bd458f72f471cebee9be6530e33c972358312 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Thu, 12 Jan 2023 15:53:25 +0100 Subject: [PATCH 15/18] Fixes #24412 --- .../application/geoportal/common/utils/Files.java | 8 ++++---- .../application/geoportal/common/FilesTests.java | 14 +++++++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java index 94c8826..7916f4f 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java @@ -92,12 +92,12 @@ public class Files { if(toFix.startsWith("\\.")) toFix=toFix.replaceFirst("\\.","_"); String extension=""; - if(toFix.contains(".")) { + int extensionIndex=toFix.lastIndexOf("."); + if(extensionIndex>0) { //preserve extension - int index=toFix.indexOf("."); - extension=toFix.substring(index); + extension=toFix.substring(extensionIndex); //only escape before extension - toFix=toFix.substring(0,toFix.indexOf(".")); + toFix=toFix.substring(0,extensionIndex); } return toFix.toLowerCase(). replaceAll("[\\-\\*\\+\\/\\\\ \\[\\]\\(\\)\\.\\\"\\:\\;\\|\\=]","_")+extension.toLowerCase(); diff --git a/geoportal-common/src/test/java/org/gcube/application/geoportal/common/FilesTests.java b/geoportal-common/src/test/java/org/gcube/application/geoportal/common/FilesTests.java index 2317dd3..0ec8885 100644 --- a/geoportal-common/src/test/java/org/gcube/application/geoportal/common/FilesTests.java +++ b/geoportal-common/src/test/java/org/gcube/application/geoportal/common/FilesTests.java @@ -6,6 +6,8 @@ import org.junit.Test; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -18,12 +20,18 @@ public class FilesTests { @Test public void testNames(){ - for(String name : baseFolder.list()){ + + ArrayList toTestStrings=new ArrayList<>(Arrays.asList(baseFolder.list())); + toTestStrings.add("e. gna_topografia_timponedellamotta.qmd"); + + for(String name : toTestStrings){ if(name.contains(".")) { - String originalExtension = name.substring(name.indexOf(".")); + int extensionIndex = name.lastIndexOf("."); + String originalExtension = extensionIndex>0?name.substring(extensionIndex):null; String obtained = Files.fixFilename(name); log.info(name + "->" + obtained + "[" + originalExtension + "]"); - assertTrue(obtained.endsWith(originalExtension)); + if(originalExtension!=null) + assertTrue(obtained.endsWith(originalExtension)); } } } -- 2.17.1 From e7481f67c4dd29ca1ca0f83f309393936de4d20f Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Thu, 12 Jan 2023 18:03:55 +0100 Subject: [PATCH 16/18] Fixes #24380 --- .../plugins/ConcessioniLifeCycleManager.java | 32 +------------------ .../plugins/ConcessioniPluginTests.java | 20 ++++++------ .../engine/mongo/ProfiledMongoManager.java | 13 +++++--- 3 files changed, 20 insertions(+), 45 deletions(-) diff --git a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java index 349e612..527438c 100644 --- a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java +++ b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java @@ -82,12 +82,6 @@ public class ConcessioniLifeCycleManager extends Default3PhaseManager implements log.debug("Concessione {}, managing relazione {}",document.getId(),rel); rel.putIfAbsent(ProfiledConcessione.Sections.TITOLO,doc.getString(ProfiledConcessione.NOME)+" relazione di scavo"); rel.putIfAbsent(ProfiledConcessione.SOGGETTO,doc.get(ProfiledConcessione.SOGGETTO)); - rel.putIfAbsent(RegisteredFileSet.CREATION_INFO,c.getInfo().getCreationInfo()); - rel.putIfAbsent(RegisteredFileSet.ACCESS,c.getInfo().getAccess()); - Access relAccess=Serialization.convert(rel.get(RegisteredFileSet.ACCESS),Access.class); - relAccess.setLicense(ConstraintCheck.defaultFor(relAccess.getLicense(),"CC-BY-4.0").evaluate()); - relAccess.setPolicy(ConstraintCheck.defaultFor(relAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); - rel.put(RegisteredFileSet.ACCESS,relAccess); doc.put(ProfiledConcessione.RELAZIONE_SCAVO,rel); @@ -96,12 +90,6 @@ public class ConcessioniLifeCycleManager extends Default3PhaseManager implements Serialization.convert(doc.get(ProfiledConcessione.ABSTRACT_RELAZIONE), Document.class):new Document(); log.debug("Concessione {}, managing abstract relazione {}",document.getId(),abs); abs.putIfAbsent(ProfiledConcessione.Sections.TITOLO,doc.getString(ProfiledConcessione.NOME)+" abstract relazione di scavo"); - abs.putIfAbsent(RegisteredFileSet.CREATION_INFO,c.getInfo().getCreationInfo()); - abs.putIfAbsent(RegisteredFileSet.ACCESS,c.getInfo().getAccess()); - Access absAccess=Serialization.convert(abs.get(RegisteredFileSet.ACCESS),Access.class); - absAccess.setLicense(ConstraintCheck.defaultFor(absAccess.getLicense(),"CC-BY-4.0").evaluate()); - absAccess.setPolicy(ConstraintCheck.defaultFor(absAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); - abs.put(RegisteredFileSet.ACCESS,absAccess); doc.put(ProfiledConcessione.ABSTRACT_RELAZIONE,abs); @@ -120,13 +108,6 @@ public class ConcessioniLifeCycleManager extends Default3PhaseManager implements // BBOX in registered filesets pos.put(ProfiledConcessione.RESPONSABILE,doc.get(ProfiledConcessione.RESPONSABILE)); - - pos.putIfAbsent(RegisteredFileSet.CREATION_INFO,c.getInfo().getCreationInfo()); - pos.putIfAbsent(RegisteredFileSet.ACCESS,c.getInfo().getAccess()); - Access posAccess=Serialization.convert(rel.get(RegisteredFileSet.ACCESS),Access.class); - posAccess.setLicense(ConstraintCheck.defaultFor(posAccess.getLicense(),"CC-BY-4.0").evaluate()); - posAccess.setPolicy(ConstraintCheck.defaultFor(posAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); - pos.put(RegisteredFileSet.ACCESS,posAccess); doc.put(ProfiledConcessione.POSIZIONAMENTO_SCAVO,pos); } @@ -139,12 +120,7 @@ public class ConcessioniLifeCycleManager extends Default3PhaseManager implements for (int i = 0; i Date: Fri, 13 Jan 2023 16:05:36 +0100 Subject: [PATCH 17/18] Redundant --- geoportal-service/docs/example.rst | 810 ----------------------------- 1 file changed, 810 deletions(-) delete mode 100644 geoportal-service/docs/example.rst diff --git a/geoportal-service/docs/example.rst b/geoportal-service/docs/example.rst deleted file mode 100644 index 69195b8..0000000 --- a/geoportal-service/docs/example.rst +++ /dev/null @@ -1,810 +0,0 @@ -.. _Anchor For ExampleRSTFile: - -################# -Example .rst File -################# - -NB https://sphinx-design.readthedocs.io/en/furo-theme/dropdowns.html - -If you work with edX documentation source files, you might find this file -helpful as a reference. This file contains examples of .rst formatting. - -Explanations and more context for each type of element are provided in -:ref:`Work with edX Documentation Source Files`. - -This file covers the following topics. - -.. contents:: - :local: - :depth: 1 - -*************** -Heading Levels -*************** - -:: - - ############# - Heading 1 - ############# - - ************* - Heading 2 - ************* - - =========== - Heading 3 - =========== - - Heading 4 - ************ - - Heading 5 - =========== - - Heading 6 - ~~~~~~~~~~~ - -************************************************ -Paragraph Text and Commented Text -************************************************ - -This is an example of regular text in paragraph form. There are no indents. As -a best practice, break lines at about 80 characters, so that each line has its -own line number for commenting in reviews. - -.. warning:: Throughout text and code examples, make sure double quotation - marks and apostrophes are straight (") or ('), not curly quotatation marks - and apostrophes, which might be introduced when text is cut and pasted from - other sources or editors. - -Boldface is used for labels that are visible in the user interface. The UI -text is surrounded by double asterisks. For example, **bold**. - -Italics are rarely used. Text surrounded by single asterisks is rendered in -*italics*. - -Monospace text is used for ``code examples``. Text surrounded by double grave -accent characters is rendered in monospace font. - -``.. comments can be added in a file by starting a line with 2 periods and a space.`` - -In English source files, look for comments addressed to translators from writers. - -``.. Translators: In this code example, do not translate such and such.`` - - -*************************************** -Ordered and Unordered Lists -*************************************** - -Use hash symbols for ordered lists. - -:: - -#. Select **Advanced Settings**. -#. Find the **Course Advertised Start Date** policy key. -#. Enter the value you want to display. - -.. note:: - Ordered lists usually use numerals. Nested ordered lists (ordered lists inside - other ordered lists) use letters. - -Use asterisks for unordered (bulleted) lists. - -:: - -* Who is teaching the course? -* What university or college is the course affiliated with? -* What topics and concepts are covered in your course? -* Why should a learner enroll in your course? - -======================= -Nested Lists or Content -======================= - -You can include content including additional lists and code examples inside -lists. - -Unordered List inside Ordered List -*************************************** - -To include an unordered list inside an ordered list, indent the unordered list -three spaces. The first bullet in the unordered list must be flush with the -text in the ordered list. - -:: - - #. Review your entry to verify that the key is accurate and that it is - surrounded by quotation marks. If there is a list of keys, they must be - comma separated. - - * In this example, the key for the Annotation Problem tool is the only - value in the list. - - * In this example, the key for the Annotation Problem tool is added at - the beginning of a list of other keys. - - #. Select **Save Changes**. - -.. image:: /Images/Lists_UL_inside_OL.png - :width: 500 - :alt: An unordered (bulleted) list inside an ordered (numbered) list. - -Ordered List inside Unordered List -*************************************** - -To include an ordered list inside an unordered list, indent the ordered list -two spaces. The first number or letter of the ordered list must be flush with -the text in the unordered list. - -:: - - * Review your entry to verify that the key is accurate and that it is - surrounded by quotation marks. If there is a list of keys, they must be comma - separated. - - #. In this example, the key for the Annotation Problem tool is the only - value in the list. - - #. In this example, the key for the Annotation Problem tool is added at the - beginning of a list of other keys. - - * Select **Save Changes**. - -.. There isn't a screen shot of the above example yet because these lists don't -.. render correctly locally, and searching for an example in the built docs -.. online was taking too much time. - -Unordered List inside Unordered List -*************************************** - -To include an unordered list inside another unordered list, indent the second -unordered list two spaces. The first bullet of the second unordered list must -be flush with the text in the unordered list. - -:: - - * Review your entry to verify that the key is accurate and that it is - surrounded by quotation marks. If there is a list of keys, they must be - comma separated. - - #. In this example, the key for the Annotation Problem tool is the only - value in the list. - - #. In this example, the key for the Annotation Problem tool is added at the - beginning of a list of other keys. - - * Select **Save Changes**. - -.. image:: /Images/Lists_UL_inside_UL.png - :width: 500 - :alt: An ordered (numbered) list inside an unordered (bulleted) list. - -Ordered List inside Ordered List -*************************************** - -To include another ordered list inside an ordered list, indent the second -ordered list three spaces. The second ordered list must be flush with the text -in the numbered list. The first ordered list uses numerals, and the second -uses letters. - -:: - - #. Review your entry to verify that the key is accurate and that it is - surrounded by quotation marks. If there is a list of keys, they must be - comma separated. - - #. In this example, the key for the Annotation Problem tool is the only - value in the list. - - #. In this example, the key for the Annotation Problem tool is added at - the beginning of a list of other keys. - - #. Select **Save Changes**. - -.. There isn't a screen shot of the above example yet because these lists don't -.. render correctly locally, and searching for an example in the built docs -.. online was taking too much time. - -Code, Images, and Other Content inside Lists -********************************************* - -To include content such as code or an image inside a list, position the code or -image directive flush with the text in the list. That is, indent three spaces -for ordered lists and two spaces for unordered lists. - -:: - - #. In the ``lms.yml`` and ``studio.yml`` files, set the value of - ``CERTIFICATES_HTML_VIEW`` within the ``FEATURES`` object to ``true``. - - .. code-block:: bash - - "FEATURES": { - ... - 'CERTIFICATES_HTML_VIEW': true, - ... - } - - #. Save the ``lms.yml`` and ``studio.yml`` files. - - -*************************************** -Conditional Text -*************************************** - -To conditionalize a single paragraph, use either the ``only:: Partners`` or -the ``only:: Open_edX`` directive, and indent the paragraph under the -directive. You can add the conditional text as regular text or as a note. - -Make sure to indent the paragraph under the directive. - -:: - - .. only:: Partners - - Data about course enrollment is available from edX Insights. You can access - Insights from the instructor dashboard for your live course: after you select - **Instructor**, follow the link in the banner at the top of each page. For - more information, see `Using edX Insights`_. - - .. only:: Open_edX - - .. note:: - If you want to require an entrance exam for your course, you also create - the exam in the course outline. Before you can create an exam, you must - set your course to require an entrance exam in Studio. For more - information, see :ref:`Require an Entrance Exam`. - -To conditionalize more than a paragraph, use either the ``only:: Partners`` or -the ``only:: Open_edX`` directive, and then use an ``include::`` directive -indented under the only directive. - -:: - - .. only:: Open_edX - - .. include:: ../../../shared/building_and_running_chapters/running_course/Section_course_student.rst - - - -********************************* -Notes and Warnings -********************************* - -:: - - .. note:: - This is note text. If note text runs over a line, make sure the lines wrap - and are indented to the same level as the note tag. If formatting is - incorrect, part of the note might not render in the HTML output. - - Notes can have more than one paragraph. Successive paragraphs must indent - to the same level as the rest of the note. - -.. note:: - This is note text. If note text runs over a line, make sure the lines wrap - and are indented to the same level as the note tag. If formatting is - incorrect, part of the note might not render in the HTML output. - - Notes can have more than one paragraph. Successive paragraphs must indent to - the same level as the rest of the note. - - -:: - - .. warning:: - Warnings are formatted in the same way as notes. In the same way, lines - must be broken and indented under the warning tag. - - -.. warning:: - Warnings are formatted in the same way as notes. In the same way, lines must - be broken and indented under the warning tag. - - -**************************** -Cross-References -**************************** - -In edX documents, you can include cross-references to other locations in the -same edX document, to locations in other edX documents (such as a cross- -reference from a location in the *Building and Running an edX Course* guide to -a location in the *EdX Learner's Guide*), to JIRA stories, and to external -websites. In this section, "EdX documents" refers to the resources, including -guides and tutorials, that are listed on docs.edx.org. - -For more information about creating cross-references using RST and Sphinx, see -`Cross-referencing arbitrary locations`_ in the online Sphinx documentation. - -================================================== -Cross-References to Locations in the Same Document -================================================== - -Cross-references to locations in the same document use anchors that are located -above the heading for each topic or section. Anchors can contain numbers, -letters, spaces, underscores, and hyphens, but cannot include punctuation. -Anchors use the following syntax. - -:: - - .. _Anchor Text: - -The following example shows an anchor for a section, followed by the heading -for that section. ``SFD SN Keyboard Shortcuts`` is the anchor text. - -:: - - .. _SFD SN Keyboard Shortcuts: - - ****************************** - Keyboard Shortcuts for Notes - ****************************** - -To create cross-references to locations in the same document, you can use the -anchor only, or you can use your own text. The anchor text is never visible in -output. It is replaced by the text of the heading that follows the anchor or -the text that you specify. - -Cross-References Using the Anchor Only -******************************************** - -To add a cross-reference to a specific location in a document and use the text -of the heading for that location as link text, use ``:ref:`Anchor Text``` -syntax, as in the following example. - -:: - - For more information about using keyboard shortcuts, see :ref:`SFD SN - Keyboard Shortcuts`. - -In this example, "SFD SN Keyboard Shortcuts" is the anchor text for a section -that is titled "Keyboard Shortcuts for Notes". Readers will see the following -text, and "Keyboard Shortcuts for Notes" will be an active link. - -:: - - For more information about using keyboard shortcuts, see Keyboard Shortcuts - for Notes. - -Cross-References Using Specified Link Text -******************************************* - -For internal cross-references that use text other than the heading for the -section that you're linking to, use ``:ref:`specified text``` -syntax, as in the following example. - -:: - - If you want to, you can use :ref:`keyboard shortcuts` to create, edit, and view notes. - -.. note:: - Do not include a space between the last word of the link text and the opening - angle bracket for the anchor text. - -In this example, "keyboard shortcuts" is the link text, and "SFD SN Keyboard -Shortcuts" is the anchor text for a section that is titled "Keyboard Shortcuts -for Notes". Readers will see the following text, and "keyboard shortcuts" will -be an active link. - -:: - - If you want to, you can use keyboard shortcuts to create, edit, and view your - notes. - -========================================================== -Cross-References to Locations in Different edX Documents -========================================================== - -You can create cross-references between different edX documents. For example, -you can create a link in *Building and Running an edX Course* to a topic in the -*EdX Learner's Guide*. To do this, you use the intersphinx map ID of the -document that you want to link to and the anchor text for the section you want. -The cross-reference uses the following syntax. - -:: - - :ref:`intersphinx_map_ID:Anchor Name` - -For example: - -:: - - :ref:`partnercoursestaff:Release Dates` - -To find the intersphinx map ID for the document that you want, follow these -steps. - -#. Open the conf.py file in the `edx-documentation/shared`_ folder, and then - locate the following line. - - ``intersphinx_mapping = {`` - -#. In the list that follows this line, find the ID for the document that you - want. The text between the single quotation marks (') at the beginning of - each line is the intersphinx map ID for the document. - -The following intersphinx map IDs are the most frequently used. - -.. list-table:: - :widths: 25 25 50 - - * - Map ID - - Document - * - ``partnercoursestaff`` - - *Building and Running an edX Course* - * - ``opencoursestaff`` - - *Building and Running an Open edX Course* - * - ``learners`` - - *EdX Learner's Guide* - * - ``openlearners`` - - *Open edX Learner's Guide* - * - ``data`` - - *EdX Research Guide* - * - ``insights`` - - *Using edX Insights* - * - ``installation`` - - *Installing, Configuring, and Running the Open edX Platform* - * - ``opendevelopers`` - - *Open edX Developer's Guide* - * - ``partnerreleasenotes`` - - Partner release notes - * - ``openreleasenotes`` - - Open edX release notes - -============================================ -Cross-References to JIRA -============================================ - -For cross-references to JIRA tickets, use the ``:jira:`PROJECT-ticketnumber``` -syntax, as in the following example. - -:: - - For more information, see :jira:`DOC-2316`. - -Note that ``jira`` replaces ``ref`` for these links. - -Readers will see the following text, and "DOC-2316" will be an active link. - -``For more information, see DOC-2316.`` - -============================================ -Cross-References to External Web Pages -============================================ - -A cross-reference to an external web page has several elements. - -* The URL of the external web page. -* The text to use for the cross-reference. This text becomes an anchor in the - file that contains the cross-reference. -* An ``include`` directive in the file that contains the cross-reference to the - links.rst file that is located in the ``edx-documentation/en_us/links/`` - folder. -* An entry in the links.rst file. - -To create an external cross-reference, follow these steps. - -#. In the paragraph where you want the cross-reference, add the text that you - want to use for the link, formatted as follows (where "Release Pages" is the - link text). This creates an anchor out of that text. - - :: - - The edX engineering wiki `Release Pages`_ provide access to detailed - information about every change made to the edx-platform GitHub - repository. - -#. In the file that contains the cross-reference, add an ``include`` directive - for the ``edx-documentation/en_us/links/links.rst`` file if one does not - already exist. These ``include`` directives are typically at the end of the - file. - - :: - - .. include:: ../../links/links.rst - - .. note:: - - The path to the links.rst file depends on the location of the file where - you are creating the link. For example, the path might be - ``../../../links/links.rst`` or ``../links/links.rst``. - -#. In the ``edx-documentation/en_us/links/links.rst`` file, add an entry for - the anchor text and the URL of the external website, formatted as follows. - Make sure that the anchor text in this file matches the anchor text in the - file that contains the cross-reference exactly, including capitalization. - - :: - - .. _Release Pages: https://openedx.atlassian.net/wiki/display/ENG/Release+Pages - -Readers will see the following text. "Release Pages" will be an active link. - -:: - - The edX engineering wiki Release Pages provide access to detailed - information about every change made to the edx-platform GitHub - repository. - - -**************************** -Image References -**************************** - -Image references look like this. -:: - - .. image:: /Images/Course_Outline_LMS.png - :width: 100 - :alt: A screen capture showing the elements of the course outline in the LMS. - - -Image links can include optional specifications such as height, width, or -scale. Alternative text for screen readers is required for each image. Provide -text that is useful to someone who might not be able to see the image. - - -.. _Examples of Tables: - -************************************ -Tables -************************************ - -Each example in this section shows the raw formatting for the table followed -by the table as it would render (if you are viewing this file as part of the -Style Guide). - -====================================== -Example of a table with an empty cell -====================================== - -The empty cell is the second column in the first row of this table. -:: - - .. list-table:: - :widths: 25 25 50 - - * - Annotation Problem - - - - Annotation problems ask students to respond to questions about a - specific block of text. The question appears above the text when the - student hovers the mouse over the highlighted text so that students can - think about the question as they read. - * - Example Poll - - Conditional Module - - You can create a conditional module to control versions of content that - groups of students see. For example, students who answer "Yes" to a - poll question then see a different block of text from the students who - answer "No" to that question. - * - Example JavaScript Problem - - Custom JavaScript - - Custom JavaScript display and grading problems (also called *custom - JavaScript problems* or *JS input problems*) allow you to create a - custom problem or tool that uses JavaScript and then add the problem or - tool directly into Studio. - -.. list-table:: - :widths: 25 25 50 - - * - Annotation Problem - - - - Annotation problems ask students to respond to questions about a - specific block of text. The question appears above the text when the - student hovers the mouse over the highlighted text so that students can - think about the question as they read. - * - Example Poll - - Conditional Module - - You can create a conditional module to control versions of content that - groups of students see. For example, students who answer "Yes" to a - poll question then see a different block of text from the students who - answer "No" to that question. - * - Exampel JavaScript Problem - - Custom JavaScript - - Custom JavaScript display and grading problems (also called *custom - JavaScript problems* or *JS input problems*) allow you to create a - custom problem or tool that uses JavaScript and then add the problem or - tool directly into Studio. - -==================================== -Example of a table with a header row -==================================== - -:: - - .. list-table:: - :widths: 15 15 70 - :header-rows: 1 - - * - First Name - - Last Name - - Residence - * - Elizabeth - - Bennett - - Longbourne - * - Fitzwilliam - - Darcy - - Pemberley - - -.. list-table:: - :widths: 15 15 70 - :header-rows: 1 - - * - First Name - - Last Name - - Residence - * - Elizabeth - - Bennett - - Longbourne - * - Fitzwilliam - - Darcy - - Pemberley - - -=============================================== -Example of a table with a boldface first column -=============================================== - -:: - - .. list-table:: - :widths: 15 15 70 - :stub-columns: 1 - - * - First Name - - Elizabeth - - Fitzwilliam - * - Last Name - - Bennett - - Darcy - * - Residence - - Longboure - - Pemberley - - -.. list-table:: - :widths: 15 15 70 - :stub-columns: 1 - - * - First Name - - Elizabeth - - Fitzwilliam - * - Last Name - - Bennett - - Darcy - * - Residence - - Longboure - - Pemberley - -============================================================== -Example of a table with a cell that includes an unordered list -============================================================== - -The blank lines before and after the unordered list are critical for the list -to render correctly. - -:: - - .. list-table:: - :widths: 15 15 60 - :header-rows: 1 - - * - Field - - Type - - Details - * - ``correct_map`` - - dict - - For each problem ID value listed by ``answers``, provides: - - * ``correctness``: string; 'correct', 'incorrect' - * ``hint``: string; Gives optional hint. Nulls allowed. - * ``hintmode``: string; None, 'on_request', 'always'. Nulls allowed. - * ``msg``: string; Gives extra message response. - * ``npoints``: integer; Points awarded for this ``answer_id``. Nulls allowed. - * ``queuestate``: dict; None when not queued, else ``{key:'', time:''}`` - where ``key`` is a secret string dump of a DateTime object in the form - '%Y%m%d%H%M%S'. Nulls allowed. - - * - ``grade`` - - integer - - Current grade value. - * - ``max_grade`` - - integer - - Maximum possible grade value. - - -.. list-table:: - :widths: 15 15 60 - :header-rows: 1 - - * - Field - - Type - - Details - * - ``correct_map`` - - dict - - For each problem ID value listed by ``answers``, provides: - - * ``correctness``: string; 'correct', 'incorrect' - * ``hint``: string; Gives optional hint. Nulls allowed. - * ``hintmode``: string; None, 'on_request', 'always'. Nulls allowed. - * ``msg``: string; Gives extra message response. - * ``npoints``: integer; Points awarded for this ``answer_id``. Nulls allowed. - * ``queuestate``: dict; None when not queued, else ``{key:'', time:''}`` - where ``key`` is a secret string dump of a DateTime object in the form - '%Y%m%d%H%M%S'. Nulls allowed. - - * - ``grade`` - - integer - - Current grade value. - * - ``max_grade`` - - integer - - Maximum possible grade value. - - -***************** -Code Formatting -***************** - -=========== -Inline code -=========== - -In inline text, any text can be formatted as code (monospace font) by -enclosing the selection within a pair of double "grave accent" characters (`). -For example, ````these words```` are formatted in a monospace font when the -documentation is output as PDF or HTML. - -=========== -Code blocks -=========== - - -To set text in a code block, end the previous paragaph with 2 colons, leave -one line before the intended code block, and make sure the code block is -indented beyond the first colon. -:: - - For example, this is the introductory paragraph - :: - -

and this is the code block following.

- - -Alternatively, use the code-block tag. Optionally, indicate the type of code -after the 2 colons in the tag, which results in the tags within the code block -being displayed in different colors. -:: - - .. code-block:: xml - - - - - PLACEHOLDER: Text of annotation - PLACEHOLDER: Text of question - PLACEHOLDER: Type your response below: - PLACEHOLDER: In your response to this question, which tag below - do you choose? - - - - - - - - -

PLACEHOLDER: Detailed explanation of solution

-
-
- -.. include:: ../../links/links.rst -- 2.17.1 From 293689e7881046f5a8e1ca19c5d8a2cf50a19bdb Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Fri, 13 Jan 2023 17:36:22 +0100 Subject: [PATCH 18/18] Release 1.0.4 --- CHANGELOG.md | 2 +- ckan-plugin/CHANGELOG.md | 9 ++++---- ckan-plugin/README.md | 11 ++++------ ckan-plugin/pom.xml | 4 ++-- cms-plugin-framework/CHANGELOG.md | 8 +++---- cms-plugin-framework/README.md | 11 ++++++---- cms-plugin-framework/pom.xml | 4 ++-- cms-test-commons/CHANGELOG.md | 8 +++---- cms-test-commons/README.md | 11 +++++++--- cms-test-commons/pom.xml | 4 ++-- .../application/cms/tests/TokenSetter.java | 13 ++++++++++++ concessioni-lifecycle/CHANGELOG.md | 9 ++++---- concessioni-lifecycle/README.md | 16 +++++++++----- concessioni-lifecycle/pom.xml | 4 ++-- concessioni-model/CHANGELOG.md | 8 +++---- concessioni-model/README.md | 10 +++++---- concessioni-model/pom.xml | 4 ++-- dataminer-plugins/CHANGELOG.md | 8 +++---- dataminer-plugins/README.md | 10 ++++----- dataminer-plugins/pom.xml | 4 ++-- default-lc-managers/CHANGELOG.md | 8 +++---- default-lc-managers/README.md | 18 ++++++++++++---- default-lc-managers/pom.xml | 4 ++-- geoportal-client/CHANGELOG.md | 8 +++---- geoportal-client/README.md | 15 +++++++++---- geoportal-client/pom.xml | 13 ++---------- geoportal-common/CHANGELOG.md | 8 +++---- geoportal-common/README.md | 17 +++++++++++---- geoportal-common/pom.xml | 4 ++-- geoportal-service/CHANGELOG.md | 8 +++---- geoportal-service/README.md | 15 +++++++++---- geoportal-service/pom.xml | 4 ++-- images-plugin/CHANGELOG.md | 8 +++---- images-plugin/README.md | 6 ++++-- images-plugin/pom.xml | 4 ++-- notifications-plugins/CHANGELOG.md | 8 +++---- notifications-plugins/README.md | 9 +++++--- notifications-plugins/pom.xml | 4 ++-- pom.xml | 12 +++++------ sdi-plugins/CHANGELOG.md | 8 +++---- sdi-plugins/README.md | 21 ++++++++++++------- sdi-plugins/pom.xml | 4 ++-- use-cases/CHANGELOG.md | 10 ++++----- use-cases/README.md | 15 +++++++------ use-cases/pom.xml | 4 ++-- 45 files changed, 219 insertions(+), 174 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b686a3..6fa2606 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm # Changelog for org.gcube.spatial.data.gcube-sdi-suite -## [v1.0.4-SNAPSHOT] - 2023-01-10 +## [v1.0.4] - 2023-01-10 - Updated plugin framework ## [v1.0.3] - 2022-12-07 diff --git a/ckan-plugin/CHANGELOG.md b/ckan-plugin/CHANGELOG.md index e75d18f..93ef689 100644 --- a/ckan-plugin/CHANGELOG.md +++ b/ckan-plugin/CHANGELOG.md @@ -1,10 +1,6 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.cms.ckan-plugin -This library contains gcube-cms plugins for ckan materializations - -## [v1.0.2-SNAPSHOT] - 2023-01-10 +## [v1.0.2] - 2023-01-10 - Pom updates ## [v1.0.1] - 2022-12-07 @@ -12,3 +8,6 @@ This library contains gcube-cms plugins for ckan materializations ## [v1.0.0] - 2022-02-24 - First release + +- This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + diff --git a/ckan-plugin/README.md b/ckan-plugin/README.md index 85dd719..6a729d5 100644 --- a/ckan-plugin/README.md +++ b/ckan-plugin/README.md @@ -1,7 +1,7 @@ -gCube CMS Suite +gCube CMS Suite : CKAN Plugins -------------------------------------------------- - -gCube CMS Suite is a set of components designed to manage complex space-temporal Documents defined by metadata Profiles. + +This library is expected to contains gcube-cms plugins for ckan materializations. ## Built with * [gCube SmartGears] (https://gcube.wiki.gcube-system.org/gcube/SmartGears) - The gCube SmartGears framework @@ -11,15 +11,12 @@ gCube CMS Suite is a set of components designed to manage complex space-temporal * [Maven](https://maven.apache.org/) - Dependency Management ## Documentation - -Documentation can be found [here](https://gcube.wiki.gcube-system.org/gcube/GeoPortal_Service). +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. ## Change log - See [CHANGELOG.md](CHANGELOG.md). ## License - This project is licensed under the EUPL V.1.1 License - see the [LICENSE.md](LICENSE.md) file for details. ## About the gCube Framework diff --git a/ckan-plugin/pom.xml b/ckan-plugin/pom.xml index 266f60c..cbc6fd2 100644 --- a/ckan-plugin/pom.xml +++ b/ckan-plugin/pom.xml @@ -5,14 +5,14 @@ 4.0.0 ckan-plugins - 1.0.2-SNAPSHOT + 1.0.2 gCube CMS - CKAN Plugins org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/cms-plugin-framework/CHANGELOG.md b/cms-plugin-framework/CHANGELOG.md index 48fbb29..5a1a0ca 100644 --- a/cms-plugin-framework/CHANGELOG.md +++ b/cms-plugin-framework/CHANGELOG.md @@ -1,8 +1,6 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.cms-plugin-framework -## [v1.0.3-SNAPSHOT] - 2023-01-10 +## [v1.0.3] - 2023-01-10 - UserUtils in framework ## [v1.0.2] 2022-01-17 @@ -13,4 +11,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Serialization Features ## [v1.0.0] 2021-09-20 -- First release \ No newline at end of file +- First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/cms-plugin-framework/README.md b/cms-plugin-framework/README.md index 1fd3533..a43e113 100644 --- a/cms-plugin-framework/README.md +++ b/cms-plugin-framework/README.md @@ -1,8 +1,11 @@ CMS - Plugin Framework -------------------------------------------------- - -CMS Plugin Framework is a library containing the definition of Java interfaces that plugins should implement - + +This module contains the definition of interfaces that server plugins are expected to implement. +Basic and abstract implementations are provided in different module default-lc-manager. + +Basic providers (e.g. WSProvider, ISProvider) used both in test and by the service are implemented here for simplicity. + ## Built with * [gCube SDI] (https://gcube.wiki.gcube-system.org/gcube/) - The gCube SDI * [gCube SmartGears] (https://gcube.wiki.gcube-system.org/gcube/SmartGears) - The gCube SmartGears framework @@ -12,8 +15,8 @@ CMS Plugin Framework is a library containing the definition of Java interfaces t * [Maven](https://maven.apache.org/) - Dependency Management ## Documentation +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. -Documentation can be found [here](https://gcube.wiki.gcube-system.org/gcube/GeoPortal). ## Change log diff --git a/cms-plugin-framework/pom.xml b/cms-plugin-framework/pom.xml index b5130b9..f37172e 100644 --- a/cms-plugin-framework/pom.xml +++ b/cms-plugin-framework/pom.xml @@ -4,12 +4,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 cms-plugin-framework - 1.0.3-SNAPSHOT + 1.0.3 org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/cms-test-commons/CHANGELOG.md b/cms-test-commons/CHANGELOG.md index 9b07913..e9ddf04 100644 --- a/cms-test-commons/CHANGELOG.md +++ b/cms-test-commons/CHANGELOG.md @@ -1,8 +1,6 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.cms.cms-test-commons -## [v1.0.4-SNAPSHOT] - 2023-01-10 +## [v1.0.4] - 2023-01-10 - Pom updates ## [v1.0.3] - 2022-12-07 @@ -15,4 +13,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Introduced profiled documents ## [v1.0.0] - 2021-09-11 -- First release \ No newline at end of file +- First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/cms-test-commons/README.md b/cms-test-commons/README.md index 4838743..7e93b60 100644 --- a/cms-test-commons/README.md +++ b/cms-test-commons/README.md @@ -1,14 +1,19 @@ gCube CMS - test-commons -------------------------------------------------- - -Common logic used by test cases + +Common utilities for testing such as : + +- access to test-resources Maps +- Test Credentials management +- Basic plugin Test Case implementations + ## Built with * [Maven](https://maven.apache.org/) - Dependency Management ## Documentation +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. -Documentation can be found [here](https://gcube.wiki.gcube-system.org/gcube/GeoPortal). ## Change log diff --git a/cms-test-commons/pom.xml b/cms-test-commons/pom.xml index c5bba41..399397a 100644 --- a/cms-test-commons/pom.xml +++ b/cms-test-commons/pom.xml @@ -5,14 +5,14 @@ 4.0.0 cms-test-commons - 1.0.4-SNAPSHOT + 1.0.4 CMS Test Commons org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TokenSetter.java b/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TokenSetter.java index c025d48..c948401 100644 --- a/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TokenSetter.java +++ b/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TokenSetter.java @@ -16,6 +16,19 @@ import java.io.IOException; import java.nio.charset.Charset; import java.util.Properties; +/** + * This class is used in order to set gCube Credentials for tests that needs a gCube Infrastructure. + * + * The method TokenSetter.set(String context) is used in order to specify the context to test. + * + * The library expects a Properties file /tokens.properties in the classpath like the following example : + * + * /root/vo/vre1 = GCUBE-TOKEN + * ... + * /devRoot/vo = JWT-TOKEN + * ... + * + */ @Slf4j public class TokenSetter { diff --git a/concessioni-lifecycle/CHANGELOG.md b/concessioni-lifecycle/CHANGELOG.md index 9a95716..d31a592 100644 --- a/concessioni-lifecycle/CHANGELOG.md +++ b/concessioni-lifecycle/CHANGELOG.md @@ -1,11 +1,8 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.cms.concessioni-lifecycle -This library contains custom extensions for the support of GNA "concessioni" use case - -## [v1.0.3-SNAPSHOT] - 2023-01-10 +## [v1.0.3] - 2023-01-10 - Pom updates +- Fixes default access ## [v1.0.2] - 2022-12-07 - Pom updates @@ -16,3 +13,5 @@ This library contains custom extensions for the support of GNA "concessioni" use ## [v1.0.0] - 2021-12-15 - First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/concessioni-lifecycle/README.md b/concessioni-lifecycle/README.md index 85dd719..66eca9e 100644 --- a/concessioni-lifecycle/README.md +++ b/concessioni-lifecycle/README.md @@ -1,8 +1,14 @@ -gCube CMS Suite +gCube CMS Suite : Concessioni Lifecycle -------------------------------------------------- - -gCube CMS Suite is a set of components designed to manage complex space-temporal Documents defined by metadata Profiles. - + +This library contains custom extensions for the support of GNA "concessioni" use case custom requirements. +It contains a Lifecycle Manager built on top of default 3-PHASE, extending : + +- Default values setting / evaluation +- Indexing parameters : + - Relationship management : relationship chains on "follows" and "precedes" are evaluated in order to show only last published project in centroids map + + ## Built with * [gCube SmartGears] (https://gcube.wiki.gcube-system.org/gcube/SmartGears) - The gCube SmartGears framework * [OpenJDK](https://openjdk.java.net/) - The JDK used @@ -11,8 +17,8 @@ gCube CMS Suite is a set of components designed to manage complex space-temporal * [Maven](https://maven.apache.org/) - Dependency Management ## Documentation +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. -Documentation can be found [here](https://gcube.wiki.gcube-system.org/gcube/GeoPortal_Service). ## Change log diff --git a/concessioni-lifecycle/pom.xml b/concessioni-lifecycle/pom.xml index ddee981..f9595df 100644 --- a/concessioni-lifecycle/pom.xml +++ b/concessioni-lifecycle/pom.xml @@ -4,14 +4,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 concessioni-lifecycle - 1.0.3-SNAPSHOT + 1.0.3 GNA Concessioni Lifecycle org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/concessioni-model/CHANGELOG.md b/concessioni-model/CHANGELOG.md index 22ba985..c8d4329 100644 --- a/concessioni-model/CHANGELOG.md +++ b/concessioni-model/CHANGELOG.md @@ -1,10 +1,6 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.cms.concessioni-model -This library contains custom BEANS for the support of GNA "concessioni" use case - -## [v1.0.3-SNAPSHOT] - 2023-01-10 +## [v1.0.3] - 2023-01-10 - Pom updates ## [v1.0.2] - 2022-12-07 @@ -16,3 +12,5 @@ This library contains custom BEANS for the support of GNA "concessioni" use case ## [v1.0.0] - 2021-12-15 - First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/concessioni-model/README.md b/concessioni-model/README.md index 85dd719..7ab09e5 100644 --- a/concessioni-model/README.md +++ b/concessioni-model/README.md @@ -1,7 +1,9 @@ -gCube CMS Suite +gCube CMS Suite : Concessioni Model -------------------------------------------------- - -gCube CMS Suite is a set of components designed to manage complex space-temporal Documents defined by metadata Profiles. + +This library contains custom class for GNA "concessioni" use case model. + +It contains the class ProfiledConcessione extending Project, in order to facilitate custom logic integration. ## Built with * [gCube SmartGears] (https://gcube.wiki.gcube-system.org/gcube/SmartGears) - The gCube SmartGears framework @@ -11,8 +13,8 @@ gCube CMS Suite is a set of components designed to manage complex space-temporal * [Maven](https://maven.apache.org/) - Dependency Management ## Documentation +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. -Documentation can be found [here](https://gcube.wiki.gcube-system.org/gcube/GeoPortal_Service). ## Change log diff --git a/concessioni-model/pom.xml b/concessioni-model/pom.xml index 60d5217..b8a803e 100644 --- a/concessioni-model/pom.xml +++ b/concessioni-model/pom.xml @@ -6,14 +6,14 @@ org.gcube.application.cms concessioni-model - 1.0.3-SNAPSHOT + 1.0.3 GNA Concessioni Model org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/dataminer-plugins/CHANGELOG.md b/dataminer-plugins/CHANGELOG.md index f80220f..56be04f 100644 --- a/dataminer-plugins/CHANGELOG.md +++ b/dataminer-plugins/CHANGELOG.md @@ -1,10 +1,6 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.cms.dataminer-plugins -This library contains gcube-cms plugins for processing via gCube Dataminer - -## [v1.0.2-SNAPSHOT] - 2023-01-10 +## [v1.0.2] - 2023-01-10 - Pom updates ## [v1.0.1] - 2022-12-07 @@ -12,3 +8,5 @@ This library contains gcube-cms plugins for processing via gCube Dataminer ## [v1.0.0] - 2022-02-24 - First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/dataminer-plugins/README.md b/dataminer-plugins/README.md index 85dd719..1bd34e1 100644 --- a/dataminer-plugins/README.md +++ b/dataminer-plugins/README.md @@ -1,8 +1,8 @@ -gCube CMS Suite +gCube CMS Suite : DataMiner Plugins -------------------------------------------------- - -gCube CMS Suite is a set of components designed to manage complex space-temporal Documents defined by metadata Profiles. - + +This library contains gcube-cms plugins for processing via gCube Dataminer + ## Built with * [gCube SmartGears] (https://gcube.wiki.gcube-system.org/gcube/SmartGears) - The gCube SmartGears framework * [OpenJDK](https://openjdk.java.net/) - The JDK used @@ -11,8 +11,8 @@ gCube CMS Suite is a set of components designed to manage complex space-temporal * [Maven](https://maven.apache.org/) - Dependency Management ## Documentation +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. -Documentation can be found [here](https://gcube.wiki.gcube-system.org/gcube/GeoPortal_Service). ## Change log diff --git a/dataminer-plugins/pom.xml b/dataminer-plugins/pom.xml index 99a270e..f7f82e8 100644 --- a/dataminer-plugins/pom.xml +++ b/dataminer-plugins/pom.xml @@ -5,14 +5,14 @@ 4.0.0 dataminer-plugins - 1.0.2-SNAPSHOT + 1.0.2 gCube CMS - Dataminer Plugins org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/default-lc-managers/CHANGELOG.md b/default-lc-managers/CHANGELOG.md index acc13d8..7c9afa5 100644 --- a/default-lc-managers/CHANGELOG.md +++ b/default-lc-managers/CHANGELOG.md @@ -1,11 +1,9 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.cms.ckan-plugin -This library contains default Lifecycle Managers handlers - -## [v1.0.1-SNAPSHOT] - 2023-01-10 +## [v1.0.1] - 2023-01-10 - Pom updates - ## [v1.0.0] - 2022-02-24 - First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/default-lc-managers/README.md b/default-lc-managers/README.md index 7180741..6a76d6a 100644 --- a/default-lc-managers/README.md +++ b/default-lc-managers/README.md @@ -1,9 +1,19 @@ gCube CMS Suite : default-lc-managers -------------------------------------------------- - -gCube CMS Suite is a set of components designed to manage complex space-temporal Documents called Projects defined in Use Case Descriptors. -This library contains the default Lifecycle Manager handler plugins. +This library contains default Lifecycle Managers handlers implementations : + +- AbstractPlugin +- AbstractLifecycleManager +- Default3PhaseManager +- SimpleLifeCycleManager + +It also contains utility like + +- RoleManager : caller role evaluation utilities +- GuardedEventManager, GuardedStepExecution, GuardedExecution : simplicity class for safe implementations + +Plugins SHOULD be defined extending the definitions provided in this module. ## Built with * [gCube SmartGears] (https://gcube.wiki.gcube-system.org/gcube/SmartGears) - The gCube SmartGears framework @@ -13,8 +23,8 @@ This library contains the default Lifecycle Manager handler plugins. * [Maven](https://maven.apache.org/) - Dependency Management ## Documentation +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. -Documentation can be found [here](https://gcube.wiki.gcube-system.org/gcube/GeoPortal_Service). ## Change log diff --git a/default-lc-managers/pom.xml b/default-lc-managers/pom.xml index 4e7c601..3d3ac25 100644 --- a/default-lc-managers/pom.xml +++ b/default-lc-managers/pom.xml @@ -5,14 +5,14 @@ 4.0.0 default-lc-managers - 1.0.1-SNAPSHOT + 1.0.1 gCube CMS - Default LC Managers org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/geoportal-client/CHANGELOG.md b/geoportal-client/CHANGELOG.md index 18402ab..66630e5 100644 --- a/geoportal-client/CHANGELOG.md +++ b/geoportal-client/CHANGELOG.md @@ -1,8 +1,6 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.geoportal-client -## [v1.1.2-SNAPSHOT] - 2023-01-10 +## [v1.1.2] - 2023-01-10 - Pom updates ## [v1.1.1] - 2022-12-07 @@ -42,4 +40,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm -Excluded common-calls 1.2.0 ## [v1.0.0] - 2020-11-11 -- First release \ No newline at end of file +- First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/geoportal-client/README.md b/geoportal-client/README.md index b80f923..4d23202 100644 --- a/geoportal-client/README.md +++ b/geoportal-client/README.md @@ -1,14 +1,21 @@ -GeoPortal - Client +gCube CMS Suite : GeoPortal Client -------------------------------------------------- - -GeoPortal - Client is the java library wrapping Geoportal REST Service + +This module contains the definition of the client library for interacting with geoportal-service. + +It is built on top of gCube FW stack and allows to build the following clients : +- Project entities management +- UseCaseDescriptor entites management + +It also provides a utility class Serialization for fast marshalling / unmarshalling. + ## Built with * [Maven](https://maven.apache.org/) - Dependency Management ## Documentation +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. -Documentation can be found [here](https://gcube.wiki.gcube-system.org/gcube/GeoPortal). ## Change log diff --git a/geoportal-client/pom.xml b/geoportal-client/pom.xml index 13bac29..0e92db2 100644 --- a/geoportal-client/pom.xml +++ b/geoportal-client/pom.xml @@ -4,14 +4,14 @@ 4.0.0 org.gcube.application geoportal-client - 1.1.2-SNAPSHOT + 1.1.2 Geoportal Client org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 @@ -46,15 +46,6 @@ common-generic-clients - - - - - - - - - diff --git a/geoportal-common/CHANGELOG.md b/geoportal-common/CHANGELOG.md index 6ce5fab..18e4b71 100644 --- a/geoportal-common/CHANGELOG.md +++ b/geoportal-common/CHANGELOG.md @@ -1,8 +1,6 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.geoportal-common -## [v1.0.11-SNAPSHOT] - 2023-01-10 +## [v1.0.11] - 2023-01-10 - Pom updates ## [v1.0.10] - 2022-12-07 @@ -53,4 +51,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Model update ## [v1.0.0] - 2020-11-11 -- First release \ No newline at end of file +- First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/geoportal-common/README.md b/geoportal-common/README.md index 95025f7..63edc56 100644 --- a/geoportal-common/README.md +++ b/geoportal-common/README.md @@ -1,14 +1,23 @@ -GeoPortal - Common +gCube CMS Suite : GeoPortal Common -------------------------------------------------- - -GeoPortal - Common is the java library containing basic classes (e.g. models) of gCube GeoPortal. + +This module contains the definition of the interface expose by geoportal-service. + +It contains both the methods, the constants, the model shared by service and clients (main classes are Project and UseCaseDescriptor). + +It also provides the following utility classes : + +- JSONPathWrapper : for JSON path parsing, built on top of com.jayway.jsonpath.json-path (https://github.com/json-path/JsonPath). +- FileSets : builder for FileSetRegistrationRequests +- StorageUtils : interface with gCube Storage +- ISUtils : Query to gCube IS ## Built with * [Maven](https://maven.apache.org/) - Dependency Management ## Documentation +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. -Documentation can be found [here](https://gcube.wiki.gcube-system.org/gcube/GeoPortal). ## Change log diff --git a/geoportal-common/pom.xml b/geoportal-common/pom.xml index 33c1a50..0f18ed2 100644 --- a/geoportal-common/pom.xml +++ b/geoportal-common/pom.xml @@ -3,14 +3,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 geoportal-common - 1.0.11-SNAPSHOT + 1.0.11 Geoportal Common org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/geoportal-service/CHANGELOG.md b/geoportal-service/CHANGELOG.md index 6bbc54c..2be7162 100644 --- a/geoportal-service/CHANGELOG.md +++ b/geoportal-service/CHANGELOG.md @@ -1,8 +1,6 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.geoportal-service -## [v1.0.12-SNAPSHOT] - 2023-01-10 +## [v1.0.12] - 2023-01-10 - Refactored UserUtils into framework plugin ## [v1.0.11] - 2022-12-07 @@ -55,4 +53,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Project interface ## [v1.0.0] 2020-11-11 -- First release \ No newline at end of file +- First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/geoportal-service/README.md b/geoportal-service/README.md index d20b2c8..d9fd81b 100644 --- a/geoportal-service/README.md +++ b/geoportal-service/README.md @@ -1,7 +1,14 @@ -GeoPortal - Service +gCube CMS Suite : GeoPortal Service -------------------------------------------------- - -GeoPortal - Service is the main component operating a gCube GeoPortal. It is a SmartGears web application based on top of gCube SDI + +gCube CMS Service is a gCube REST-like Application developed on top of gCube SmartGears. + +It implements the core business logic of gCube CMS Suite, exposing methods for the management of Projects, Use Case Descriptors and available server plugins. + +It is built on top of Jersey Framework, it uses a MongoDB Document Store for JSON archiving and Querying. +It exploits the infrastructure StorageHub for archiving FileSets and the Information System in order to discover available resources. + +Its main goal is to receive client calls and orchestrate plugins implementation in order to serve them according to the UCD defined in the caller context. ## Built with * [gCube SDI] (https://gcube.wiki.gcube-system.org/gcube/) - The gCube SDI @@ -12,8 +19,8 @@ GeoPortal - Service is the main component operating a gCube GeoPortal. It is a S * [Maven](https://maven.apache.org/) - Dependency Management ## Documentation +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. -Documentation can be found [here](https://gcube.wiki.gcube-system.org/gcube/GeoPortal). ## Change log diff --git a/geoportal-service/pom.xml b/geoportal-service/pom.xml index 32f6852..82c7ac5 100644 --- a/geoportal-service/pom.xml +++ b/geoportal-service/pom.xml @@ -4,14 +4,14 @@ 4.0.0 org.gcube.application geoportal-service - 1.0.12-SNAPSHOT + 1.0.12 Geoportal Service war org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/images-plugin/CHANGELOG.md b/images-plugin/CHANGELOG.md index c2c8a3a..d199889 100644 --- a/images-plugin/CHANGELOG.md +++ b/images-plugin/CHANGELOG.md @@ -1,10 +1,6 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.cms.images-plugin -This library contains gcube-cms plugins for images materializations - -## [v1.0.2-SNAPSHOT] - 2023-01-10 +## [v1.0.2] - 2023-01-10 - Pom updates ## [v1.0.1] - 2022-12-07 @@ -12,3 +8,5 @@ This library contains gcube-cms plugins for images materializations ## [v1.0.0] - 2022-02-24 - First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/images-plugin/README.md b/images-plugin/README.md index 85dd719..cf7f63a 100644 --- a/images-plugin/README.md +++ b/images-plugin/README.md @@ -1,7 +1,9 @@ -gCube CMS Suite +gCube CMS Suite : Images Plugin -------------------------------------------------- gCube CMS Suite is a set of components designed to manage complex space-temporal Documents defined by metadata Profiles. + +This module is expected to define handlers for the materializations of images preview. ## Built with * [gCube SmartGears] (https://gcube.wiki.gcube-system.org/gcube/SmartGears) - The gCube SmartGears framework @@ -11,8 +13,8 @@ gCube CMS Suite is a set of components designed to manage complex space-temporal * [Maven](https://maven.apache.org/) - Dependency Management ## Documentation +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. -Documentation can be found [here](https://gcube.wiki.gcube-system.org/gcube/GeoPortal_Service). ## Change log diff --git a/images-plugin/pom.xml b/images-plugin/pom.xml index b772af5..9e13178 100644 --- a/images-plugin/pom.xml +++ b/images-plugin/pom.xml @@ -5,14 +5,14 @@ 4.0.0 images-plugins - 1.0.2-SNAPSHOT + 1.0.2 gCube CMS - Images Plugins org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/notifications-plugins/CHANGELOG.md b/notifications-plugins/CHANGELOG.md index 620aaae..e151a7a 100644 --- a/notifications-plugins/CHANGELOG.md +++ b/notifications-plugins/CHANGELOG.md @@ -1,10 +1,6 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.cms.notifications-plugins -This library contains gcube-cms plugins for notitfications events - -## [v1.0.2-SNAPSHOT] - 2023-01-10 +## [v1.0.2] - 2023-01-10 - Pom updates ## [v1.0.1] - 2022-12-07 @@ -12,3 +8,5 @@ This library contains gcube-cms plugins for notitfications events ## [v1.0.0] - 2022-02-24 - First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/notifications-plugins/README.md b/notifications-plugins/README.md index 85dd719..6768c33 100644 --- a/notifications-plugins/README.md +++ b/notifications-plugins/README.md @@ -1,8 +1,11 @@ -gCube CMS Suite +gCube CMS Suite : Notifications Plugin -------------------------------------------------- gCube CMS Suite is a set of components designed to manage complex space-temporal Documents defined by metadata Profiles. - + +This module is expected to contain plugin definitions for the generations of notifications upon certain Lifecycle events. + + ## Built with * [gCube SmartGears] (https://gcube.wiki.gcube-system.org/gcube/SmartGears) - The gCube SmartGears framework * [OpenJDK](https://openjdk.java.net/) - The JDK used @@ -11,8 +14,8 @@ gCube CMS Suite is a set of components designed to manage complex space-temporal * [Maven](https://maven.apache.org/) - Dependency Management ## Documentation +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. -Documentation can be found [here](https://gcube.wiki.gcube-system.org/gcube/GeoPortal_Service). ## Change log diff --git a/notifications-plugins/pom.xml b/notifications-plugins/pom.xml index 91e1c98..108061c 100644 --- a/notifications-plugins/pom.xml +++ b/notifications-plugins/pom.xml @@ -5,14 +5,14 @@ 4.0.0 notifications-plugins - 1.0.2-SNAPSHOT + 1.0.2 gCube CMS - Notifications Plugins org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/pom.xml b/pom.xml index 2aece86..c3f4017 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ org.gcube.application.cms gcube-cms-suite pom - 1.0.4-SNAPSHOT + 1.0.4 Gcube CMS Suite gCube CMS Suite is a set of components designed to manage complex space-temporal Documents defined by metadata Profiles. @@ -28,13 +28,13 @@ [1.0.0,2.0.0-SNAPSHOT) - 2.1.0-SNAPSHOT - 2.2.0-SNAPSHOT - 3.7.0-SNAPSHOT - [2.0.0-SNAPSHOT,3.0.0-SNAPSHOT) + + + + - 1.0.3-SNAPSHOT + 1.0.3 diff --git a/sdi-plugins/CHANGELOG.md b/sdi-plugins/CHANGELOG.md index acee1f6..a3c4abc 100644 --- a/sdi-plugins/CHANGELOG.md +++ b/sdi-plugins/CHANGELOG.md @@ -1,10 +1,6 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.cms.sdi-plugins -This library contains gcube-cms plugins for indexing and materializations in gCube SDI - -## [v1.0.2-SNAPSHOT] - 2023-01-10 +## [v1.0.2] - 2023-01-10 - Pom updates ## [v1.0.1] - 2022-12-07 @@ -13,3 +9,5 @@ This library contains gcube-cms plugins for indexing and materializations in gCu ## [v1.0.0] - 2022-02-24 - First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/sdi-plugins/README.md b/sdi-plugins/README.md index e88b451..e5c4854 100644 --- a/sdi-plugins/README.md +++ b/sdi-plugins/README.md @@ -1,15 +1,22 @@ gCube CMS Suite : SDI Plugins -------------------------------------------------- - -[gCube CMS Suite](../) module containing references, documentation, guides ad utilities. +This module contains definition of the following plugins : +- SDIIndexerPlugin : indexes Projects in centroid layers in gCube SDI (requires PostGIS DB) +- SDIMaterializerPlugin : materializes layers in gCube SDI (currenlty supported TIF and SHP) + +It uses the SDI in the context of the caller, and requires : +- GeoServer +- Postgis DB registered in Geoserver (indexing only) + + +## Built with +* [gCube SDI] (https://gcube.wiki.gcube-system.org/gcube/) - The gCube SDI +* [OpenJDK](https://openjdk.java.net/) - The JDK used +* [Maven](https://maven.apache.org/) - Dependency Management ## Documentation -* [Dedicated Wiki](https://sublime-and-sphinx-guide.readthedocs.io) - TBD Powered by [Sphynx](https://www.sphinx-doc.org/en/master/) -* [Service Interactive API]() -TBD Powered by [Enunciate](http://enunciate.webcohesion.com/) -* [Gcube System Wiki](https://gcube.wiki.gcube-system.org/gcube/GeoPortal). -* [Guide Notebooks](../use-cases) - Powered by [Jupyter](https://jupyter.org/) -* [Service Wiki src](../use-cases/src/site/suite.rst) +[gCube CMS Suite](../) parent module containing references, documentation, guides ad utilities. ## Change log diff --git a/sdi-plugins/pom.xml b/sdi-plugins/pom.xml index 4073801..e95a416 100644 --- a/sdi-plugins/pom.xml +++ b/sdi-plugins/pom.xml @@ -5,14 +5,14 @@ 4.0.0 sdi-plugins - 1.0.2-SNAPSHOT + 1.0.2 gCube CMS - SDI Plugins org.gcube.application.cms gcube-cms-suite - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/use-cases/CHANGELOG.md b/use-cases/CHANGELOG.md index 6f75013..0125e99 100644 --- a/use-cases/CHANGELOG.md +++ b/use-cases/CHANGELOG.md @@ -1,10 +1,6 @@ -This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - # Changelog for org.gcube.application.cms.use-cases - - -## [v1.0.4-SNAPSHOT] - 2023-01-10 +## [v1.0.4] - 2023-01-10 - Pom updates ## [v1.0.3] - 2022-12-07 @@ -17,4 +13,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Updated parent ## [v1.0.0] - 2021-09-20 -- First release, extracted from client \ No newline at end of file +- First release, extracted from client + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). \ No newline at end of file diff --git a/use-cases/README.md b/use-cases/README.md index 4a2b307..9fc052e 100644 --- a/use-cases/README.md +++ b/use-cases/README.md @@ -1,19 +1,18 @@ gCube CMS Suite : Use cases -------------------------------------------------- -[gCube CMS Suite](../README.md) module containing references, documentation, guides ad utilities. +This module contains utilities for the management of gCube CMS Suite instances, such as : +- Environment Checks +- Import / Export facilities +- WS Report features +- Stress test +- Collection removal ## Documentation -* [Dedicated Wiki](https://sublime-and-sphinx-guide.readthedocs.io) - TBD Powered by [Sphynx] (https://www.sphinx-doc.org/en/master/) -* [Service Interactive API]() -TBD Powered by [Enunciate] (http://enunciate.webcohesion.com/) -* [Gcube System Wiki] - (https://gcube.wiki.gcube-system.org/gcube/GeoPortal). -* [Guide Notebooks](use-cases) - Powered by [Jupyter] (https://jupyter.org/) -* [Service Wiki src] (use-cases/src/site/suite.rst) - +[gCube CMS Suite](../README.md) module containing references, documentation, guides ad utilities. ## Change log - See [CHANGELOG.md](CHANGELOG.md). ## License diff --git a/use-cases/pom.xml b/use-cases/pom.xml index 0d5e6c8..b45c84c 100644 --- a/use-cases/pom.xml +++ b/use-cases/pom.xml @@ -4,12 +4,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 use-cases - 1.0.4-SNAPSHOT + 1.0.4 CMS Use cases gcube-cms-suite org.gcube.application.cms - 1.0.4-SNAPSHOT + 1.0.4 -- 2.17.1