From 5fc9085516792ae734eb667203d19aaa4bf399da Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Tue, 12 Nov 2024 14:28:45 +0100 Subject: [PATCH] implemented as a multi-module with single version --- .classpath | 17 + .gitignore | 1 + .project | 17 + .settings/org.eclipse.core.resources.prefs | 2 + .settings/org.eclipse.jdt.core.prefs | 7 + .settings/org.eclipse.wst.common.component | 11 + ....eclipse.wst.common.project.facet.core.xml | 5 + CHANGELOG.md | 46 + D4S_Export_PDF/DEV/devVRE/pdf_footer.png | Bin 0 -> 68992 bytes D4S_Export_PDF/DEV/devVRE/pdf_header.png | Bin 0 -> 25195 bytes D4S_Export_PDF/PRE/preVRE/pdf_footer.png | Bin 0 -> 68992 bytes D4S_Export_PDF/PRE/preVRE/pdf_header.png | Bin 0 -> 25195 bytes D4S_Export_PDF/PROD/GNA/pdf_footer.png | Bin 0 -> 68992 bytes D4S_Export_PDF/PROD/GNA/pdf_header.png | Bin 0 -> 25195 bytes D4S_UCDs/DEV/devVRE/Concessioni.json | 941 ++++++++++ D4S_UCDs/DEV/devVRE/Concessioni_estere.json | 669 +++++++ D4S_UCDs/DEV/devVRE/Esquilino.json | 511 ++++++ D4S_UCDs/DEV/devVRE/Test_BaseModel.json | 333 ++++ .../d4gna_to_catalogue.ftl | 356 ++++ .../Notifications_Messages.properties | 23 + .../Notifications_Messages_ita.properties | 23 + D4S_UCDs/Esquiline/Esquilino.json | 459 +++++ D4S_UCDs/PRE/preVRE/Concessioni.json | 815 ++++++++ D4S_UCDs/PRE/preVRE/Concessioni_estere.json | 735 ++++++++ D4S_UCDs/PRE/preVRE/Esquilino.json | 539 ++++++ D4S_UCDs/PROD/Esquiline/Esquilino.json | 459 +++++ .../Esquiline/Esquilino_with_unpublish.json | 539 ++++++ D4S_UCDs/PROD/GNA/Concessioni.json | 815 ++++++++ D4S_UCDs/PROD/GNA/Concessioni_back.json | 702 +++++++ D4S_UCDs/PROD/GNA/Concessioni_estere.json | 735 ++++++++ .../GNA/backup/Concessioni_back_01-2024.json | 782 ++++++++ .../Concessioni_estere_back_01-2024.json | 669 +++++++ FUNDING.md | 26 + LICENSE.md | 312 ++++ README.md | 108 ++ cms-plugin-framework/.classpath | 28 + cms-plugin-framework/.gitignore | 2 + cms-plugin-framework/.project | 36 + cms-plugin-framework/CHANGELOG.md | 34 + cms-plugin-framework/FUNDING.md | 26 + cms-plugin-framework/LICENSE.md | 312 ++++ cms-plugin-framework/README.md | 59 + cms-plugin-framework/pom.xml | 114 ++ .../src/main/java/META-INF/MANIFEST.MF | 3 + .../cms/caches/AbstractScopedMap.java | 44 + .../gcube/application/cms/caches/Cache.java | 8 + .../gcube/application/cms/caches/Engine.java | 12 + .../application/cms/caches/ObjectManager.java | 8 + .../application/cms/caches/TTLObject.java | 17 + .../application/cms/caches/TimedMap.java | 56 + .../implementations/DefaultISProvider.java | 61 + .../cms/implementations/ISInterface.java | 21 + .../ImplementationProvider.java | 102 ++ .../cms/implementations/ProjectAccess.java | 23 + .../implementations/StorageHubProvider.java | 20 + .../cms/implementations/WSInterface.java | 4 + .../cms/implementations/WorkspaceManager.java | 187 ++ .../faults/DataParsingException.java | 30 + .../faults/DeletionException.java | 23 + .../faults/InvalidLockException.java | 22 + .../faults/InvalidStateException.java | 38 + .../faults/InvalidUserRoleException.java | 23 + .../faults/ProjectLockedException.java | 22 + .../faults/ProjectNotFoundException.java | 22 + .../faults/RegistrationException.java | 23 + .../faults/UnauthorizedAccess.java | 23 + .../cms/implementations/utils/UserUtils.java | 106 ++ .../plugins/EventListenerPluginInterface.java | 10 + .../cms/plugins/IndexerPluginInterface.java | 19 + .../cms/plugins/InitializablePlugin.java | 28 + .../cms/plugins/LifecycleManager.java | 28 + .../cms/plugins/MaterializationPlugin.java | 14 + .../gcube/application/cms/plugins/Plugin.java | 8 + .../cms/plugins/PluginManagerInterface.java | 11 + .../cms/plugins/PluginsReflections.java | 47 + .../cms/plugins/events/EventListener.java | 7 + .../cms/plugins/events/EventManager.java | 132 ++ .../plugins/events/EventManagerInterface.java | 13 + .../cms/plugins/events/ItemObservable.java | 9 + .../cms/plugins/events/ItemObserved.java | 110 ++ .../cms/plugins/faults/EventException.java | 23 + .../cms/plugins/faults/IndexingException.java | 22 + .../faults/InitializationException.java | 23 + .../faults/InsufficientPrivileges.java | 22 + .../faults/InvalidPluginRequestException.java | 22 + .../faults/InvalidProfileException.java | 22 + .../faults/MaterializationException.java | 23 + .../faults/PluginExecutionException.java | 22 + .../cms/plugins/faults/ShutDownException.java | 23 + .../cms/plugins/faults/StepException.java | 23 + .../faults/UnrecognizedEventException.java | 22 + .../faults/UnrecognizedStepException.java | 22 + .../cms/plugins/model/ComparableVersion.java | 843 +++++++++ .../reports/DocumentHandlingReport.java | 93 + .../plugins/reports/EventExecutionReport.java | 35 + .../plugins/reports/IndexDocumentReport.java | 28 + .../plugins/reports/InitializationReport.java | 11 + .../reports/MaterializationReport.java | 14 + .../cms/plugins/reports/Report.java | 43 + .../plugins/reports/StepExecutionReport.java | 57 + .../requests/BaseExecutionRequest.java | 32 + .../cms/plugins/requests/BaseRequest.java | 59 + .../requests/EventExecutionRequest.java | 33 + .../requests/IndexDocumentRequest.java | 16 + .../requests/MaterializationRequest.java | 16 + .../requests/StepExecutionRequest.java | 26 + .../cms/serialization/JacksonProvider.java | 40 + .../cms/serialization/Serialization.java | 194 ++ .../GeoportalServiceAccount.java | 121 ++ .../serviceaccount/IAMClientCredentials.java | 90 + .../IAMClientCredentialsReader.java | 80 + default-lc-managers/.classpath | 28 + default-lc-managers/.gitignore | 2 + default-lc-managers/.project | 36 + default-lc-managers/CHANGELOG.md | 32 + default-lc-managers/FUNDING.md | 26 + default-lc-managers/LICENSE.md | 312 ++++ default-lc-managers/README.md | 73 + default-lc-managers/pom.xml | 71 + .../AbstractLifeCycleManager.java | 266 +++ .../implementations/AbstractPlugin.java | 30 + .../implementations/Default3PhaseManager.java | 242 +++ .../implementations/IndexConstants.java | 16 + .../plugins/implementations/RoleManager.java | 71 + .../SimpleLifeCycleManager.java | 364 ++++ .../executions/GuardedEventManager.java | 17 + .../executions/GuardedExecution.java | 69 + .../executions/GuardedStepExecution.java | 28 + .../cms/plugins/SimpleLifecycleTests.java | 50 + geoportal-common/.classpath | 34 + geoportal-common/.gitignore | 2 + geoportal-common/.project | 36 + geoportal-common/CHANGELOG.md | 76 + geoportal-common/FUNDING.md | 26 + geoportal-common/LICENSE.md | 312 ++++ geoportal-common/README.md | 59 + geoportal-common/pom.xml | 93 + .../common/JSONSerializationProvider.java | 7 + .../faults/InvalidRequestException.java | 22 + .../common/faults/PathException.java | 23 + .../common/faults/StorageException.java | 22 + .../common/model/JSONPathWrapper.java | 239 +++ .../common/model/configuration/Archive.java | 23 + .../model/configuration/Configuration.java | 77 + .../common/model/configuration/Index.java | 29 + .../model/configuration/MongoConnection.java | 27 + .../geoportal/common/model/document/Lock.java | 31 + .../common/model/document/Project.java | 113 ++ .../common/model/document/access/Access.java | 26 + .../model/document/access/AccessPolicy.java | 7 + .../document/accounting/AccountingInfo.java | 30 + .../model/document/accounting/Context.java | 24 + .../document/accounting/PublicationInfo.java | 31 + .../model/document/accounting/User.java | 42 + .../document/filesets/Materialization.java | 22 + .../document/filesets/RegisteredFile.java | 23 + .../document/filesets/RegisteredFileSet.java | 36 + .../document/filesets/sdi/GCubeSDILayer.java | 143 ++ .../filesets/sdi/GeoServerPlatform.java | 29 + .../document/filesets/sdi/PlatformInfo.java | 23 + .../CentroidRecordReference.java | 7 + .../IdentificationReference.java | 24 + .../identification/SpatialReference.java | 25 + .../identification/TemporalReference.java | 9 + .../lifecycle/LifecycleInformation.java | 84 + .../document/lifecycle/TriggeredEvents.java | 33 + .../document/relationships/Relationship.java | 29 + .../RelationshipNavigationObject.java | 31 + .../model/legacy/AbstractRelazione.java | 17 + .../common/model/legacy/AccessPolicy.java | 7 + .../model/legacy/AssociatedContent.java | 128 ++ .../geoportal/common/model/legacy/BBOX.java | 36 + .../common/model/legacy/Concessione.java | 520 ++++++ .../common/model/legacy/GeoServerContent.java | 28 + .../model/legacy/InputStreamDescriptor.java | 21 + .../common/model/legacy/LayerConcessione.java | 152 ++ .../common/model/legacy/OtherContent.java | 15 + .../common/model/legacy/PersistedContent.java | 36 + .../geoportal/common/model/legacy/Record.java | 74 + .../common/model/legacy/RecordType.java | 6 + .../common/model/legacy/RelazioneScavo.java | 60 + .../model/legacy/SDILayerDescriptor.java | 25 + .../common/model/legacy/UploadedImage.java | 73 + .../common/model/legacy/WorkspaceContent.java | 19 + .../common/model/legacy/report/Check.java | 56 + .../common/model/legacy/report/Checks.java | 7 + .../model/legacy/report/ConstraintCheck.java | 106 ++ .../model/legacy/report/DeletionReport.java | 5 + .../legacy/report/PublicationReport.java | 29 + .../model/legacy/report/ValidationReport.java | 80 + .../plugins/IndexerPluginDescriptor.java | 8 + .../plugins/LifecycleManagerDescriptor.java | 28 + .../plugins/MaterializerPluginDescriptor.java | 7 + .../model/plugins/OperationDescriptor.java | 35 + .../model/plugins/PluginDescriptor.java | 27 + .../rest/AddSectionToConcessioneRequest.java | 31 + .../model/rest/ConfigurationException.java | 38 + .../model/rest/CreateRelationshipRequest.java | 17 + .../common/model/rest/DatabaseConnection.java | 16 + .../model/rest/DeleteRelationshipRequest.java | 11 + .../common/model/rest/PerformStepRequest.java | 22 + .../model/rest/PostgisIndexDescriptor.java | 13 + .../common/model/rest/QueryRequest.java | 29 + .../model/rest/RegisterFileSetRequest.java | 46 + .../geoportal/common/model/rest/TempFile.java | 34 + .../useCaseDescriptor/DataAccessPolicy.java | 93 + .../common/model/useCaseDescriptor/Field.java | 70 + .../model/useCaseDescriptor/FieldMap.java | 13 + .../useCaseDescriptor/HandlerDeclaration.java | 22 + .../RelationshipDefinition.java | 23 + .../useCaseDescriptor/UseCaseDescriptor.java | 143 ++ .../geoportal/common/rest/ConcessioniI.java | 10 + .../common/rest/InterfaceConstants.java | 54 + .../common/rest/MongoConcessioni.java | 32 + .../geoportal/common/rest/Projects.java | 62 + .../common/rest/UseCaseDescriptorsI.java | 22 + .../common/utils/CollectionsUtils.java | 44 + .../geoportal/common/utils/ContextUtils.java | 27 + .../geoportal/common/utils/FileSets.java | 133 ++ .../geoportal/common/utils/Files.java | 127 ++ .../geoportal/common/utils/ISUtils.java | 91 + .../geoportal/common/utils/StorageUtils.java | 90 + .../common/utils/tests/GCubeTest.java | 29 + geoportal-common/src/test/.gitignore | 1 + .../geoportal/common/FilesTests.java | 51 + .../geoportal/common/JacksonProvider.java | 38 + .../geoportal/common/StorageUtilsTest.java | 103 ++ .../geoportal/common/TokenSetter.java | 34 + .../common/legacy/DefaultsTests.java | 42 + .../geoportal/common/model/JSONPathTests.java | 157 ++ geoportal-service/.classpath | 39 + geoportal-service/.gitignore | 2 + geoportal-service/.project | 37 + geoportal-service/CHANGELOG.md | 94 + geoportal-service/FUNDING.md | 26 + geoportal-service/LICENSE.md | 312 ++++ geoportal-service/README.md | 60 + .../docs/_notebooks/commons.ipynb | 175 ++ .../docs/_notebooks/gcube_cms.ipynb | 1631 +++++++++++++++++ .../gna/MOSI read from csv row.json | 169 ++ .../docs/_notebooks/gna/MOSI.ipynb | 821 +++++++++ .../docs/_static/imgs/2phase_lc.png | Bin 0 -> 28999 bytes .../docs/_static/imgs/3phase_lc.png | Bin 0 -> 37598 bytes .../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 .../docs/_static/imgs/project.png | Bin 0 -> 86477 bytes .../docs/_static/imgs/step_execution.png | Bin 0 -> 67206 bytes geoportal-service/docs/_static/imgs/suite.png | Bin 0 -> 166036 bytes .../docs/_static/plugins_table.rst | 9 + geoportal-service/docs/architecture.rst | 314 ++++ geoportal-service/docs/conf.py | 55 + geoportal-service/docs/index.rst | 86 + geoportal-service/docs/lifecycle.rst | 132 ++ geoportal-service/docs/plugins.rst | 67 + geoportal-service/docs/project.rst | 282 +++ geoportal-service/docs/quickstart.rst | 35 + geoportal-service/docs/ucd.rst | 101 + geoportal-service/enunciate.xml | 24 + .../extra-resources/WEB-INF/gcube-app.xml | 13 + geoportal-service/pom.xml | 274 +++ .../geoportal/service/AppManager.java | 24 + .../geoportal/service/GeoPortalService.java | 81 + .../geoportal/service/InterfaceUtils.java | 5 + .../geoportal/service/RequestFilter.java | 58 + .../geoportal/service/ServiceConstants.java | 17 + .../accounting/CalledMethodHandler.java | 23 + .../service/engine/mongo/MongoManager.java | 144 ++ .../service/engine/mongo/MongoManagerI.java | 301 +++ .../engine/mongo/ProfiledMongoManager.java | 1611 ++++++++++++++++ .../service/engine/mongo/UCDManagerI.java | 17 + .../service/engine/mongo/UCDMongoManager.java | 124 ++ .../engine/providers/ConfigurationCache.java | 62 + .../engine/providers/MongoClientProvider.java | 71 + .../engine/providers/PluginManager.java | 147 ++ .../engine/providers/ProjectAccessImpl.java | 71 + .../providers/ProjectAccessProvider.java | 26 + .../providers/StorageClientProvider.java | 45 + .../ucd/LocalFolderProfileMapCache.java | 68 + .../engine/providers/ucd/ProfileMap.java | 11 + .../ucd/SingleISResourceUCDProvider.java | 236 +++ .../engine/providers/ucd/UCDManager.java | 215 +++ .../geoportal/service/http/PATCH.java | 20 + .../model/internal/db/DBConstants.java | 141 ++ .../service/model/internal/db/Mongo.java | 44 + .../model/internal/db/PostgisTable.java | 320 ++++ .../geoportal/service/rest/Commons.java | 8 + .../geoportal/service/rest/DocsGenerator.java | 44 + .../service/rest/GeoportalHealth.java | 144 ++ .../geoportal/service/rest/GuardedMethod.java | 77 + .../geoportal/service/rest/Plugins.java | 66 + .../service/rest/ProfiledDocuments.java | 757 ++++++++ .../service/rest/UseCaseDescriptors.java | 150 ++ .../rest/health/DatabaseHealthCheck.java | 161 ++ .../rest/health/GeoportalHealthCheck.java | 37 + .../health/HealthCheckResponseSerializer.java | 40 + .../service/rest/health/MongoHealthCheck.java | 117 ++ .../service/util/AuthorizedThread.java | 81 + .../META-INF/enunciate/d4science_docs.fmt | 1183 ++++++++++++ .../resources/styles/clustered_points.sld | 173 ++ .../src/main/webapp/WEB-INF/web.xml | 38 + .../css/d4science_enunciate_custom.css | 26 + geoportal-service/src/test/.gitignore | 1 + .../service/BasicServiceTestUnit.java | 78 + .../geoportal/service/DescribeGSFolder.java | 43 + .../InexistentUseCaseDescriptorTests.java | 34 + .../geoportal/service/StorageTests.java | 21 + .../geoportal/service/UCDTests.java | 74 + .../service/engine/caches/Caches.java | 145 ++ .../service/engine/caches/DummyCache.java | 32 + .../service/engine/mongo/LockTests.java | 123 ++ .../engine/mongo/ManagementUseCases.java | 27 + .../service/engine/mongo/MongoTester.java | 28 + .../service/engine/mongo/MongoTests.java | 81 + .../engine/mongo/ProjectsManualUpdate.java | 160 ++ .../service/engine/profiles/GenericTests.java | 24 + .../service/engine/profiles/UCDCalls.java | 71 + .../engine/providers/MongoProviderTest.java | 63 + .../engine/providers/ucd/UCDLoadingTest.java | 66 + .../lifecycleManagers/RoleManagerTests.java | 36 + .../service/health/HealthCheckSerializer.java | 32 + .../AbstractProfiledDocumentsTests.java | 193 ++ .../profiledDocuments/DummyProjectTest.java | 161 ++ .../ProfiledConcessioniTests.java | 173 ++ .../service/profiledDocuments/RolesTests.java | 54 + .../geoportal/service/ws/MoveWSFolder.java | 31 + pom.xml | 363 ++++ 327 files changed, 35593 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .project create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.wst.common.component create mode 100644 .settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 CHANGELOG.md create mode 100644 D4S_Export_PDF/DEV/devVRE/pdf_footer.png create mode 100644 D4S_Export_PDF/DEV/devVRE/pdf_header.png create mode 100644 D4S_Export_PDF/PRE/preVRE/pdf_footer.png create mode 100644 D4S_Export_PDF/PRE/preVRE/pdf_header.png create mode 100644 D4S_Export_PDF/PROD/GNA/pdf_footer.png create mode 100644 D4S_Export_PDF/PROD/GNA/pdf_header.png create mode 100644 D4S_UCDs/DEV/devVRE/Concessioni.json create mode 100644 D4S_UCDs/DEV/devVRE/Concessioni_estere.json create mode 100644 D4S_UCDs/DEV/devVRE/Esquilino.json create mode 100644 D4S_UCDs/DEV/devVRE/Test_BaseModel.json create mode 100644 D4S_UCDs/DEV/devVRE/catalogue/binding/freemarker_templates/d4gna_to_catalogue.ftl create mode 100644 D4S_UCDs/DEV/devVRE/notifications/Notifications_Messages.properties create mode 100644 D4S_UCDs/DEV/devVRE/notifications/Notifications_Messages_ita.properties create mode 100644 D4S_UCDs/Esquiline/Esquilino.json create mode 100644 D4S_UCDs/PRE/preVRE/Concessioni.json create mode 100644 D4S_UCDs/PRE/preVRE/Concessioni_estere.json create mode 100644 D4S_UCDs/PRE/preVRE/Esquilino.json create mode 100644 D4S_UCDs/PROD/Esquiline/Esquilino.json create mode 100644 D4S_UCDs/PROD/Esquiline/Esquilino_with_unpublish.json create mode 100644 D4S_UCDs/PROD/GNA/Concessioni.json create mode 100644 D4S_UCDs/PROD/GNA/Concessioni_back.json create mode 100644 D4S_UCDs/PROD/GNA/Concessioni_estere.json create mode 100644 D4S_UCDs/PROD/GNA/backup/Concessioni_back_01-2024.json create mode 100644 D4S_UCDs/PROD/GNA/backup/Concessioni_estere_back_01-2024.json create mode 100644 FUNDING.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 cms-plugin-framework/.classpath create mode 100644 cms-plugin-framework/.gitignore create mode 100644 cms-plugin-framework/.project create mode 100644 cms-plugin-framework/CHANGELOG.md create mode 100644 cms-plugin-framework/FUNDING.md create mode 100644 cms-plugin-framework/LICENSE.md create mode 100644 cms-plugin-framework/README.md create mode 100644 cms-plugin-framework/pom.xml create mode 100644 cms-plugin-framework/src/main/java/META-INF/MANIFEST.MF create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/AbstractScopedMap.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/Cache.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/Engine.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/ObjectManager.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/TTLObject.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/TimedMap.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/DefaultISProvider.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ISInterface.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ImplementationProvider.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ProjectAccess.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/StorageHubProvider.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/WSInterface.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/WorkspaceManager.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DataParsingException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DeletionException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidLockException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidStateException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidUserRoleException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectLockedException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectNotFoundException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/RegistrationException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/UnauthorizedAccess.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/utils/UserUtils.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/EventListenerPluginInterface.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/IndexerPluginInterface.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/InitializablePlugin.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/LifecycleManager.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/MaterializationPlugin.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/Plugin.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/PluginManagerInterface.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/PluginsReflections.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/EventListener.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/EventManager.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/EventManagerInterface.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/ItemObservable.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/ItemObserved.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/EventException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/IndexingException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InitializationException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InsufficientPrivileges.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InvalidPluginRequestException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InvalidProfileException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/MaterializationException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/PluginExecutionException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/ShutDownException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/StepException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/UnrecognizedEventException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/UnrecognizedStepException.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/model/ComparableVersion.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/DocumentHandlingReport.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/EventExecutionReport.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/IndexDocumentReport.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/InitializationReport.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/MaterializationReport.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/Report.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/StepExecutionReport.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseExecutionRequest.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseRequest.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/EventExecutionRequest.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/IndexDocumentRequest.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/MaterializationRequest.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/StepExecutionRequest.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/serialization/JacksonProvider.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/serialization/Serialization.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/serviceaccount/GeoportalServiceAccount.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/serviceaccount/IAMClientCredentials.java create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/serviceaccount/IAMClientCredentialsReader.java create mode 100644 default-lc-managers/.classpath create mode 100644 default-lc-managers/.gitignore create mode 100644 default-lc-managers/.project create mode 100644 default-lc-managers/CHANGELOG.md create mode 100644 default-lc-managers/FUNDING.md create mode 100644 default-lc-managers/LICENSE.md create mode 100644 default-lc-managers/README.md create mode 100644 default-lc-managers/pom.xml create mode 100644 default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractLifeCycleManager.java create mode 100644 default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/AbstractPlugin.java create mode 100644 default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/Default3PhaseManager.java create mode 100644 default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/IndexConstants.java create mode 100644 default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/RoleManager.java create mode 100644 default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/SimpleLifeCycleManager.java create mode 100644 default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/executions/GuardedEventManager.java create mode 100644 default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/executions/GuardedExecution.java create mode 100644 default-lc-managers/src/main/java/org/gcube/application/cms/plugins/implementations/executions/GuardedStepExecution.java create mode 100644 default-lc-managers/src/test/java/org/gcube/application/cms/plugins/SimpleLifecycleTests.java create mode 100644 geoportal-common/.classpath create mode 100644 geoportal-common/.gitignore create mode 100644 geoportal-common/.project create mode 100644 geoportal-common/CHANGELOG.md create mode 100644 geoportal-common/FUNDING.md create mode 100644 geoportal-common/LICENSE.md create mode 100644 geoportal-common/README.md create mode 100644 geoportal-common/pom.xml create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/JSONSerializationProvider.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/faults/InvalidRequestException.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/faults/PathException.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/faults/StorageException.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/JSONPathWrapper.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/configuration/Archive.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/configuration/Configuration.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/configuration/Index.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/configuration/MongoConnection.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/Lock.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/Project.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/access/Access.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/access/AccessPolicy.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/accounting/AccountingInfo.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/accounting/Context.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/accounting/PublicationInfo.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/accounting/User.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/Materialization.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/RegisteredFile.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/RegisteredFileSet.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/sdi/GCubeSDILayer.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/sdi/GeoServerPlatform.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/sdi/PlatformInfo.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/identification/CentroidRecordReference.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/identification/IdentificationReference.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/identification/SpatialReference.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/identification/TemporalReference.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/lifecycle/LifecycleInformation.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/lifecycle/TriggeredEvents.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/relationships/Relationship.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/relationships/RelationshipNavigationObject.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/AbstractRelazione.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/AccessPolicy.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/AssociatedContent.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/BBOX.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/Concessione.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/GeoServerContent.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/InputStreamDescriptor.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/LayerConcessione.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/OtherContent.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/PersistedContent.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/Record.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/RecordType.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/RelazioneScavo.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/SDILayerDescriptor.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/UploadedImage.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/WorkspaceContent.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/report/Check.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/report/Checks.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/report/ConstraintCheck.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/report/DeletionReport.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/report/PublicationReport.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/legacy/report/ValidationReport.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/plugins/IndexerPluginDescriptor.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/plugins/LifecycleManagerDescriptor.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/plugins/MaterializerPluginDescriptor.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/plugins/OperationDescriptor.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/plugins/PluginDescriptor.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/AddSectionToConcessioneRequest.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/ConfigurationException.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/CreateRelationshipRequest.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/DatabaseConnection.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/DeleteRelationshipRequest.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/PerformStepRequest.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/PostgisIndexDescriptor.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/QueryRequest.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/RegisterFileSetRequest.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/TempFile.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/useCaseDescriptor/DataAccessPolicy.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/useCaseDescriptor/Field.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/useCaseDescriptor/FieldMap.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/useCaseDescriptor/HandlerDeclaration.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/useCaseDescriptor/RelationshipDefinition.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/useCaseDescriptor/UseCaseDescriptor.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/ConcessioniI.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/InterfaceConstants.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/MongoConcessioni.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/Projects.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/UseCaseDescriptorsI.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/CollectionsUtils.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/ContextUtils.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/FileSets.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/ISUtils.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/StorageUtils.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java create mode 100644 geoportal-common/src/test/.gitignore create mode 100644 geoportal-common/src/test/java/org/gcube/application/geoportal/common/FilesTests.java create mode 100644 geoportal-common/src/test/java/org/gcube/application/geoportal/common/JacksonProvider.java create mode 100644 geoportal-common/src/test/java/org/gcube/application/geoportal/common/StorageUtilsTest.java create mode 100644 geoportal-common/src/test/java/org/gcube/application/geoportal/common/TokenSetter.java create mode 100644 geoportal-common/src/test/java/org/gcube/application/geoportal/common/legacy/DefaultsTests.java create mode 100644 geoportal-common/src/test/java/org/gcube/application/geoportal/common/model/JSONPathTests.java create mode 100644 geoportal-service/.classpath create mode 100644 geoportal-service/.gitignore create mode 100644 geoportal-service/.project create mode 100644 geoportal-service/CHANGELOG.md create mode 100644 geoportal-service/FUNDING.md create mode 100644 geoportal-service/LICENSE.md create mode 100644 geoportal-service/README.md create mode 100644 geoportal-service/docs/_notebooks/commons.ipynb create mode 100644 geoportal-service/docs/_notebooks/gcube_cms.ipynb create mode 100644 geoportal-service/docs/_notebooks/gna/MOSI read from csv row.json create mode 100644 geoportal-service/docs/_notebooks/gna/MOSI.ipynb create mode 100644 geoportal-service/docs/_static/imgs/2phase_lc.png create mode 100644 geoportal-service/docs/_static/imgs/3phase_lc.png 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 create mode 100644 geoportal-service/docs/_static/imgs/project.png create mode 100644 geoportal-service/docs/_static/imgs/step_execution.png create mode 100644 geoportal-service/docs/_static/imgs/suite.png create mode 100644 geoportal-service/docs/_static/plugins_table.rst create mode 100644 geoportal-service/docs/architecture.rst create mode 100644 geoportal-service/docs/conf.py create mode 100644 geoportal-service/docs/index.rst create mode 100644 geoportal-service/docs/lifecycle.rst create mode 100644 geoportal-service/docs/plugins.rst create mode 100644 geoportal-service/docs/project.rst create mode 100644 geoportal-service/docs/quickstart.rst create mode 100644 geoportal-service/docs/ucd.rst create mode 100644 geoportal-service/enunciate.xml create mode 100644 geoportal-service/gcube/extra-resources/WEB-INF/gcube-app.xml create mode 100644 geoportal-service/pom.xml create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/AppManager.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/GeoPortalService.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/InterfaceUtils.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/RequestFilter.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/ServiceConstants.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/accounting/CalledMethodHandler.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManager.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDManagerI.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ConfigurationCache.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/MongoClientProvider.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/PluginManager.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ProjectAccessImpl.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ProjectAccessProvider.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/StorageClientProvider.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ucd/LocalFolderProfileMapCache.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ucd/ProfileMap.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ucd/SingleISResourceUCDProvider.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ucd/UCDManager.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/http/PATCH.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/db/DBConstants.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/db/Mongo.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/model/internal/db/PostgisTable.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/Commons.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/DocsGenerator.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/GeoportalHealth.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/GuardedMethod.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/Plugins.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/UseCaseDescriptors.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/health/DatabaseHealthCheck.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/health/GeoportalHealthCheck.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/health/HealthCheckResponseSerializer.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/health/MongoHealthCheck.java create mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/util/AuthorizedThread.java create mode 100644 geoportal-service/src/main/resources/META-INF/enunciate/d4science_docs.fmt create mode 100644 geoportal-service/src/main/resources/styles/clustered_points.sld create mode 100644 geoportal-service/src/main/webapp/WEB-INF/web.xml create mode 100644 geoportal-service/src/main/webapp/api-docs/css/d4science_enunciate_custom.css create mode 100644 geoportal-service/src/test/.gitignore create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/BasicServiceTestUnit.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/DescribeGSFolder.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/InexistentUseCaseDescriptorTests.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/StorageTests.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/UCDTests.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/caches/Caches.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/caches/DummyCache.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/LockTests.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/ManagementUseCases.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/MongoTester.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/MongoTests.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/mongo/ProjectsManualUpdate.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/profiles/GenericTests.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/profiles/UCDCalls.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/providers/MongoProviderTest.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/providers/ucd/UCDLoadingTest.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/framework/lifecycleManagers/RoleManagerTests.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/health/HealthCheckSerializer.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProjectTest.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/RolesTests.java create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/ws/MoveWSFolder.java create mode 100644 pom.xml diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..3538854 --- /dev/null +++ b/.classpath @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/.project b/.project new file mode 100644 index 0000000..ec418ff --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + geoportal-cms-suite + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..0c68a61 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..601b6a1 --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..fb95c45 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..51b8d6a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,46 @@ +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +# Changelog for org.gcube.application.gcs.geoportal-cms-suite + +## [v2.0.0-SNAPSHOT] + +- Refactored as `geoportal-cms-suite` [#28423] + +## [v1.0.6] + +- Integrated an EventManager centrally [#26321] +- sdi-plugins: add the logic to apply a regex to the value that must be added to index [#26322] +- notifications-plugins: integrated [#26453] +- catalogue-binding-plugins: integrated [#26454] +- Moved to `gcube-smartgears-bom 2.5.1{-SNAPSHOT}` [#28026] + +## [v1.0.5] + +- Added maven profiles `geoportal-release-profile` and `geoportal-snapshot-profile` [#25570] +- Moved to maven-parent.v1.2.0 [#25570] + +## [v1.0.4] - 2023-01-10 + +- Updated plugin framework + +## [v1.0.3] - 2022-12-07 + +- Updated plugin framework +- Introduced module default-lc-managers + +## [v1.0.2] - 2021-02-24 + +-Introduced module sdi-plugins +-Introduced module notifications-plugins +-Introduced module dataminer-plugins +-Introduced module images-plugins +-Introduced module ckan-plugin + +## [v1.0.1] - 2021-12-07 + +- Introduced cms-plugin-framework +- Introduced concessioni use case +- Fixed internal group ids + +## [v1.0.0] - 2021-2-11 +- First release diff --git a/D4S_Export_PDF/DEV/devVRE/pdf_footer.png b/D4S_Export_PDF/DEV/devVRE/pdf_footer.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b9f9774724423dafe71f9048ed3cf3851e8a49 GIT binary patch literal 68992 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 N002ovPDHLkV1nLy$e{oL literal 0 HcmV?d00001 diff --git a/D4S_Export_PDF/PRE/preVRE/pdf_footer.png b/D4S_Export_PDF/PRE/preVRE/pdf_footer.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b9f9774724423dafe71f9048ed3cf3851e8a49 GIT binary patch literal 68992 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 N002ovPDHLkV1nLy$e{oL literal 0 HcmV?d00001 diff --git a/D4S_Export_PDF/PROD/GNA/pdf_footer.png b/D4S_Export_PDF/PROD/GNA/pdf_footer.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b9f9774724423dafe71f9048ed3cf3851e8a49 GIT binary patch literal 68992 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 N002ovPDHLkV1nLy$e{oL literal 0 HcmV?d00001 diff --git a/D4S_UCDs/DEV/devVRE/Concessioni.json b/D4S_UCDs/DEV/devVRE/Concessioni.json new file mode 100644 index 0000000..2160014 --- /dev/null +++ b/D4S_UCDs/DEV/devVRE/Concessioni.json @@ -0,0 +1,941 @@ +{ + "_id": "profiledConcessioni", + "_version": "1.0.0", + "_name": "Indagini svolte in regime di concessione", + "_schema": { + "abstractRelazione": { + "_min": 1, + "_children": [ + { + "filesetIta": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "filesetEng": { + "_type": "RegisteredFileSet" + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "relazioneScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "immaginiRappresentative": { + "_max": 4, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "posizionamentoScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "pianteFineScavo": { + "_max": -1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + } + }, + "_description": "Embedded profile for concessioni [mibac] management", + "_creationInfo": { + "_user": { + "_username": "francesco.mangiacrapa" + } + }, + "_dataAccessPolicies": [ + { + "_policy": { + "_read": "any", + "_write": "any" + }, + "_roles": [ + "Data-Manager" + ] + }, + { + "_policy": { + "_read": "own", + "_write": "own" + }, + "_roles": [ + "Data-Editor" + ] + }, + { + "_policy": { + "_read": "any", + "_write": "none" + }, + "_roles": [ + "Member" + ], + "_enforcer": { + "_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}" + } + }, + { + "_policy": { + "_read": "none", + "_write": "none" + }, + "_roles": [] + } + ], + "_handlers": [ + { + "_id": "GNA-CONCESSIONI-LC", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "SUBMIT-FOR-REVIEW", + "roles": [] + }, + { + "STEP": "REJECT-DRAFT", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + }, + { + "STEP": "APPROVE-SUBMITTED", + "roles": [ + "Data-Manager" + ] + }, + { + "STEP": "UNPUBLISH", + "roles": [ + "Data-Manager" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "pianteFineScavo", + "documentPath": "pianteFineScavo[*].fileset" + }, + { + "schemaField": "posizionamentoScavo", + "documentPath": "posizionamentoScavo.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..posizionamentoScavo.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "nome", + "path": "$._theDocument.nome", + "type": "TEXT" + }, + { + "name": "data_inizio_progetto", + "path": "$._theDocument.dataInizioProgetto", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.introduzione", + "type": "TEXT" + }, + { + "name": "contenuto", + "path": "$._theDocument.descrizioneContenuto", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "responsabile", + "path": "$._theDocument.responsabile", + "type": "TEXT" + }, + { + "name": "editore", + "path": "$._theDocument.editore", + "type": "TEXT" + }, + { + "name": "ufficio_mic_competente", + "path": "$._theDocument.ufficioMic", + "type": "TEXT" + }, + { + "name": "funzionario_responsabile", + "path": "$._theDocument.funzionarioResponsabile", + "type": "TEXT" + }, + { + "name": "finanziamento", + "path": "$._theDocument.fontiFinanziamento", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "risorse", + "path": "$._theDocument.risorseCorrelate", + "type": "TEXT" + }, + { + "name": "data_fine_progetto", + "path": "$._theDocument.dataFineProgetto", + "type": "TEXT" + }, + { + "name": "data_archiviazione", + "path": "$._info._lastEditInfo._instant", + "type": "TEXT" + }, + { + "name": "versione", + "path": "$._version", + "type": "TEXT" + }, + { + "name": "licenza", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "accesso", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "parole_chiave", + "path": "$._theDocument.paroleChiaveLibere", + "type": "TEXT" + }, + { + "name": "modalita_individuazione", + "path": "$._theDocument.modalitaIndividuazione", + "type": "TEXT" + }, + { + "name": "contesto_indagine", + "path": "$._theDocument.contestoIndagine", + "type": "TEXT" + }, + { + "name": "denominazione", + "path": "$._theDocument.denominazione", + "type": "TEXT" + }, + { + "name": "stato_attuale", + "path": "$._theDocument.statoAttuale", + "type": "TEXT" + }, + { + "name": "accessibilita", + "path": "$._theDocument.accessibilita", + "type": "TEXT" + }, + { + "name": "cronologia_macrofase", + "path": "$._theDocument.cronologiaMacrofase", + "type": "TEXT", + "apply_regex": { + "type": "replaceAll", + "regex": "(\\s)?\\([\\s\\S]*", + "replacement": "" + } + }, + { + "name": "specifiche_cronologia", + "path": "$._theDocument.specificheCronologia", + "type": "TEXT" + }, + { + "name": "quota_max", + "path": "$._theDocument.quotaMax", + "type": "TEXT" + }, + { + "name": "quota_min", + "path": "$._theDocument.quotaMin", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "Catalogue-Binding-Plugin", + "_type": "EventListener", + "_configuration": { + "subscribeEvents": [ + { + "event": "LIFECYCLE_STEP_PERFORMED", + "when": [ + { + "target_phase": [ + "Published" + ], + "last_invoked_step": "APPROVE-SUBMITTED" + }, + { + "target_phase": [ + "DRAFT" + ], + "last_invoked_step": "UNPUBLISH" + } + ] + }, + { + "event": "PROJECT_DELETED" + } + ], + "freemarker_template_host": "https://code-repo.d4science.org", + "freemarker_template_path": "gCubeSystem/gcube-cms-suite/raw/branch/event_manager/D4S_UCDs/DEV/devVRE/catalogue/binding/freemarker_templates/d4gna_to_catalogue.ftl", + "enabled": true + } + }, + { + "_id": "Notifications-Plugin", + "_type": "EventListener", + "_configuration": { + "subscribeNotifications": [ + { + "event": "LIFECYCLE_STEP_PERFORMED", + "notificationFor": [ + { + "roles": [ + "Data-Manager" + ], + "when": [ + { + "target_phase": [ + "Pending Approval" + ], + "last_invoked_step": "SUBMIT-FOR-REVIEW", + "notify": [ + { + "type": "USER_NOTIFICATION", + "send": true, + "placeholder_title": "TITLE_REVIEW_REQUIRED", + "placeholder_msg": "MSG_REVIEW_REQUIRED" + } + ] + }, + { + "target_phase": [ + "DRAFT" + ], + "last_invoked_step": "REJECT-DRAFT", + "notify": [ + { + "type": "USER_NOTIFICATION", + "send": true, + "placeholder_title": "TITLE_ITEM_REJECTED", + "placeholder_msg": "MSG_ITEM_REJECTED" + } + ] + } + ] + }, + { + "roles": [ + "Item_Creator" + ], + "when": [ + { + "target_phase": [ + "DRAFT" + ], + "last_invoked_step": "REJECT-DRAFT", + "notify": [ + { + "type": "USER_NOTIFICATION", + "send": true, + "placeholder_title": "TITLE_ITEM_REJECTED_REVIEW_REQUIRED", + "placeholder_msg": "MSG_ITEM_REJECTED_REVIEW_REQUIRED" + } + ] + } + ] + }, + { + "roles": [ + "Any" + ], + "when": [ + { + "target_phase": [ + "Published" + ], + "last_invoked_step": "APPROVE-SUBMITTED", + "notify": [ + { + "type": "VRE_POST", + "send": true, + "placeholder_msg": "MSG_ITEM_PUBLISHED", + "export_as_pdf": { + "export": false, + "placeholder_msg": "MSG_GO_TO_PDF" + } + } + ] + } + ] + } + ] + } + ], + "enabled": true, + "link_to_notifications_messages": "https://code-repo.d4science.org/gCubeSystem/gcube-cms-suite/raw/branch/event_manager/D4S_UCDs/DEV/devVRE/notifications/Notifications_Messages_ita.properties" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Informazioni_di_progetto", + "sectionName": "$.", + "sectionTitle": "Informazioni di Progetto" + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Abstract_Relazione_di_Scavo", + "sectionName": "abstractRelazione", + "sectionTitle": "Abstract della Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + }, + { + "gcubeProfileFieldName": "Carica Abstract Eng (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetEng)]", + "fieldName": "filesetEng" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Relazione_di_Scavo", + "sectionName": "relazioneScavo", + "sectionTitle": "Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Relazione scientifica (in PDF)", + "fieldDefinition": "$.relazioneScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Immagine_Rappresentativa_di_Scavo", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 4, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Posizionamento_dell_area_di_indagine", + "sectionName": "posizionamentoScavo", + "sectionTitle": "Posizionamento dell'Area di Indagine", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.posizionamentoScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Pianta_di_fine_Scavo", + "sectionName": "pianteFineScavo", + "sectionTitle": "Piante di Fine Indagine", + "parentName": "$.", + "minOccurs": 0, + "maxOccurs": 0, + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.pianteFineScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.contributore", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.contestoIndagine", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (yyyy-mm-dd)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.responsabile", + "_theDocument.editore" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.contributore", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.contestoIndagine", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": false, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (YEAR)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.responsabile", + "_theDocument.editore" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-timeline-json-template", + "_type": "TIMELINE_JSON_TEMPLATE", + "_configuration": { + "tjt_document": { + "content": "$.nome", + "title": "$.nome", + "start": "$.dataInizioProgetto", + "end": "$.dataFineProgetto" + } + } + }, + { + "_id": "org.gcube.portlets.user.grouped_overlay_layers", + "_type": "GROUPED_OVERLAY_LAYERS", + "_configuration": { + "grouped_overlay_layers": [ + { + "name": "Limiti Amministrativi Italiani 2023 (fonte ISTAT)", + "description": "Layers automatically added to the Map", + "layers": [ + { + "title": "Regioni", + "name": "limiti_amministrativi:regioni", + "wms_url": "https://geoserver-1.cloud-dev.d4science.org/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=limiti_amministrativi:regioni&styles=&bbox=6.626621368537682,35.49285260122859,18.520381599098922,47.09178374646218&width=768&height=748&srs=EPSG:4326&format=application%2Fopenlayers", + "display": true + }, + { + "title": "Province", + "name": "limiti_amministrativi:province", + "wms_url": "https://geoserver-1.cloud-dev.d4science.org/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=limiti_amministrativi:province&styles=&bbox=6.626621368537682,35.49285260122859,18.520381599098922,47.09178374646218&width=768&height=748&srs=EPSG:4326&format=application%2Fopenlayers", + "display": true + }, + { + "title": "Comuni", + "name": "limiti_amministrativi:comuni", + "wms_url": "https://geoserver-1.cloud-dev.d4science.org/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=limiti_amministrativi:comuni&styles=&bbox=6.626621368537682,35.49285260122859,18.520381599098922,47.09178374646218&width=768&height=748&srs=EPSG:4326&format=application%2Fopenlayers", + "display": true + } + ] + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.grouped_cross_filtering_layers", + "_type": "GROUPED_CROSS_FILTERING_LAYERS", + "_configuration": { + "grouped_cross_filtering_layers": [ + { + "name": "Limiti Amministrativi Italiani 2023 (fonte ISTAT)", + "description": "Spatial filtering for the selected layer", + "layers": [ + { + "title": "Regioni", + "description": "Le Regioni Italiane", + "name": "limiti_amministrativi:regioni", + "wfs_url": "https://geoserver-1.cloud-dev.d4science.org/geoserver/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=limiti_amministrativi:regioni&maxFeatures=50&outputFormat=application%2Fjson&propertyName=COD_REG,DEN_REG&sortby=DEN_REG", + "table_show_field": "DEN_REG", + "table_key_field": "COD_REG", + "table_parent_key_field": "", + "table_geometry_name": "the_geom", + "related_to": [ + { + "title": "Province", + "description": "Le Province Italiane", + "name": "limiti_amministrativi:province", + "wfs_url": "https://geoserver-1.cloud-dev.d4science.org/geoserver/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=limiti_amministrativi:province&maxFeatures=150&outputFormat=application%2Fjson&propertyName=COD_PROV,DEN_PROV,COD_REG&sortby=DEN_PROV", + "table_show_field": "DEN_PROV", + "table_key_field": "COD_PROV", + "table_parent_key_field": "COD_REG", + "table_geometry_name": "the_geom", + "related_to": [ + { + "title": "Comuni", + "description": "I Comuni Italiani", + "name": "limiti_amministrativi:comuni", + "wfs_url": "https://geoserver-1.cloud-dev.d4science.org/geoserver/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=limiti_amministrativi:comuni&maxFeatures=9000&outputFormat=application%2Fjson&propertyName=PRO_COM,COMUNE,COD_PROV&sortby=COMUNE", + "table_show_field": "COMUNE", + "table_key_field": "PRO_COM", + "table_parent_key_field": "COD_PROV", + "table_geometry_name": "the_geom" + } + ] + } + ] + } + ] + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "submit_for_review", + "title": "Submit for Review", + "call_STEPS": [ + "SUBMIT-FOR-REVIEW" + ], + "description": "Submit the Project (for review)", + "display_on_phase": [ + "DRAFT" + ] + }, + { + "id": "reject", + "title": "Reject", + "call_STEPS": [ + "REJECT-DRAFT" + ], + "description": "Reject the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "approve", + "title": "Approve", + "call_STEPS": [ + "APPROVE-SUBMITTED" + ], + "description": "Approve the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "Published" + ] + } + ] + } + } + ], + "_relationshipDefinitions": [ + { + "_id": "precedes", + "_label": "Precede", + "_reverseRelationId": "follows" + }, + { + "_id": "follows", + "_label": "Segue", + "_reverseRelationId": "precedes" + } + ] +} \ No newline at end of file diff --git a/D4S_UCDs/DEV/devVRE/Concessioni_estere.json b/D4S_UCDs/DEV/devVRE/Concessioni_estere.json new file mode 100644 index 0000000..6be515c --- /dev/null +++ b/D4S_UCDs/DEV/devVRE/Concessioni_estere.json @@ -0,0 +1,669 @@ +{ + "_id": "concessioni-estere", + "_version": "1.0.0", + "_name": "Missioni archeologiche italiane all'estero", + "_schema": { + "abstractRelazione": { + "_min": 1, + "_children": [ + { + "filesetIta": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "filesetEng": { + "_type": "RegisteredFileSet" + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "relazioneScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "immaginiRappresentative": { + "_max": 4, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "posizionamentoScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "pianteFineScavo": { + "_max": -1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + } + }, + "_description": "Embedded profile for concessioni estere [mibac] management", + "_creationInfo": { + "_user": { + "_username": "fabio.sinibaldi" + } + }, + "_dataAccessPolicies": [ + {"_policy": {"_read": "any","_write": "any"}, + "_roles": ["Data-Manager"]}, + {"_policy": {"_read": "own","_write": "own"}, + "_roles": ["Data-Editor"]}, + {"_policy": {"_read": "any","_write": "none"}, + "_roles": ["Member"], + "_enforcer": {"_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}"}}, + {"_policy": {"_read": "none","_write": "none"}, + "_roles": []} + ], + "_handlers": [ + { + "_id": "GNA-CONCESSIONI-LC", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "SUBMIT-FOR-REVIEW", + "roles": [] + }, + { + "STEP": "REJECT-DRAFT", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + }, + { + "STEP": "APPROVE-SUBMITTED", + "roles": [ + "Data-Manager" + ] + }, + { + "STEP": "UNPUBLISH", + "roles": [ + "Data-Manager" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "pianteFineScavo", + "documentPath": "pianteFineScavo[*].fileset" + }, + { + "schemaField": "posizionamentoScavo", + "documentPath": "posizionamentoScavo.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..posizionamentoScavo.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "nome", + "path": "$._theDocument.nome", + "type": "TEXT" + }, + { + "name": "data_inizio_progetto", + "path": "$._theDocument.dataInizioProgetto", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.introduzione", + "type": "TEXT" + }, + { + "name": "contenuto", + "path": "$._theDocument.descrizioneContenuto", + "type": "TEXT" + }, + { + "name": "autore", + "path": "$._theDocument.authors", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "titolare", + "path": "$._theDocument.titolari", + "type": "TEXT" + }, + { + "name": "responsabile", + "path": "$._theDocument.responsabile", + "type": "TEXT" + }, + { + "name": "editore", + "path": "$._theDocument.editore", + "type": "TEXT" + }, + { + "name": "finanziamento", + "path": "$._theDocument.fontiFinanziamento", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "risorse", + "path": "$._theDocument.risorseCorrelate", + "type": "TEXT" + }, + { + "name": "data_fine_progetto", + "path": "$._theDocument.dataFineProgetto", + "type": "TEXT" + }, + { + "name": "data_archiviazione", + "path": "$._info._lastEditInfo._instant", + "type": "TEXT" + }, + { + "name": "versione", + "path": "$._version", + "type": "TEXT" + }, + { + "name": "licenza", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "titolare_licenza", + "path": "$._theDocument.titolareLicenza", + "type": "TEXT" + }, + { + "name": "accesso", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "parole_chiave", + "path": "$._theDocument.paroleChiaveLibere", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Informazioni_di_progetto", + "sectionName": "$.", + "sectionTitle": "Informazioni di Progetto" + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Abstract_Relazione_di_Scavo", + "sectionName": "abstractRelazione", + "sectionTitle": "Abstract della Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + }, + { + "gcubeProfileFieldName": "Carica Abstract Eng (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetEng)]", + "fieldName": "filesetEng" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Relazione_di_Scavo", + "sectionName": "relazioneScavo", + "sectionTitle": "Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Relazione scientifica (in PDF)", + "fieldDefinition": "$.relazioneScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Immagine_Rappresentativa_di_Scavo", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 4, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Posizionamento_dell_area_di_indagine", + "sectionName": "posizionamentoScavo", + "sectionTitle": "Posizionamento dell'Area di Indagine", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.posizionamentoScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Pianta_di_fine_Scavo", + "sectionName": "pianteFineScavo", + "sectionTitle": "Piante di Fine Indagine", + "parentName": "$.", + "minOccurs": 0, + "maxOccurs": 0, + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.pianteFineScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Author/s", + "paths": [ + "_theDocument.authors" + ], + "operator": "$and", + "searchable": false, + "sortable": true, + "asResult": true + }, + { + "label": "Project Start (yyyy-mm-dd)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } +}, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": false, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (YEAR)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } +} +, + { + "_id": "org.gcube.portlets.user.geoportal-timeline-json-template", + "_type": "TIMELINE_JSON_TEMPLATE", + "_configuration": { + "tjt_document": { + "content": "$.nome", + "title": "$.nome", + "start": "$.dataInizioProgetto", + "end": "$.dataFineProgetto" + } + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "submit_for_review", + "title": "Submit for Review", + "call_STEPS": [ + "SUBMIT-FOR-REVIEW" + ], + "description": "Submit the Project (for review)", + "display_on_phase": [ + "DRAFT" + ] + }, + { + "id": "reject", + "title": "Reject", + "call_STEPS": [ + "REJECT-DRAFT" + ], + "description": "Reject the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "approve", + "title": "Approve", + "call_STEPS": [ + "APPROVE-SUBMITTED" + ], + "description": "Approve the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "Published" + ] + } + ] + } + } + ], + "_relationshipDefinitions" : [ + {"_id": "precedes", "_label" : "Precede", + "_reverseRelationId" : "follows"}, + {"_id": "follows", "_label" : "Segue", + "_reverseRelationId" : "precedes"} + ] +} diff --git a/D4S_UCDs/DEV/devVRE/Esquilino.json b/D4S_UCDs/DEV/devVRE/Esquilino.json new file mode 100644 index 0000000..4427670 --- /dev/null +++ b/D4S_UCDs/DEV/devVRE/Esquilino.json @@ -0,0 +1,511 @@ +{ + "_id": "esquilino", + "_version": "1.0.0", + "_name": "Esquilino", + "_schema": { + "fonteInformazione": { + "_children": [ + { + "filesetIta": { + "_type": "RegisteredFileSet" + } + } + ] + }, + "documentazioneScientifica": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + }, + "immaginiRappresentative": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + }, + "datiAltimetrici": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + }, + "planimetria": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + } + }, + "_description": "UCD for Equilino", + "_creationInfo": { + "_user": { + "_username": "fabio.sinibaldi" + } + }, + "_dataAccessPolicies": [ + { + "_policy": { + "_read": "any", + "_write": "any" + }, + "_roles": [ + "Data-Manager" + ] + }, + { + "_policy": { + "_read": "own", + "_write": "own" + }, + "_roles": [ + "Data-Editor" + ] + }, + { + "_policy": { + "_read": "any", + "_write": "none" + }, + "_roles": [ + "Member" + ], + "_enforcer": { + "_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}" + } + }, + { + "_policy": { + "_read": "none", + "_write": "none" + }, + "_roles": [] + } + ], + "_handlers": [ + { + "_id": "DEFAULT-SINGLE-STEP", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "PUBLISH", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "datiAltimetrici", + "documentPath": "datiAltimetrici.fileset" + }, + { + "schemaField": "planimetria", + "documentPath": "planimetria.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..planimetria.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "definizione", + "path": "$._theDocument.definizione", + "type": "TEXT" + }, + { + "name": "denominazione", + "path": "$._theDocument.denominazione", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.descrizione", + "type": "TEXT" + }, + { + "name": "cronologia", + "path": "$._theDocument.cronologia", + "type": "TEXT" + }, + { + "name": "codice_partizione_archeologica", + "path": "$._theDocument.codice_partizione_archeologica", + "type": "TEXT" + }, + { + "name": "modalita_acquisizione", + "path": "$._theDocument.modalita_acquisizione", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "titolare_dati", + "path": "$._theDocument.titolare_dati", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "copyright", + "path": "$._theDocument.copyright", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Dati_Descrittivi", + "sectionName": "$.", + "sectionTitle": "Dati Descrittivi" + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Fonte_Informazione", + "sectionName": "fonteInformazione", + "sectionTitle": "Fonte dell'informazione", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.fonteInformazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Documentazione_Scientifica", + "sectionName": "documentazioneScientifica", + "sectionTitle": "Documentazione scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Documentazione scientifica (in PDF)", + "fieldDefinition": "$.documentazioneScientifica._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Immagine", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 10, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Dati_Altimetrici", + "sectionName": "datiAltimetrici", + "sectionTitle": "Dati Altimetrici", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.datiAltimetrici._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Planimetria", + "sectionName": "planimetria", + "sectionTitle": "Planimetria", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.planimetria._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.definizione", + "_theDocument.denominazione", + "_theDocument.descrizione", + "_theDocument.cronologia", + "_theDocument.codice_partizione_archeologica", + "_theDocument.modalita_acquisizione", + "_theDocument.contributore", + "_theDocument.titolare_dati", + "_theDocument.soggetto", + "_theDocument.copyright" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Definition", + "paths": [ + "_theDocument.definizione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Name", + "paths": [ + "_theDocument.denominazione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Code", + "paths": [ + "_theDocument.codice_partizione_archeologica" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.titolare_dati" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Chronology", + "paths": [ + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.definizione", + "_theDocument.denominazione", + "_theDocument.descrizione", + "_theDocument.cronologia", + "_theDocument.codice_partizione_archeologica", + "_theDocument.modalita_acquisizione", + "_theDocument.contributore", + "_theDocument.titolare_dati", + "_theDocument.soggetto", + "_theDocument.copyright" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Definition", + "paths": [ + "_theDocument.definizione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Name", + "paths": [ + "_theDocument.denominazione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Code", + "paths": [ + "_theDocument.codice_partizione_archeologica" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.titolare_dati" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Chronology", + "paths": [ + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [ + "PUBLISH" + ], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "publish", + "title": "Publish the Project", + "call_STEPS": [ + "PUBLISH" + ], + "description": "Publish the Project", + "display_on_phase": [ + "DRAFT" + ] + } + ] + } + } + ] +} \ No newline at end of file diff --git a/D4S_UCDs/DEV/devVRE/Test_BaseModel.json b/D4S_UCDs/DEV/devVRE/Test_BaseModel.json new file mode 100644 index 0000000..a2d76a2 --- /dev/null +++ b/D4S_UCDs/DEV/devVRE/Test_BaseModel.json @@ -0,0 +1,333 @@ +{ + "_id": "test_basemodel", + "_version": "1.0.0", + "_name": "Test_BaseModel", + "_schema": { + "planimetria": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + } + }, + "_description": "UCD for BaseModel Test", + "_creationInfo": { + "_user": { + "_username": "francesco.mangiacrapa" + } + }, + "_dataAccessPolicies": [ + { + "_policy": { + "_read": "any", + "_write": "any" + }, + "_roles": [ + "Data-Manager" + ] + }, + { + "_policy": { + "_read": "own", + "_write": "own" + }, + "_roles": [ + "Data-Editor" + ] + }, + { + "_policy": { + "_read": "any", + "_write": "none" + }, + "_roles": [ + "Member" + ], + "_enforcer": { + "_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}" + } + }, + { + "_policy": { + "_read": "none", + "_write": "none" + }, + "_roles": [ + ] + } + ], + "_handlers": [ + { + "_id": "DEFAULT-SINGLE-STEP", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "PUBLISH", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "planimetria", + "documentPath": "planimetria.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..planimetria.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "titolo", + "path": "$._theDocument.titolo", + "type": "TEXT" + }, + { + "name": "denominazione", + "path": "$._theDocument.denominazione", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.descrizione", + "type": "TEXT" + }, + { + "name": "cronologia", + "path": "$._theDocument.cronologia", + "type": "TEXT" + } + ], + "jslt": { + }, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Test_Dati_Descrittivi", + "sectionName": "$.", + "sectionTitle": "Dati Descrittivi" + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Test_Planimetria", + "sectionName": "planimetria", + "sectionTitle": "Planimetria", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.planimetria._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.titolo", + "_theDocument.denominazione", + "_theDocument.descrizione", + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Titolo", + "paths": [ + "_theDocument.titolo" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Denominazione/Descrizione", + "paths": [ + "_theDocument.denominazione", + "_theDocument.descrizione" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Chronology", + "paths": [ + "_theDocument.cronologia" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.titolo", + "_theDocument.denominazione", + "_theDocument.descrizione", + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Title", + "paths": [ + "_theDocument.titolo" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Name", + "paths": [ + "_theDocument.denominazione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Chronology", + "paths": [ + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [ + "PUBLISH" + ], + "description": "Action fired after the Project creation", + "display_on_phase": [ + ] + }, + { + "id": "publish", + "title": "Publish the Project", + "call_STEPS": [ + "PUBLISH" + ], + "description": "Publish the Project", + "display_on_phase": [ + "DRAFT" + ] + } + ] + } + } + ] +} diff --git a/D4S_UCDs/DEV/devVRE/catalogue/binding/freemarker_templates/d4gna_to_catalogue.ftl b/D4S_UCDs/DEV/devVRE/catalogue/binding/freemarker_templates/d4gna_to_catalogue.ftl new file mode 100644 index 0000000..a63e128 --- /dev/null +++ b/D4S_UCDs/DEV/devVRE/catalogue/binding/freemarker_templates/d4gna_to_catalogue.ftl @@ -0,0 +1,356 @@ +<#assign jsonProj=doc> +<#assign theDocument=jsonProj._theDocument> + +<#assign resources=[]> +<#assign groups=[]> +<#assign tags=[]> +<#assign extras=[]> + +<#function sanitizeString(value)> +<#if value??> +<#-- Removing new lines and slashes --> + <#return value?replace('\n','')?replace('\"','')?trim> + +<#return ""> + + +<#function onlyAlphanumericString(value)> +<#if value??> +<#-- Removing new lines, slashes and not alphanumeric characters except for '-','_','.' --> + <#return value?replace('\n','')?replace('\"','')?replace("[^\\w^.^-^_]+", " ", "r")?trim> + +<#return ""> + + +<#-- Macro to assign Tags --> +<#macro assignTag in_tags> +<#if in_tags??> + <#if in_tags?is_sequence> + <#list in_tags as my_tag> + <#assign tags = tags + [onlyAlphanumericString(my_tag)] /> + + <#else> + <#assign tags = tags + [onlyAlphanumericString(in_tags)] /> + + + + +<#-- Macro to assign a Resource --> +<#macro assignResource name url description format> +<#if description??> +<#else> +<#assign description = ""/> + +<#if url??> + <#assign resource = {"name": name, "url": url, "description": sanitizeString(description), "format": format}> + <#assign resources = resources + [resource]/> + + + +<#-- Macro to assign Groups --> +<#macro assignGroup in_groups> +<#if in_groups??> + <#if in_groups?is_sequence> + <#list in_groups as my_group> + <#assign groups = groups + [my_group] /> + + <#else> + <#assign groups = groups + [in_groups] /> + + + + +<#-- Macro to assign Extras field --> +<#macro assignExtraField key value asObject> +<#if key??> +<#assign checkedValue = value/> +<#if key != "spatial"> +<#assign checkedValue = sanitizeString(value)/> + + <#assign extra = {"key": sanitizeString(key), "value": checkedValue, "asObject": asObject}> + <#assign extras = extras + [extra]/> + + + +<#-- Macro to build the tags as [{},{},..{}] --> +<#macro buildTags the_tags> +<#if the_tags??> + "tags": [ + <#list the_tags as tag> + { + "name": "${tag}" + } + <#if tag?is_last==false>, + + ], + + + +<#-- Macro to build the groups as [{},{},..{}] --> +<#macro buildGroups the_groups> +<#if the_groups??> + "groups": [ + <#list the_groups as the_group> + { + "name": "${the_group}" + } + <#if the_group?is_last==false>, + + ], + + + +<#-- Macro to build the resources as [{},{},..{}] --> +<#macro buildResources the_resources> +<#if the_resources??> + "resources": [ + <#list the_resources as resource> + { + "name": "${resource.name}", + "url": "${resource.url}", + "description": "${resource.description}", + "format": "${resource.format}" + } + <#if resource?is_last==false>, + + ], + + + +<#-- Macro to build the extras as [{},{},..{}] --> +<#macro buildExtrasFields the_extras> +<#if the_extras??> + "extras": [ + <#list the_extras as extra> + <#if extra.asObject?? && extra.asObject> + { + "key": "${extra.key}", + "value": ${extra.value} + } + <#else> + { + "key": "${extra.key}", + "value": "${extra.value}" + } + + <#if extra?is_last==false>, + + ] + + + + + +<#-- +############################################################ +# +# +# Starting document mapping to Catalogue +# +# +############################################################ +--> +<#compress> +{ + "name": "${jsonProj._id}", + "title": "${sanitizeString(theDocument.nome)}", + "license_id": "CC-BY-SA-4.0", + "private": false, + <#assign sanitizedNotes = sanitizeString(theDocument.introduzione) /> + "notes": "${sanitizedNotes}", + +<#-- +###################### + + RESOURCES + +###################### +--> + +<#-- Mapping "Relazione Scavo" as resource --> +<#if theDocument.relazioneScavo?? && theDocument.relazioneScavo.fileset?? && theDocument.relazioneScavo.fileset._payloads??> +<#assign payloads = theDocument.relazioneScavo.fileset._payloads> +<#if payloads?size!=0> +<#-- Getting the first payload --> +<#assign payload = payloads[0]> +<@assignResource name=payload._name url=payload._link description=theDocument.relazioneScavo.titolo format=payload._mimetype> + + + +<#-- Mapping "Immagine Rappresentative" as resource --> +<#if theDocument.immaginiRappresentative??> + <#if theDocument.immaginiRappresentative?is_sequence && theDocument.immaginiRappresentative?size gt 0> + <#list theDocument.immaginiRappresentative as the_image> + <#if the_image.fileset?? && the_image.fileset._payloads??> + <#assign payloads = the_image.fileset._payloads> + <#if payloads?size!=0> + <#-- Getting the first payload --> + <#assign payload = payloads[0]> + <@assignResource name=payload._name url=payload._link description=the_image.didascalia format=payload._mimetype> + + + + + + +<#-- Building Resources --> +<@buildResources the_resources=resources> + + +<#-- +###################### + + TAGS + +###################### +--> + +<#-- Mapping "paroleChiaveLibere" as tag --> +<#if theDocument.paroleChiaveLibere??> +<@assignTag in_tags=theDocument.paroleChiaveLibere> + + +<#-- Building tags --> +<@buildTags the_tags=tags> + + +<#-- +###################### + + GROUPS + +###################### +--> + +<#-- Mapping the year of the "dataInizioProgetto" as group --> +<#assign dateString = theDocument.dataInizioProgetto?trim> +<#assign dataInizioYear = dateString?split("-")[0]> +<#-- <@assignGroup in_groups=dataInizioYear> --> +<#-- Building groups --> +<@buildGroups the_groups=groups> + + +<#-- +###################### + + EXTRAS + +###################### +--> + +<#-- Mapping extras fields --> + + <#-- profiled-concessioni --> +<#if theDocument.doi??> +<@assignExtraField key="DOI" value=theDocument.doi asObject=false> + + +<#if theDocument.contributore??> +<@assignExtraField key="Contributore" value=theDocument.contributore asObject=false> + + +<#if theDocument.responsabile??> +<@assignExtraField key="Responsabile dei contenuti" value=theDocument.responsabile asObject=false> + + +<#if theDocument.editore??> +<@assignExtraField key="Ente responsabile del progetto" value=theDocument.editore asObject=false> + + +<#-- profiled-concessioni --> +<#if theDocument.ufficioMic??> +<@assignExtraField key="Ufficio MiC competente per territorio" value=theDocument.ufficioMic asObject=false> + + +<#-- concessioni-estere --> +<#if theDocument.ufficioCompetente??> +<@assignExtraField key="Ufficio estero competente per territorio" value=theDocument.ufficioCompetente asObject=false> + + +<#if theDocument.funzionarioResponsabile??> +<@assignExtraField key="Funzionario Responsabile" value=theDocument.funzionarioResponsabile asObject=false> + + +<#if theDocument.fontiFinanziamento??> +<#if theDocument.fontiFinanziamento?is_sequence> + <#list theDocument.fontiFinanziamento as my_extra> + <@assignExtraField key="Fonte del finanziamento" value=my_extra asObject=false> + + <#else> + <@assignExtraField key="Fonte del finanziamento" value=theDocument.fontiFinanziamento asObject=false> + + + +<#if theDocument.risorseCorrelate??> +<#if theDocument.risorseCorrelate?is_sequence> + <#list theDocument.risorseCorrelate as my_extra> + <@assignExtraField key="Risorse Correlate" value=my_extra asObject=false> + + <#else> + <@assignExtraField key="Risorse Correlate" value=theDocument.risorseCorrelate asObject=false> + + + +<#if theDocument.dataInizioProgetto??> +<@assignExtraField key="Data inizio Campagna" value=theDocument.dataInizioProgetto?trim asObject=false> + + +<#if theDocument.dataFineProgetto??> +<@assignExtraField key="Data fine Campagna" value=theDocument.dataFineProgetto?trim asObject=false> + + +<#if theDocument.modalitaIndividuazione??> +<#if theDocument.modalitaIndividuazione?is_sequence> + <#list theDocument.modalitaIndividuazione as my_extra> + <@assignExtraField key="Modalità di individuazione" value=my_extra asObject=false> + + <#else> + <@assignExtraField key="Modalità di individuazione" value=theDocument.modalitaIndividuazione asObject=false> + + + +<#if theDocument.contestoIndagine??> +<#if theDocument.contestoIndagine?is_sequence> + <#list theDocument.contestoIndagine as my_extra> + <@assignExtraField key="Contesto Indagine" value=my_extra asObject=false> + + <#else> + <@assignExtraField key="Contesto Indagine" value=theDocument.contestoIndagine asObject=false> + + + +<#if theDocument.statoAttuale??> +<@assignExtraField key="Stato attuale" value=theDocument.statoAttuale asObject=false> + + +<#if theDocument.accessibilita??> +<@assignExtraField key="Accessibilità" value=theDocument.accessibilita asObject=false> + + +<#if theDocument.cronologiaMacrofase??> +<#if theDocument.cronologiaMacrofase?is_sequence> + <#list theDocument.cronologiaMacrofase as my_extra> + <@assignExtraField key="Cronologia Macrofase" value=my_extra asObject=false> + + <#else> + <@assignExtraField key="Cronologia Macrofase" value=theDocument.cronologiaMacrofase asObject=false> + + + +<#-- spatial field --> +<#if jsonProj._identificationReferences?? && jsonProj._identificationReferences?size!=0 && jsonProj._identificationReferences[0].geoJSON??> +<#assign geoJSON = jsonProj._identificationReferences[0].geoJSON> +<#-- if coordinates exists, managing it as a Point --> +<#if geoJSON.coordinates?? && geoJSON.coordinates?is_sequence && geoJSON.coordinates?size gt 2> + <#assign point_Coordinates = [geoJSON.coordinates[0], geoJSON.coordinates[1]]> + <#assign spatialField = '{\\"type\\": \\"${geoJSON.type}\\", \\"coordinates\\": [${point_Coordinates?join(", ")}]}'> + <@assignExtraField key="spatial" value=spatialField asObject=false> + + + +<#-- Adding extra field "Anno" to add it as group --> +<@assignExtraField key="Anno" value=dataInizioYear asObject=false> + +<@buildExtrasFields the_extras=extras> +} + diff --git a/D4S_UCDs/DEV/devVRE/notifications/Notifications_Messages.properties b/D4S_UCDs/DEV/devVRE/notifications/Notifications_Messages.properties new file mode 100644 index 0000000..7c96f83 --- /dev/null +++ b/D4S_UCDs/DEV/devVRE/notifications/Notifications_Messages.properties @@ -0,0 +1,23 @@ +# REVIEW ACTION +TITLE_REVIEW_REQUIRED=Review required for ${project_name} +MSG_REVIEW_REQUIRED=@${user_caller} submitted the project ${project_name}. You are kindly requested to review it and decide either to APPROVE or REJECT it. See the Project at ${private_data_entry_link} +# REJECTED ACTION +TITLE_ITEM_REJECTED=Rejected ${project_name} +MSG_ITEM_REJECTED=The project ${project_name} (id: ${project_id}) has just been rejected by @${user_caller}. See the Project at ${private_data_entry_link} +# REJECTED ACTION +TITLE_ITEM_REJECTED_REVIEW_REQUIRED=Rejected ${project_name} +MSG_ITEM_REJECTED_REVIEW_REQUIRED=The project ${project_name} has just been rejected. You are kindly requested to review it. See the Project at ${private_data_entry_link} +# PUBLISHED ACTION +TITLE_ITEM_PUBLISHED=Published ${project_name} +MSG_ITEM_PUBLISHED=The project ${project_name} created by @${item_creator} has just been published. See the Project at ${public_data_viewer_link} +# CREATED ACTION +TITLE_ITEM_CREATED=Created ${project_name} +MSG_ITEM_CREATED=The project ${project_name} has just been created. See the Project at ${private_data_entry_link} +# DELETED ACTION +TITLE_ITEM_DELETED=Deleted ${project_name} +MSG_ITEM_DELETED=The project ${project_name} has just been deleted +# UPDATED ACTION +TITLE_ITEM_UPDATED=Updated ${project_name} +MSG_ITEM_UPDATED=The project ${project_name} (id: ${project_id}) has just been updated. See the Project at ${private_data_entry_link} +# GO TO PDF ACTION +MSG_GO_TO_PDF=Go to PDF report at ${project_as_pdf_link} \ No newline at end of file diff --git a/D4S_UCDs/DEV/devVRE/notifications/Notifications_Messages_ita.properties b/D4S_UCDs/DEV/devVRE/notifications/Notifications_Messages_ita.properties new file mode 100644 index 0000000..8d306ce --- /dev/null +++ b/D4S_UCDs/DEV/devVRE/notifications/Notifications_Messages_ita.properties @@ -0,0 +1,23 @@ +# REVIEW ACTION +TITLE_REVIEW_REQUIRED=Richiesta di revisione per ${project_name} +MSG_REVIEW_REQUIRED=@${user_caller} ha sottomesso il progetto ${project_name}. Si prega di esaminarlo e decidere se APPROVARLO o RIFIUTARLO. Vedi il progetto ${private_data_entry_link} +# REJECTED ACTION +TITLE_ITEM_REJECTED=Rigettato ${project_name} +MSG_ITEM_REJECTED=Il progetto ${project_name} (id: ${project_id}) è stato rigettato da @${user_caller}. Vedi il progetto ${private_data_entry_link} +# REJECTED ACTION +TITLE_ITEM_REJECTED_REVIEW_REQUIRED=Rigettato ${project_name} +MSG_ITEM_REJECTED_REVIEW_REQUIRED=Il progetto ${project_name} è stato rigettato. Si prega di rivederlo. Vedi il progetto ${private_data_entry_link} +# PUBLISHED ACTION +TITLE_ITEM_PUBLISHED=Pubblicato ${project_name} +MSG_ITEM_PUBLISHED=Il progetto ${project_name} creato da @${item_creator} è stato pubblicato. Vedi il progetto ${public_data_viewer_link} +# CREATED ACTION +TITLE_ITEM_CREATED=Creato ${project_name} +MSG_ITEM_CREATED=Il progetto ${project_name} è stato creato. Vedi il progetto ${private_data_entry_link} +# DELETED ACTION +TITLE_ITEM_DELETED=Cancellato ${project_name} +MSG_ITEM_DELETED=Il progetto ${project_name} è stato cancellato +# UPDATED ACTION +TITLE_ITEM_UPDATED=Aggiornato ${project_name} +MSG_ITEM_UPDATED=Il progetto ${project_name} (id: ${project_id}) è stato aggiornato. Vedi il progetto ${private_data_entry_link} +# GO TO PDF ACTION +MSG_GO_TO_PDF=Vai al report PDF ${project_as_pdf_link} \ No newline at end of file diff --git a/D4S_UCDs/Esquiline/Esquilino.json b/D4S_UCDs/Esquiline/Esquilino.json new file mode 100644 index 0000000..d5547ed --- /dev/null +++ b/D4S_UCDs/Esquiline/Esquilino.json @@ -0,0 +1,459 @@ +{ + "_id": "esquilino", + "_version": "1.0.0", + "_name": "Esquilino", + "_schema": { + "fonteInformazione" :{ + "_children": [ + {"filesetIta": {"_type": "RegisteredFileSet"}} + ] + }, + "documentazioneScientifica" :{ + "_children": [ + {"fileset": {"_type": "RegisteredFileSet"}} + ] + }, + "immaginiRappresentative" :{ + "_children": [ + {"fileset": {"_type": "RegisteredFileSet"}} + ] + }, + "datiAltimetrici" :{ + "_children": [ + {"fileset": {"_type": "RegisteredFileSet"}} + ] + }, + "planimetria" :{ + "_children": [ + {"fileset": {"_type": "RegisteredFileSet"}} + ] + } + }, + "_description": "UCD for Equilino", + "_creationInfo": { + "_user": { + "_username": "fabio.sinibaldi" + } + }, + "_dataAccessPolicies": [ + {"_policy": {"_read": "any","_write": "any"}, + "_roles": ["Data-Manager"]}, + {"_policy": {"_read": "own","_write": "own"}, + "_roles": ["Data-Editor"]}, + {"_policy": {"_read": "any","_write": "none"}, + "_roles": ["Member"], + "_enforcer": {"_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"PUBLISHED\"}}"}}, + {"_policy": {"_read": "none","_write": "none"}, + "_roles": []} + ], + "_handlers": [ + { + "_id": "DEFAULT-SINGLE-STEP", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "PUBLISH", + "roles": ["Data-Manager","Data-Editor"] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "datiAltimetrici", + "documentPath": "datiAltimetrici[*].fileset" + }, + { + "schemaField": "planimetria", + "documentPath": "planimetria.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..planimetria.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "definizione", + "path": "$._theDocument.definizione", + "type": "TEXT" + }, + { + "name": "denominazione", + "path": "$._theDocument.denominazione", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.descrizione", + "type": "TEXT" + }, + { + "name": "cronologia", + "path": "$._theDocument.cronologia", + "type": "TEXT" + }, + { + "name": "codice_partizione_archeologica", + "path": "$._theDocument.codice_partizione_archeologica", + "type": "TEXT" + }, + { + "name": "modalita_acquisizione", + "path": "$._theDocument.modalita_acquisizione", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "titolare_dati", + "path": "$._theDocument.titolare_dati", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "copyright", + "path": "$._theDocument.copyright", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Dati_Descrittivi", + "sectionName": "$.", + "sectionTitle": "Dati Descrittivi" + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Fonte_Informazione", + "sectionName": "fonteInformazione", + "sectionTitle": "Fonte dell'informazione", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.fonteInformazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Documentazione_Scientifica", + "sectionName": "documentazioneScientifica", + "sectionTitle": "Documentazione scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Documentazione scientifica (in PDF)", + "fieldDefinition": "$.documentazioneScientifica._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Immagine", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 10, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Dati_Altimetrici", + "sectionName": "datiAltimetrici", + "sectionTitle": "Dati Altimetrici", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.datiAltimetrici._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Planimetria", + "sectionName": "planimetria", + "sectionTitle": "Planimetria", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.planimetria._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } +}, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.definizione", + "_theDocument.denominazione", + "_theDocument.descrizione", + "_theDocument.cronologia", + "_theDocument.codice_partizione_archeologica", + "_theDocument.modalita_acquisizione", + "_theDocument.contributore", + "_theDocument.titolare_dati", + "_theDocument.soggetto", + "_theDocument.copyright" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Definition", + "paths": [ + "_theDocument.definizione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Name", + "paths": [ + "_theDocument.denominazione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Code", + "paths": [ + "_theDocument.codice_partizione_archeologica" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.titolare_dati" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Chronology", + "paths": [ + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } +}, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.definizione", + "_theDocument.denominazione", + "_theDocument.descrizione", + "_theDocument.cronologia", + "_theDocument.codice_partizione_archeologica", + "_theDocument.modalita_acquisizione", + "_theDocument.contributore", + "_theDocument.titolare_dati", + "_theDocument.soggetto", + "_theDocument.copyright" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Definition", + "paths": [ + "_theDocument.definizione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Name", + "paths": [ + "_theDocument.denominazione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Code", + "paths": [ + "_theDocument.codice_partizione_archeologica" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.titolare_dati" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Chronology", + "paths": [ + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } +} +, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": ["PUBLISH"], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "publish", + "title": "Publish the Project", + "call_STEPS": [ + "PUBLISH" + ], + "description": "Publish the Project", + "display_on_phase": [ + "DRAFT" + ] + } + ] + } +} +] +} diff --git a/D4S_UCDs/PRE/preVRE/Concessioni.json b/D4S_UCDs/PRE/preVRE/Concessioni.json new file mode 100644 index 0000000..7f69406 --- /dev/null +++ b/D4S_UCDs/PRE/preVRE/Concessioni.json @@ -0,0 +1,815 @@ +{ + "_id": "profiledConcessioni", + "_version": "1.0.0", + "_name": "Indagini svolte in regime di concessione", + "_schema": { + "abstractRelazione": { + "_min": 1, + "_children": [ + { + "filesetIta": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "filesetEng": { + "_type": "RegisteredFileSet" + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "relazioneScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "immaginiRappresentative": { + "_max": 4, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "posizionamentoScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "pianteFineScavo": { + "_max": -1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + } + }, + "_description": "Embedded profile for concessioni [mibac] management", + "_creationInfo": { + "_user": { + "_username": "francesco.mangiacrapa" + } + }, + "_dataAccessPolicies": [ + { + "_policy": { + "_read": "any", + "_write": "any" + }, + "_roles": [ + "Data-Manager" + ] + }, + { + "_policy": { + "_read": "own", + "_write": "own" + }, + "_roles": [ + "Data-Editor" + ] + }, + { + "_policy": { + "_read": "any", + "_write": "none" + }, + "_roles": [ + "Member" + ], + "_enforcer": { + "_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}" + } + }, + { + "_policy": { + "_read": "none", + "_write": "none" + }, + "_roles": [] + } + ], + "_handlers": [ + { + "_id": "GNA-CONCESSIONI-LC", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "SUBMIT-FOR-REVIEW", + "roles": [] + }, + { + "STEP": "REJECT-DRAFT", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + }, + { + "STEP": "APPROVE-SUBMITTED", + "roles": [ + "Data-Manager" + ] + }, + { + "STEP": "UNPUBLISH", + "roles": [ + "Data-Manager" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "pianteFineScavo", + "documentPath": "pianteFineScavo[*].fileset" + }, + { + "schemaField": "posizionamentoScavo", + "documentPath": "posizionamentoScavo.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..posizionamentoScavo.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "nome", + "path": "$._theDocument.nome", + "type": "TEXT" + }, + { + "name": "data_inizio_progetto", + "path": "$._theDocument.dataInizioProgetto", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.introduzione", + "type": "TEXT" + }, + { + "name": "contenuto", + "path": "$._theDocument.descrizioneContenuto", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "responsabile", + "path": "$._theDocument.responsabile", + "type": "TEXT" + }, + { + "name": "editore", + "path": "$._theDocument.editore", + "type": "TEXT" + }, + { + "name": "ufficio_mic_competente", + "path": "$._theDocument.ufficioMic", + "type": "TEXT" + }, + { + "name": "funzionario_responsabile", + "path": "$._theDocument.funzionarioResponsabile", + "type": "TEXT" + }, + { + "name": "finanziamento", + "path": "$._theDocument.fontiFinanziamento", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "risorse", + "path": "$._theDocument.risorseCorrelate", + "type": "TEXT" + }, + { + "name": "data_fine_progetto", + "path": "$._theDocument.dataFineProgetto", + "type": "TEXT" + }, + { + "name": "data_archiviazione", + "path": "$._info._lastEditInfo._instant", + "type": "TEXT" + }, + { + "name": "versione", + "path": "$._version", + "type": "TEXT" + }, + { + "name": "licenza", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "accesso", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "parole_chiave", + "path": "$._theDocument.paroleChiaveLibere", + "type": "TEXT" + }, + { + "name": "modalita_individuazione", + "path": "$._theDocument.modalitaIndividuazione", + "type": "TEXT" + }, + { + "name": "contesto_indagine", + "path": "$._theDocument.contestoIndagine", + "type": "TEXT" + }, + { + "name": "denominazione", + "path": "$._theDocument.denominazione", + "type": "TEXT" + }, + { + "name": "stato_attuale", + "path": "$._theDocument.statoAttuale", + "type": "TEXT" + }, + { + "name": "accessibilita", + "path": "$._theDocument.accessibilita", + "type": "TEXT" + }, + { + "name": "cronologia_macrofase", + "path": "$._theDocument.cronologiaMacrofase", + "type": "TEXT", + "apply_regex": { + "type": "replaceAll", + "regex": "(\\s)?\\([\\s\\S]*", + "replacement": "" + } + }, + { + "name": "specifiche_cronologia", + "path": "$._theDocument.specificheCronologia", + "type": "TEXT" + }, + { + "name": "quota_max", + "path": "$._theDocument.quotaMax", + "type": "TEXT" + }, + { + "name": "quota_min", + "path": "$._theDocument.quotaMin", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Informazioni_di_progetto", + "sectionName": "$.", + "sectionTitle": "Informazioni di Progetto" + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Abstract_Relazione_di_Scavo", + "sectionName": "abstractRelazione", + "sectionTitle": "Abstract della Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + }, + { + "gcubeProfileFieldName": "Carica Abstract Eng (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetEng)]", + "fieldName": "filesetEng" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Relazione_di_Scavo", + "sectionName": "relazioneScavo", + "sectionTitle": "Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Relazione scientifica (in PDF)", + "fieldDefinition": "$.relazioneScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Immagine_Rappresentativa_di_Scavo", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 4, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Posizionamento_dell_area_di_indagine", + "sectionName": "posizionamentoScavo", + "sectionTitle": "Posizionamento dell'Area di Indagine", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.posizionamentoScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Pianta_di_fine_Scavo", + "sectionName": "pianteFineScavo", + "sectionTitle": "Piante di Fine Indagine", + "parentName": "$.", + "minOccurs": 0, + "maxOccurs": 0, + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.pianteFineScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.contributore", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.contestoIndagine", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (yyyy-mm-dd)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.responsabile", + "_theDocument.editore" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.contributore", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.contestoIndagine", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": false, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (YEAR)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.responsabile", + "_theDocument.editore" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-timeline-json-template", + "_type": "TIMELINE_JSON_TEMPLATE", + "_configuration": { + "tjt_document": { + "content": "$.nome", + "title": "$.nome", + "start": "$.dataInizioProgetto", + "end": "$.dataFineProgetto" + } + } + }, + { + "_id": "org.gcube.portlets.user.grouped_overlay_layers", + "_type": "GROUPED_OVERLAY_LAYERS", + "_configuration": { + "grouped_overlay_layers": [ + { + "name": "Limiti Amministrativi Italiani 2023 (fonte ISTAT)", + "description": "Layers automatically added to the Map", + "layers": [ + { + "title": "Regioni", + "name": "limiti_amministrativi:regioni", + "wms_url": "https://geoserver-t.pre.d4science.org/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=limiti_amministrativi:regioni&styles=&bbox=6.626621368537682,35.49285260122859,18.520381599098922,47.09178374646218&width=768&height=748&srs=EPSG:4326&format=application%2Fopenlayers", + "display": true + }, + { + "title": "Province", + "name": "limiti_amministrativi:province", + "wms_url": "https://geoserver-t.pre.d4science.org/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=limiti_amministrativi:province&styles=&bbox=6.626621368537682,35.49285260122859,18.520381599098922,47.09178374646218&width=768&height=748&srs=EPSG:4326&format=application%2Fopenlayers", + "display": true + }, + { + "title": "Comuni", + "name": "limiti_amministrativi:comuni", + "wms_url": "https://geoserver-t.pre.d4science.org/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=limiti_amministrativi:comuni&styles=&bbox=6.626621368537682,35.49285260122859,18.520381599098922,47.09178374646218&width=768&height=748&srs=EPSG:4326&format=application%2Fopenlayers", + "display": true + } + ] + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.grouped_cross_filtering_layers", + "_type": "GROUPED_CROSS_FILTERING_LAYERS", + "_configuration": { + "grouped_cross_filtering_layers": [ + { + "name": "Limiti Amministrativi Italiani 2023 (fonte ISTAT)", + "description": "Spatial filtering for the selected layer", + "layers": [ + { + "title": "Regioni", + "description": "Le Regioni Italiane", + "name": "limiti_amministrativi:regioni", + "wfs_url": "https://geoserver-t.pre.d4science.org/geoserver/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=limiti_amministrativi:regioni&maxFeatures=50&outputFormat=application%2Fjson&propertyName=COD_REG,DEN_REG&sortby=DEN_REG", + "table_show_field": "DEN_REG", + "table_key_field": "COD_REG", + "table_parent_key_field": "", + "table_geometry_name": "the_geom", + "related_to": [ + { + "title": "Province", + "description": "Le Province Italiane", + "name": "limiti_amministrativi:province", + "wfs_url": "https://geoserver-t.pre.d4science.org/geoserver/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=limiti_amministrativi:province&maxFeatures=150&outputFormat=application%2Fjson&propertyName=COD_PROV,DEN_PROV,COD_REG&sortby=DEN_PROV", + "table_show_field": "DEN_PROV", + "table_key_field": "COD_PROV", + "table_parent_key_field": "COD_REG", + "table_geometry_name": "the_geom", + "related_to": [ + { + "title": "Comuni", + "description": "I Comuni Italiani", + "name": "limiti_amministrativi:comuni", + "wfs_url": "https://geoserver-t.pre.d4science.org/geoserver/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=limiti_amministrativi:comuni&maxFeatures=9000&outputFormat=application%2Fjson&propertyName=PRO_COM,COMUNE,COD_PROV&sortby=COMUNE", + "table_show_field": "COMUNE", + "table_key_field": "PRO_COM", + "table_parent_key_field": "COD_PROV", + "table_geometry_name": "the_geom" + } + ] + } + ] + } + ] + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "submit_for_review", + "title": "Submit for Review", + "call_STEPS": [ + "SUBMIT-FOR-REVIEW" + ], + "description": "Submit the Project (for review)", + "display_on_phase": [ + "DRAFT" + ] + }, + { + "id": "reject", + "title": "Reject", + "call_STEPS": [ + "REJECT-DRAFT" + ], + "description": "Reject the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "approve", + "title": "Approve", + "call_STEPS": [ + "APPROVE-SUBMITTED" + ], + "description": "Approve the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "Published" + ] + } + ] + } + } + ], + "_relationshipDefinitions": [ + { + "_id": "precedes", + "_label": "Precede", + "_reverseRelationId": "follows" + }, + { + "_id": "follows", + "_label": "Segue", + "_reverseRelationId": "precedes" + } + ] +} \ No newline at end of file diff --git a/D4S_UCDs/PRE/preVRE/Concessioni_estere.json b/D4S_UCDs/PRE/preVRE/Concessioni_estere.json new file mode 100644 index 0000000..2b03d75 --- /dev/null +++ b/D4S_UCDs/PRE/preVRE/Concessioni_estere.json @@ -0,0 +1,735 @@ +{ + "_id": "concessioni-estere", + "_version": "1.0.0", + "_name": "Missioni archeologiche italiane all'estero", + "_schema": { + "abstractRelazione": { + "_min": 1, + "_children": [ + { + "filesetIta": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "filesetEng": { + "_type": "RegisteredFileSet" + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "relazioneScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "immaginiRappresentative": { + "_max": 4, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "posizionamentoScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "pianteFineScavo": { + "_max": -1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + } + }, + "_description": "Embedded profile for concessioni estere [mibac] management", + "_creationInfo": { + "_user": { + "_username": "fabio.sinibaldi" + } + }, + "_dataAccessPolicies": [ + { + "_policy": { + "_read": "any", + "_write": "any" + }, + "_roles": [ + "Data-Manager" + ] + }, + { + "_policy": { + "_read": "own", + "_write": "own" + }, + "_roles": [ + "Data-Editor" + ] + }, + { + "_policy": { + "_read": "any", + "_write": "none" + }, + "_roles": [ + "Member" + ], + "_enforcer": { + "_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}" + } + }, + { + "_policy": { + "_read": "none", + "_write": "none" + }, + "_roles": [] + } + ], + "_handlers": [ + { + "_id": "GNA-CONCESSIONI-LC", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "SUBMIT-FOR-REVIEW", + "roles": [] + }, + { + "STEP": "REJECT-DRAFT", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + }, + { + "STEP": "APPROVE-SUBMITTED", + "roles": [ + "Data-Manager" + ] + }, + { + "STEP": "UNPUBLISH", + "roles": [ + "Data-Manager" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "pianteFineScavo", + "documentPath": "pianteFineScavo[*].fileset" + }, + { + "schemaField": "posizionamentoScavo", + "documentPath": "posizionamentoScavo.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..posizionamentoScavo.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "nome", + "path": "$._theDocument.nome", + "type": "TEXT" + }, + { + "name": "data_inizio_progetto", + "path": "$._theDocument.dataInizioProgetto", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.introduzione", + "type": "TEXT" + }, + { + "name": "contenuto", + "path": "$._theDocument.descrizioneContenuto", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "responsabile", + "path": "$._theDocument.responsabile", + "type": "TEXT" + }, + { + "name": "editore", + "path": "$._theDocument.editore", + "type": "TEXT" + }, + { + "name": "ufficio_competente", + "path": "$._theDocument.ufficioCompetente", + "type": "TEXT" + }, + { + "name": "funzionario_responsabile", + "path": "$._theDocument.funzionarioResponsabile", + "type": "TEXT" + }, + { + "name": "finanziamento", + "path": "$._theDocument.fontiFinanziamento", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "risorse", + "path": "$._theDocument.risorseCorrelate", + "type": "TEXT" + }, + { + "name": "data_fine_progetto", + "path": "$._theDocument.dataFineProgetto", + "type": "TEXT" + }, + { + "name": "data_archiviazione", + "path": "$._info._lastEditInfo._instant", + "type": "TEXT" + }, + { + "name": "versione", + "path": "$._version", + "type": "TEXT" + }, + { + "name": "licenza", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "accesso", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "parole_chiave", + "path": "$._theDocument.paroleChiaveLibere", + "type": "TEXT" + }, + { + "name": "modalita_individuazione", + "path": "$._theDocument.modalitaIndividuazione", + "type": "TEXT" + }, + { + "name": "contesto_indagine", + "path": "$._theDocument.contestoIndagine", + "type": "TEXT" + }, + { + "name": "denominazione", + "path": "$._theDocument.denominazione", + "type": "TEXT" + }, + { + "name": "stato_attuale", + "path": "$._theDocument.statoAttuale", + "type": "TEXT" + }, + { + "name": "accessibilita", + "path": "$._theDocument.accessibilita", + "type": "TEXT" + }, + { + "name": "cronologia_macrofase", + "path": "$._theDocument.cronologiaMacrofase", + "type": "TEXT", + "apply_regex": { + "type": "replaceAll", + "regex": "(\\s)?\\([\\s\\S]*", + "replacement": "" + } + }, + { + "name": "specifiche_cronologia", + "path": "$._theDocument.specificheCronologia", + "type": "TEXT" + }, + { + "name": "quota_max", + "path": "$._theDocument.quotaMax", + "type": "TEXT" + }, + { + "name": "quota_min", + "path": "$._theDocument.quotaMin", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Informazioni_di_progetto_estero", + "sectionName": "$.", + "sectionTitle": "Informazioni di Progetto per l'Estero" + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Abstract_Relazione_di_Scavo", + "sectionName": "abstractRelazione", + "sectionTitle": "Abstract della Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + }, + { + "gcubeProfileFieldName": "Carica Abstract Eng (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetEng)]", + "fieldName": "filesetEng" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Relazione_di_Scavo", + "sectionName": "relazioneScavo", + "sectionTitle": "Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Relazione scientifica (in PDF)", + "fieldDefinition": "$.relazioneScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Immagine_Rappresentativa_di_Scavo", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 4, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Posizionamento_dell_area_di_indagine", + "sectionName": "posizionamentoScavo", + "sectionTitle": "Posizionamento dell'Area di Indagine", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.posizionamentoScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Pianta_di_fine_Scavo", + "sectionName": "pianteFineScavo", + "sectionTitle": "Piante di Fine Indagine", + "parentName": "$.", + "minOccurs": 0, + "maxOccurs": 0, + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.pianteFineScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.contributore", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.contestoIndagine", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (yyyy-mm-dd)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.responsabile", + "_theDocument.editore" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.contributore", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.contestoIndagine", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": false, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (YEAR)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.responsabile", + "_theDocument.editore" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-timeline-json-template", + "_type": "TIMELINE_JSON_TEMPLATE", + "_configuration": { + "tjt_document": { + "content": "$.nome", + "title": "$.nome", + "start": "$.dataInizioProgetto", + "end": "$.dataFineProgetto" + } + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "submit_for_review", + "title": "Submit for Review", + "call_STEPS": [ + "SUBMIT-FOR-REVIEW" + ], + "description": "Submit the Project (for review)", + "display_on_phase": [ + "DRAFT" + ] + }, + { + "id": "reject", + "title": "Reject", + "call_STEPS": [ + "REJECT-DRAFT" + ], + "description": "Reject the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "approve", + "title": "Approve", + "call_STEPS": [ + "APPROVE-SUBMITTED" + ], + "description": "Approve the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "Published" + ] + } + ] + } + } + ], + "_relationshipDefinitions": [ + { + "_id": "precedes", + "_label": "Precede", + "_reverseRelationId": "follows" + }, + { + "_id": "follows", + "_label": "Segue", + "_reverseRelationId": "precedes" + } + ] +} \ No newline at end of file diff --git a/D4S_UCDs/PRE/preVRE/Esquilino.json b/D4S_UCDs/PRE/preVRE/Esquilino.json new file mode 100644 index 0000000..5ed17bd --- /dev/null +++ b/D4S_UCDs/PRE/preVRE/Esquilino.json @@ -0,0 +1,539 @@ +{ + "_id": "esquilino", + "_version": "1.0.0", + "_name": "Esquilino", + "_schema": { + "fonteInformazione": { + "_children": [ + { + "filesetIta": { + "_type": "RegisteredFileSet" + } + } + ] + }, + "documentazioneScientifica": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + }, + "immaginiRappresentative": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + }, + "datiAltimetrici": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + }, + "planimetria": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + } + }, + "_description": "UCD for Equilino", + "_creationInfo": { + "_user": { + "_username": "fabio.sinibaldi" + } + }, + "_dataAccessPolicies": [ + { + "_policy": { + "_read": "any", + "_write": "any" + }, + "_roles": [ + "Data-Manager" + ] + }, + { + "_policy": { + "_read": "own", + "_write": "own" + }, + "_roles": [ + "Data-Editor" + ] + }, + { + "_policy": { + "_read": "any", + "_write": "none" + }, + "_roles": [ + "Member" + ], + "_enforcer": { + "_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}" + } + }, + { + "_policy": { + "_read": "none", + "_write": "none" + }, + "_roles": [] + } + ], + "_handlers": [ + { + "_id": "DEFAULT-SINGLE-STEP", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "PUBLISH", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + }, + { + "STEP": "UNPUBLISH", + "roles": [ + "Data-Manager" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "datiAltimetrici", + "documentPath": "datiAltimetrici.fileset" + }, + { + "schemaField": "planimetria", + "documentPath": "planimetria.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..planimetria.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "definizione", + "path": "$._theDocument.definizione", + "type": "TEXT" + }, + { + "name": "denominazione", + "path": "$._theDocument.denominazione", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.descrizione", + "type": "TEXT" + }, + { + "name": "cronologia", + "path": "$._theDocument.cronologia", + "type": "TEXT" + }, + { + "name": "codice_partizione_archeologica", + "path": "$._theDocument.codice_partizione_archeologica", + "type": "TEXT" + }, + { + "name": "modalita_acquisizione", + "path": "$._theDocument.modalita_acquisizione", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "titolare_dati", + "path": "$._theDocument.titolare_dati", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "copyright", + "path": "$._theDocument.copyright", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Dati_Descrittivi", + "sectionName": "$.", + "sectionTitle": "Dati Descrittivi" + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Fonte_Informazione", + "sectionName": "fonteInformazione", + "sectionTitle": "Fonte dell'informazione", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.fonteInformazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Documentazione_Scientifica", + "sectionName": "documentazioneScientifica", + "sectionTitle": "Documentazione scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Documentazione scientifica (in PDF)", + "fieldDefinition": "$.documentazioneScientifica._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Immagine", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 10, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Dati_Altimetrici", + "sectionName": "datiAltimetrici", + "sectionTitle": "Dati Altimetrici", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.datiAltimetrici._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Planimetria", + "sectionName": "planimetria", + "sectionTitle": "Planimetria", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.planimetria._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.definizione", + "_theDocument.denominazione", + "_theDocument.descrizione", + "_theDocument.cronologia", + "_theDocument.codice_partizione_archeologica", + "_theDocument.modalita_acquisizione", + "_theDocument.contributore", + "_theDocument.titolare_dati", + "_theDocument.soggetto", + "_theDocument.copyright" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Definition", + "paths": [ + "_theDocument.definizione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Name", + "paths": [ + "_theDocument.denominazione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Code", + "paths": [ + "_theDocument.codice_partizione_archeologica" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.titolare_dati" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Chronology", + "paths": [ + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.definizione", + "_theDocument.denominazione", + "_theDocument.descrizione", + "_theDocument.cronologia", + "_theDocument.codice_partizione_archeologica", + "_theDocument.modalita_acquisizione", + "_theDocument.contributore", + "_theDocument.titolare_dati", + "_theDocument.soggetto", + "_theDocument.copyright" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Definition", + "paths": [ + "_theDocument.definizione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Name", + "paths": [ + "_theDocument.denominazione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Code", + "paths": [ + "_theDocument.codice_partizione_archeologica" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.titolare_dati" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Chronology", + "paths": [ + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [ + "PUBLISH" + ], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "submit_for_review", + "title": "Submit for Review", + "call_STEPS": [ + "PUBLISH" + ], + "description": "Publish the Project", + "display_on_phase": [ + "DRAFT" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "Published" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "PUBLISHED" + ] + } + ] + } + } + ] +} \ No newline at end of file diff --git a/D4S_UCDs/PROD/Esquiline/Esquilino.json b/D4S_UCDs/PROD/Esquiline/Esquilino.json new file mode 100644 index 0000000..5a58924 --- /dev/null +++ b/D4S_UCDs/PROD/Esquiline/Esquilino.json @@ -0,0 +1,459 @@ +{ + "_id": "esquilino", + "_version": "1.0.0", + "_name": "Esquilino", + "_schema": { + "fonteInformazione" :{ + "_children": [ + {"filesetIta": {"_type": "RegisteredFileSet"}} + ] + }, + "documentazioneScientifica" :{ + "_children": [ + {"fileset": {"_type": "RegisteredFileSet"}} + ] + }, + "immaginiRappresentative" :{ + "_children": [ + {"fileset": {"_type": "RegisteredFileSet"}} + ] + }, + "datiAltimetrici" :{ + "_children": [ + {"fileset": {"_type": "RegisteredFileSet"}} + ] + }, + "planimetria" :{ + "_children": [ + {"fileset": {"_type": "RegisteredFileSet"}} + ] + } + }, + "_description": "UCD for Equilino", + "_creationInfo": { + "_user": { + "_username": "fabio.sinibaldi" + } + }, + "_dataAccessPolicies": [ + {"_policy": {"_read": "any","_write": "any"}, + "_roles": ["Data-Manager"]}, + {"_policy": {"_read": "own","_write": "own"}, + "_roles": ["Data-Editor"]}, + {"_policy": {"_read": "any","_write": "none"}, + "_roles": ["Member"], + "_enforcer": {"_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}"}}, + {"_policy": {"_read": "none","_write": "none"}, + "_roles": []} + ], + "_handlers": [ + { + "_id": "DEFAULT-SINGLE-STEP", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "PUBLISH", + "roles": ["Data-Manager","Data-Editor"] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "datiAltimetrici", + "documentPath": "datiAltimetrici.fileset" + }, + { + "schemaField": "planimetria", + "documentPath": "planimetria.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..planimetria.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "definizione", + "path": "$._theDocument.definizione", + "type": "TEXT" + }, + { + "name": "denominazione", + "path": "$._theDocument.denominazione", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.descrizione", + "type": "TEXT" + }, + { + "name": "cronologia", + "path": "$._theDocument.cronologia", + "type": "TEXT" + }, + { + "name": "codice_partizione_archeologica", + "path": "$._theDocument.codice_partizione_archeologica", + "type": "TEXT" + }, + { + "name": "modalita_acquisizione", + "path": "$._theDocument.modalita_acquisizione", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "titolare_dati", + "path": "$._theDocument.titolare_dati", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "copyright", + "path": "$._theDocument.copyright", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Dati_Descrittivi", + "sectionName": "$.", + "sectionTitle": "Dati Descrittivi" + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Fonte_Informazione", + "sectionName": "fonteInformazione", + "sectionTitle": "Fonte dell'informazione", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.fonteInformazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Documentazione_Scientifica", + "sectionName": "documentazioneScientifica", + "sectionTitle": "Documentazione scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Documentazione scientifica (in PDF)", + "fieldDefinition": "$.documentazioneScientifica._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Immagine", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 10, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Dati_Altimetrici", + "sectionName": "datiAltimetrici", + "sectionTitle": "Dati Altimetrici", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.datiAltimetrici._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Planimetria", + "sectionName": "planimetria", + "sectionTitle": "Planimetria", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.planimetria._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } +}, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.definizione", + "_theDocument.denominazione", + "_theDocument.descrizione", + "_theDocument.cronologia", + "_theDocument.codice_partizione_archeologica", + "_theDocument.modalita_acquisizione", + "_theDocument.contributore", + "_theDocument.titolare_dati", + "_theDocument.soggetto", + "_theDocument.copyright" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Definition", + "paths": [ + "_theDocument.definizione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Name", + "paths": [ + "_theDocument.denominazione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Code", + "paths": [ + "_theDocument.codice_partizione_archeologica" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.titolare_dati" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Chronology", + "paths": [ + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } +}, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.definizione", + "_theDocument.denominazione", + "_theDocument.descrizione", + "_theDocument.cronologia", + "_theDocument.codice_partizione_archeologica", + "_theDocument.modalita_acquisizione", + "_theDocument.contributore", + "_theDocument.titolare_dati", + "_theDocument.soggetto", + "_theDocument.copyright" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Definition", + "paths": [ + "_theDocument.definizione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Name", + "paths": [ + "_theDocument.denominazione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Code", + "paths": [ + "_theDocument.codice_partizione_archeologica" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.titolare_dati" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Chronology", + "paths": [ + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } +} +, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": ["PUBLISH"], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "publish", + "title": "Publish the Project", + "call_STEPS": [ + "PUBLISH" + ], + "description": "Publish the Project", + "display_on_phase": [ + "DRAFT" + ] + } + ] + } +} +] +} diff --git a/D4S_UCDs/PROD/Esquiline/Esquilino_with_unpublish.json b/D4S_UCDs/PROD/Esquiline/Esquilino_with_unpublish.json new file mode 100644 index 0000000..b1d4678 --- /dev/null +++ b/D4S_UCDs/PROD/Esquiline/Esquilino_with_unpublish.json @@ -0,0 +1,539 @@ +{ + "_id": "esquilino", + "_version": "1.0.0", + "_name": "Esquilino", + "_schema": { + "fonteInformazione": { + "_children": [ + { + "filesetIta": { + "_type": "RegisteredFileSet" + } + } + ] + }, + "documentazioneScientifica": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + }, + "immaginiRappresentative": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + }, + "datiAltimetrici": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + }, + "planimetria": { + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet" + } + } + ] + } + }, + "_description": "UCD for Equilino", + "_creationInfo": { + "_user": { + "_username": "fabio.sinibaldi" + } + }, + "_dataAccessPolicies": [ + { + "_policy": { + "_read": "any", + "_write": "any" + }, + "_roles": [ + "Data-Manager" + ] + }, + { + "_policy": { + "_read": "own", + "_write": "own" + }, + "_roles": [ + "Data-Editor" + ] + }, + { + "_policy": { + "_read": "any", + "_write": "none" + }, + "_roles": [ + "Member" + ], + "_enforcer": { + "_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"PUBLISHED\"}}" + } + }, + { + "_policy": { + "_read": "none", + "_write": "none" + }, + "_roles": [] + } + ], + "_handlers": [ + { + "_id": "DEFAULT-SINGLE-STEP", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "PUBLISH", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + }, + { + "STEP": "UNPUBLISH", + "roles": [ + "Data-Manager" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "datiAltimetrici", + "documentPath": "datiAltimetrici[*].fileset" + }, + { + "schemaField": "planimetria", + "documentPath": "planimetria.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..planimetria.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "definizione", + "path": "$._theDocument.definizione", + "type": "TEXT" + }, + { + "name": "denominazione", + "path": "$._theDocument.denominazione", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.descrizione", + "type": "TEXT" + }, + { + "name": "cronologia", + "path": "$._theDocument.cronologia", + "type": "TEXT" + }, + { + "name": "codice_partizione_archeologica", + "path": "$._theDocument.codice_partizione_archeologica", + "type": "TEXT" + }, + { + "name": "modalita_acquisizione", + "path": "$._theDocument.modalita_acquisizione", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "titolare_dati", + "path": "$._theDocument.titolare_dati", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "copyright", + "path": "$._theDocument.copyright", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Dati_Descrittivi", + "sectionName": "$.", + "sectionTitle": "Dati Descrittivi" + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Fonte_Informazione", + "sectionName": "fonteInformazione", + "sectionTitle": "Fonte dell'informazione", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.fonteInformazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Documentazione_Scientifica", + "sectionName": "documentazioneScientifica", + "sectionTitle": "Documentazione scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Documentazione scientifica (in PDF)", + "fieldDefinition": "$.documentazioneScientifica._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Immagine", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 10, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Dati_Altimetrici", + "sectionName": "datiAltimetrici", + "sectionTitle": "Dati Altimetrici", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.datiAltimetrici._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoportalMetadata", + "gcubeName": "Esquilino_Planimetria", + "sectionName": "planimetria", + "sectionTitle": "Planimetria", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.planimetria._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.definizione", + "_theDocument.denominazione", + "_theDocument.descrizione", + "_theDocument.cronologia", + "_theDocument.codice_partizione_archeologica", + "_theDocument.modalita_acquisizione", + "_theDocument.contributore", + "_theDocument.titolare_dati", + "_theDocument.soggetto", + "_theDocument.copyright" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Definition", + "paths": [ + "_theDocument.definizione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Name", + "paths": [ + "_theDocument.denominazione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Code", + "paths": [ + "_theDocument.codice_partizione_archeologica" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.titolare_dati" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Chronology", + "paths": [ + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.definizione", + "_theDocument.denominazione", + "_theDocument.descrizione", + "_theDocument.cronologia", + "_theDocument.codice_partizione_archeologica", + "_theDocument.modalita_acquisizione", + "_theDocument.contributore", + "_theDocument.titolare_dati", + "_theDocument.soggetto", + "_theDocument.copyright" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Definition", + "paths": [ + "_theDocument.definizione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Name", + "paths": [ + "_theDocument.denominazione" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Code", + "paths": [ + "_theDocument.codice_partizione_archeologica" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.titolare_dati" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Chronology", + "paths": [ + "_theDocument.cronologia" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [ + "PUBLISH" + ], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "submit_for_review", + "title": "Submit for Review", + "call_STEPS": [ + "PUBLISH" + ], + "description": "Publish the Project", + "display_on_phase": [ + "DRAFT" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "Published" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "PUBLISHED" + ] + } + ] + } + } + ] +} \ No newline at end of file diff --git a/D4S_UCDs/PROD/GNA/Concessioni.json b/D4S_UCDs/PROD/GNA/Concessioni.json new file mode 100644 index 0000000..6aaf92f --- /dev/null +++ b/D4S_UCDs/PROD/GNA/Concessioni.json @@ -0,0 +1,815 @@ +{ + "_id": "profiledConcessioni", + "_version": "1.0.0", + "_name": "Indagini svolte in regime di concessione", + "_schema": { + "abstractRelazione": { + "_min": 1, + "_children": [ + { + "filesetIta": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "filesetEng": { + "_type": "RegisteredFileSet" + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "relazioneScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "immaginiRappresentative": { + "_max": 4, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "posizionamentoScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "pianteFineScavo": { + "_max": -1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + } + }, + "_description": "Embedded profile for concessioni [mibac] management", + "_creationInfo": { + "_user": { + "_username": "francesco.mangiacrapa" + } + }, + "_dataAccessPolicies": [ + { + "_policy": { + "_read": "any", + "_write": "any" + }, + "_roles": [ + "Data-Manager" + ] + }, + { + "_policy": { + "_read": "own", + "_write": "own" + }, + "_roles": [ + "Data-Editor" + ] + }, + { + "_policy": { + "_read": "any", + "_write": "none" + }, + "_roles": [ + "Member" + ], + "_enforcer": { + "_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}" + } + }, + { + "_policy": { + "_read": "none", + "_write": "none" + }, + "_roles": [] + } + ], + "_handlers": [ + { + "_id": "GNA-CONCESSIONI-LC", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "SUBMIT-FOR-REVIEW", + "roles": [] + }, + { + "STEP": "REJECT-DRAFT", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + }, + { + "STEP": "APPROVE-SUBMITTED", + "roles": [ + "Data-Manager" + ] + }, + { + "STEP": "UNPUBLISH", + "roles": [ + "Data-Manager" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "pianteFineScavo", + "documentPath": "pianteFineScavo[*].fileset" + }, + { + "schemaField": "posizionamentoScavo", + "documentPath": "posizionamentoScavo.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..posizionamentoScavo.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "nome", + "path": "$._theDocument.nome", + "type": "TEXT" + }, + { + "name": "data_inizio_progetto", + "path": "$._theDocument.dataInizioProgetto", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.introduzione", + "type": "TEXT" + }, + { + "name": "contenuto", + "path": "$._theDocument.descrizioneContenuto", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "responsabile", + "path": "$._theDocument.responsabile", + "type": "TEXT" + }, + { + "name": "editore", + "path": "$._theDocument.editore", + "type": "TEXT" + }, + { + "name": "ufficio_mic_competente", + "path": "$._theDocument.ufficioMic", + "type": "TEXT" + }, + { + "name": "funzionario_responsabile", + "path": "$._theDocument.funzionarioResponsabile", + "type": "TEXT" + }, + { + "name": "finanziamento", + "path": "$._theDocument.fontiFinanziamento", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "risorse", + "path": "$._theDocument.risorseCorrelate", + "type": "TEXT" + }, + { + "name": "data_fine_progetto", + "path": "$._theDocument.dataFineProgetto", + "type": "TEXT" + }, + { + "name": "data_archiviazione", + "path": "$._info._lastEditInfo._instant", + "type": "TEXT" + }, + { + "name": "versione", + "path": "$._version", + "type": "TEXT" + }, + { + "name": "licenza", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "accesso", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "parole_chiave", + "path": "$._theDocument.paroleChiaveLibere", + "type": "TEXT" + }, + { + "name": "modalita_individuazione", + "path": "$._theDocument.modalitaIndividuazione", + "type": "TEXT" + }, + { + "name": "contesto_indagine", + "path": "$._theDocument.contestoIndagine", + "type": "TEXT" + }, + { + "name": "denominazione", + "path": "$._theDocument.denominazione", + "type": "TEXT" + }, + { + "name": "stato_attuale", + "path": "$._theDocument.statoAttuale", + "type": "TEXT" + }, + { + "name": "accessibilita", + "path": "$._theDocument.accessibilita", + "type": "TEXT" + }, + { + "name": "cronologia_macrofase", + "path": "$._theDocument.cronologiaMacrofase", + "type": "TEXT", + "apply_regex": { + "type": "replaceAll", + "regex": "(\\s)?\\([\\s\\S]*", + "replacement": "" + } + }, + { + "name": "specifiche_cronologia", + "path": "$._theDocument.specificheCronologia", + "type": "TEXT" + }, + { + "name": "quota_max", + "path": "$._theDocument.quotaMax", + "type": "TEXT" + }, + { + "name": "quota_min", + "path": "$._theDocument.quotaMin", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Informazioni_di_progetto", + "sectionName": "$.", + "sectionTitle": "Informazioni di Progetto" + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Abstract_Relazione_di_Scavo", + "sectionName": "abstractRelazione", + "sectionTitle": "Abstract della Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + }, + { + "gcubeProfileFieldName": "Carica Abstract Eng (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetEng)]", + "fieldName": "filesetEng" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Relazione_di_Scavo", + "sectionName": "relazioneScavo", + "sectionTitle": "Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Relazione scientifica (in PDF)", + "fieldDefinition": "$.relazioneScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Immagine_Rappresentativa_di_Scavo", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 4, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Posizionamento_dell_area_di_indagine", + "sectionName": "posizionamentoScavo", + "sectionTitle": "Posizionamento dell'Area di Indagine", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.posizionamentoScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Pianta_di_fine_Scavo", + "sectionName": "pianteFineScavo", + "sectionTitle": "Piante di Fine Indagine", + "parentName": "$.", + "minOccurs": 0, + "maxOccurs": 0, + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.pianteFineScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.contributore", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.contestoIndagine", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (yyyy-mm-dd)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.responsabile", + "_theDocument.editore" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.contributore", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.contestoIndagine", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": false, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (YEAR)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.responsabile", + "_theDocument.editore" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-timeline-json-template", + "_type": "TIMELINE_JSON_TEMPLATE", + "_configuration": { + "tjt_document": { + "content": "$.nome", + "title": "$.nome", + "start": "$.dataInizioProgetto", + "end": "$.dataFineProgetto" + } + } + }, + { + "_id": "org.gcube.portlets.user.grouped_overlay_layers", + "_type": "GROUPED_OVERLAY_LAYERS", + "_configuration": { + "grouped_overlay_layers": [ + { + "name": "Limiti Amministrativi Italiani 2023 (fonte ISTAT)", + "description": "Layers automatically added to the Map", + "layers": [ + { + "title": "Regioni", + "name": "limiti_amministrativi:regioni", + "wms_url": "https://geoserver-geona.cloud.d4science.org/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=limiti_amministrativi:regioni&styles=&bbox=6.626621368537682,35.49285260122859,18.520381599098922,47.09178374646218&width=768&height=748&srs=EPSG:4326&format=application%2Fopenlayers", + "display": true + }, + { + "title": "Province", + "name": "limiti_amministrativi:province", + "wms_url": "https://geoserver-geona.cloud.d4science.org/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=limiti_amministrativi:province&styles=&bbox=6.626621368537682,35.49285260122859,18.520381599098922,47.09178374646218&width=768&height=748&srs=EPSG:4326&format=application%2Fopenlayers", + "display": true + }, + { + "title": "Comuni", + "name": "limiti_amministrativi:comuni", + "wms_url": "https://geoserver-geona.cloud.d4science.org/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=limiti_amministrativi:comuni&styles=&bbox=6.626621368537682,35.49285260122859,18.520381599098922,47.09178374646218&width=768&height=748&srs=EPSG:4326&format=application%2Fopenlayers", + "display": true + } + ] + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.grouped_cross_filtering_layers", + "_type": "GROUPED_CROSS_FILTERING_LAYERS", + "_configuration": { + "grouped_cross_filtering_layers": [ + { + "name": "Limiti Amministrativi Italiani 2023 (fonte ISTAT)", + "description": "Spatial filtering for the selected layer", + "layers": [ + { + "title": "Regioni", + "description": "Le Regioni Italiane", + "name": "limiti_amministrativi:regioni", + "wfs_url": "https://geoserver-geona.cloud.d4science.org/geoserver/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=limiti_amministrativi:regioni&maxFeatures=50&outputFormat=application%2Fjson&propertyName=COD_REG,DEN_REG&sortby=DEN_REG", + "table_show_field": "DEN_REG", + "table_key_field": "COD_REG", + "table_parent_key_field": "", + "table_geometry_name": "the_geom", + "related_to": [ + { + "title": "Province", + "description": "Le Province Italiane", + "name": "limiti_amministrativi:province", + "wfs_url": "https://geoserver-geona.cloud.d4science.org/geoserver/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=limiti_amministrativi:province&maxFeatures=150&outputFormat=application%2Fjson&propertyName=COD_PROV,DEN_PROV,COD_REG&sortby=DEN_PROV", + "table_show_field": "DEN_PROV", + "table_key_field": "COD_PROV", + "table_parent_key_field": "COD_REG", + "table_geometry_name": "the_geom", + "related_to": [ + { + "title": "Comuni", + "description": "I Comuni Italiani", + "name": "limiti_amministrativi:comuni", + "wfs_url": "https://geoserver-geona.cloud.d4science.org/geoserver/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=limiti_amministrativi:comuni&maxFeatures=9000&outputFormat=application%2Fjson&propertyName=PRO_COM,COMUNE,COD_PROV&sortby=COMUNE", + "table_show_field": "COMUNE", + "table_key_field": "PRO_COM", + "table_parent_key_field": "COD_PROV", + "table_geometry_name": "the_geom" + } + ] + } + ] + } + ] + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "submit_for_review", + "title": "Submit for Review", + "call_STEPS": [ + "SUBMIT-FOR-REVIEW" + ], + "description": "Submit the Project (for review)", + "display_on_phase": [ + "DRAFT" + ] + }, + { + "id": "reject", + "title": "Reject", + "call_STEPS": [ + "REJECT-DRAFT" + ], + "description": "Reject the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "approve", + "title": "Approve", + "call_STEPS": [ + "APPROVE-SUBMITTED" + ], + "description": "Approve the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "Published" + ] + } + ] + } + } + ], + "_relationshipDefinitions": [ + { + "_id": "precedes", + "_label": "Precede", + "_reverseRelationId": "follows" + }, + { + "_id": "follows", + "_label": "Segue", + "_reverseRelationId": "precedes" + } + ] +} \ No newline at end of file diff --git a/D4S_UCDs/PROD/GNA/Concessioni_back.json b/D4S_UCDs/PROD/GNA/Concessioni_back.json new file mode 100644 index 0000000..42b87f2 --- /dev/null +++ b/D4S_UCDs/PROD/GNA/Concessioni_back.json @@ -0,0 +1,702 @@ +{ + "_id": "profiledConcessioni", + "_version": "1.0.0", + "_name": "Indagini svolte in regime di concessione", + "_schema": { + "abstractRelazione": { + "_min": 1, + "_children": [ + { + "filesetIta": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "filesetEng": { + "_type": "RegisteredFileSet" + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "relazioneScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "immaginiRappresentative": { + "_max": 4, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "posizionamentoScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "pianteFineScavo": { + "_max": -1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + } + }, + "_description": "Embedded profile for concessioni [mibac] management", + "_creationInfo": { + "_user": { + "_username": "francesco.mangiacrapa" + } + }, + "_dataAccessPolicies": [ + { + "_policy": { + "_read": "any", + "_write": "any" + }, + "_roles": [ + "Data-Manager" + ] + }, + { + "_policy": { + "_read": "own", + "_write": "own" + }, + "_roles": [ + "Data-Editor" + ] + }, + { + "_policy": { + "_read": "any", + "_write": "none" + }, + "_roles": [ + "Member" + ], + "_enforcer": { + "_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}" + } + }, + { + "_policy": { + "_read": "none", + "_write": "none" + }, + "_roles": [] + } + ], + "_handlers": [ + { + "_id": "GNA-CONCESSIONI-LC", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "SUBMIT-FOR-REVIEW", + "roles": [] + }, + { + "STEP": "REJECT-DRAFT", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + }, + { + "STEP": "APPROVE-SUBMITTED", + "roles": [ + "Data-Manager" + ] + }, + { + "STEP": "UNPUBLISH", + "roles": [ + "Data-Manager" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "pianteFineScavo", + "documentPath": "pianteFineScavo[*].fileset" + }, + { + "schemaField": "posizionamentoScavo", + "documentPath": "posizionamentoScavo.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..posizionamentoScavo.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "nome", + "path": "$._theDocument.nome", + "type": "TEXT" + }, + { + "name": "data_inizio_progetto", + "path": "$._theDocument.dataInizioProgetto", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.introduzione", + "type": "TEXT" + }, + { + "name": "contenuto", + "path": "$._theDocument.descrizioneContenuto", + "type": "TEXT" + }, + { + "name": "autore", + "path": "$._theDocument.authors", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "titolare", + "path": "$._theDocument.titolari", + "type": "TEXT" + }, + { + "name": "responsabile", + "path": "$._theDocument.responsabile", + "type": "TEXT" + }, + { + "name": "editore", + "path": "$._theDocument.editore", + "type": "TEXT" + }, + { + "name": "finanziamento", + "path": "$._theDocument.fontiFinanziamento", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "risorse", + "path": "$._theDocument.risorseCorrelate", + "type": "TEXT" + }, + { + "name": "data_fine_progetto", + "path": "$._theDocument.dataFineProgetto", + "type": "TEXT" + }, + { + "name": "data_archiviazione", + "path": "$._info._lastEditInfo._instant", + "type": "TEXT" + }, + { + "name": "versione", + "path": "$._version", + "type": "TEXT" + }, + { + "name": "licenza", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "titolare_licenza", + "path": "$._theDocument.titolareLicenza", + "type": "TEXT" + }, + { + "name": "accesso", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "parole_chiave", + "path": "$._theDocument.paroleChiaveLibere", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Informazioni_di_progetto", + "sectionName": "$.", + "sectionTitle": "Informazioni di Progetto" + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Abstract_Relazione_di_Scavo", + "sectionName": "abstractRelazione", + "sectionTitle": "Abstract della Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + }, + { + "gcubeProfileFieldName": "Carica Abstract Eng (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetEng)]", + "fieldName": "filesetEng" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Relazione_di_Scavo", + "sectionName": "relazioneScavo", + "sectionTitle": "Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Relazione scientifica (in PDF)", + "fieldDefinition": "$.relazioneScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Immagine_Rappresentativa_di_Scavo", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 4, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Posizionamento_dell_area_di_indagine", + "sectionName": "posizionamentoScavo", + "sectionTitle": "Posizionamento dell'Area di Indagine", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.posizionamentoScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Pianta_di_fine_Scavo", + "sectionName": "pianteFineScavo", + "sectionTitle": "Piante di Fine Indagine", + "parentName": "$.", + "minOccurs": 0, + "maxOccurs": 0, + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.pianteFineScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Author/s", + "paths": [ + "_theDocument.authors" + ], + "operator": "$and", + "searchable": false, + "sortable": true, + "asResult": true + }, + { + "label": "Project Start (yyyy-mm-dd)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": false, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (YEAR)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-timeline-json-template", + "_type": "TIMELINE_JSON_TEMPLATE", + "_configuration": { + "tjt_document": { + "content": "$.nome", + "title": "$.nome", + "start": "$.dataInizioProgetto", + "end": "$.dataFineProgetto" + } + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "submit_for_review", + "title": "Submit for Review", + "call_STEPS": [ + "SUBMIT-FOR-REVIEW" + ], + "description": "Submit the Project (for review)", + "display_on_phase": [ + "DRAFT" + ] + }, + { + "id": "reject", + "title": "Reject", + "call_STEPS": [ + "REJECT-DRAFT" + ], + "description": "Reject the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "approve", + "title": "Approve", + "call_STEPS": [ + "APPROVE-SUBMITTED" + ], + "description": "Approve the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "Published" + ] + } + ] + } + } + ], + "_relationshipDefinitions": [ + { + "_id": "precedes", + "_label": "Precede", + "_reverseRelationId": "follows" + }, + { + "_id": "follows", + "_label": "Segue", + "_reverseRelationId": "precedes" + } + ] +} \ No newline at end of file diff --git a/D4S_UCDs/PROD/GNA/Concessioni_estere.json b/D4S_UCDs/PROD/GNA/Concessioni_estere.json new file mode 100644 index 0000000..8d3b8a5 --- /dev/null +++ b/D4S_UCDs/PROD/GNA/Concessioni_estere.json @@ -0,0 +1,735 @@ +{ + "_id": "concessioni-estere", + "_version": "1.0.0", + "_name": "Missioni archeologiche italiane all'estero", + "_schema": { + "abstractRelazione": { + "_min": 1, + "_children": [ + { + "filesetIta": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "filesetEng": { + "_type": "RegisteredFileSet" + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "relazioneScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "immaginiRappresentative": { + "_max": 4, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "posizionamentoScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "pianteFineScavo": { + "_max": -1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + } + }, + "_description": "Embedded profile for concessioni estere [mibac] management", + "_creationInfo": { + "_user": { + "_username": "francesco.mangiacrapa" + } + }, + "_dataAccessPolicies": [ + { + "_policy": { + "_read": "any", + "_write": "any" + }, + "_roles": [ + "Data-Manager" + ] + }, + { + "_policy": { + "_read": "own", + "_write": "own" + }, + "_roles": [ + "Data-Editor" + ] + }, + { + "_policy": { + "_read": "any", + "_write": "none" + }, + "_roles": [ + "Member" + ], + "_enforcer": { + "_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}" + } + }, + { + "_policy": { + "_read": "none", + "_write": "none" + }, + "_roles": [] + } + ], + "_handlers": [ + { + "_id": "GNA-CONCESSIONI-LC", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "SUBMIT-FOR-REVIEW", + "roles": [] + }, + { + "STEP": "REJECT-DRAFT", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + }, + { + "STEP": "APPROVE-SUBMITTED", + "roles": [ + "Data-Manager" + ] + }, + { + "STEP": "UNPUBLISH", + "roles": [ + "Data-Manager" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "pianteFineScavo", + "documentPath": "pianteFineScavo[*].fileset" + }, + { + "schemaField": "posizionamentoScavo", + "documentPath": "posizionamentoScavo.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..posizionamentoScavo.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "nome", + "path": "$._theDocument.nome", + "type": "TEXT" + }, + { + "name": "data_inizio_progetto", + "path": "$._theDocument.dataInizioProgetto", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.introduzione", + "type": "TEXT" + }, + { + "name": "contenuto", + "path": "$._theDocument.descrizioneContenuto", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "responsabile", + "path": "$._theDocument.responsabile", + "type": "TEXT" + }, + { + "name": "editore", + "path": "$._theDocument.editore", + "type": "TEXT" + }, + { + "name": "ufficio_competente", + "path": "$._theDocument.ufficioCompetente", + "type": "TEXT" + }, + { + "name": "funzionario_responsabile", + "path": "$._theDocument.funzionarioResponsabile", + "type": "TEXT" + }, + { + "name": "finanziamento", + "path": "$._theDocument.fontiFinanziamento", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "risorse", + "path": "$._theDocument.risorseCorrelate", + "type": "TEXT" + }, + { + "name": "data_fine_progetto", + "path": "$._theDocument.dataFineProgetto", + "type": "TEXT" + }, + { + "name": "data_archiviazione", + "path": "$._info._lastEditInfo._instant", + "type": "TEXT" + }, + { + "name": "versione", + "path": "$._version", + "type": "TEXT" + }, + { + "name": "licenza", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "accesso", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "parole_chiave", + "path": "$._theDocument.paroleChiaveLibere", + "type": "TEXT" + }, + { + "name": "modalita_individuazione", + "path": "$._theDocument.modalitaIndividuazione", + "type": "TEXT" + }, + { + "name": "contesto_indagine", + "path": "$._theDocument.contestoIndagine", + "type": "TEXT" + }, + { + "name": "denominazione", + "path": "$._theDocument.denominazione", + "type": "TEXT" + }, + { + "name": "stato_attuale", + "path": "$._theDocument.statoAttuale", + "type": "TEXT" + }, + { + "name": "accessibilita", + "path": "$._theDocument.accessibilita", + "type": "TEXT" + }, + { + "name": "cronologia_macrofase", + "path": "$._theDocument.cronologiaMacrofase", + "type": "TEXT", + "apply_regex": { + "type": "replaceAll", + "regex": "(\\s)?\\([\\s\\S]*", + "replacement": "" + } + }, + { + "name": "specifiche_cronologia", + "path": "$._theDocument.specificheCronologia", + "type": "TEXT" + }, + { + "name": "quota_max", + "path": "$._theDocument.quotaMax", + "type": "TEXT" + }, + { + "name": "quota_min", + "path": "$._theDocument.quotaMin", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Informazioni_di_progetto_estero", + "sectionName": "$.", + "sectionTitle": "Informazioni di Progetto Estero" + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Abstract_Relazione_di_Scavo", + "sectionName": "abstractRelazione", + "sectionTitle": "Abstract della Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + }, + { + "gcubeProfileFieldName": "Carica Abstract Eng (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetEng)]", + "fieldName": "filesetEng" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Relazione_di_Scavo", + "sectionName": "relazioneScavo", + "sectionTitle": "Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Relazione scientifica (in PDF)", + "fieldDefinition": "$.relazioneScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Immagine_Rappresentativa_di_Scavo", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 4, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Posizionamento_dell_area_di_indagine", + "sectionName": "posizionamentoScavo", + "sectionTitle": "Posizionamento dell'Area di Indagine", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.posizionamentoScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Pianta_di_fine_Scavo", + "sectionName": "pianteFineScavo", + "sectionTitle": "Piante di Fine Indagine", + "parentName": "$.", + "minOccurs": 0, + "maxOccurs": 0, + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.pianteFineScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.contributore", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.contestoIndagine", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (yyyy-mm-dd)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.responsabile", + "_theDocument.editore" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.contributore", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.contestoIndagine", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": false, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (YEAR)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.contributore", + "_theDocument.responsabile", + "_theDocument.editore" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.cronologiaMacrofase", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-timeline-json-template", + "_type": "TIMELINE_JSON_TEMPLATE", + "_configuration": { + "tjt_document": { + "content": "$.nome", + "title": "$.nome", + "start": "$.dataInizioProgetto", + "end": "$.dataFineProgetto" + } + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "submit_for_review", + "title": "Submit for Review", + "call_STEPS": [ + "SUBMIT-FOR-REVIEW" + ], + "description": "Submit the Project (for review)", + "display_on_phase": [ + "DRAFT" + ] + }, + { + "id": "reject", + "title": "Reject", + "call_STEPS": [ + "REJECT-DRAFT" + ], + "description": "Reject the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "approve", + "title": "Approve", + "call_STEPS": [ + "APPROVE-SUBMITTED" + ], + "description": "Approve the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "Published" + ] + } + ] + } + } + ], + "_relationshipDefinitions": [ + { + "_id": "precedes", + "_label": "Precede", + "_reverseRelationId": "follows" + }, + { + "_id": "follows", + "_label": "Segue", + "_reverseRelationId": "precedes" + } + ] +} \ No newline at end of file diff --git a/D4S_UCDs/PROD/GNA/backup/Concessioni_back_01-2024.json b/D4S_UCDs/PROD/GNA/backup/Concessioni_back_01-2024.json new file mode 100644 index 0000000..e8df07a --- /dev/null +++ b/D4S_UCDs/PROD/GNA/backup/Concessioni_back_01-2024.json @@ -0,0 +1,782 @@ +{ + "_id": "profiledConcessioni", + "_version": "1.0.0", + "_name": "Indagini svolte in regime di concessione", + "_schema": { + "abstractRelazione": { + "_min": 1, + "_children": [ + { + "filesetIta": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "filesetEng": { + "_type": "RegisteredFileSet" + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "relazioneScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "immaginiRappresentative": { + "_max": 4, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "posizionamentoScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "pianteFineScavo": { + "_max": -1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + } + }, + "_description": "Embedded profile for concessioni [mibac] management", + "_creationInfo": { + "_user": { + "_username": "francesco.mangiacrapa" + } + }, + "_dataAccessPolicies": [ + { + "_policy": { + "_read": "any", + "_write": "any" + }, + "_roles": [ + "Data-Manager" + ] + }, + { + "_policy": { + "_read": "own", + "_write": "own" + }, + "_roles": [ + "Data-Editor" + ] + }, + { + "_policy": { + "_read": "any", + "_write": "none" + }, + "_roles": [ + "Member" + ], + "_enforcer": { + "_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}" + } + }, + { + "_policy": { + "_read": "none", + "_write": "none" + }, + "_roles": [] + } + ], + "_handlers": [ + { + "_id": "GNA-CONCESSIONI-LC", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "SUBMIT-FOR-REVIEW", + "roles": [] + }, + { + "STEP": "REJECT-DRAFT", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + }, + { + "STEP": "APPROVE-SUBMITTED", + "roles": [ + "Data-Manager" + ] + }, + { + "STEP": "UNPUBLISH", + "roles": [ + "Data-Manager" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "pianteFineScavo", + "documentPath": "pianteFineScavo[*].fileset" + }, + { + "schemaField": "posizionamentoScavo", + "documentPath": "posizionamentoScavo.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..posizionamentoScavo.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "nome", + "path": "$._theDocument.nome", + "type": "TEXT" + }, + { + "name": "data_inizio_progetto", + "path": "$._theDocument.dataInizioProgetto", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.introduzione", + "type": "TEXT" + }, + { + "name": "contenuto", + "path": "$._theDocument.descrizioneContenuto", + "type": "TEXT" + }, + { + "name": "autore", + "path": "$._theDocument.authors", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "titolare", + "path": "$._theDocument.titolari", + "type": "TEXT" + }, + { + "name": "responsabile", + "path": "$._theDocument.responsabile", + "type": "TEXT" + }, + { + "name": "editore", + "path": "$._theDocument.editore", + "type": "TEXT" + }, + { + "name": "finanziamento", + "path": "$._theDocument.fontiFinanziamento", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "risorse", + "path": "$._theDocument.risorseCorrelate", + "type": "TEXT" + }, + { + "name": "data_fine_progetto", + "path": "$._theDocument.dataFineProgetto", + "type": "TEXT" + }, + { + "name": "data_archiviazione", + "path": "$._info._lastEditInfo._instant", + "type": "TEXT" + }, + { + "name": "versione", + "path": "$._version", + "type": "TEXT" + }, + { + "name": "licenza", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "titolare_licenza", + "path": "$._theDocument.titolareLicenza", + "type": "TEXT" + }, + { + "name": "accesso", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "parole_chiave", + "path": "$._theDocument.paroleChiaveLibere", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Informazioni_di_progetto", + "sectionName": "$.", + "sectionTitle": "Informazioni di Progetto" + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Abstract_Relazione_di_Scavo", + "sectionName": "abstractRelazione", + "sectionTitle": "Abstract della Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + }, + { + "gcubeProfileFieldName": "Carica Abstract Eng (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetEng)]", + "fieldName": "filesetEng" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Relazione_di_Scavo", + "sectionName": "relazioneScavo", + "sectionTitle": "Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Relazione scientifica (in PDF)", + "fieldDefinition": "$.relazioneScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Immagine_Rappresentativa_di_Scavo", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 4, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Posizionamento_dell_area_di_indagine", + "sectionName": "posizionamentoScavo", + "sectionTitle": "Posizionamento dell'Area di Indagine", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.posizionamentoScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Pianta_di_fine_Scavo", + "sectionName": "pianteFineScavo", + "sectionTitle": "Piante di Fine Indagine", + "parentName": "$.", + "minOccurs": 0, + "maxOccurs": 0, + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.pianteFineScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Author/s", + "paths": [ + "_theDocument.authors" + ], + "operator": "$and", + "searchable": false, + "sortable": true, + "asResult": true + }, + { + "label": "Project Start (yyyy-mm-dd)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": false, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (YEAR)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-timeline-json-template", + "_type": "TIMELINE_JSON_TEMPLATE", + "_configuration": { + "tjt_document": { + "content": "$.nome", + "title": "$.nome", + "start": "$.dataInizioProgetto", + "end": "$.dataFineProgetto" + } + } + }, + { + "_id": "org.gcube.portlets.user.grouped_overlay_layers", + "_type": "GROUPED_OVERLAY_LAYERS", + "_configuration": { + "grouped_overlay_layers": [ + { + "name": "Limiti Amministrativi Italiani 2023 (fonte ISTAT)", + "description": "Layers automatically added to the Map", + "layers": [ + { + "title": "Regioni", + "name": "limiti_amministrativi:regioni", + "wms_url": "https://geona-proto.d4science.org/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=limiti_amministrativi:regioni&styles=&bbox=6.626621368537682,35.49285260122859,18.520381599098922,47.09178374646218&width=768&height=748&srs=EPSG:4326&format=application%2Fopenlayers", + "display": true + }, + { + "title": "Province", + "name": "limiti_amministrativi:province", + "wms_url": "https://geona-proto.d4science.org/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=limiti_amministrativi:province&styles=&bbox=6.626621368537682,35.49285260122859,18.520381599098922,47.09178374646218&width=768&height=748&srs=EPSG:4326&format=application%2Fopenlayers", + "display": true + }, + { + "title": "Comuni", + "name": "limiti_amministrativi:comuni", + "wms_url": "https://geona-proto.d4science.org/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=limiti_amministrativi:comuni&styles=&bbox=6.626621368537682,35.49285260122859,18.520381599098922,47.09178374646218&width=768&height=748&srs=EPSG:4326&format=application%2Fopenlayers", + "display": true + } + ] + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.grouped_cross_filtering_layers", + "_type": "GROUPED_CROSS_FILTERING_LAYERS", + "_configuration": { + "grouped_cross_filtering_layers": [ + { + "name": "Limiti Amministrativi Italiani 2023 (fonte ISTAT)", + "description": "Spatial filtering for the selected layer", + "layers": [ + { + "title": "Regioni", + "description": "Le Regioni Italiane", + "name": "limiti_amministrativi:regioni", + "wfs_url": "https://geona-proto.d4science.org/geoserver/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=limiti_amministrativi:regioni&maxFeatures=50&outputFormat=application%2Fjson&propertyName=COD_REG,DEN_REG&sortby=DEN_REG", + "table_show_field": "DEN_REG", + "table_key_field": "COD_REG", + "table_parent_key_field": "", + "table_geometry_name": "the_geom", + "related_to": [ + { + "title": "Province", + "description": "Le Province Italiane", + "name": "limiti_amministrativi:province", + "wfs_url": "https://geona-proto.d4science.org/geoserver/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=limiti_amministrativi:province&maxFeatures=150&outputFormat=application%2Fjson&propertyName=COD_PROV,DEN_PROV,COD_REG&sortby=DEN_PROV", + "table_show_field": "DEN_PROV", + "table_key_field": "COD_PROV", + "table_parent_key_field": "COD_REG", + "table_geometry_name": "the_geom", + "related_to": [ + { + "title": "Comuni", + "description": "I Comuni Italiani", + "name": "limiti_amministrativi:comuni", + "wfs_url": "https://geona-proto.d4science.org/geoserver/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=limiti_amministrativi:comuni&maxFeatures=9000&outputFormat=application%2Fjson&propertyName=PRO_COM,COMUNE,COD_PROV&sortby=COMUNE", + "table_show_field": "COMUNE", + "table_key_field": "PRO_COM", + "table_parent_key_field": "COD_PROV", + "table_geometry_name": "the_geom" + } + ] + } + ] + } + ] + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "submit_for_review", + "title": "Submit for Review", + "call_STEPS": [ + "SUBMIT-FOR-REVIEW" + ], + "description": "Submit the Project (for review)", + "display_on_phase": [ + "DRAFT" + ] + }, + { + "id": "reject", + "title": "Reject", + "call_STEPS": [ + "REJECT-DRAFT" + ], + "description": "Reject the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "approve", + "title": "Approve", + "call_STEPS": [ + "APPROVE-SUBMITTED" + ], + "description": "Approve the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "Published" + ] + } + ] + } + } + ], + "_relationshipDefinitions": [ + { + "_id": "precedes", + "_label": "Precede", + "_reverseRelationId": "follows" + }, + { + "_id": "follows", + "_label": "Segue", + "_reverseRelationId": "precedes" + } + ] +} \ No newline at end of file diff --git a/D4S_UCDs/PROD/GNA/backup/Concessioni_estere_back_01-2024.json b/D4S_UCDs/PROD/GNA/backup/Concessioni_estere_back_01-2024.json new file mode 100644 index 0000000..9e114e5 --- /dev/null +++ b/D4S_UCDs/PROD/GNA/backup/Concessioni_estere_back_01-2024.json @@ -0,0 +1,669 @@ +{ + "_id": "concessioni-estere", + "_version": "1.0.0", + "_name": "Missioni archeologiche italiane all'estero", + "_schema": { + "abstractRelazione": { + "_min": 1, + "_children": [ + { + "filesetIta": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "filesetEng": { + "_type": "RegisteredFileSet" + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "relazioneScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "immaginiRappresentative": { + "_max": 4, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "posizionamentoScavo": { + "_max": 1, + "_min": 1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + }, + "pianteFineScavo": { + "_max": -1, + "_children": [ + { + "fileset": { + "_type": "RegisteredFileSet", + "_min": 1 + } + }, + { + "title": { + "_min": 1 + } + } + ] + } + }, + "_description": "Embedded profile for concessioni estere [mibac] management", + "_creationInfo": { + "_user": { + "_username": "francesco.mangiacrapa" + } + }, + "_dataAccessPolicies": [ + {"_policy": {"_read": "any","_write": "any"}, + "_roles": ["Data-Manager"]}, + {"_policy": {"_read": "own","_write": "own"}, + "_roles": ["Data-Editor"]}, + {"_policy": {"_read": "any","_write": "none"}, + "_roles": ["Member"], + "_enforcer": {"_filter": "{\"_lifecycleInformation._phase\" : {\"$eq\" : \"Published\"}}"}}, + {"_policy": {"_read": "none","_write": "none"}, + "_roles": []} + ], + "_handlers": [ + { + "_id": "GNA-CONCESSIONI-LC", + "_type": "LifecycleManagement", + "_configuration": { + "step_access": [ + { + "STEP": "SUBMIT-FOR-REVIEW", + "roles": [] + }, + { + "STEP": "REJECT-DRAFT", + "roles": [ + "Data-Manager", + "Data-Editor" + ] + }, + { + "STEP": "APPROVE-SUBMITTED", + "roles": [ + "Data-Manager" + ] + }, + { + "STEP": "UNPUBLISH", + "roles": [ + "Data-Manager" + ] + } + ] + } + }, + { + "_id": "SDI-Default-Materializer", + "_type": "Materializer", + "_configuration": { + "registeredFileSetPaths": [ + { + "schemaField": "pianteFineScavo", + "documentPath": "pianteFineScavo[*].fileset" + }, + { + "schemaField": "posizionamentoScavo", + "documentPath": "posizionamentoScavo.fileset" + } + ] + } + }, + { + "_id": "SDI-Indexer-Plugin", + "_type": "Indexer", + "_configuration": { + "bboxEvaluation": [ + "$..posizionamentoScavo.._bbox" + ], + "explicitFieldMapping": [ + { + "name": "nome", + "path": "$._theDocument.nome", + "type": "TEXT" + }, + { + "name": "data_inizio_progetto", + "path": "$._theDocument.dataInizioProgetto", + "type": "TEXT" + }, + { + "name": "descrizione", + "path": "$._theDocument.introduzione", + "type": "TEXT" + }, + { + "name": "contenuto", + "path": "$._theDocument.descrizioneContenuto", + "type": "TEXT" + }, + { + "name": "autore", + "path": "$._theDocument.authors", + "type": "TEXT" + }, + { + "name": "contributore", + "path": "$._theDocument.contributore", + "type": "TEXT" + }, + { + "name": "titolare", + "path": "$._theDocument.titolari", + "type": "TEXT" + }, + { + "name": "responsabile", + "path": "$._theDocument.responsabile", + "type": "TEXT" + }, + { + "name": "editore", + "path": "$._theDocument.editore", + "type": "TEXT" + }, + { + "name": "finanziamento", + "path": "$._theDocument.fontiFinanziamento", + "type": "TEXT" + }, + { + "name": "soggetto", + "path": "$._theDocument.soggetto", + "type": "TEXT" + }, + { + "name": "risorse", + "path": "$._theDocument.risorseCorrelate", + "type": "TEXT" + }, + { + "name": "data_fine_progetto", + "path": "$._theDocument.dataFineProgetto", + "type": "TEXT" + }, + { + "name": "data_archiviazione", + "path": "$._info._lastEditInfo._instant", + "type": "TEXT" + }, + { + "name": "versione", + "path": "$._version", + "type": "TEXT" + }, + { + "name": "licenza", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "titolare_licenza", + "path": "$._theDocument.titolareLicenza", + "type": "TEXT" + }, + { + "name": "accesso", + "path": "$._info._access._license", + "type": "TEXT" + }, + { + "name": "parole_chiave", + "path": "$._theDocument.paroleChiaveLibere", + "type": "TEXT" + } + ], + "jslt": {}, + "additionalLayers": [ + { + "source": { + "url": "..." + }, + "toSetTitle": "" + } + ] + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-entry-app", + "_type": "DATA_ENTRY_GUI", + "_configuration": { + "gcubeProfiles": [ + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Informazioni_di_progetto", + "sectionName": "$.", + "sectionTitle": "Informazioni di Progetto" + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Abstract_Relazione_di_Scavo", + "sectionName": "abstractRelazione", + "sectionTitle": "Abstract della Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Carica Abstract Ita (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetIta)]", + "fieldName": "filesetIta" + }, + { + "gcubeProfileFieldName": "Carica Abstract Eng (in PDF)", + "fieldDefinition": "$.abstractRelazione._children[?(@.filesetEng)]", + "fieldName": "filesetEng" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Relazione_di_Scavo", + "sectionName": "relazioneScavo", + "sectionTitle": "Relazione Scientifica", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Relazione scientifica (in PDF)", + "fieldDefinition": "$.relazioneScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Immagine_Rappresentativa_di_Scavo", + "sectionName": "immaginiRappresentative", + "sectionTitle": "Immagini Rappresentative", + "minOccurs": 1, + "maxOccurs": 4, + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "Immagine", + "fieldDefinition": "$.immaginiRappresentative._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Posizionamento_dell_area_di_indagine", + "sectionName": "posizionamentoScavo", + "sectionTitle": "Posizionamento dell'Area di Indagine", + "parentName": "$.", + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.posizionamentoScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + }, + { + "gcubeSecondaryType": "GeoNaMetadata", + "gcubeName": "Pianta_di_fine_Scavo", + "sectionName": "pianteFineScavo", + "sectionTitle": "Piante di Fine Indagine", + "parentName": "$.", + "minOccurs": 0, + "maxOccurs": 0, + "filePaths": [ + { + "gcubeProfileFieldName": "File", + "fieldDefinition": "$.pianteFineScavo._children[?(@.fileset)]", + "fieldName": "fileset" + } + ] + } + ], + "saveStep": "" + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-data-list", + "_type": "DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Author/s", + "paths": [ + "_theDocument.authors" + ], + "operator": "$and", + "searchable": false, + "sortable": true, + "asResult": true + }, + { + "label": "Project Start (yyyy-mm-dd)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Creator", + "paths": [ + "_info._creationInfo._user._username" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Updated", + "paths": [ + "_info._lastEditInfo._instant" + ], + "operator": "$or", + "searchable": false, + "sortable": true, + "asResult": false + }, + { + "label": "Phase", + "paths": [ + "_lifecycleInformation._phase" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + }, + { + "label": "Status", + "paths": [ + "_lifecycleInformation._lastOperationStatus" + ], + "operator": "$or", + "searchable": true, + "sortable": true, + "asResult": false + } + ] + } +}, + { + "_id": "org.gcube.portlets.user.geoportal-basic-data-list", + "_type": "BASIC_DATA_LIST_GUI", + "_configuration": { + "itemFields": [ + { + "label": "Any Field", + "paths": [ + "_theDocument.nome", + "_theDocument.introduzione", + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile", + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Name", + "paths": [ + "_theDocument.nome" + ], + "operator": "$and", + "searchable": true, + "sortable": true, + "asResult": true + }, + { + "label": "Introduction", + "paths": [ + "_theDocument.introduzione" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": false, + "sortable": false, + "asResult": true + }, + { + "label": "Project Start (YEAR)", + "paths": [ + "_theDocument.dataInizioProgetto" + ], + "operator": "$and", + "searchable": true, + "sortable": false, + "asResult": false + }, + { + "label": "Director/Staff", + "paths": [ + "_theDocument.authors", + "_theDocument.contributore", + "_theDocument.titolari", + "_theDocument.editore", + "_theDocument.responsabile" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + }, + { + "label": "Keywords", + "paths": [ + "_theDocument.paroleChiaveLibere", + "_theDocument.paroleChiaveICCD" + ], + "operator": "$or", + "searchable": true, + "sortable": false, + "asResult": true + } + ] + } +} +, + { + "_id": "org.gcube.portlets.user.geoportal-timeline-json-template", + "_type": "TIMELINE_JSON_TEMPLATE", + "_configuration": { + "tjt_document": { + "content": "$.nome", + "title": "$.nome", + "start": "$.dataInizioProgetto", + "end": "$.dataFineProgetto" + } + } + }, + { + "_id": "org.gcube.portlets.user.geoportal-workflow-action-list", + "_type": "WORKFLOW_ACTION_LIST_GUI", + "_configuration": { + "actionsDefinition": [ + { + "id": "post_creation_action", + "title": "Post Creation Action", + "call_STEPS": [], + "description": "Action fired after the Project creation", + "display_on_phase": [] + }, + { + "id": "submit_for_review", + "title": "Submit for Review", + "call_STEPS": [ + "SUBMIT-FOR-REVIEW" + ], + "description": "Submit the Project (for review)", + "display_on_phase": [ + "DRAFT" + ] + }, + { + "id": "reject", + "title": "Reject", + "call_STEPS": [ + "REJECT-DRAFT" + ], + "description": "Reject the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "approve", + "title": "Approve", + "call_STEPS": [ + "APPROVE-SUBMITTED" + ], + "description": "Approve the Project", + "display_on_phase": [ + "Pending Approval" + ] + }, + { + "id": "unpublish", + "title": "UnPublish", + "call_STEPS": [ + "UNPUBLISH" + ], + "description": "UnPublish the Project", + "display_on_phase": [ + "Published" + ] + } + ] + } + } + ], + "_relationshipDefinitions" : [ + {"_id": "precedes", "_label" : "Precede", + "_reverseRelationId" : "follows"}, + {"_id": "follows", "_label" : "Segue", + "_reverseRelationId" : "precedes"} + ] +} diff --git a/FUNDING.md b/FUNDING.md new file mode 100644 index 0000000..9e48b94 --- /dev/null +++ b/FUNDING.md @@ -0,0 +1,26 @@ +# Acknowledgments + +The projects leading to this software have received funding from a series of European Union programmes including: + +- the Sixth Framework Programme for Research and Technological Development + - [DILIGENT](https://cordis.europa.eu/project/id/004260) (grant no. 004260). +- the Seventh Framework Programme for research, technological development and demonstration + - [D4Science](https://cordis.europa.eu/project/id/212488) (grant no. 212488); + - [D4Science-II](https://cordis.europa.eu/project/id/239019) (grant no.239019); + - [ENVRI](https://cordis.europa.eu/project/id/283465) (grant no. 283465); + - [iMarine](https://cordis.europa.eu/project/id/283644) (grant no. 283644); + - [EUBrazilOpenBio](https://cordis.europa.eu/project/id/288754) (grant no. 288754). +- the H2020 research and innovation programme + - [SoBigData](https://cordis.europa.eu/project/id/654024) (grant no. 654024); + - [PARTHENOS](https://cordis.europa.eu/project/id/654119) (grant no. 654119); + - [EGI-Engage](https://cordis.europa.eu/project/id/654142) (grant no. 654142); + - [ENVRI PLUS](https://cordis.europa.eu/project/id/654182) (grant no. 654182); + - [BlueBRIDGE](https://cordis.europa.eu/project/id/675680) (grant no. 675680); + - [PerformFISH](https://cordis.europa.eu/project/id/727610) (grant no. 727610); + - [AGINFRA PLUS](https://cordis.europa.eu/project/id/731001) (grant no. 731001); + - [DESIRA](https://cordis.europa.eu/project/id/818194) (grant no. 818194); + - [ARIADNEplus](https://cordis.europa.eu/project/id/823914) (grant no. 823914); + - [RISIS 2](https://cordis.europa.eu/project/id/824091) (grant no. 824091); + - [EOSC-Pillar](https://cordis.europa.eu/project/id/857650) (grant no. 857650); + - [Blue Cloud](https://cordis.europa.eu/project/id/862409) (grant no. 862409); + - [SoBigData-PlusPlus](https://cordis.europa.eu/project/id/871042) (grant no. 871042); diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..3af0507 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,312 @@ +# European Union Public Licence V. 1.1 + + +EUPL © the European Community 2007 + + +This European Union Public Licence (the “EUPLâ€) applies to the Work or Software +(as defined below) which is provided under the terms of this Licence. Any use of +the Work, other than as authorised under this Licence is prohibited (to the +extent such use is covered by a right of the copyright holder of the Work). + +The Original Work is provided under the terms of this Licence when the Licensor +(as defined below) has placed the following notice immediately following the +copyright notice for the Original Work: + +Licensed under the EUPL V.1.1 + +or has expressed by any other mean his willingness to license under the EUPL. + + + +## 1. Definitions + +In this Licence, the following terms have the following meaning: + +- The Licence: this Licence. + +- The Original Work or the Software: the software distributed and/or + communicated by the Licensor under this Licence, available as Source Code and + also as Executable Code as the case may be. + +- Derivative Works: the works or software that could be created by the Licensee, + based upon the Original Work or modifications thereof. This Licence does not + define the extent of modification or dependence on the Original Work required + in order to classify a work as a Derivative Work; this extent is determined by + copyright law applicable in the country mentioned in Article 15. + +- The Work: the Original Work and/or its Derivative Works. + +- The Source Code: the human-readable form of the Work which is the most + convenient for people to study and modify. + +- The Executable Code: any code which has generally been compiled and which is + meant to be interpreted by a computer as a program. + +- The Licensor: the natural or legal person that distributes and/or communicates + the Work under the Licence. + +- Contributor(s): any natural or legal person who modifies the Work under the + Licence, or otherwise contributes to the creation of a Derivative Work. + +- The Licensee or “Youâ€: any natural or legal person who makes any usage of the + Software under the terms of the Licence. + +- Distribution and/or Communication: any act of selling, giving, lending, + renting, distributing, communicating, transmitting, or otherwise making + available, on-line or off-line, copies of the Work or providing access to its + essential functionalities at the disposal of any other natural or legal + person. + + + +## 2. Scope of the rights granted by the Licence + +The Licensor hereby grants You a world-wide, royalty-free, non-exclusive, +sub-licensable licence to do the following, for the duration of copyright vested +in the Original Work: + +- use the Work in any circumstance and for all usage, reproduce the Work, modify +- the Original Work, and make Derivative Works based upon the Work, communicate +- to the public, including the right to make available or display the Work or +- copies thereof to the public and perform publicly, as the case may be, the +- Work, distribute the Work or copies thereof, lend and rent the Work or copies +- thereof, sub-license rights in the Work or copies thereof. + +Those rights can be exercised on any media, supports and formats, whether now +known or later invented, as far as the applicable law permits so. + +In the countries where moral rights apply, the Licensor waives his right to +exercise his moral right to the extent allowed by law in order to make effective +the licence of the economic rights here above listed. + +The Licensor grants to the Licensee royalty-free, non exclusive usage rights to +any patents held by the Licensor, to the extent necessary to make use of the +rights granted on the Work under this Licence. + + + +## 3. Communication of the Source Code + +The Licensor may provide the Work either in its Source Code form, or as +Executable Code. If the Work is provided as Executable Code, the Licensor +provides in addition a machine-readable copy of the Source Code of the Work +along with each copy of the Work that the Licensor distributes or indicates, in +a notice following the copyright notice attached to the Work, a repository where +the Source Code is easily and freely accessible for as long as the Licensor +continues to distribute and/or communicate the Work. + + + +## 4. Limitations on copyright + +Nothing in this Licence is intended to deprive the Licensee of the benefits from +any exception or limitation to the exclusive rights of the rights owners in the +Original Work or Software, of the exhaustion of those rights or of other +applicable limitations thereto. + + + +## 5. Obligations of the Licensee + +The grant of the rights mentioned above is subject to some restrictions and +obligations imposed on the Licensee. Those obligations are the following: + +Attribution right: the Licensee shall keep intact all copyright, patent or +trademarks notices and all notices that refer to the Licence and to the +disclaimer of warranties. The Licensee must include a copy of such notices and a +copy of the Licence with every copy of the Work he/she distributes and/or +communicates. The Licensee must cause any Derivative Work to carry prominent +notices stating that the Work has been modified and the date of modification. + +Copyleft clause: If the Licensee distributes and/or communicates copies of the +Original Works or Derivative Works based upon the Original Work, this +Distribution and/or Communication will be done under the terms of this Licence +or of a later version of this Licence unless the Original Work is expressly +distributed only under this version of the Licence. The Licensee (becoming +Licensor) cannot offer or impose any additional terms or conditions on the Work +or Derivative Work that alter or restrict the terms of the Licence. + +Compatibility clause: If the Licensee Distributes and/or Communicates Derivative +Works or copies thereof based upon both the Original Work and another work +licensed under a Compatible Licence, this Distribution and/or Communication can +be done under the terms of this Compatible Licence. For the sake of this clause, +“Compatible Licence†refers to the licences listed in the appendix attached to +this Licence. Should the Licensee’s obligations under the Compatible Licence +conflict with his/her obligations under this Licence, the obligations of the +Compatible Licence shall prevail. + +Provision of Source Code: When distributing and/or communicating copies of the +Work, the Licensee will provide a machine-readable copy of the Source Code or +indicate a repository where this Source will be easily and freely available for +as long as the Licensee continues to distribute and/or communicate the Work. + +Legal Protection: This Licence does not grant permission to use the trade names, +trademarks, service marks, or names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the copyright notice. + + + +## 6. Chain of Authorship + +The original Licensor warrants that the copyright in the Original Work granted +hereunder is owned by him/her or licensed to him/her and that he/she has the +power and authority to grant the Licence. + +Each Contributor warrants that the copyright in the modifications he/she brings +to the Work are owned by him/her or licensed to him/her and that he/she has the +power and authority to grant the Licence. + +Each time You accept the Licence, the original Licensor and subsequent +Contributors grant You a licence to their contributions to the Work, under the +terms of this Licence. + + + +## 7. Disclaimer of Warranty + +The Work is a work in progress, which is continuously improved by numerous +contributors. It is not a finished work and may therefore contain defects or +“bugs†inherent to this type of software development. + +For the above reason, the Work is provided under the Licence on an “as is†basis +and without warranties of any kind concerning the Work, including without +limitation merchantability, fitness for a particular purpose, absence of defects +or errors, accuracy, non-infringement of intellectual property rights other than +copyright as stated in Article 6 of this Licence. + +This disclaimer of warranty is an essential part of the Licence and a condition +for the grant of any rights to the Work. + + + +## 8. Disclaimer of Liability + +Except in the cases of wilful misconduct or damages directly caused to natural +persons, the Licensor will in no event be liable for any direct or indirect, +material or moral, damages of any kind, arising out of the Licence or of the use +of the Work, including without limitation, damages for loss of goodwill, work +stoppage, computer failure or malfunction, loss of data or any commercial +damage, even if the Licensor has been advised of the possibility of such +damage. However, the Licensor will be liable under statutory product liability +laws as far such laws apply to the Work. + + + +## 9. Additional agreements + +While distributing the Original Work or Derivative Works, You may choose to +conclude an additional agreement to offer, and charge a fee for, acceptance of +support, warranty, indemnity, or other liability obligations and/or services +consistent with this Licence. However, in accepting such obligations, You may +act only on your own behalf and on your sole responsibility, not on behalf of +the original Licensor or any other Contributor, and only if You agree to +indemnify, defend, and hold each Contributor harmless for any liability incurred +by, or claims asserted against such Contributor by the fact You have accepted +any such warranty or additional liability. + + + +## 10. Acceptance of the Licence + +The provisions of this Licence can be accepted by clicking on an icon “I agree†+placed under the bottom of a window displaying the text of this Licence or by +affirming consent in any other similar way, in accordance with the rules of +applicable law. Clicking on that icon indicates your clear and irrevocable +acceptance of this Licence and all of its terms and conditions. + +Similarly, you irrevocably accept this Licence and all of its terms and +conditions by exercising any rights granted to You by Article 2 of this Licence, +such as the use of the Work, the creation by You of a Derivative Work or the +Distribution and/or Communication by You of the Work or copies thereof. + + + +## 11. Information to the public + +In case of any Distribution and/or Communication of the Work by means of +electronic communication by You (for example, by offering to download the Work +from a remote location) the distribution channel or media (for example, a +website) must at least provide to the public the information requested by the +applicable law regarding the Licensor, the Licence and the way it may be +accessible, concluded, stored and reproduced by the Licensee. + + + +## 12. Termination of the Licence + +The Licence and the rights granted hereunder will terminate automatically upon +any breach by the Licensee of the terms of the Licence. + +Such a termination will not terminate the licences of any person who has +received the Work from the Licensee under the Licence, provided such persons +remain in full compliance with the Licence. + + + +## 13. Miscellaneous + +Without prejudice of Article 9 above, the Licence represents the complete +agreement between the Parties as to the Work licensed hereunder. + +If any provision of the Licence is invalid or unenforceable under applicable +law, this will not affect the validity or enforceability of the Licence as a +whole. Such provision will be construed and/or reformed so as necessary to make +it valid and enforceable. + +The European Commission may publish other linguistic versions and/or new +versions of this Licence, so far this is required and reasonable, without +reducing the scope of the rights granted by the Licence. New versions of the +Licence will be published with a unique version number. + +All linguistic versions of this Licence, approved by the European Commission, +have identical value. Parties can take advantage of the linguistic version of +their choice. + + + +## 14. Jurisdiction + +Any litigation resulting from the interpretation of this License, arising +between the European Commission, as a Licensor, and any Licensee, will be +subject to the jurisdiction of the Court of Justice of the European Communities, +as laid down in article 238 of the Treaty establishing the European Community. + +Any litigation arising between Parties, other than the European Commission, and +resulting from the interpretation of this License, will be subject to the +exclusive jurisdiction of the competent court where the Licensor resides or +conducts its primary business. + + + +## 15. Applicable Law + +This Licence shall be governed by the law of the European Union country where +the Licensor resides or has his registered office. + +This licence shall be governed by the Belgian law if: + +- a litigation arises between the European Commission, as a Licensor, and any +- Licensee; the Licensor, other than the European Commission, has no residence +- or registered office inside a European Union country. + + + +## Appendix + + + +“Compatible Licences†according to article 5 EUPL are: + + +- GNU General Public License (GNU GPL) v. 2 + +- Open Software License (OSL) v. 2.1, v. 3.0 + +- Common Public License v. 1.0 + +- Eclipse Public License v. 1.0 + +- Cecill v. 2.0 + diff --git a/README.md b/README.md new file mode 100644 index 0000000..6708abf --- /dev/null +++ b/README.md @@ -0,0 +1,108 @@ +Geoportal CMS Suite +-------------------------------------------------- + +Geoportal CMS Suite is a distributed full stack application for publication management in a gCube Hybrid e-infrastructure. Check wiki [here](https://sublime-and-sphinx-guide.readthedocs.io) + +[](https://geoportal.cloud.d4science.org/geoportal-service/docs/index.html) + + +Rationale : + +Publication involves lots of common features as well as custom behaviour and formats. The service implements the basic common logic, delegating to installed plugin both custom and configurable functions ranging from validation, data manifestation, indexing and lifecycle management. +**Lifecycle management** is itself an extension allowing for both common and complex ad-hoc workflows. +**High modularity of plugins** allows for the composition of ad hoc use cases with maximized re-usability. + +The suite comes with a set of pre-built plugins and GUIs that communities can easily extend and / or reuse. + +## Built with +* [gCube SmartGears](https://gcube.wiki.gcube-system.org/gcube/SmartGears) - The gCube SmartGears framework +* [OpenJDK](https://openjdk.java.net/) - The JDK used +* [JAX-RS](https://github.com/eclipse-ee4j/jaxrs-api) - Javaâ„¢ API for RESTful Web Services +* [Jersey](https://jersey.github.io/) - JAX-RS runtime +* [Maven](https://maven.apache.org/) - Dependency Management +* [Enunciate](http://enunciate.webcohesion.com/) - API Documentation + +## Archived project + +This project has been refactored from [gcube-cms-suite](https://code-repo.d4science.org/gCubeSystem/gcube-cms-suite) + +## General Architecture +[](https://geoportal.cloud.d4science.org/geoportal-service/docs/architecture.html) + +## Lifecycle Managements + +Document Lifecycle Managements in action: + +##### Single Step (no moderation) +Default Single Step lifecycle + +##### 3 Phases (content moderation) + +Default 3 Phases lifecycle + +## Plugins + +Plugins in action: + +* [Lifecycle Manager](/gCubeSystem/gcube-cms-suite/src/branch/master/default-lc-managers) +* [Spatial Data Infrastructure "SDI"](/gCubeSystem/gcube-cms-suite/src/branch/master/sdi-plugins) +* [Notifications](/gCubeSystem/gcube-cms-suite/src/branch/master/notifications-plugins) +* [Catalogue Binding](/gCubeSystem/gcube-cms-suite/src/branch/event_manager/catalogue-binding-plugin) + +## Use Case +##### The D4GNA + +["Dataset per il Geoportale Nazionale per l'Archeologia"](https://gna.d4science.org) + +Component diagram: + +D4GNA context: engines involved + +## Documentation +* [Dedicated Wiki](https://geoportal.d4science.org/geoportal-service/docs/index.html#) - powered by [Sphynx](https://www.sphinx-doc.org/en/master/) +* [Service Interactive API](https://geoportal.d4science.org/geoportal-service/api-docs/index.html) - 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/) + +## Change log + +See [CHANGELOG.md](CHANGELOG.md). + +## Authors + +* **Fabio Sinibaldi** as "Architect", "Developer" ([ORCID](https://orcid.org/0000-0003-1013-6203)) Computer Scientist at ISTI-CNR + +* **Francesco Mangiacrapa** as "Architect", "Developer" and "Maintainer" ([ORCID](https://orcid.org/0000-0002-6528-664X)) Computer Scientist at [ISTI-CNR Infrascience Group](http://nemis.isti.cnr.it/groups/infrascience) + +## 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 +This software is part of the [gCubeFramework](https://www.gcube-system.org/ "gCubeFramework"): an +open-source software toolkit used for building and operating Hybrid Data +Infrastructures enabling the dynamic deployment of Virtual Research Environments +by favouring the realisation of reuse oriented policies. + +The projects leading to this software have received funding from a series of European Union programmes including: + +- the Sixth Framework Programme for Research and Technological Development + - DILIGENT (grant no. 004260). +- the Seventh Framework Programme for research, technological development and demonstration + - D4Science (grant no. 212488); + - D4Science-II (grant no.239019); + - ENVRI (grant no. 283465); + - iMarine(grant no. 283644); + - EUBrazilOpenBio (grant no. 288754). +- the H2020 research and innovation programme + - SoBigData (grant no. 654024); + - PARTHENOS (grant no. 654119); + - EGIEngage (grant no. 654142); + - ENVRIplus (grant no. 654182); + - BlueBRIDGE (grant no. 675680); + - PerformFish (grant no. 727610); + - AGINFRAplus (grant no. 731001); + - DESIRA (grant no. 818194); + - ARIADNEplus (grant no. 823914); + - RISIS2 (grant no. 824091); + diff --git a/cms-plugin-framework/.classpath b/cms-plugin-framework/.classpath new file mode 100644 index 0000000..2e4d759 --- /dev/null +++ b/cms-plugin-framework/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cms-plugin-framework/.gitignore b/cms-plugin-framework/.gitignore new file mode 100644 index 0000000..731eb43 --- /dev/null +++ b/cms-plugin-framework/.gitignore @@ -0,0 +1,2 @@ +/target/ +/.settings/ diff --git a/cms-plugin-framework/.project b/cms-plugin-framework/.project new file mode 100644 index 0000000..1a1d20c --- /dev/null +++ b/cms-plugin-framework/.project @@ -0,0 +1,36 @@ + + + cms-plugin-framework + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + + diff --git a/cms-plugin-framework/CHANGELOG.md b/cms-plugin-framework/CHANGELOG.md new file mode 100644 index 0000000..dc663d0 --- /dev/null +++ b/cms-plugin-framework/CHANGELOG.md @@ -0,0 +1,34 @@ +# Changelog for org.gcube.application.cms-plugin-framework + +## [v2.0.0-SNAPSHOT] + +- Refactored as `geoportal-cms-suite` [#28423] + +## [v1.0.6] - 2024-10-01 + +- Included the file size to reduce/optimize the time to upload files to the storage hub [#28150] +- Checked if the user is `null` in the `UserUtils` class [#28301] + +## [v1.0.5] - 2024-07-03 + +- Implemented Event Broker [#26321] +- Added Geoportal Service Account management + +## [v1.0.4] - 2023-09-06 + +- Using parent range version [#25572] + +## [v1.0.3] - 2023-01-10 +- UserUtils in framework + +## [v1.0.2] 2022-01-17 +- Fixes #2435 +- Introduced module default-lc-managers + +## [v1.0.1] 2022-01-17 +- Serialization Features + +## [v1.0.0] 2021-09-20 +- First release + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/cms-plugin-framework/FUNDING.md b/cms-plugin-framework/FUNDING.md new file mode 100644 index 0000000..9e48b94 --- /dev/null +++ b/cms-plugin-framework/FUNDING.md @@ -0,0 +1,26 @@ +# Acknowledgments + +The projects leading to this software have received funding from a series of European Union programmes including: + +- the Sixth Framework Programme for Research and Technological Development + - [DILIGENT](https://cordis.europa.eu/project/id/004260) (grant no. 004260). +- the Seventh Framework Programme for research, technological development and demonstration + - [D4Science](https://cordis.europa.eu/project/id/212488) (grant no. 212488); + - [D4Science-II](https://cordis.europa.eu/project/id/239019) (grant no.239019); + - [ENVRI](https://cordis.europa.eu/project/id/283465) (grant no. 283465); + - [iMarine](https://cordis.europa.eu/project/id/283644) (grant no. 283644); + - [EUBrazilOpenBio](https://cordis.europa.eu/project/id/288754) (grant no. 288754). +- the H2020 research and innovation programme + - [SoBigData](https://cordis.europa.eu/project/id/654024) (grant no. 654024); + - [PARTHENOS](https://cordis.europa.eu/project/id/654119) (grant no. 654119); + - [EGI-Engage](https://cordis.europa.eu/project/id/654142) (grant no. 654142); + - [ENVRI PLUS](https://cordis.europa.eu/project/id/654182) (grant no. 654182); + - [BlueBRIDGE](https://cordis.europa.eu/project/id/675680) (grant no. 675680); + - [PerformFISH](https://cordis.europa.eu/project/id/727610) (grant no. 727610); + - [AGINFRA PLUS](https://cordis.europa.eu/project/id/731001) (grant no. 731001); + - [DESIRA](https://cordis.europa.eu/project/id/818194) (grant no. 818194); + - [ARIADNEplus](https://cordis.europa.eu/project/id/823914) (grant no. 823914); + - [RISIS 2](https://cordis.europa.eu/project/id/824091) (grant no. 824091); + - [EOSC-Pillar](https://cordis.europa.eu/project/id/857650) (grant no. 857650); + - [Blue Cloud](https://cordis.europa.eu/project/id/862409) (grant no. 862409); + - [SoBigData-PlusPlus](https://cordis.europa.eu/project/id/871042) (grant no. 871042); diff --git a/cms-plugin-framework/LICENSE.md b/cms-plugin-framework/LICENSE.md new file mode 100644 index 0000000..3af0507 --- /dev/null +++ b/cms-plugin-framework/LICENSE.md @@ -0,0 +1,312 @@ +# European Union Public Licence V. 1.1 + + +EUPL © the European Community 2007 + + +This European Union Public Licence (the “EUPLâ€) applies to the Work or Software +(as defined below) which is provided under the terms of this Licence. Any use of +the Work, other than as authorised under this Licence is prohibited (to the +extent such use is covered by a right of the copyright holder of the Work). + +The Original Work is provided under the terms of this Licence when the Licensor +(as defined below) has placed the following notice immediately following the +copyright notice for the Original Work: + +Licensed under the EUPL V.1.1 + +or has expressed by any other mean his willingness to license under the EUPL. + + + +## 1. Definitions + +In this Licence, the following terms have the following meaning: + +- The Licence: this Licence. + +- The Original Work or the Software: the software distributed and/or + communicated by the Licensor under this Licence, available as Source Code and + also as Executable Code as the case may be. + +- Derivative Works: the works or software that could be created by the Licensee, + based upon the Original Work or modifications thereof. This Licence does not + define the extent of modification or dependence on the Original Work required + in order to classify a work as a Derivative Work; this extent is determined by + copyright law applicable in the country mentioned in Article 15. + +- The Work: the Original Work and/or its Derivative Works. + +- The Source Code: the human-readable form of the Work which is the most + convenient for people to study and modify. + +- The Executable Code: any code which has generally been compiled and which is + meant to be interpreted by a computer as a program. + +- The Licensor: the natural or legal person that distributes and/or communicates + the Work under the Licence. + +- Contributor(s): any natural or legal person who modifies the Work under the + Licence, or otherwise contributes to the creation of a Derivative Work. + +- The Licensee or “Youâ€: any natural or legal person who makes any usage of the + Software under the terms of the Licence. + +- Distribution and/or Communication: any act of selling, giving, lending, + renting, distributing, communicating, transmitting, or otherwise making + available, on-line or off-line, copies of the Work or providing access to its + essential functionalities at the disposal of any other natural or legal + person. + + + +## 2. Scope of the rights granted by the Licence + +The Licensor hereby grants You a world-wide, royalty-free, non-exclusive, +sub-licensable licence to do the following, for the duration of copyright vested +in the Original Work: + +- use the Work in any circumstance and for all usage, reproduce the Work, modify +- the Original Work, and make Derivative Works based upon the Work, communicate +- to the public, including the right to make available or display the Work or +- copies thereof to the public and perform publicly, as the case may be, the +- Work, distribute the Work or copies thereof, lend and rent the Work or copies +- thereof, sub-license rights in the Work or copies thereof. + +Those rights can be exercised on any media, supports and formats, whether now +known or later invented, as far as the applicable law permits so. + +In the countries where moral rights apply, the Licensor waives his right to +exercise his moral right to the extent allowed by law in order to make effective +the licence of the economic rights here above listed. + +The Licensor grants to the Licensee royalty-free, non exclusive usage rights to +any patents held by the Licensor, to the extent necessary to make use of the +rights granted on the Work under this Licence. + + + +## 3. Communication of the Source Code + +The Licensor may provide the Work either in its Source Code form, or as +Executable Code. If the Work is provided as Executable Code, the Licensor +provides in addition a machine-readable copy of the Source Code of the Work +along with each copy of the Work that the Licensor distributes or indicates, in +a notice following the copyright notice attached to the Work, a repository where +the Source Code is easily and freely accessible for as long as the Licensor +continues to distribute and/or communicate the Work. + + + +## 4. Limitations on copyright + +Nothing in this Licence is intended to deprive the Licensee of the benefits from +any exception or limitation to the exclusive rights of the rights owners in the +Original Work or Software, of the exhaustion of those rights or of other +applicable limitations thereto. + + + +## 5. Obligations of the Licensee + +The grant of the rights mentioned above is subject to some restrictions and +obligations imposed on the Licensee. Those obligations are the following: + +Attribution right: the Licensee shall keep intact all copyright, patent or +trademarks notices and all notices that refer to the Licence and to the +disclaimer of warranties. The Licensee must include a copy of such notices and a +copy of the Licence with every copy of the Work he/she distributes and/or +communicates. The Licensee must cause any Derivative Work to carry prominent +notices stating that the Work has been modified and the date of modification. + +Copyleft clause: If the Licensee distributes and/or communicates copies of the +Original Works or Derivative Works based upon the Original Work, this +Distribution and/or Communication will be done under the terms of this Licence +or of a later version of this Licence unless the Original Work is expressly +distributed only under this version of the Licence. The Licensee (becoming +Licensor) cannot offer or impose any additional terms or conditions on the Work +or Derivative Work that alter or restrict the terms of the Licence. + +Compatibility clause: If the Licensee Distributes and/or Communicates Derivative +Works or copies thereof based upon both the Original Work and another work +licensed under a Compatible Licence, this Distribution and/or Communication can +be done under the terms of this Compatible Licence. For the sake of this clause, +“Compatible Licence†refers to the licences listed in the appendix attached to +this Licence. Should the Licensee’s obligations under the Compatible Licence +conflict with his/her obligations under this Licence, the obligations of the +Compatible Licence shall prevail. + +Provision of Source Code: When distributing and/or communicating copies of the +Work, the Licensee will provide a machine-readable copy of the Source Code or +indicate a repository where this Source will be easily and freely available for +as long as the Licensee continues to distribute and/or communicate the Work. + +Legal Protection: This Licence does not grant permission to use the trade names, +trademarks, service marks, or names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the copyright notice. + + + +## 6. Chain of Authorship + +The original Licensor warrants that the copyright in the Original Work granted +hereunder is owned by him/her or licensed to him/her and that he/she has the +power and authority to grant the Licence. + +Each Contributor warrants that the copyright in the modifications he/she brings +to the Work are owned by him/her or licensed to him/her and that he/she has the +power and authority to grant the Licence. + +Each time You accept the Licence, the original Licensor and subsequent +Contributors grant You a licence to their contributions to the Work, under the +terms of this Licence. + + + +## 7. Disclaimer of Warranty + +The Work is a work in progress, which is continuously improved by numerous +contributors. It is not a finished work and may therefore contain defects or +“bugs†inherent to this type of software development. + +For the above reason, the Work is provided under the Licence on an “as is†basis +and without warranties of any kind concerning the Work, including without +limitation merchantability, fitness for a particular purpose, absence of defects +or errors, accuracy, non-infringement of intellectual property rights other than +copyright as stated in Article 6 of this Licence. + +This disclaimer of warranty is an essential part of the Licence and a condition +for the grant of any rights to the Work. + + + +## 8. Disclaimer of Liability + +Except in the cases of wilful misconduct or damages directly caused to natural +persons, the Licensor will in no event be liable for any direct or indirect, +material or moral, damages of any kind, arising out of the Licence or of the use +of the Work, including without limitation, damages for loss of goodwill, work +stoppage, computer failure or malfunction, loss of data or any commercial +damage, even if the Licensor has been advised of the possibility of such +damage. However, the Licensor will be liable under statutory product liability +laws as far such laws apply to the Work. + + + +## 9. Additional agreements + +While distributing the Original Work or Derivative Works, You may choose to +conclude an additional agreement to offer, and charge a fee for, acceptance of +support, warranty, indemnity, or other liability obligations and/or services +consistent with this Licence. However, in accepting such obligations, You may +act only on your own behalf and on your sole responsibility, not on behalf of +the original Licensor or any other Contributor, and only if You agree to +indemnify, defend, and hold each Contributor harmless for any liability incurred +by, or claims asserted against such Contributor by the fact You have accepted +any such warranty or additional liability. + + + +## 10. Acceptance of the Licence + +The provisions of this Licence can be accepted by clicking on an icon “I agree†+placed under the bottom of a window displaying the text of this Licence or by +affirming consent in any other similar way, in accordance with the rules of +applicable law. Clicking on that icon indicates your clear and irrevocable +acceptance of this Licence and all of its terms and conditions. + +Similarly, you irrevocably accept this Licence and all of its terms and +conditions by exercising any rights granted to You by Article 2 of this Licence, +such as the use of the Work, the creation by You of a Derivative Work or the +Distribution and/or Communication by You of the Work or copies thereof. + + + +## 11. Information to the public + +In case of any Distribution and/or Communication of the Work by means of +electronic communication by You (for example, by offering to download the Work +from a remote location) the distribution channel or media (for example, a +website) must at least provide to the public the information requested by the +applicable law regarding the Licensor, the Licence and the way it may be +accessible, concluded, stored and reproduced by the Licensee. + + + +## 12. Termination of the Licence + +The Licence and the rights granted hereunder will terminate automatically upon +any breach by the Licensee of the terms of the Licence. + +Such a termination will not terminate the licences of any person who has +received the Work from the Licensee under the Licence, provided such persons +remain in full compliance with the Licence. + + + +## 13. Miscellaneous + +Without prejudice of Article 9 above, the Licence represents the complete +agreement between the Parties as to the Work licensed hereunder. + +If any provision of the Licence is invalid or unenforceable under applicable +law, this will not affect the validity or enforceability of the Licence as a +whole. Such provision will be construed and/or reformed so as necessary to make +it valid and enforceable. + +The European Commission may publish other linguistic versions and/or new +versions of this Licence, so far this is required and reasonable, without +reducing the scope of the rights granted by the Licence. New versions of the +Licence will be published with a unique version number. + +All linguistic versions of this Licence, approved by the European Commission, +have identical value. Parties can take advantage of the linguistic version of +their choice. + + + +## 14. Jurisdiction + +Any litigation resulting from the interpretation of this License, arising +between the European Commission, as a Licensor, and any Licensee, will be +subject to the jurisdiction of the Court of Justice of the European Communities, +as laid down in article 238 of the Treaty establishing the European Community. + +Any litigation arising between Parties, other than the European Commission, and +resulting from the interpretation of this License, will be subject to the +exclusive jurisdiction of the competent court where the Licensor resides or +conducts its primary business. + + + +## 15. Applicable Law + +This Licence shall be governed by the law of the European Union country where +the Licensor resides or has his registered office. + +This licence shall be governed by the Belgian law if: + +- a litigation arises between the European Commission, as a Licensor, and any +- Licensee; the Licensor, other than the European Commission, has no residence +- or registered office inside a European Union country. + + + +## Appendix + + + +“Compatible Licences†according to article 5 EUPL are: + + +- GNU General Public License (GNU GPL) v. 2 + +- Open Software License (OSL) v. 2.1, v. 3.0 + +- Common Public License v. 1.0 + +- Eclipse Public License v. 1.0 + +- Cecill v. 2.0 + diff --git a/cms-plugin-framework/README.md b/cms-plugin-framework/README.md new file mode 100644 index 0000000..7b7356d --- /dev/null +++ b/cms-plugin-framework/README.md @@ -0,0 +1,59 @@ +CMS - Plugin Framework +-------------------------------------------------- + +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. + +Morover, this module provides an `EventManager` to notify the events {`PROJECT_CREATED`, `PROJECT_UPDATED`, `PROJECT_DELETED` `LIFECYCLE_STEP_PERFORMED`} +to the plugins that subscribe to them. + +## 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 +* [OpenJDK](https://openjdk.java.net/) - The JDK used +* [JAX-RS](https://github.com/eclipse-ee4j/jaxrs-api) - Javaâ„¢ API for RESTful Web Services +* [Jersey](https://jersey.github.io/) - JAX-RS runtime +* [Maven](https://maven.apache.org/) - Dependency Management + +## Documentation +[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 +This software is part of the [gCubeFramework](https://www.gcube-system.org/ "gCubeFramework"): an +open-source software toolkit used for building and operating Hybrid Data +Infrastructures enabling the dynamic deployment of Virtual Research Environments +by favouring the realisation of reuse oriented policies. + +The projects leading to this software have received funding from a series of European Union programmes including: + +- the Sixth Framework Programme for Research and Technological Development + - DILIGENT (grant no. 004260). +- the Seventh Framework Programme for research, technological development and demonstration + - D4Science (grant no. 212488); + - D4Science-II (grant no.239019); + - ENVRI (grant no. 283465); + - iMarine(grant no. 283644); + - EUBrazilOpenBio (grant no. 288754). +- the H2020 research and innovation programme + - SoBigData (grant no. 654024); + - PARTHENOS (grant no. 654119); + - EGIEngage (grant no. 654142); + - ENVRIplus (grant no. 654182); + - BlueBRIDGE (grant no. 675680); + - PerformFish (grant no. 727610); + - AGINFRAplus (grant no. 731001); + - DESIRA (grant no. 818194); + - ARIADNEplus (grant no. 823914); + - RISIS2 (grant no. 824091); + diff --git a/cms-plugin-framework/pom.xml b/cms-plugin-framework/pom.xml new file mode 100644 index 0000000..64be097 --- /dev/null +++ b/cms-plugin-framework/pom.xml @@ -0,0 +1,114 @@ + + + 4.0.0 + + + org.gcube.application.gcs + geoportal-cms-suite + 2.0.0-SNAPSHOT + + + cms-plugin-framework + geportal CMS - Plugin Framework + + + https://code-repo.d4science.org/gCubeSystem + 1.0 + + + + scm:git:${gitBaseUrl}/gcube-cms-suite + scm:git:${gitBaseUrl}/gcube-cms-suite + ${gitBaseUrl}/gcube-cms-suite + + + + + + + + + + + + net.postgis + postgis-jdbc + 2.5.0 + + + + + org.gcube.spatial.data + gis-interface + [2.4.6,3.0.0-SNAPSHOT) + + + + + org.gcube.data.transfer + data-transfer-library + [1.2.1,2.0.0-SNAPSHOT) + + + + + + + + org.gcube.common + authorization-utils + ${authorization-utils-range} + + + + org.gcube.application.gcs + geoportal-common + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + + + org.gcube.common + storagehub-client-library + + + + + de.grundid.opendatalab + geojson-jackson + 1.14 + + + + + org.slf4j + slf4j-api + provided + + + + org.projectlombok + lombok + provided + + + + org.reflections + reflections + + + + javax.xml.bind + jaxb-api + + + + + + \ No newline at end of file diff --git a/cms-plugin-framework/src/main/java/META-INF/MANIFEST.MF b/cms-plugin-framework/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 0000000..5e94951 --- /dev/null +++ b/cms-plugin-framework/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + 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 new file mode 100644 index 0000000..a932c33 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/AbstractScopedMap.java @@ -0,0 +1,44 @@ +package org.gcube.application.cms.caches; + +import org.gcube.application.cms.implementations.utils.UserUtils; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; + +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +/** + * TTL Map Context -> T + * + */ +public abstract class AbstractScopedMap extends TimedMap implements Engine{ + + public AbstractScopedMap(@NonNull String name) { + super(name); + } + + @Override + public T getObject() throws ConfigurationException { + UserUtils.AuthenticatedUser user = UserUtils.getCurrent(); + String context = user.getContext(); + log.debug(" {} : Accessing object under context {} ",name,context); + return get(context); + } + + + @Override + public void init() {} + + @Override + public void shutdown() { + log.warn(name + ": shutting down"); + scopeMap.forEach((String s,TTLObject o)->{ + try{if(o!=null&&o.getTheObject()!=null) + dispose(o.getTheObject()); + }catch(Throwable t) { + log.warn(name +": unable to dispose ",t); + } + }); + } + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/Cache.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/Cache.java new file mode 100644 index 0000000..2da1918 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/Cache.java @@ -0,0 +1,8 @@ +package org.gcube.application.cms.caches; + +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; + +public interface Cache{ + + public V get(K key) throws ConfigurationException; +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/Engine.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/Engine.java new file mode 100644 index 0000000..d31f1e9 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/Engine.java @@ -0,0 +1,12 @@ +package org.gcube.application.cms.caches; + +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; + + +public interface Engine { + + public void init(); + public void shutdown(); + + public T getObject() throws ConfigurationException; +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/ObjectManager.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/ObjectManager.java new file mode 100644 index 0000000..8beb55a --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/ObjectManager.java @@ -0,0 +1,8 @@ +package org.gcube.application.cms.caches; + +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; + +public interface ObjectManager{ + + public T insert(T object) throws ConfigurationException; +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/TTLObject.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/TTLObject.java new file mode 100644 index 0000000..f3b12b4 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/TTLObject.java @@ -0,0 +1,17 @@ +package org.gcube.application.cms.caches; + +import java.time.LocalDateTime; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.ToString; + +@Getter +@ToString +@AllArgsConstructor +public class TTLObject { + + private LocalDateTime creationTime; + private T theObject; + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/TimedMap.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/TimedMap.java new file mode 100644 index 0000000..cbc6e73 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/caches/TimedMap.java @@ -0,0 +1,56 @@ +package org.gcube.application.cms.caches; + +import java.time.LocalDateTime; +import java.time.temporal.TemporalAmount; +import java.util.concurrent.ConcurrentHashMap; + +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; + +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +public abstract class TimedMap implements Cache { + + protected ConcurrentHashMap> scopeMap=new ConcurrentHashMap>(); + + @Setter + @Getter + protected TemporalAmount TTL=null; + + @NonNull + protected String name; + + @Override + public V get(K key) throws ConfigurationException { + log.trace(name+" : obtaining object by "+key); + + TTLObject found=scopeMap.get(key); + + if(found== null){ + log.debug(name+" : init object for key "+key); + TTLObject toPut=new TTLObject(LocalDateTime.now(),retrieveObject(key)); + scopeMap.put(key, toPut); + return toPut.getTheObject(); + } + + if(getTTL()!=null) { + if(found.getCreationTime().plus(getTTL()).isBefore(LocalDateTime.now())) { + log.debug(name+" : elapsed TTL, disposing.."); + dispose(found.getTheObject()); + TTLObject newer=new TTLObject(LocalDateTime.now(),retrieveObject(key)); + scopeMap.put(key, newer); + found=scopeMap.get(key); + } + }else {log.trace(name+" : TTL is null, never disposing..");} + log.trace(name+"Returning {} ",found); + return found.getTheObject(); + } + + protected abstract V retrieveObject(K key) throws ConfigurationException; + protected void dispose(V toDispose){}; +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/DefaultISProvider.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/DefaultISProvider.java new file mode 100644 index 0000000..c1cb6a2 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/DefaultISProvider.java @@ -0,0 +1,61 @@ +package org.gcube.application.cms.implementations; + +import java.util.List; + +import org.gcube.application.cms.caches.Engine; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; +import org.gcube.application.geoportal.common.model.rest.DatabaseConnection; +import org.gcube.application.geoportal.common.utils.ISUtils; +import org.gcube.common.resources.gcore.GenericResource; +import org.gcube.common.resources.gcore.ServiceEndpoint; + +public class DefaultISProvider implements ISInterface, Engine { + + + @Override + public DatabaseConnection queryForDatabase(String category, String platform, String flagName, String flagValue) throws ConfigurationException { + return ISUtils.performQueryForDB(category, platform, flagName, flagValue); + } + + @Override + public List performGetAP(String category, String platform, String flagName, String flagValue) { + return ISUtils.performGetAP(category, platform, flagName, flagValue); + } + + @Override + public String decryptString(String toDecrypt) { + return ISUtils.decryptString(toDecrypt); + } + + @Override + public String encryptString(String toEncrypt) { + return ISUtils.encryptString(toEncrypt); + } + + @Override + public List getGenericResource(String secondaryType,String name) { + return ISUtils.getGenericResources(secondaryType,name); + } + + @Override + public GenericResource createUpdateGR(GenericResource resource) { + return ISUtils.writeGR(resource); + } + + // ** ENGINE + + @Override + public void init() { + + } + + @Override + public void shutdown() { + + } + + @Override + public ISInterface getObject() throws ConfigurationException { + return this; + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ISInterface.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ISInterface.java new file mode 100644 index 0000000..8b33d4c --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ISInterface.java @@ -0,0 +1,21 @@ +package org.gcube.application.cms.implementations; + +import java.util.List; + +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; +import org.gcube.application.geoportal.common.model.rest.DatabaseConnection; +import org.gcube.common.resources.gcore.GenericResource; +import org.gcube.common.resources.gcore.ServiceEndpoint; + +public interface ISInterface { + + public DatabaseConnection queryForDatabase(String category, String platform,String flagName, String flagValue) throws ConfigurationException; + public List performGetAP(String category, String platform, String flagName, String flagValue); + public String decryptString(String toDecrypt); + public String encryptString(String toEncrypt); + + public List getGenericResource(String secondaryType,String name); + + + public GenericResource createUpdateGR(GenericResource res); +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ImplementationProvider.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ImplementationProvider.java new file mode 100644 index 0000000..8c79a7d --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ImplementationProvider.java @@ -0,0 +1,102 @@ +package org.gcube.application.cms.implementations; + + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.gcube.application.cms.caches.Engine; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; +import org.gcube.common.storagehub.client.dsl.StorageHubClient; + +import lombok.Synchronized; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class ImplementationProvider { + + private static ImplementationProvider instance=null; + + @Synchronized + public static ImplementationProvider get() { + if(instance==null) { + instance=new ImplementationProvider(); + } + return instance; + } + + + public T getProvidedObjectByClass(Class clazz) throws ConfigurationException { + return (T) implementationsRegistry.get(clazz).getObject(); + } + + public Engine getEngineByManagedClass(Class clazz) throws ConfigurationException { + return implementationsRegistry.get(clazz); + } + + private ConcurrentHashMap implementationsRegistry=new ConcurrentHashMap<>(); + + public void setEngine(Engine engine, Class clazz){ + implementationsRegistry.put(clazz,engine); + } + + private ImplementationProvider(){ + //Defaults + setEngine(new DefaultISProvider(),ISInterface.class); + setEngine(new StorageHubProvider(), StorageHubClient.class); + } + public Map getManagerList(){ + HashMap toReturn=new HashMap<>(); + implementationsRegistry.forEach( + (aClass, engine) -> {toReturn.put(engine.getClass(),aClass.getCanonicalName());} + ); + return toReturn; + } + + private boolean isInit=false; + + @Synchronized + public void initEngines(){ + if(!isInit) { + log.info("INITIALIZING ENGINES. Size : {} ", implementationsRegistry.size()); + HashSet failed = new HashSet<>(); + implementationsRegistry.forEach((aClass, engine) -> { + log.info("Init : {} -> {}", engine.getClass().toGenericString(), aClass.getCanonicalName()); + try { + engine.init(); + } catch (Throwable t) { + failed.add(engine.getClass()); + log.error("Unable to start engine {} ", engine.getClass(), t); + } + }); + if (failed.isEmpty()) + log.info("INIT OK"); + else { + log.warn("!!!!! Following Engines FAILED INIT :"); + failed.forEach(aClass -> log.warn(String.valueOf(aClass))); + } + isInit = true; + }else log.info("Received Init request but Engines already started"); + } + + public void shutdownEngines(){ + log.info("SHUTTING DOWN ENGINES. Size : {} ",implementationsRegistry.size()); + HashSet failed= new HashSet<>(); + implementationsRegistry.forEach((aClass, engine) -> { + log.info("ShotDown : {} -> {}",engine.getClass().toGenericString(),aClass.getCanonicalName()); + try{ + engine.shutdown(); + }catch (Throwable t){ + failed.add(engine.getClass()); + log.error("Unable to shutdown engine {} ",engine.getClass(),t); + } + }); + if(failed.isEmpty()) + log.info("SHUTDOWN OK"); + else { + log.warn("!!!!! Following Engines FAILED SHUTDOWN :"); + failed.forEach(aClass->log.warn(String.valueOf(aClass))); + } + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ProjectAccess.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ProjectAccess.java new file mode 100644 index 0000000..f00cef9 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ProjectAccess.java @@ -0,0 +1,23 @@ +package org.gcube.application.cms.implementations; + +import java.util.List; + +import org.bson.Document; +import org.gcube.application.cms.implementations.faults.InvalidUserRoleException; +import org.gcube.application.cms.implementations.faults.ProjectNotFoundException; +import org.gcube.application.cms.implementations.faults.RegistrationException; +import org.gcube.application.cms.implementations.faults.UnauthorizedAccess; +import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.relationships.RelationshipNavigationObject; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; +import org.gcube.application.geoportal.common.model.rest.QueryRequest; + +public interface ProjectAccess { + + + public Project getById(String ucid,String id) throws RegistrationException, ConfigurationException, InvalidUserRoleException, ProjectNotFoundException, UnauthorizedAccess; + + public Iterable query(String ucid, QueryRequest query) throws RegistrationException, ConfigurationException, InvalidUserRoleException; + + public List getRelations(String ucid, String id, String relation,Boolean deep) throws InvalidUserRoleException, RegistrationException, ProjectNotFoundException, ConfigurationException, UnauthorizedAccess; +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/StorageHubProvider.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/StorageHubProvider.java new file mode 100644 index 0000000..ac32917 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/StorageHubProvider.java @@ -0,0 +1,20 @@ +package org.gcube.application.cms.implementations; + +import org.gcube.application.cms.caches.Engine; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; +import org.gcube.common.storagehub.client.dsl.StorageHubClient; + +public class StorageHubProvider implements Engine { + + + @Override + public StorageHubClient getObject() throws ConfigurationException { + return new StorageHubClient(); + } + + @Override + public void init() {} + @Override + public void shutdown() { } + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/WSInterface.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/WSInterface.java new file mode 100644 index 0000000..b1b4e53 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/WSInterface.java @@ -0,0 +1,4 @@ +package org.gcube.application.cms.implementations; + +public interface WSInterface { +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/WorkspaceManager.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/WorkspaceManager.java new file mode 100644 index 0000000..7a6acd3 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/WorkspaceManager.java @@ -0,0 +1,187 @@ +package org.gcube.application.cms.implementations; + +import java.io.InputStream; + +import org.gcube.application.geoportal.common.model.configuration.Archive; +import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFile; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; +import org.gcube.application.geoportal.common.utils.Files; +import org.gcube.common.storagehub.client.dsl.FileContainer; +import org.gcube.common.storagehub.client.dsl.FolderContainer; +import org.gcube.common.storagehub.client.dsl.StorageHubClient; +import org.gcube.common.storagehub.model.exceptions.StorageHubException; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.Synchronized; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class WorkspaceManager { + + private static final String APP_FOLDER = ".GNA_RECORDS"; + + private StorageHubClient sgClient = null; + @Getter + private FolderContainer appBase = null; + + @Getter + @Setter + @AllArgsConstructor + @RequiredArgsConstructor + public static class FolderOptions { + @NonNull + private String folderName; + private String folderDescription; + private FolderContainer parent; + } + + @Getter + @Setter + @AllArgsConstructor + @RequiredArgsConstructor + public static class FileOptions { + @NonNull + private String fileName; + @NonNull + private InputStream is; + + private String fileDescription; + private FolderContainer parent; + // Added by Francesco, see #28150 + private Long size; + } + + public Archive getConfiguration() { + Archive toReturn = new Archive("W-STORAGE"); + toReturn.put("folder_id", appBase.getId()); + return toReturn; + } + + public WorkspaceManager() throws ConfigurationException, StorageHubException { + sgClient = ImplementationProvider.get().getProvidedObjectByClass(StorageHubClient.class); + appBase = getApplicationBaseFolder(sgClient); + } + + public FolderContainer createFolder(FolderOptions opts) throws StorageHubException { + if (opts.getParent() == null) + opts.setParent(appBase); + return createFolderRoutine(opts); + } + + public FileContainer getFileById(String id) throws StorageHubException { + return sgClient.open(id).asFile(); + } + + public FolderContainer getFolderById(String id) throws StorageHubException { + return sgClient.open(id).asFolder(); + } + + public void removeFolderById(String id) throws StorageHubException { + sgClient.open(id).asFolder().delete(); + } + + public FolderContainer getSubFolder(FolderContainer parentFolder, String path) throws StorageHubException { + return getSubFolder(parentFolder, path, ""); + } + + /** + * Returns sub folder. Creates it if missing + * + * @param parentFolder + * @param path + * @return + * @throws StorageHubException + */ + public FolderContainer getSubFolder(FolderContainer parentFolder, String path, String description) + throws StorageHubException { + try { + return parentFolder.openByRelativePath(path).asFolder(); + } catch (StorageHubException e) { + log.debug("Missing subPath " + path); + FolderContainer targetParent = parentFolder; + String targetName = path; + if (path.contains("/")) { + String parent = path.substring(0, path.lastIndexOf("/")); + log.debug("Checking intermediate " + parent); + targetParent = getSubFolder(parentFolder, parent); + targetName = path.substring(path.lastIndexOf("/") + 1); + } + FolderOptions opts = new FolderOptions(targetName, description, targetParent); + log.debug("Creating FOLDER {}", opts); + return createFolder(opts); + } + } + +// public WorkspaceContent storeToWS(FileOptions opts) throws FileNotFoundException, StorageHubException { +// FileContainer item=createFileRoutine(opts); +// item=sgClient.open(item.getId()).asFile(); +// +// WorkspaceContent content=new WorkspaceContent(); +// content.setLink(item.getPublicLink().toString()); +// content.setMimetype(item.get().getContent().getMimeType()); +// content.setStorageID(item.getId()); +// content.setName(item.get().getName()); +// return content; +// +// } + + public RegisteredFile registerFile(FileOptions opts) throws StorageHubException { + FileContainer item = createFileRoutine(opts); + item = sgClient.open(item.getId()).asFile(); + + RegisteredFile file = new RegisteredFile(); + + file.setLink(item.getPublicLink().toString()); + file.setMimetype(item.get().getContent().getMimeType()); + file.setStorageID(item.getId()); + file.setName(item.get().getName()); + return file; + + } + +// public void deleteFromWS(WorkspaceContent toDelete) throws StorageHubException { +// sgClient.open(toDelete.getStorageID()).asFile().forceDelete(); +// } + + public void deleteItem(String itemId) throws StorageHubException { + sgClient.open(itemId).asItem().forceDelete(); + } + + // STATIC SYNCH METHODS + + @Synchronized + public static FolderContainer getApplicationBaseFolder(StorageHubClient sgClient) throws StorageHubException { + FolderContainer vre = sgClient.openVREFolder(); + try { + return vre.openByRelativePath(APP_FOLDER).asFolder(); + } catch (StorageHubException e) { + log.debug("APP Folder missing. Initializing.."); + FolderContainer toReturn = vre.newFolder(APP_FOLDER, "Base folder for GNA records"); + toReturn.setHidden(); + return toReturn; + } + } + + @Synchronized + private static FolderContainer createFolderRoutine(FolderOptions opts) throws StorageHubException { + opts.setFolderName(Files.fixFilename(opts.getFolderName())); + return opts.getParent().newFolder(opts.getFolderName(), opts.getFolderDescription()); + } + + @Synchronized + private static FileContainer createFileRoutine(FileOptions opts) throws StorageHubException { + // Updated by Francesco, see #28150 + log.info("Uploading file name: {}, in the parent folder id: {}, filesize is: " + opts.getSize(), + opts.getFileName(), opts.getParent().getId()); + opts.setFileName(Files.fixFilename(opts.getFileName())); + if (opts.getSize() == null) + return opts.getParent().uploadFile(opts.getIs(), opts.getFileName(), opts.getFileDescription()); + else + return opts.getParent().uploadFile(opts.getIs(), opts.getFileName(), opts.getFileDescription(), + opts.getSize()); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DataParsingException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DataParsingException.java new file mode 100644 index 0000000..4495115 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DataParsingException.java @@ -0,0 +1,30 @@ +package org.gcube.application.cms.implementations.faults; + +public class DataParsingException extends Exception { + + public DataParsingException() { + // TODO Auto-generated constructor stub + } + + public DataParsingException(String message) { + super(message); + // TODO Auto-generated constructor stub + } + + public DataParsingException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub + } + + public DataParsingException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub + } + + public DataParsingException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub + } + +} \ No newline at end of file diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DeletionException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DeletionException.java new file mode 100644 index 0000000..d41cfa3 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/DeletionException.java @@ -0,0 +1,23 @@ +package org.gcube.application.cms.implementations.faults; + +public class DeletionException extends Exception { + + public DeletionException() { + } + + public DeletionException(String message) { + super(message); + } + + public DeletionException(String message, Throwable cause) { + super(message, cause); + } + + public DeletionException(Throwable cause) { + super(cause); + } + + public DeletionException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidLockException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidLockException.java new file mode 100644 index 0000000..13f9c02 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidLockException.java @@ -0,0 +1,22 @@ +package org.gcube.application.cms.implementations.faults; + +public class InvalidLockException extends Exception{ + public InvalidLockException() { + } + + public InvalidLockException(String message) { + super(message); + } + + public InvalidLockException(String message, Throwable cause) { + super(message, cause); + } + + public InvalidLockException(Throwable cause) { + super(cause); + } + + public InvalidLockException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidStateException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidStateException.java new file mode 100644 index 0000000..18762b3 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidStateException.java @@ -0,0 +1,38 @@ +package org.gcube.application.cms.implementations.faults; + +public class InvalidStateException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 8926481061304048080L; + + public InvalidStateException() { + super(); + // TODO Auto-generated constructor stub + } + + public InvalidStateException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub + } + + public InvalidStateException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub + } + + public InvalidStateException(String message) { + super(message); + // TODO Auto-generated constructor stub + } + + public InvalidStateException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub + } + + + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidUserRoleException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidUserRoleException.java new file mode 100644 index 0000000..1a6de3f --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/InvalidUserRoleException.java @@ -0,0 +1,23 @@ +package org.gcube.application.cms.implementations.faults; + +public class InvalidUserRoleException extends Exception { + + public InvalidUserRoleException() { + } + + public InvalidUserRoleException(String message) { + super(message); + } + + public InvalidUserRoleException(String message, Throwable cause) { + super(message, cause); + } + + public InvalidUserRoleException(Throwable cause) { + super(cause); + } + + public InvalidUserRoleException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectLockedException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectLockedException.java new file mode 100644 index 0000000..07b9c32 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectLockedException.java @@ -0,0 +1,22 @@ +package org.gcube.application.cms.implementations.faults; + +public class ProjectLockedException extends Exception{ + public ProjectLockedException() { + } + + public ProjectLockedException(String message) { + super(message); + } + + public ProjectLockedException(String message, Throwable cause) { + super(message, cause); + } + + public ProjectLockedException(Throwable cause) { + super(cause); + } + + public ProjectLockedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectNotFoundException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectNotFoundException.java new file mode 100644 index 0000000..9bb9f90 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/ProjectNotFoundException.java @@ -0,0 +1,22 @@ +package org.gcube.application.cms.implementations.faults; + +public class ProjectNotFoundException extends Exception { + public ProjectNotFoundException() { + } + + public ProjectNotFoundException(String message) { + super(message); + } + + public ProjectNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public ProjectNotFoundException(Throwable cause) { + super(cause); + } + + public ProjectNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/RegistrationException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/RegistrationException.java new file mode 100644 index 0000000..a2e59bc --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/RegistrationException.java @@ -0,0 +1,23 @@ +package org.gcube.application.cms.implementations.faults; + +public class RegistrationException extends Exception { + + public RegistrationException() { + } + + public RegistrationException(String message) { + super(message); + } + + public RegistrationException(String message, Throwable cause) { + super(message, cause); + } + + public RegistrationException(Throwable cause) { + super(cause); + } + + public RegistrationException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/UnauthorizedAccess.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/UnauthorizedAccess.java new file mode 100644 index 0000000..3bb5572 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/faults/UnauthorizedAccess.java @@ -0,0 +1,23 @@ +package org.gcube.application.cms.implementations.faults; + +public class UnauthorizedAccess extends Exception { + + public UnauthorizedAccess() { + } + + public UnauthorizedAccess(String message) { + super(message); + } + + public UnauthorizedAccess(String message, Throwable cause) { + super(message, cause); + } + + public UnauthorizedAccess(Throwable cause) { + super(cause); + } + + public UnauthorizedAccess(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/utils/UserUtils.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/utils/UserUtils.java new file mode 100644 index 0000000..a168533 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/utils/UserUtils.java @@ -0,0 +1,106 @@ +package org.gcube.application.cms.implementations.utils; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.gcube.application.geoportal.common.model.document.accounting.AccountingInfo; +import org.gcube.application.geoportal.common.model.document.accounting.Context; +import org.gcube.application.geoportal.common.model.document.accounting.User; +import org.gcube.common.authorization.library.provider.AccessTokenProvider; +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.authorization.utils.manager.SecretManager; +import org.gcube.common.authorization.utils.manager.SecretManagerProvider; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class UserUtils { + + public static List DEFAULT_ROLES = new ArrayList<>(); + + public static AuthenticatedUser getCurrent() throws SecurityException { + log.debug("Loading caller info.."); + + SecretManager cm = SecretManagerProvider.instance.get(); + String context = cm.getContext(); + if (context == null) + throw new SecurityException("Cannot determine context"); + Set roles = new HashSet<>(); + org.gcube.common.authorization.utils.user.User user = cm.getUser(); + + if (user == null) { + log.warn("No user found in the session work, context is {}", context); + } else { + log.info("Identified caller {} in context {}", user.getUsername(), context); + roles.addAll(user.getRoles()); + } + AuthenticatedUser toReturn = new AuthenticatedUser(user, roles, AccessTokenProvider.instance.get(), + SecurityTokenProvider.instance.get(), context); + + log.info("Current User is {} ", toReturn); + return toReturn; + } + + @AllArgsConstructor + @Getter + public static class AuthenticatedUser { + + private org.gcube.common.authorization.utils.user.User user; + + private Set roles; + + private String uma_token; + + private String gcube_token; + + private String context; + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("User [user="); + builder.append(user); + builder.append(", uma_token="); + builder.append(uma_token == null ? uma_token : "***"); + + builder.append(", gcube_token="); + builder.append(gcube_token == null ? gcube_token : "***"); + + builder.append(", roles="); + builder.append(roles); + + builder.append(", context="); + builder.append(context); + builder.append("]"); + return builder.toString(); + } + + public AccountingInfo asInfo() { + AccountingInfo info = new AccountingInfo(); + User user = new User(); + try { + user.setUsername(this.getUser().getUsername()); + user.setRoles(roles); + } catch (Exception e) { + log.warn("Unable to determine user id, using FAKE", e); + user.setUsername("FAKE"); + user.setRoles(new HashSet<>()); + user.getRoles().addAll(DEFAULT_ROLES); + } + + info.setUser(user); + info.setInstant(LocalDateTime.now()); + Context c = new Context(); + c.setId(this.context); + c.setName(context.contains("/") ? context.substring(context.lastIndexOf("/")) : context); + info.setContext(c); + return info; + } + + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/EventListenerPluginInterface.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/EventListenerPluginInterface.java new file mode 100644 index 0000000..d008b1e --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/EventListenerPluginInterface.java @@ -0,0 +1,10 @@ +package org.gcube.application.cms.plugins; + +import org.gcube.application.cms.plugins.events.ItemObserved; +import org.gcube.application.geoportal.common.model.document.Project; + +public interface EventListenerPluginInterface extends InitializablePlugin { + + public void doAction(ItemObserved itemObserved); + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/IndexerPluginInterface.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/IndexerPluginInterface.java new file mode 100644 index 0000000..60ee76b --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/IndexerPluginInterface.java @@ -0,0 +1,19 @@ +package org.gcube.application.cms.plugins; + +import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; +import org.gcube.application.cms.plugins.reports.IndexDocumentReport; +import org.gcube.application.cms.plugins.requests.BaseRequest; +import org.gcube.application.cms.plugins.requests.IndexDocumentRequest; +import org.gcube.application.geoportal.common.model.configuration.Index; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; + +public interface IndexerPluginInterface extends InitializablePlugin{ + + public IndexDocumentReport index(IndexDocumentRequest request) throws InvalidPluginRequestException; + public IndexDocumentReport deindex(IndexDocumentRequest request) throws InvalidPluginRequestException; + + public Index getIndex(BaseRequest request) throws ConfigurationException; + + + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/InitializablePlugin.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/InitializablePlugin.java new file mode 100644 index 0000000..9a4e502 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/InitializablePlugin.java @@ -0,0 +1,28 @@ +package org.gcube.application.cms.plugins; + +import org.gcube.application.cms.plugins.faults.InitializationException; +import org.gcube.application.cms.plugins.faults.ShutDownException; +import org.gcube.application.cms.plugins.reports.InitializationReport; + +public interface InitializablePlugin extends Plugin{ + /** + * To be called once per context + * @return + * @throws InitializationException + */ + + public InitializationReport initInContext()throws InitializationException; + + /** + * To be called for static initialization + * @return + * @throws InitializationException + */ + public InitializationReport init()throws InitializationException; + + /** + * To be called at application shutdown + * @throws ShutDownException + */ + public void shutdown() throws ShutDownException; +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/LifecycleManager.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/LifecycleManager.java new file mode 100644 index 0000000..4216435 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/LifecycleManager.java @@ -0,0 +1,28 @@ +package org.gcube.application.cms.plugins; + +import org.gcube.application.cms.plugins.faults.EventException; +import org.gcube.application.cms.plugins.faults.InsufficientPrivileges; +import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; +import org.gcube.application.cms.plugins.faults.InvalidProfileException; +import org.gcube.application.cms.plugins.faults.StepException; +import org.gcube.application.cms.plugins.reports.EventExecutionReport; +import org.gcube.application.cms.plugins.reports.StepExecutionReport; +import org.gcube.application.cms.plugins.requests.BaseRequest; +import org.gcube.application.cms.plugins.requests.EventExecutionRequest; +import org.gcube.application.cms.plugins.requests.StepExecutionRequest; +import org.gcube.application.geoportal.common.model.configuration.Configuration; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; + + +public interface LifecycleManager extends InitializablePlugin{ + + // Lifecycle operations + + public StepExecutionReport performStep(StepExecutionRequest request) throws StepException, InvalidPluginRequestException, InvalidProfileException, ConfigurationException, InsufficientPrivileges; + + public Configuration getCurrentConfiguration(BaseRequest request) throws ConfigurationException; + + public EventExecutionReport onEvent(EventExecutionRequest request) throws EventException, InvalidPluginRequestException; + + public void setPluginManager(PluginManagerInterface manager); +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/MaterializationPlugin.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/MaterializationPlugin.java new file mode 100644 index 0000000..d1e796c --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/MaterializationPlugin.java @@ -0,0 +1,14 @@ +package org.gcube.application.cms.plugins; + +import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; +import org.gcube.application.cms.plugins.faults.MaterializationException; +import org.gcube.application.cms.plugins.reports.MaterializationReport; +import org.gcube.application.cms.plugins.requests.MaterializationRequest; + +public interface MaterializationPlugin extends InitializablePlugin{ + + public MaterializationReport materialize(MaterializationRequest request) throws MaterializationException, InvalidPluginRequestException; + + public MaterializationReport dematerialize(MaterializationRequest request) throws MaterializationException, InvalidPluginRequestException; + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/Plugin.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/Plugin.java new file mode 100644 index 0000000..57636af --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/Plugin.java @@ -0,0 +1,8 @@ +package org.gcube.application.cms.plugins; + +import org.gcube.application.geoportal.common.model.plugins.PluginDescriptor; + +public interface Plugin { + + public PluginDescriptor getDescriptor(); +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/PluginManagerInterface.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/PluginManagerInterface.java new file mode 100644 index 0000000..26671c0 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/PluginManagerInterface.java @@ -0,0 +1,11 @@ +package org.gcube.application.cms.plugins; + +import java.util.Map; + +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; + +public interface PluginManagerInterface { + + public Plugin getById(String pluginID) throws ConfigurationException; + public Map getByType(String type) throws ConfigurationException; +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/PluginsReflections.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/PluginsReflections.java new file mode 100644 index 0000000..cf27d7f --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/PluginsReflections.java @@ -0,0 +1,47 @@ +package org.gcube.application.cms.plugins; + +import java.lang.reflect.Modifier; +import java.util.HashMap; +import java.util.Map; + +import org.reflections.Reflections; +import org.reflections.util.ConfigurationBuilder; +import org.reflections.util.FilterBuilder; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class PluginsReflections { + + /** Loads Plugin implementation classes. It should only be accessed once by Plugin Manager + * Plugins shouldn't access this class unless for testing purposes. + * @return + */ + public static Map load(){ + Map toReturn=new HashMap<>(); + log.warn("WARNING!! LOADING PLUGIN CLASSES : THIS SHOULD HAPPEN ONLY ONCE"); + Reflections reflections = new Reflections( + new ConfigurationBuilder() + .forPackage("org.gcube.application.cms") + .filterInputsBy(new FilterBuilder().includePackage("org.gcube.application.cms"))); + + reflections.getSubTypesOf(Plugin.class).iterator().forEachRemaining(pluginClass->{ + log.debug("Evaluating class {}",pluginClass); + if(!pluginClass.isInterface() && !Modifier.isAbstract(pluginClass.getModifiers())){ + try { + log.debug("Found implementation {} ",pluginClass); + Plugin plugin = pluginClass.newInstance(); + log.debug("Loading {} description : {}", plugin, plugin.getDescriptor()); + + toReturn.put(plugin.getDescriptor().getId(), plugin); + + + }catch (Throwable t){ + log.warn("Unable to instantiate Plugin "+pluginClass,t); + } + } + + }); + return toReturn; + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/EventListener.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/EventListener.java new file mode 100644 index 0000000..1bdacf2 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/EventListener.java @@ -0,0 +1,7 @@ +package org.gcube.application.cms.plugins.events; + +public interface EventListener { + + public void updated(T observerd); + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/EventManager.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/EventManager.java new file mode 100644 index 0000000..02681df --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/EventManager.java @@ -0,0 +1,132 @@ +package org.gcube.application.cms.plugins.events; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.gcube.application.geoportal.common.model.document.Project; + +/** + * The Class EventManager. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Dec 11, 2023 + */ +public class EventManager implements EventManagerInterface> { + + private HashMap>>> listeners = new HashMap>>>(); + + /** + * The Class Event. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Nov 29, 2023 + */ + public static enum Event { + + PROJECT_CREATED("PROJECT_CREATED"), + PROJECT_UPDATED("PROJECT_UPDATED"), + PROJECT_DELETED("PROJECT_DELETED"), + LIFECYCLE_STEP_PERFORMED("LIFECYCLE_STEP_PERFORMED"); + + String name; + + /** + * Instantiates a new event. + * + * @param name the name + */ + Event(String name) { + this.name = name; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + } + + // private instance, so that it can be + // accessed by only by getInstance() method + private static EventManager instance; + + /** + * Instantiates a new event manager. + */ + private EventManager() { + // private constructor + } + + /** + * Gets the single instance of EventManager. + * + * @return single instance of EventManager + */ + public static EventManager getInstance() { + if (instance == null) { + // synchronized block to remove overhead + synchronized (EventManager.class) { + if (instance == null) { + // if instance is null, initialize + instance = new EventManager(); + } + + } + } + return instance; + } + + /** + * Subscribe. + * + * @param eventType the event type + * @param listener the listener + */ + public void subscribe(Event eventType, EventListener> listener) { + List>> list = listeners.get(eventType); + if (list == null) + list = new ArrayList>>(); + + list.add(listener); + listeners.put(eventType, list); + } + + /** + * Unsubscribe. + * + * @param eventType the event type + * @param listener the listener + */ + public void unsubscribe(Event eventType, EventListener> listener) { + List>> list = listeners.get(eventType); + if (list == null) + return; + + list.remove(listener); + listeners.put(eventType, list); + } + + /** + * Notify. + * + * @param eventType the event type + * @param item the item + */ + public void notify(Event eventType, ItemObserved item) { + for (EventManager.Event event : listeners.keySet()) { + if (event.equals(eventType)) { + for (EventListener> eventListner : listeners.get(eventType)) { + eventListner.updated(item); + } + } + } + } + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/EventManagerInterface.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/EventManagerInterface.java new file mode 100644 index 0000000..dc5706b --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/EventManagerInterface.java @@ -0,0 +1,13 @@ +package org.gcube.application.cms.plugins.events; + +import org.gcube.application.cms.plugins.events.EventManager.Event; + +public interface EventManagerInterface { + + public void subscribe(Event eventType, EventListener listener); + + public void unsubscribe(Event eventType, EventListener listener); + + public void notify(Event eventType, T item); + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/ItemObservable.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/ItemObservable.java new file mode 100644 index 0000000..993aba1 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/ItemObservable.java @@ -0,0 +1,9 @@ +package org.gcube.application.cms.plugins.events; + +public interface ItemObservable { + + public String getProjectId(); + + public String getUCD_Id(); + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/ItemObserved.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/ItemObserved.java new file mode 100644 index 0000000..d7d9f8c --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/events/ItemObserved.java @@ -0,0 +1,110 @@ +package org.gcube.application.cms.plugins.events; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map.Entry; + +import org.bson.Document; +import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.accounting.Context; +import org.gcube.application.geoportal.common.model.document.accounting.User; +import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Slf4j +public class ItemObserved implements ItemObservable { + + private User userCaller; + private Context context; + private UseCaseDescriptor useCaseDescriptor; + private T project; + private EventManager.Event event; + private Document optional; + + public static enum OPTIONAL_FIELD { + message, preview_url + } + + public String getProjectId() { + log.debug("Called getProjectId"); + if (project == null) + return null; + return project.getId(); + } + + @Override + public String getUCD_Id() { + log.debug("Called getUCD_Id"); + if (useCaseDescriptor == null) + return null; + return useCaseDescriptor.getId(); + } + + public LinkedHashMap getDocumentEntries(int limit) { + + LinkedHashMap documentAsMap = new LinkedHashMap<>(); + + try { + + Iterator> entrySetsIt = project.getTheDocument().entrySet().iterator(); + int i = 0; + while (entrySetsIt.hasNext()) { + if (i + 1 > limit) + break; + + Entry entry = entrySetsIt.next(); + documentAsMap.put(entry.getKey(), entry.getValue() != null ? entry.getValue().toString() : null); + i++; + } + + } catch (Exception e) { + throw e; + } + + return documentAsMap; + } + + public void setOptional(OPTIONAL_FIELD optionalField, String value) { + this.optional = new Document(); + if (optional == null) + this.optional = new Document(); + + this.optional.put(optionalField.name(), value); + } + + public String getOptionalValue(OPTIONAL_FIELD optionalField) { + if (this.optional != null) { + return this.optional.getString(optionalField.name()); + } + return null; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ItemObserved [userCaller="); + builder.append(userCaller); + builder.append(", context="); + builder.append(context); + builder.append(", useCaseDescriptor id="); + builder.append(useCaseDescriptor != null ? useCaseDescriptor.getId() : null); + builder.append(", project id="); + builder.append(project != null ? project.getId() : null); + builder.append(", event="); + builder.append(event); + builder.append(", optional="); + builder.append(optional); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/EventException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/EventException.java new file mode 100644 index 0000000..cc89b52 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/EventException.java @@ -0,0 +1,23 @@ +package org.gcube.application.cms.plugins.faults; + +public class EventException extends PluginExecutionException{ + + public EventException() { + } + + public EventException(String message) { + super(message); + } + + public EventException(String message, Throwable cause) { + super(message, cause); + } + + public EventException(Throwable cause) { + super(cause); + } + + public EventException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/IndexingException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/IndexingException.java new file mode 100644 index 0000000..e49cc34 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/IndexingException.java @@ -0,0 +1,22 @@ +package org.gcube.application.cms.plugins.faults; + +public class IndexingException extends PluginExecutionException{ + public IndexingException() { + } + + public IndexingException(String message) { + super(message); + } + + public IndexingException(String message, Throwable cause) { + super(message, cause); + } + + public IndexingException(Throwable cause) { + super(cause); + } + + public IndexingException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InitializationException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InitializationException.java new file mode 100644 index 0000000..131c23e --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InitializationException.java @@ -0,0 +1,23 @@ +package org.gcube.application.cms.plugins.faults; + +public class InitializationException extends PluginExecutionException{ + + public InitializationException() { + } + + public InitializationException(String message) { + super(message); + } + + public InitializationException(String message, Throwable cause) { + super(message, cause); + } + + public InitializationException(Throwable cause) { + super(cause); + } + + public InitializationException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InsufficientPrivileges.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InsufficientPrivileges.java new file mode 100644 index 0000000..c33a332 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InsufficientPrivileges.java @@ -0,0 +1,22 @@ +package org.gcube.application.cms.plugins.faults; + +public class InsufficientPrivileges extends Exception { + public InsufficientPrivileges() { + } + + public InsufficientPrivileges(String message) { + super(message); + } + + public InsufficientPrivileges(String message, Throwable cause) { + super(message, cause); + } + + public InsufficientPrivileges(Throwable cause) { + super(cause); + } + + public InsufficientPrivileges(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InvalidPluginRequestException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InvalidPluginRequestException.java new file mode 100644 index 0000000..0d65159 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InvalidPluginRequestException.java @@ -0,0 +1,22 @@ +package org.gcube.application.cms.plugins.faults; + +public class InvalidPluginRequestException extends PluginExecutionException { + public InvalidPluginRequestException() { + } + + public InvalidPluginRequestException(String message) { + super(message); + } + + public InvalidPluginRequestException(String message, Throwable cause) { + super(message, cause); + } + + public InvalidPluginRequestException(Throwable cause) { + super(cause); + } + + public InvalidPluginRequestException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InvalidProfileException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InvalidProfileException.java new file mode 100644 index 0000000..1fe0b00 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/InvalidProfileException.java @@ -0,0 +1,22 @@ +package org.gcube.application.cms.plugins.faults; + +public class InvalidProfileException extends Exception { + public InvalidProfileException() { + } + + public InvalidProfileException(String message) { + super(message); + } + + public InvalidProfileException(String message, Throwable cause) { + super(message, cause); + } + + public InvalidProfileException(Throwable cause) { + super(cause); + } + + public InvalidProfileException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/MaterializationException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/MaterializationException.java new file mode 100644 index 0000000..35760af --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/MaterializationException.java @@ -0,0 +1,23 @@ +package org.gcube.application.cms.plugins.faults; + +public class MaterializationException extends PluginExecutionException { + + public MaterializationException() { + } + + public MaterializationException(String message) { + super(message); + } + + public MaterializationException(String message, Throwable cause) { + super(message, cause); + } + + public MaterializationException(Throwable cause) { + super(cause); + } + + public MaterializationException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/PluginExecutionException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/PluginExecutionException.java new file mode 100644 index 0000000..7078cb6 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/PluginExecutionException.java @@ -0,0 +1,22 @@ +package org.gcube.application.cms.plugins.faults; + +public class PluginExecutionException extends Exception{ + public PluginExecutionException() { + } + + public PluginExecutionException(String message) { + super(message); + } + + public PluginExecutionException(String message, Throwable cause) { + super(message, cause); + } + + public PluginExecutionException(Throwable cause) { + super(cause); + } + + public PluginExecutionException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/ShutDownException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/ShutDownException.java new file mode 100644 index 0000000..c3584b1 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/ShutDownException.java @@ -0,0 +1,23 @@ +package org.gcube.application.cms.plugins.faults; + +public class ShutDownException extends Exception { + + public ShutDownException() { + } + + public ShutDownException(String message) { + super(message); + } + + public ShutDownException(String message, Throwable cause) { + super(message, cause); + } + + public ShutDownException(Throwable cause) { + super(cause); + } + + public ShutDownException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/StepException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/StepException.java new file mode 100644 index 0000000..893e5ee --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/StepException.java @@ -0,0 +1,23 @@ +package org.gcube.application.cms.plugins.faults; + +public class StepException extends PluginExecutionException { + + public StepException() { + } + + public StepException(String message) { + super(message); + } + + public StepException(String message, Throwable cause) { + super(message, cause); + } + + public StepException(Throwable cause) { + super(cause); + } + + public StepException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/UnrecognizedEventException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/UnrecognizedEventException.java new file mode 100644 index 0000000..1586575 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/UnrecognizedEventException.java @@ -0,0 +1,22 @@ +package org.gcube.application.cms.plugins.faults; + +public class UnrecognizedEventException extends EventException{ + public UnrecognizedEventException() { + } + + public UnrecognizedEventException(String message) { + super(message); + } + + public UnrecognizedEventException(String message, Throwable cause) { + super(message, cause); + } + + public UnrecognizedEventException(Throwable cause) { + super(cause); + } + + public UnrecognizedEventException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/UnrecognizedStepException.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/UnrecognizedStepException.java new file mode 100644 index 0000000..8dd57db --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/faults/UnrecognizedStepException.java @@ -0,0 +1,22 @@ +package org.gcube.application.cms.plugins.faults; + +public class UnrecognizedStepException extends StepException{ + public UnrecognizedStepException() { + } + + public UnrecognizedStepException(String message) { + super(message); + } + + public UnrecognizedStepException(String message, Throwable cause) { + super(message, cause); + } + + public UnrecognizedStepException(Throwable cause) { + super(cause); + } + + public UnrecognizedStepException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/model/ComparableVersion.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/model/ComparableVersion.java new file mode 100644 index 0000000..132725f --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/model/ComparableVersion.java @@ -0,0 +1,843 @@ +package org.gcube.application.cms.plugins.model; + +import java.math.BigInteger; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Deque; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Properties; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + *

+ * Generic implementation of version comparison. + *

+ * + * Features: + *
    + *
  • mixing of '-' (hyphen) and '.' (dot) separators,
  • + *
  • transition between characters and digits also constitutes a separator: + * 1.0alpha1 => [1, 0, alpha, 1]
  • + *
  • unlimited number of version components,
  • + *
  • version components in the text can be digits or strings,
  • + *
  • strings are checked for well-known qualifiers and the qualifier ordering is used for version ordering. + * Well-known qualifiers (case insensitive) are:
      + *
    • alpha or a
    • + *
    • beta or b
    • + *
    • milestone or m
    • + *
    • rc or cr
    • + *
    • snapshot
    • + *
    • (the empty string) or ga or final
    • + *
    • sp
    • + *
    + * Unknown qualifiers are considered after known qualifiers, with lexical order (always case insensitive), + *
  • + *
  • a hyphen usually precedes a qualifier, and is always less important than something preceded with a dot.
  • + *
+ * + * @see
"Versioning" on Maven Wiki + * @author Kenney Westerhof + * @author Hervé Boutemy + */ + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@ToString +public class ComparableVersion + implements Comparable +{ + private static final int MAX_INTITEM_LENGTH = 9; + + private static final int MAX_LONGITEM_LENGTH = 18; + + private String value; + + private String canonical; + + private ListItem items; + + private interface Item + { + int INT_ITEM = 3; + int LONG_ITEM = 4; + int BIGINTEGER_ITEM = 0; + int STRING_ITEM = 1; + int LIST_ITEM = 2; + + int compareTo( Item item ); + + int getType(); + + boolean isNull(); + } + + /** + * Represents a numeric item in the version item list that can be represented with an int. + */ + private static class IntItem + implements Item + { + private final int value; + + public static final IntItem ZERO = new IntItem(); + + private IntItem() + { + this.value = 0; + } + + IntItem( String str ) + { + this.value = Integer.parseInt( str ); + } + + @Override + public int getType() + { + return INT_ITEM; + } + + @Override + public boolean isNull() + { + return value == 0; + } + + @Override + public int compareTo( Item item ) + { + if ( item == null ) + { + return ( value == 0 ) ? 0 : 1; // 1.0 == 1, 1.1 > 1 + } + + switch ( item.getType() ) + { + case INT_ITEM: + int itemValue = ( (IntItem) item ).value; + return Integer.compare( value, itemValue ); + case LONG_ITEM: + case BIGINTEGER_ITEM: + return -1; + + case STRING_ITEM: + return 1; // 1.1 > 1-sp + + case LIST_ITEM: + return 1; // 1.1 > 1-1 + + default: + throw new IllegalStateException( "invalid item: " + item.getClass() ); + } + } + + @Override + public boolean equals( Object o ) + { + if ( this == o ) + { + return true; + } + if ( o == null || getClass() != o.getClass() ) + { + return false; + } + + IntItem intItem = (IntItem) o; + + return value == intItem.value; + + } + + @Override + public int hashCode() + { + return value; + } + + @Override + public String toString() + { + return Integer.toString( value ); + } + } + + /** + * Represents a numeric item in the version item list that can be represented with a long. + */ + private static class LongItem + implements Item + { + private final long value; + + LongItem( String str ) + { + this.value = Long.parseLong( str ); + } + + @Override + public int getType() + { + return LONG_ITEM; + } + + @Override + public boolean isNull() + { + return value == 0; + } + + @Override + public int compareTo( Item item ) + { + if ( item == null ) + { + return ( value == 0 ) ? 0 : 1; // 1.0 == 1, 1.1 > 1 + } + + switch ( item.getType() ) + { + case INT_ITEM: + return 1; + case LONG_ITEM: + long itemValue = ( (LongItem) item ).value; + return Long.compare( value, itemValue ); + case BIGINTEGER_ITEM: + return -1; + + case STRING_ITEM: + return 1; // 1.1 > 1-sp + + case LIST_ITEM: + return 1; // 1.1 > 1-1 + + default: + throw new IllegalStateException( "invalid item: " + item.getClass() ); + } + } + + @Override + public boolean equals( Object o ) + { + if ( this == o ) + { + return true; + } + if ( o == null || getClass() != o.getClass() ) + { + return false; + } + + LongItem longItem = (LongItem) o; + + return value == longItem.value; + + } + + @Override + public int hashCode() + { + return (int) ( value ^ ( value >>> 32 ) ); + } + + @Override + public String toString() + { + return Long.toString( value ); + } + } + + /** + * Represents a numeric item in the version item list. + */ + private static class BigIntegerItem + implements Item + { + private final BigInteger value; + + BigIntegerItem( String str ) + { + this.value = new BigInteger( str ); + } + + @Override + public int getType() + { + return BIGINTEGER_ITEM; + } + + @Override + public boolean isNull() + { + return BigInteger.ZERO.equals( value ); + } + + @Override + public int compareTo( Item item ) + { + if ( item == null ) + { + return BigInteger.ZERO.equals( value ) ? 0 : 1; // 1.0 == 1, 1.1 > 1 + } + + switch ( item.getType() ) + { + case INT_ITEM: + case LONG_ITEM: + return 1; + + case BIGINTEGER_ITEM: + return value.compareTo( ( (BigIntegerItem) item ).value ); + + case STRING_ITEM: + return 1; // 1.1 > 1-sp + + case LIST_ITEM: + return 1; // 1.1 > 1-1 + + default: + throw new IllegalStateException( "invalid item: " + item.getClass() ); + } + } + + @Override + public boolean equals( Object o ) + { + if ( this == o ) + { + return true; + } + if ( o == null || getClass() != o.getClass() ) + { + return false; + } + + BigIntegerItem that = (BigIntegerItem) o; + + return value.equals( that.value ); + + } + + @Override + public int hashCode() + { + return value.hashCode(); + } + + public String toString() + { + return value.toString(); + } + } + + /** + * Represents a string in the version item list, usually a qualifier. + */ + private static class StringItem + implements Item + { + private static final List QUALIFIERS = + Arrays.asList( "alpha", "beta", "milestone", "rc", "snapshot", "", "sp" ); + + private static final Properties ALIASES = new Properties(); + static + { + ALIASES.put( "ga", "" ); + ALIASES.put( "final", "" ); + ALIASES.put( "release", "" ); + ALIASES.put( "cr", "rc" ); + } + + /** + * A comparable value for the empty-string qualifier. This one is used to determine if a given qualifier makes + * the version older than one without a qualifier, or more recent. + */ + private static final String RELEASE_VERSION_INDEX = String.valueOf( QUALIFIERS.indexOf( "" ) ); + + private final String value; + + StringItem( String value, boolean followedByDigit ) + { + if ( followedByDigit && value.length() == 1 ) + { + // a1 = alpha-1, b1 = beta-1, m1 = milestone-1 + switch ( value.charAt( 0 ) ) + { + case 'a': + value = "alpha"; + break; + case 'b': + value = "beta"; + break; + case 'm': + value = "milestone"; + break; + default: + } + } + this.value = ALIASES.getProperty( value , value ); + } + + @Override + public int getType() + { + return STRING_ITEM; + } + + @Override + public boolean isNull() + { + return ( comparableQualifier( value ).compareTo( RELEASE_VERSION_INDEX ) == 0 ); + } + + /** + * Returns a comparable value for a qualifier. + * + * This method takes into account the ordering of known qualifiers then unknown qualifiers with lexical + * ordering. + * + * just returning an Integer with the index here is faster, but requires a lot of if/then/else to check for -1 + * or QUALIFIERS.size and then resort to lexical ordering. Most comparisons are decided by the first character, + * so this is still fast. If more characters are needed then it requires a lexical sort anyway. + * + * @param qualifier + * @return an equivalent value that can be used with lexical comparison + */ + public static String comparableQualifier( String qualifier ) + { + int i = QUALIFIERS.indexOf( qualifier ); + + return i == -1 ? ( QUALIFIERS.size() + "-" + qualifier ) : String.valueOf( i ); + } + + @Override + public int compareTo( Item item ) + { + if ( item == null ) + { + // 1-rc < 1, 1-ga > 1 + return comparableQualifier( value ).compareTo( RELEASE_VERSION_INDEX ); + } + switch ( item.getType() ) + { + case INT_ITEM: + case LONG_ITEM: + case BIGINTEGER_ITEM: + return -1; // 1.any < 1.1 ? + + case STRING_ITEM: + return comparableQualifier( value ).compareTo( comparableQualifier( ( (StringItem) item ).value ) ); + + case LIST_ITEM: + return -1; // 1.any < 1-1 + + default: + throw new IllegalStateException( "invalid item: " + item.getClass() ); + } + } + + @Override + public boolean equals( Object o ) + { + if ( this == o ) + { + return true; + } + if ( o == null || getClass() != o.getClass() ) + { + return false; + } + + StringItem that = (StringItem) o; + + return value.equals( that.value ); + + } + + @Override + public int hashCode() + { + return value.hashCode(); + } + + public String toString() + { + return value; + } + } + + /** + * Represents a version list item. This class is used both for the global item list and for sub-lists (which start + * with '-(number)' in the version specification). + */ + private static class ListItem + extends ArrayList + implements Item + { + @Override + public int getType() + { + return LIST_ITEM; + } + + @Override + public boolean isNull() + { + return ( size() == 0 ); + } + + void normalize() + { + for ( int i = size() - 1; i >= 0; i-- ) + { + Item lastItem = get( i ); + + if ( lastItem.isNull() ) + { + // remove null trailing items: 0, "", empty list + remove( i ); + } + else if ( !( lastItem instanceof ListItem ) ) + { + break; + } + } + } + + @Override + public int compareTo( Item item ) + { + if ( item == null ) + { + if ( size() == 0 ) + { + return 0; // 1-0 = 1- (normalize) = 1 + } + // Compare the entire list of items with null - not just the first one, MNG-6964 + for ( Item i : this ) + { + int result = i.compareTo( null ); + if ( result != 0 ) + { + return result; + } + } + return 0; + } + switch ( item.getType() ) + { + case INT_ITEM: + case LONG_ITEM: + case BIGINTEGER_ITEM: + return -1; // 1-1 < 1.0.x + + case STRING_ITEM: + return 1; // 1-1 > 1-sp + + case LIST_ITEM: + Iterator left = iterator(); + Iterator right = ( (ListItem) item ).iterator(); + + while ( left.hasNext() || right.hasNext() ) + { + Item l = left.hasNext() ? left.next() : null; + Item r = right.hasNext() ? right.next() : null; + + // if this is shorter, then invert the compare and mul with -1 + int result = l == null ? ( r == null ? 0 : -1 * r.compareTo( l ) ) : l.compareTo( r ); + + if ( result != 0 ) + { + return result; + } + } + + return 0; + + default: + throw new IllegalStateException( "invalid item: " + item.getClass() ); + } + } + + @Override + public String toString() + { + StringBuilder buffer = new StringBuilder(); + for ( Item item : this ) + { + if ( buffer.length() > 0 ) + { + buffer.append( ( item instanceof ListItem ) ? '-' : '.' ); + } + buffer.append( item ); + } + return buffer.toString(); + } + + /** + * Return the contents in the same format that is used when you call toString() on a List. + */ + private String toListString() + { + StringBuilder buffer = new StringBuilder(); + buffer.append( "[" ); + for ( Item item : this ) + { + if ( buffer.length() > 1 ) + { + buffer.append( ", " ); + } + if ( item instanceof ListItem ) + { + buffer.append( ( (ListItem ) item ).toListString() ); + } + else + { + buffer.append( item ); + } + } + buffer.append( "]" ); + return buffer.toString(); + } + } + + public ComparableVersion( String version ) + { + parseVersion( version ); + } + + @SuppressWarnings( "checkstyle:innerassignment" ) + public final void parseVersion( String version ) + { + this.value = version; + + items = new ListItem(); + + version = version.toLowerCase( Locale.ENGLISH ); + + ListItem list = items; + + Deque stack = new ArrayDeque<>(); + stack.push( list ); + + boolean isDigit = false; + + int startIndex = 0; + + for ( int i = 0; i < version.length(); i++ ) + { + char c = version.charAt( i ); + + if ( c == '.' ) + { + if ( i == startIndex ) + { + list.add( IntItem.ZERO ); + } + else + { + list.add( parseItem( isDigit, version.substring( startIndex, i ) ) ); + } + startIndex = i + 1; + } + else if ( c == '-' ) + { + if ( i == startIndex ) + { + list.add( IntItem.ZERO ); + } + else + { + list.add( parseItem( isDigit, version.substring( startIndex, i ) ) ); + } + startIndex = i + 1; + + list.add( list = new ListItem() ); + stack.push( list ); + } + else if ( Character.isDigit( c ) ) + { + if ( !isDigit && i > startIndex ) + { + list.add( new StringItem( version.substring( startIndex, i ), true ) ); + startIndex = i; + + list.add( list = new ListItem() ); + stack.push( list ); + } + + isDigit = true; + } + else + { + if ( isDigit && i > startIndex ) + { + list.add( parseItem( true, version.substring( startIndex, i ) ) ); + startIndex = i; + + list.add( list = new ListItem() ); + stack.push( list ); + } + + isDigit = false; + } + } + + if ( version.length() > startIndex ) + { + list.add( parseItem( isDigit, version.substring( startIndex ) ) ); + } + + while ( !stack.isEmpty() ) + { + list = (ListItem) stack.pop(); + list.normalize(); + } + } + + private static Item parseItem( boolean isDigit, String buf ) + { + if ( isDigit ) + { + buf = stripLeadingZeroes( buf ); + if ( buf.length() <= MAX_INTITEM_LENGTH ) + { + // lower than 2^31 + return new IntItem( buf ); + } + else if ( buf.length() <= MAX_LONGITEM_LENGTH ) + { + // lower than 2^63 + return new LongItem( buf ); + } + return new BigIntegerItem( buf ); + } + return new StringItem( buf, false ); + } + + private static String stripLeadingZeroes( String buf ) + { + if ( buf == null || buf.isEmpty() ) + { + return "0"; + } + for ( int i = 0; i < buf.length(); ++i ) + { + char c = buf.charAt( i ); + if ( c != '0' ) + { + return buf.substring( i ); + } + } + return buf; + } + + @Override + public int compareTo( ComparableVersion o ) + { + return items.compareTo( o.items ); + } + + @Override + public String toString() + { + return value; + } + + public String getCanonical() + { + if ( canonical == null ) + { + canonical = items.toString(); + } + return canonical; + } + + @Override + public boolean equals( Object o ) + { + return ( o instanceof ComparableVersion ) && items.equals( ( (ComparableVersion) o ).items ); + } + + @Override + public int hashCode() + { + return items.hashCode(); + } + + // CHECKSTYLE_OFF: LineLength + /** + * Main to test version parsing and comparison. + *

+ * To check how "1.2.7" compares to "1.2-SNAPSHOT", for example, you can issue + *

java -jar ${maven.repo.local}/org/apache/maven/maven-artifact/${maven.version}/maven-artifact-${maven.version}.jar "1.2.7" "1.2-SNAPSHOT"
+ * command to command line. Result of given command will be something like this: + *
+     * Display parameters as parsed by Maven (in canonical form) and comparison result:
+     * 1. 1.2.7 == 1.2.7
+     *    1.2.7 > 1.2-SNAPSHOT
+     * 2. 1.2-SNAPSHOT == 1.2-snapshot
+     * 
+ * + * @param args the version strings to parse and compare. You can pass arbitrary number of version strings and always + * two adjacent will be compared + */ + // CHECKSTYLE_ON: LineLength + public static void main( String... args ) + { + System.out.println( "Display parameters as parsed by Maven (in canonical form and as a list of tokens) and" + + " comparison result:" ); + if ( args.length == 0 ) + { + return; + } + + ComparableVersion prev = null; + int i = 1; + for ( String version : args ) + { + ComparableVersion c = new ComparableVersion( version ); + + if ( prev != null ) + { + int compare = prev.compareTo( c ); + System.out.println( " " + prev.toString() + ' ' + + ( ( compare == 0 ) ? "==" : ( ( compare < 0 ) ? "<" : ">" ) ) + ' ' + version ); + } + + System.out.println( ( i++ ) + ". " + version + " -> " + c.getCanonical() + + "; tokens: " + c.items.toListString() ); + + prev = c; + } + } +} + diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/DocumentHandlingReport.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/DocumentHandlingReport.java new file mode 100644 index 0000000..7e1136a --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/DocumentHandlingReport.java @@ -0,0 +1,93 @@ +package org.gcube.application.cms.plugins.reports; + +import java.util.ArrayList; +import java.util.List; + +import org.bson.Document; +import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; +import org.gcube.application.cms.plugins.faults.PluginExecutionException; +import org.gcube.application.cms.plugins.requests.BaseExecutionRequest; +import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.identification.IdentificationReference; +import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; + +import com.fasterxml.jackson.core.JsonProcessingException; + +import lombok.Data; +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; + + +@Data + +@Slf4j +public class DocumentHandlingReport extends Report{ + + @NonNull + T theRequest; + Document resultingDocument; + LifecycleInformation toSetLifecycleInformation; + + protected List toSetIdentificationReferences=null; + + public DocumentHandlingReport addIdentificationReference(IdentificationReference toAdd){ + if(toSetIdentificationReferences == null) toSetIdentificationReferences = new ArrayList<>(); + toSetIdentificationReferences.add(toAdd); + return this; + } + + + public DocumentHandlingReport(@NonNull T theRequest) throws InvalidPluginRequestException { + theRequest.validate(); + this.theRequest = theRequest; + this.setStatus(Status.OK); + toSetLifecycleInformation=theRequest.getDocument().getLifecycleInformation(); + resultingDocument = theRequest.getDocument().getTheDocument(); + } + + @Override + public void validate() throws PluginExecutionException { + super.validate(); + if (resultingDocument==null) { + log.warn("NULL resulting document in report {} ", this); + throw new PluginExecutionException("Invalid report : Resulting document cannot be null"); + } + if(toSetLifecycleInformation == null) { + log.warn("NULL lifecycleinformation in report {} ",this); + throw new PluginExecutionException("Invalid report : Lifecycle information cannot be null"); + } + } + + public Project prepareResult() throws JsonProcessingException, PluginExecutionException { + log.trace("Preparing document ID {} from report ... ",theRequest.getDocument().getId()); + this.validate(); + + Project toReturn = theRequest.getDocument(); + toReturn.setTheDocument(resultingDocument); + toReturn.setLifecycleInformation(toSetLifecycleInformation); + + // Force Report status into info + log.trace("Report status is {} ",getStatus()); + LifecycleInformation info = toReturn.getLifecycleInformation(); + switch (getStatus()){ + case ERROR: { + info.setLastOperationStatus(LifecycleInformation.Status.ERROR); + this.getMessages().forEach(s -> info.addErrorMessage(s)); + break; + } + case WARNING:{ + info.setLastOperationStatus(LifecycleInformation.Status.WARNING); + this.getMessages().forEach(s -> info.addWarningMessage(s)); + break; + } + case OK: { + if(info.getLastOperationStatus()==null) + info.setLastOperationStatus(LifecycleInformation.Status.OK); + break; + } + } + if(toSetIdentificationReferences!=null) + toReturn.setIdentificationReferences(toSetIdentificationReferences); + return toReturn; + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/EventExecutionReport.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/EventExecutionReport.java new file mode 100644 index 0000000..8591b48 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/EventExecutionReport.java @@ -0,0 +1,35 @@ +package org.gcube.application.cms.plugins.reports; + +import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; +import org.gcube.application.cms.plugins.requests.EventExecutionRequest; +import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; + +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +@ToString(callSuper = true) +@Slf4j +public class EventExecutionReport extends DocumentHandlingReport{ + + public EventExecutionReport(EventExecutionRequest req) throws InvalidPluginRequestException { + super(req); + try{ + if(theRequest.getDocument().getLifecycleInformation()!=null) + this.setToSetLifecycleInformation(theRequest.getDocument().getLifecycleInformation().cleanState()); + else theRequest.getDocument().setLifecycleInformation(new LifecycleInformation().cleanState()); + }catch(Throwable t){ + log.warn("Cannot to clean state for lifecycle information {} in {} : {}", + theRequest.getDocument().getLifecycleInformation(), + theRequest.getDocument().getProfileID(), + theRequest.getDocument().getId(), + t); + } + this.getToSetLifecycleInformation().setLastOperationStatus(LifecycleInformation.Status.OK); + } + + + @Override + public void setToSetLifecycleInformation(LifecycleInformation toSetLifecycleInformation) { + } + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/IndexDocumentReport.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/IndexDocumentReport.java new file mode 100644 index 0000000..7d45cad --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/IndexDocumentReport.java @@ -0,0 +1,28 @@ +package org.gcube.application.cms.plugins.reports; + +import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; +import org.gcube.application.cms.plugins.requests.IndexDocumentRequest; + +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; + +@Getter +@Setter +public class IndexDocumentReport extends DocumentHandlingReport { + +// protected List toSetIndexReferences=new ArrayList<>(); + + + public IndexDocumentReport(@NonNull IndexDocumentRequest theRequest) throws InvalidPluginRequestException { + super(theRequest); + } + +// @Override +// public Project prepareResult() throws JsonProcessingException, PluginExecutionException { +// Project toReturn= super.prepareResult(); +// if(toSetSpatialReference != null) toReturn.setSpatialReference(toSetSpatialReference); +// if(toSetTemporalReference != null) toReturn.setTemporalReference(toSetTemporalReference); +// return toReturn; +// } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/InitializationReport.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/InitializationReport.java new file mode 100644 index 0000000..f4f86f5 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/InitializationReport.java @@ -0,0 +1,11 @@ +package org.gcube.application.cms.plugins.reports; + +import lombok.NoArgsConstructor; + +@NoArgsConstructor +public class InitializationReport extends Report{ + + public InitializationReport(Status status, String... messages) { + super(status, messages); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/MaterializationReport.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/MaterializationReport.java new file mode 100644 index 0000000..07dce0b --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/MaterializationReport.java @@ -0,0 +1,14 @@ +package org.gcube.application.cms.plugins.reports; + +import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; +import org.gcube.application.cms.plugins.requests.MaterializationRequest; + +import lombok.NonNull; + + +public class MaterializationReport extends DocumentHandlingReport{ + + public MaterializationReport(@NonNull MaterializationRequest theRequest) throws InvalidPluginRequestException { + super(theRequest); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/Report.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/Report.java new file mode 100644 index 0000000..586322e --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/Report.java @@ -0,0 +1,43 @@ +package org.gcube.application.cms.plugins.reports; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.application.cms.plugins.faults.PluginExecutionException; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class Report { + + public static enum Status { + ERROR,WARNING,OK + } + + private Status status; + private List messages; + + public Report(Status status,String ... messages) { + this.status = status; + this.messages=new ArrayList<>(); + for (String s : messages) + this.messages.add(s); + } + + public Report putMessage(String msg){ + if(messages==null)messages=new ArrayList<>(); + messages.add(msg); + return this; + } + + public void validate()throws PluginExecutionException { + if(status == null) throw new PluginExecutionException("Status is null"); + if(!status.equals(Status.OK)) + if(messages==null || messages.isEmpty()) throw new PluginExecutionException("Messages are mandatory for status != OK "); + } + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/StepExecutionReport.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/StepExecutionReport.java new file mode 100644 index 0000000..babdd40 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/StepExecutionReport.java @@ -0,0 +1,57 @@ +package org.gcube.application.cms.plugins.reports; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; +import org.gcube.application.cms.plugins.faults.PluginExecutionException; +import org.gcube.application.cms.plugins.requests.EventExecutionRequest; +import org.gcube.application.cms.plugins.requests.StepExecutionRequest; +import org.gcube.application.geoportal.common.model.document.Project; + +import com.fasterxml.jackson.core.JsonProcessingException; + +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class StepExecutionReport extends DocumentHandlingReport{ + + public StepExecutionReport(@NonNull StepExecutionRequest theRequest) throws InvalidPluginRequestException { + + super(theRequest); + this.getToSetLifecycleInformation().cleanState(); + this.getToSetLifecycleInformation().setLastInvokedStep(theRequest.getStep()); + } + + List toTriggerEvents; + + List cascadeSteps; + + + + + public StepExecutionReport addToTriggerEvent(EventExecutionRequest req){ + if(toTriggerEvents==null) toTriggerEvents = new ArrayList<>(); + toTriggerEvents.add(req); + return this; + } + + + public StepExecutionReport addCascadeStep(StepExecutionRequest req){ + if(cascadeSteps == null ) cascadeSteps = new ArrayList<>(); + cascadeSteps.add(req); + return this; + } + + @Override + public Project prepareResult() throws JsonProcessingException, PluginExecutionException { + Project toReturn= super.prepareResult(); + + return toReturn; + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseExecutionRequest.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseExecutionRequest.java new file mode 100644 index 0000000..fbf0134 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseExecutionRequest.java @@ -0,0 +1,32 @@ +package org.gcube.application.cms.plugins.requests; + +import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; +import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.accounting.Context; +import org.gcube.application.geoportal.common.model.document.accounting.User; +import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; + +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(callSuper = true) +public class BaseExecutionRequest extends BaseRequest{ + + + Project document; + + public BaseExecutionRequest(@NonNull UseCaseDescriptor useCaseDescriptor, @NonNull User caller, @NonNull Context context, Project document) { + super(useCaseDescriptor, caller, context); + this.document = document; + } + + public BaseExecutionRequest validate() throws InvalidPluginRequestException { + super.validate(); + if(document==null) throw new InvalidPluginRequestException("Document cannot be null"); + return this; + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseRequest.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseRequest.java new file mode 100644 index 0000000..3735cec --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseRequest.java @@ -0,0 +1,59 @@ +package org.gcube.application.cms.plugins.requests; + +import org.bson.Document; +import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; +import org.gcube.application.cms.serialization.Serialization; +import org.gcube.application.geoportal.common.model.document.accounting.Context; +import org.gcube.application.geoportal.common.model.document.accounting.User; +import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; + +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(callSuper = true) +@RequiredArgsConstructor +public class BaseRequest { + + @NonNull + UseCaseDescriptor useCaseDescriptor; + @NonNull + User caller; + @NonNull + Context context; + + + Document callParameters; + + public final String getMandatory(String param) throws InvalidPluginRequestException { + return getMandatory(param,callParameters); + } + + public final String getWithDefault(String param,String defaultValue) { + try{ + return getMandatory(param,callParameters); + }catch (InvalidPluginRequestException e){ + return defaultValue; + } + } + + public static final String getMandatory(String param,Document params) throws InvalidPluginRequestException { + if(params==null || params.isEmpty()|| !params.containsKey(param)) throw new InvalidPluginRequestException("Missing mandatory parameter "+param); + return Serialization.convert(params.get(param),String.class); + } + + public BaseRequest validate() throws InvalidPluginRequestException { + if(useCaseDescriptor ==null)throw new InvalidPluginRequestException("UseCaseDescriptor cannot be null "); + return this; + } + + public BaseRequest setParameter(String key,Object value){ + if(callParameters==null) callParameters=new Document(); + callParameters.put(key, value); + return this; + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/EventExecutionRequest.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/EventExecutionRequest.java new file mode 100644 index 0000000..323576c --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/EventExecutionRequest.java @@ -0,0 +1,33 @@ +package org.gcube.application.cms.plugins.requests; + +import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.accounting.Context; +import org.gcube.application.geoportal.common.model.document.accounting.User; +import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; + +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(callSuper = true) +public class EventExecutionRequest extends BaseExecutionRequest{ + + public static class Events{ + public static final String ON_INIT_DOCUMENT="INIT_DOCUMENT"; + public static final String ON_UPDATE_DOCUMENT="UPDATE_DOCUMENT"; + public static final String ON_DELETE_DOCUMENT="DELETE_DOCUMENT"; + public static final String ON_DELETE_FILESET="DELETE_FILESET"; + } + + public EventExecutionRequest(@NonNull UseCaseDescriptor useCaseDescriptor, @NonNull User caller, @NonNull Context context, Project document, String event) { + super(useCaseDescriptor, caller, context, document); + this.event = event; + } + + String event; + + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/IndexDocumentRequest.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/IndexDocumentRequest.java new file mode 100644 index 0000000..0237e61 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/IndexDocumentRequest.java @@ -0,0 +1,16 @@ +package org.gcube.application.cms.plugins.requests; + +import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.accounting.Context; +import org.gcube.application.geoportal.common.model.document.accounting.User; +import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; + +import lombok.NonNull; +import lombok.ToString; + +@ToString(callSuper = true) +public class IndexDocumentRequest extends BaseExecutionRequest{ + public IndexDocumentRequest(@NonNull UseCaseDescriptor useCaseDescriptor, @NonNull User caller, @NonNull Context context, Project document) { + super(useCaseDescriptor, caller, context, document); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/MaterializationRequest.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/MaterializationRequest.java new file mode 100644 index 0000000..574a7ca --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/MaterializationRequest.java @@ -0,0 +1,16 @@ +package org.gcube.application.cms.plugins.requests; + +import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.accounting.Context; +import org.gcube.application.geoportal.common.model.document.accounting.User; +import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; + +import lombok.NonNull; +import lombok.ToString; + +@ToString(callSuper = true) +public class MaterializationRequest extends BaseExecutionRequest{ + public MaterializationRequest(@NonNull UseCaseDescriptor useCaseDescriptor, @NonNull User caller, @NonNull Context context, Project document) { + super(useCaseDescriptor, caller, context, document); + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/StepExecutionRequest.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/StepExecutionRequest.java new file mode 100644 index 0000000..8b985ae --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/StepExecutionRequest.java @@ -0,0 +1,26 @@ +package org.gcube.application.cms.plugins.requests; + +import org.gcube.application.geoportal.common.model.document.Project; +import org.gcube.application.geoportal.common.model.document.accounting.Context; +import org.gcube.application.geoportal.common.model.document.accounting.User; +import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; + +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(callSuper = true) +public class StepExecutionRequest extends BaseExecutionRequest{ + + public StepExecutionRequest(@NonNull UseCaseDescriptor useCaseDescriptor, @NonNull User caller, @NonNull Context context, Project document, String step) { + super(useCaseDescriptor, caller, context, document); + this.step = step; + } + + String step; + + +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/serialization/JacksonProvider.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/serialization/JacksonProvider.java new file mode 100644 index 0000000..afbeb80 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/serialization/JacksonProvider.java @@ -0,0 +1,40 @@ +package org.gcube.application.cms.serialization; + +import java.util.EnumSet; +import java.util.Set; + +import org.gcube.application.geoportal.common.JSONSerializationProvider; + +import com.jayway.jsonpath.Configuration; +import com.jayway.jsonpath.Option; +import com.jayway.jsonpath.spi.json.JacksonJsonProvider; +import com.jayway.jsonpath.spi.json.JsonProvider; +import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider; +import com.jayway.jsonpath.spi.mapper.MappingProvider; + +public class JacksonProvider implements JSONSerializationProvider { + + + @Override + public void setJSONWrapperDefaults() { + Configuration.setDefaults(new Configuration.Defaults() { + private JsonProvider jacksonProvider = new JacksonJsonProvider(Serialization.mapper); + + private final MappingProvider mappingProvider = new JacksonMappingProvider(Serialization.mapper); + @Override + public JsonProvider jsonProvider() { + return jacksonProvider; + } + + @Override + public Set