task_24166 #11

Merged
francesco.mangiacrapa merged 37 commits from task_24166 into master 2023-05-12 10:57:15 +02:00
36 changed files with 3154 additions and 956 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <classpath>
<classpathentry including="**/*.java" kind="src" output="target/geoportal-data-entry-app-3.0.0/WEB-INF/classes" path="src/main/java"> <classpathentry including="**/*.java" kind="src" output="target/geoportal-data-entry-app-3.2.0-SNAPSHOT/WEB-INF/classes" path="src/main/java">
<attributes> <attributes>
<attribute name="optional" value="true"/> <attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
@ -31,5 +31,5 @@
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="output" path="target/geoportal-data-entry-app-3.0.0/WEB-INF/classes"/> <classpathentry kind="output" path="target/geoportal-data-entry-app-3.2.0-SNAPSHOT/WEB-INF/classes"/>
</classpath> </classpath>

View File

@ -1,5 +1,5 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
jarsExcludedFromWebInfLib= jarsExcludedFromWebInfLib=
lastWarOutDir=/home/francescomangiacrapa/git/geoportal-data-entry-app/target/geoportal-data-entry-app-3.0.0 lastWarOutDir=/home/francescomangiacrapa/git/geoportal-data-entry-app/target/geoportal-data-entry-app-3.2.0-SNAPSHOT
warSrcDir=src/main/webapp warSrcDir=src/main/webapp
warSrcDirIsOutput=false warSrcDirIsOutput=false

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0"> <?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
@ -69,8 +69,92 @@
<wb-module deploy-name="geoportal-data-entry-app-3.0.0">
<wb-module deploy-name="geoportal-data-entry-app-3.2.0-SNAPSHOT">
@ -141,7 +225,49 @@
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/> <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
@ -212,7 +338,49 @@
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/> <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
@ -283,7 +451,49 @@
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/> <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
@ -306,10 +516,49 @@
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/> <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
<dependent-module archiveName="geoportal-data-common-2.0.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/geoportal-data-common/geoportal-data-common">
<dependency-type>uses</dependency-type>
</dependent-module>
@ -380,7 +629,49 @@
<property name="context-root" value="geoportal-data-entry-app"/> <property name="context-root" value="geoportal-data-entry-app"/>
@ -451,7 +742,49 @@
<property name="java-output-path" value="/geoportal-data-entry-app/target/geoportal-data-entry-app-2.0.0-SNAPSHOT/WEB-INF/classes"/> <property name="java-output-path" value="/geoportal-data-entry-app/target/geoportal-data-entry-app-2.0.0-SNAPSHOT/WEB-INF/classes"/>
@ -522,7 +855,49 @@
</wb-module> </wb-module>

View File

@ -4,6 +4,36 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [v3.2.0-SNAPSHOT] - 2022-05-11
- Implemented the Update facility [#24166]
- Integrated with the geoportal-data-mapper library [#24244]
- Integrated the Geoportal Data-Viewer Widget [#25015]
- Passed to Geoportal_Resolver service [#25031]
- Provided the "View Document" and "View As JSON" facilities
- DELETE relation" operation allowed only in DRAFT phase [#25104]
## [v3.1.0] - 2023-03-06
#### Enhancements
- [#24569] The Edit operation is available only in the "DRAFT" phase
- [#24571] The "Create Relation" operation is available only in the "DRAFT" phase
## [v3.0.2] - 2023-02-02
#### Fixes
- [#24520] Added parameter "force=true" to Delete Project
- [#24475] Propagated the Access Policy in the fileset
## [v3.0.1] - 2023-01-19
#### Fixes
- [#24281] Fixed filtering selection label
- [#24049] Fixed "Show on Map" facility vs Chrome browser
- [#24432] Fixing serialization issue using LinkedHashMap<String, String> instead of LinkedHashMap<String, Object>
## [v3.0.0] - 2022-11-09 ## [v3.0.0] - 2022-11-09
@ -20,6 +50,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
- [#23926] Integrated a Post Creation Action in the UCD and manage it - [#23926] Integrated a Post Creation Action in the UCD and manage it
- [#24136] Integrated the temporal dimension on the front-end side - [#24136] Integrated the temporal dimension on the front-end side
## [v2.2.1] - 2022-06-29 ## [v2.2.1] - 2022-06-29
#### Enhancements #### Enhancements

View File

@ -9,14 +9,22 @@ The GeoPortal Data Entry App is an application to build the web forms for data e
**Uses** **Uses**
* GWT v.2.9.0. [GWT](http://www.gwtproject.org) is licensed under [Apache License 2.0](http://www.gwtproject.org/terms.html) * GWT v.2.10.0. [GWT](http://www.gwtproject.org) is licensed under [Apache License 2.0](http://www.gwtproject.org/terms.html)
* GWT-Bootstrap v.2.3.2.0. [GWT-Bootstrap](https://github.com/gwtbootstrap) is licensed under [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0) * GWT-Bootstrap v.2.3.2.0. [GWT-Bootstrap](https://github.com/gwtbootstrap) is licensed under [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0)
* pretty-print-json v.1.1. [pretty-print-json](https://github.com/center-key/pretty-print-json) is licensed under [MIT](https://github.com/center-key/pretty-print-json/blob/main/LICENSE.txt) * pretty-print-json v.1.1. [pretty-print-json](https://github.com/center-key/pretty-print-json) is licensed under [MIT](https://github.com/center-key/pretty-print-json/blob/main/LICENSE.txt)
* jsoneditor v.9.5.5. [jsoneditor](https://github.com/josdejong/jsoneditor) is licensed under [Apache License 2.0](https://github.com/josdejong/jsoneditor/blob/master/LICENSE) * jsoneditor v.9.5.5. [jsoneditor](https://github.com/josdejong/jsoneditor) is licensed under [Apache License 2.0](https://github.com/josdejong/jsoneditor/blob/master/LICENSE)
## Architecture
<img src="https://gcube.wiki.gcube-system.org/images_gcube/8/8e/GeoPortalDataEntry_Architecture.png" style="max-width:800px;" alt="GeoPortal Data-Entry - Architecture" />
## Documentation ## Documentation
N/A D4GNA Use Case - 3 Phase Lifecycle
<img src="https://gcube.wiki.gcube-system.org/images_gcube/4/46/D4GNA_Workflow_Phases_and_Operations.png" style="max-width:800px;" alt="GeoPortal Data-Entry - Workflow & Phases & Operations" />
Geoportal Service Documentation is available at [gCube CMS Suite](https://geoportal.d4science.org/geoportal-service/docs/index.html)
## Change log ## Change log

58
pom.xml
View File

@ -14,7 +14,7 @@
<groupId>org.gcube.portlets.user</groupId> <groupId>org.gcube.portlets.user</groupId>
<artifactId>geoportal-data-entry-app</artifactId> <artifactId>geoportal-data-entry-app</artifactId>
<packaging>war</packaging> <packaging>war</packaging>
<version>3.0.0</version> <version>3.2.0-SNAPSHOT</version>
<name>GeoPortal Data Entry App</name> <name>GeoPortal Data Entry App</name>
<description>The GeoPortal Data Entry App is an application to build the web forms for data entries needed to create projects/documents (based on UCD) in the D4Science Geoportal service</description> <description>The GeoPortal Data Entry App is an application to build the web forms for data entries needed to create projects/documents (based on UCD) in the D4Science Geoportal service</description>
<scm> <scm>
@ -25,7 +25,7 @@
<properties> <properties>
<!-- Convenience property to set the GWT version --> <!-- Convenience property to set the GWT version -->
<gwt.version>2.9.0</gwt.version> <gwt.version>2.10.0</gwt.version>
<!-- GWT needs at least java 1.6 --> <!-- GWT needs at least java 1.6 -->
<webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory> <webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@ -51,7 +51,7 @@
<dependency> <dependency>
<groupId>org.gcube.distribution</groupId> <groupId>org.gcube.distribution</groupId>
<artifactId>maven-portal-bom</artifactId> <artifactId>maven-portal-bom</artifactId>
<version>3.6.4</version> <version>3.8.0-SNAPSHOT</version>
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
@ -68,22 +68,6 @@
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- needed to compile with gwt > 2.7 -->
<!-- <dependency> -->
<!-- <groupId>xml-apis</groupId> -->
<!-- <artifactId>xml-apis</artifactId> -->
<!-- <version>1.4.01</version> -->
<!-- <scope>provided</scope> -->
<!-- </dependency> -->
<!-- ASM required for GWT 2.9 -->
<!-- <dependency> -->
<!-- <groupId>org.ow2.asm</groupId> -->
<!-- <artifactId>asm</artifactId> -->
<!-- <scope>provided</scope> -->
<!-- <version>7.1</version> -->
<!-- </dependency> -->
<dependency> <dependency>
<groupId>com.google.gwt</groupId> <groupId>com.google.gwt</groupId>
<artifactId>gwt-servlet</artifactId> <artifactId>gwt-servlet</artifactId>
@ -107,6 +91,21 @@
<artifactId>gwt-bootstrap</artifactId> <artifactId>gwt-bootstrap</artifactId>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.gcube.portlets.widgets</groupId>
<artifactId>geoportal-data-viewer-widget</artifactId>
<version>[1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.gcube.application</groupId>
<artifactId>geoportal-data-mapper</artifactId>
<version>[1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)</version>
<scope>compile</scope>
</dependency>
<dependency> <dependency>
<groupId>org.gcube.portlets.widgets</groupId> <groupId>org.gcube.portlets.widgets</groupId>
<artifactId>metadata-profile-form-builder-widget</artifactId> <artifactId>metadata-profile-form-builder-widget</artifactId>
@ -129,12 +128,6 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>org.gcube.portlets.widgets</groupId>
<artifactId>openlayer-basic-widgets</artifactId>
<version>[1.0.0, 2.0.0-SNAPSHOT)</version>
<scope>compile</scope>
</dependency>
<!-- FWS --> <!-- FWS -->
<dependency> <dependency>
<groupId>org.gcube.common</groupId> <groupId>org.gcube.common</groupId>
@ -161,12 +154,6 @@
<version>[1.0.0, 2.0.0-SNAPSHOT)</version> <version>[1.0.0, 2.0.0-SNAPSHOT)</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
<scope>compile</scope>
</dependency>
<dependency> <dependency>
<groupId>org.gcube.application</groupId> <groupId>org.gcube.application</groupId>
<artifactId>geoportal-data-common</artifactId> <artifactId>geoportal-data-common</artifactId>
@ -237,6 +224,8 @@
<artifactId>slf4j-api</artifactId> <artifactId>slf4j-api</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- TESTS -->
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
@ -249,6 +238,13 @@
<artifactId>guava</artifactId> <artifactId>guava</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -13,9 +13,17 @@
<inherits name="com.google.gwt.json.JSON" /> <inherits name="com.google.gwt.json.JSON" />
<inherits <inherits
name='org.gcube.portlets.widgets.mpformbuilder.MetadataProfileFormBuilder' /> name='org.gcube.application.geoportalcommon.GeoportalDataCommon' />
<inherits name='org.gcube.application.geoportalcommon.GeoportalDataCommon' /> <inherits
name='org.gcube.application.geoportaldatamapper.GeoportalDataMapper' />
<inherits
name='org.gcube.portlets.widgets.gdvw.geoportal_data_viewer_widget' />
<inherits
name='org.gcube.portlets.widgets.mpformbuilder.MetadataProfileFormBuilder' />
<!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> --> <!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->

View File

@ -3,6 +3,7 @@ package org.gcube.portlets.user.geoportaldataentry.client;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import org.gcube.application.geoportalcommon.shared.geoportal.WORKFLOW_PHASE;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.GEOPORTAL_DATA_HANDLER; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.GEOPORTAL_DATA_HANDLER;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.HandlerDeclarationDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.HandlerDeclarationDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.UseCaseDescriptorDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.UseCaseDescriptorDV;
@ -44,10 +45,28 @@ public class ConstantsGeoPortalDataEntryApp {
public static final RootPanel ROOT_PANEL_DIV_PORTLET = RootPanel.get(ConstantsGeoPortalDataEntryApp.DIV_PORTLET_ID); public static final RootPanel ROOT_PANEL_DIV_PORTLET = RootPanel.get(ConstantsGeoPortalDataEntryApp.DIV_PORTLET_ID);
public static final String CSS_CLASS_GEOPORTAL_LOADERS_CENTER = "geoportal-loaders-center"; public static final String CSS_CLASS_GEOPORTAL_LOADERS_CENTER = "geoportal-loaders-center";
public static final String WORKFLOW_ACTION_POST_CREATION_ACTION_ID = "post_creation_action"; public static final String WORKFLOW_ACTION_POST_CREATION_ACTION_ID = "post_creation_action";
public static final DateTimeFormat DATE_TIME_FORMAT = DateTimeFormat.getFormat("dd MMMM yyyy"); public static final DateTimeFormat DATE_TIME_FORMAT = DateTimeFormat.getFormat("dd MMMM yyyy");
public static final String SHOW_ON_MAP_NOT_AVAILABLE_IN_DRAFT = "The 'Show on Map' facility is not available in DRAFT phase";
public static final String ALERT_MESSAGE_PROJECT_NOT_EDITABLE = "A Project can only be updated in "
+ WORKFLOW_PHASE.DRAFT.name()
+ " phase. You need to perform the step 'Reject' or 'UnPublish' to take back the project in "
+ WORKFLOW_PHASE.DRAFT.name() + " phase.";
public static final String ALERT_MESSAGE_CREATE_RELATION_FORBIDDEN = "The Create Relation operation can be performed only in "
+ WORKFLOW_PHASE.DRAFT.name()
+ " phase. You need to perform the step 'Reject' or 'UnPublish' to take back the project in "
+ WORKFLOW_PHASE.DRAFT.name() + " phase.";
public static final String ALERT_MESSAGE_DELETE_RELATION_FORBIDDEN = "The Delete Relation operation can be performed only in "
+ WORKFLOW_PHASE.DRAFT.name()
+ " phase. You need to perform the step 'Reject' or 'UnPublish' to take back the project in "
+ WORKFLOW_PHASE.DRAFT.name() + " phase.";
/** /**
* The Enum ACTION_PERFORMED_ON_ITEM. * The Enum ACTION_PERFORMED_ON_ITEM.

View File

@ -15,14 +15,19 @@ import org.gcube.application.geoportalcommon.shared.config.RoleRights;
import org.gcube.application.geoportalcommon.shared.config.RoleRights.OPERATION_TYPE; import org.gcube.application.geoportalcommon.shared.config.RoleRights.OPERATION_TYPE;
import org.gcube.application.geoportalcommon.shared.geoportal.DocumentDV; import org.gcube.application.geoportalcommon.shared.geoportal.DocumentDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ResultDocumentDV; import org.gcube.application.geoportalcommon.shared.geoportal.ResultDocumentDV;
import org.gcube.application.geoportalcommon.shared.geoportal.WORKFLOW_PHASE;
import org.gcube.application.geoportalcommon.shared.geoportal.config.GcubeProfileDV; import org.gcube.application.geoportalcommon.shared.geoportal.config.GcubeProfileDV;
import org.gcube.application.geoportalcommon.shared.geoportal.config.ItemFieldDV; import org.gcube.application.geoportalcommon.shared.geoportal.config.ItemFieldDV;
import org.gcube.application.geoportalcommon.shared.geoportal.materialization.innerobject.FilesetDV;
import org.gcube.application.geoportalcommon.shared.geoportal.materialization.innerobject.PayloadDV;
import org.gcube.application.geoportalcommon.shared.geoportal.project.LifecycleInformationDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.LifecycleInformationDV;
import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.GEOPORTAL_DATA_HANDLER; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.GEOPORTAL_DATA_HANDLER;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.HandlerDeclarationDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.HandlerDeclarationDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.RelationshipDefinitionDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.RelationshipDefinitionDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.UseCaseDescriptorDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.UseCaseDescriptorDV;
import org.gcube.application.geoportalcommon.shared.geoportal.view.ProjectView;
import org.gcube.application.geoportaldatamapper.shared.MetaDataProfileBeanExt;
import org.gcube.portlets.user.geoportaldataentry.client.ConstantsGeoPortalDataEntryApp.ACTION_PERFORMED_ON_ITEM; import org.gcube.portlets.user.geoportaldataentry.client.ConstantsGeoPortalDataEntryApp.ACTION_PERFORMED_ON_ITEM;
import org.gcube.portlets.user.geoportaldataentry.client.GeoPortalClientCaches.CacheSearchingFilterParametersFromConfig; import org.gcube.portlets.user.geoportaldataentry.client.GeoPortalClientCaches.CacheSearchingFilterParametersFromConfig;
import org.gcube.portlets.user.geoportaldataentry.client.events.ClickItemEvent; import org.gcube.portlets.user.geoportaldataentry.client.events.ClickItemEvent;
@ -39,6 +44,7 @@ import org.gcube.portlets.user.geoportaldataentry.client.events.OperationPerform
import org.gcube.portlets.user.geoportaldataentry.client.events.OperationPerformedOnItemEventHandler; import org.gcube.portlets.user.geoportaldataentry.client.events.OperationPerformedOnItemEventHandler;
import org.gcube.portlets.user.geoportaldataentry.client.events.RelationActionHandler; import org.gcube.portlets.user.geoportaldataentry.client.events.RelationActionHandler;
import org.gcube.portlets.user.geoportaldataentry.client.events.RelationActionHandlerEvent; import org.gcube.portlets.user.geoportaldataentry.client.events.RelationActionHandlerEvent;
import org.gcube.portlets.user.geoportaldataentry.client.events.RelationActionHandlerEvent.RELACTION_ACTION_TYPE;
import org.gcube.portlets.user.geoportaldataentry.client.events.SaveGeonaDataFormsEvent; import org.gcube.portlets.user.geoportaldataentry.client.events.SaveGeonaDataFormsEvent;
import org.gcube.portlets.user.geoportaldataentry.client.events.SaveGeonaDataFormsHandler; import org.gcube.portlets.user.geoportaldataentry.client.events.SaveGeonaDataFormsHandler;
import org.gcube.portlets.user.geoportaldataentry.client.events.TreeItemEvent; import org.gcube.portlets.user.geoportaldataentry.client.events.TreeItemEvent;
@ -51,6 +57,7 @@ import org.gcube.portlets.user.geoportaldataentry.client.ui.GeonaRecordsPaginate
import org.gcube.portlets.user.geoportaldataentry.client.ui.ModalWindow; import org.gcube.portlets.user.geoportaldataentry.client.ui.ModalWindow;
import org.gcube.portlets.user.geoportaldataentry.client.ui.card.GeoNaFormCardModel; import org.gcube.portlets.user.geoportaldataentry.client.ui.card.GeoNaFormCardModel;
import org.gcube.portlets.user.geoportaldataentry.client.ui.edit.EditModeRecord; import org.gcube.portlets.user.geoportaldataentry.client.ui.edit.EditModeRecord;
import org.gcube.portlets.user.geoportaldataentry.client.ui.edit.UpdateRecord;
import org.gcube.portlets.user.geoportaldataentry.client.ui.form.GeonaDataEntryMainForm; import org.gcube.portlets.user.geoportaldataentry.client.ui.form.GeonaDataEntryMainForm;
import org.gcube.portlets.user.geoportaldataentry.client.ui.report.LifecycleInformationPanel; import org.gcube.portlets.user.geoportaldataentry.client.ui.report.LifecycleInformationPanel;
import org.gcube.portlets.user.geoportaldataentry.client.ui.report.ReportTemplateToHTML; import org.gcube.portlets.user.geoportaldataentry.client.ui.report.ReportTemplateToHTML;
@ -61,23 +68,30 @@ import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.HTMLUtil;
import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.HTMLUtil.HTML_TAG; import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.HTMLUtil.HTML_TAG;
import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.LoaderIcon; import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.LoaderIcon;
import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.ModalConfirm; import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.ModalConfirm;
import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.NewBrowserWindow;
import org.gcube.portlets.user.geoportaldataentry.shared.CommitReport; import org.gcube.portlets.user.geoportaldataentry.shared.CommitReport;
import org.gcube.portlets.user.geoportaldataentry.shared.GNADataEntryExtendedConfigProfile; import org.gcube.portlets.user.geoportaldataentry.shared.GNADataEntryExtendedConfigProfile;
import org.gcube.portlets.user.geoportaldataentry.shared.GeoNaFormDataObject; import org.gcube.portlets.user.geoportaldataentry.shared.GeoNaFormDataObject;
import org.gcube.portlets.user.geoportaldataentry.shared.GeoportalISConfig; import org.gcube.portlets.user.geoportaldataentry.shared.GeoportalISConfig;
import org.gcube.portlets.user.geoportaldataentry.shared.Tree_Node; import org.gcube.portlets.user.geoportaldataentry.shared.Tree_Node;
import org.gcube.portlets.user.geoportaldataentry.shared.UserRights; import org.gcube.portlets.user.geoportaldataentry.shared.UserRights;
import org.gcube.portlets.widgets.gdvw.client.GeoportalDataViewerWidget;
import org.gcube.portlets.widgets.gdvw.client.project.ProjectViewer;
import org.gcube.portlets.widgets.mpformbuilder.client.MetadataProfileFormBuilderServiceAsync; import org.gcube.portlets.widgets.mpformbuilder.client.MetadataProfileFormBuilderServiceAsync;
import org.gcube.portlets.widgets.mpformbuilder.client.form.generic.CreateMetadataForm; import org.gcube.portlets.widgets.mpformbuilder.client.form.generic.CreateMetadataForm;
import org.gcube.portlets.widgets.mpformbuilder.client.form.generic.CreateMetadataForm.OPERATION; import org.gcube.portlets.widgets.mpformbuilder.client.form.generic.CreateMetadataForm.OPERATION;
import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.DataTypeWrapper;
import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean; import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean;
import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetadataFieldWrapper;
import org.gcube.portlets.widgets.mpformbuilder.shared.upload.FilePath;
import org.gcube.portlets.widgets.mpformbuilder.shared.upload.FileUploaded;
import org.gcube.portlets.widgets.mpformbuilder.shared.upload.FileUploadedRemote;
import com.github.gwtbootstrap.client.ui.Alert; import com.github.gwtbootstrap.client.ui.Alert;
import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.Modal; import com.github.gwtbootstrap.client.ui.Modal;
import com.github.gwtbootstrap.client.ui.constants.AlertType; import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.github.gwtbootstrap.client.ui.constants.ButtonType; import com.github.gwtbootstrap.client.ui.constants.ButtonType;
import com.github.gwtbootstrap.client.ui.constants.LabelType;
import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler;
@ -91,6 +105,7 @@ import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.user.client.Window; import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Image;
@ -193,7 +208,7 @@ public class GeoPortalDataEntryApp implements EntryPoint {
@Override @Override
public void onFailure(Throwable caught) { public void onFailure(Throwable caught) {
String errorMsg = "Sorry, an error occurrend when loading configurations. Please, contact the support"; String errorMsg = "Sorry, an error occurred when loading configurations. Please, contact the support";
Alert alert = new Alert(errorMsg, AlertType.ERROR); Alert alert = new Alert(errorMsg, AlertType.ERROR);
alert.setClose(false); alert.setClose(false);
try { try {
@ -224,7 +239,7 @@ public class GeoPortalDataEntryApp implements EntryPoint {
@Override @Override
public void onFailure(Throwable caught) { public void onFailure(Throwable caught) {
String errorMsg = "Sorry, an error occurrend on istancing the application. Please, contact the support"; String errorMsg = "Sorry, an error occurred on istancing the application. Please, contact the support";
Alert alert = new Alert(errorMsg, AlertType.ERROR); Alert alert = new Alert(errorMsg, AlertType.ERROR);
alert.setClose(false); alert.setClose(false);
try { try {
@ -305,7 +320,7 @@ public class GeoPortalDataEntryApp implements EntryPoint {
@Override @Override
public void onFailure(Throwable caught) { public void onFailure(Throwable caught) {
String errorMsg = "Sorry, an error occurrend on loading configurations. Please, contact the support"; String errorMsg = "Sorry, an error occurred on loading configurations. Please, contact the support";
Alert alert = new Alert(errorMsg, AlertType.ERROR); Alert alert = new Alert(errorMsg, AlertType.ERROR);
alert.setClose(false); alert.setClose(false);
try { try {
@ -380,18 +395,18 @@ public class GeoPortalDataEntryApp implements EntryPoint {
} }
private void createNewDataEntyFor(String profileID, HandlerDeclarationDV handlerDeclarationDV, private <T extends MetaDataProfileBean> void createNewDataEntyFor(String profileID,
List<GcubeProfileDV> listGPs) { HandlerDeclarationDV handlerDeclarationDV, List<GcubeProfileDV> listGPs) {
dataEntryProjectCreated = true; dataEntryProjectCreated = true;
mainTabPanel.setLoaderVisible("Loading...", true); mainTabPanel.setLoaderVisible("Loading...", true);
// orderedCards.clear(); // orderedCards.clear();
resetUI(); resetUI();
mainTabPanel.setPageHeader(handlerDeclarationDV); mainTabPanel.setPageHeader(handlerDeclarationDV);
//TODO AVOIDING THE CACHE // TODO AVOIDING THE CACHE
//TODO I NEED TO CHECK WHY THE BY USING THE CACHE THE WEB-FORM IS FULL (EQUAL TO PREVIOUS ONE) AND NOT RESET PERFORMED // TODO I NEED TO CHECK WHY THE BY USING THE CACHE THE WEB-FORM IS FULL (EQUAL
// TO PREVIOUS ONE) AND NOT RESET PERFORMED
// List<GeoNaFormCardModel> cardsPerIT = geoportalCaches.getGcubeProfilePerItemType(handlerDeclarationDV.getItemType()); // List<GeoNaFormCardModel> cardsPerIT = geoportalCaches.getGcubeProfilePerItemType(handlerDeclarationDV.getItemType());
// if (cardsPerIT != null) { // if (cardsPerIT != null) {
// GWT.log("Profiles/Cards per Item Type are: " + cardsPerIT); // GWT.log("Profiles/Cards per Item Type are: " + cardsPerIT);
@ -410,10 +425,18 @@ public class GeoPortalDataEntryApp implements EntryPoint {
final int order = i; final int order = i;
GWT.log("calling getProfilesInTheScope for secondaryType: " + gcubeProfile.getGcubeSecondaryType() GWT.log("calling getProfilesInTheScope for secondaryType: " + gcubeProfile.getGcubeSecondaryType()
+ ", name: " + gcubeProfile.getGcubeName()); + ", name: " + gcubeProfile.getGcubeName());
MetadataProfileFormBuilderServiceAsync.Util.getInstance().getProfilesInTheScopeForName( MetadataProfileFormBuilderServiceAsync.Util.getInstance().getProfilesInTheScopeForName(
geoportalISConfigs.getScope(), gcubeProfile.getGcubeSecondaryType(), gcubeProfile.getGcubeName(), geoportalISConfigs.getScope(), gcubeProfile.getGcubeSecondaryType(), gcubeProfile.getGcubeName(),
new AsyncCallback<List<MetaDataProfileBean>>() { new AsyncCallback<List<MetaDataProfileBean>>() {
@Override
public void onFailure(Throwable caught) {
mainTabPanel.setLoaderVisible("Loading...", false);
Window.alert(caught.getMessage());
}
@Override @Override
public void onSuccess(List<MetaDataProfileBean> result) { public void onSuccess(List<MetaDataProfileBean> result) {
@ -427,7 +450,7 @@ public class GeoPortalDataEntryApp implements EntryPoint {
GWT.log("Building form card for type: " + theMetaType); GWT.log("Building form card for type: " + theMetaType);
GeoNaFormCardModel geonaForm = buildNewFormCardModelFromProfile(gcubeProfile, order, GeoNaFormCardModel geonaForm = buildNewFormCardModelFromProfile(gcubeProfile, order,
metaDataProfileBean, OPERATION.UPDATE); metaDataProfileBean, OPERATION.UPDATE, appManagerBus);
treemapOrderedGNAProfiles.put(order, geonaForm); treemapOrderedGNAProfiles.put(order, geonaForm);
} }
@ -437,19 +460,14 @@ public class GeoPortalDataEntryApp implements EntryPoint {
// ordered values // ordered values
Collection<GeoNaFormCardModel> gnaCardsModels = treemapOrderedGNAProfiles.values(); Collection<GeoNaFormCardModel> gnaCardsModels = treemapOrderedGNAProfiles.values();
GWT.log("TreeMap values: " + gnaCardsModels); GWT.log("TreeMap values: " + gnaCardsModels);
List<GeoNaFormCardModel> listGNAFormCardModel = new ArrayList<GeoNaFormCardModel>(gnaCardsModels); List<GeoNaFormCardModel> listGNAFormCardModel = new ArrayList<GeoNaFormCardModel>(
gnaCardsModels);
geoportalCaches.putGcubeProfilePerItemType(handlerDeclarationDV.getItemType(), geoportalCaches.putGcubeProfilePerItemType(handlerDeclarationDV.getItemType(),
listGNAFormCardModel); listGNAFormCardModel);
// orderedCards.addAll(new ArrayList<GeoNaFormCardModel>(gnaCardsModels)); // orderedCards.addAll(new ArrayList<GeoNaFormCardModel>(gnaCardsModels));
buildNewCards(profileID, handlerDeclarationDV.getItemType(), buildNewCards(profileID, handlerDeclarationDV.getItemType(), listGNAFormCardModel);
listGNAFormCardModel);
} }
}
@Override
public void onFailure(Throwable caught) {
mainTabPanel.setLoaderVisible("Loading...", false);
Window.alert(caught.getMessage());
} }
}); });
@ -493,8 +511,8 @@ public class GeoPortalDataEntryApp implements EntryPoint {
mainTabPanel.setLoaderVisible("Loading...", true); mainTabPanel.setLoaderVisible("Loading...", true);
geoNaMainForm.setVisibleFormActions(true); geoNaMainForm.setVisibleFormActions(true);
resetUI(); resetUI();
//geoNaMainForm.removeTree(treeItemPanel); // geoNaMainForm.removeTree(treeItemPanel);
geoNaMainForm.enableButtonSave(true); geoNaMainForm.enableButtonSave(true);
mainTabPanel.setLoaderVisible("", false); mainTabPanel.setLoaderVisible("", false);
@ -606,7 +624,7 @@ public class GeoPortalDataEntryApp implements EntryPoint {
savedMap.put(result.getProjectID(), saveGeonaDataFormsEvent.getTreeNode()); savedMap.put(result.getProjectID(), saveGeonaDataFormsEvent.getTreeNode());
LifecycleInformationPanel lip = new LifecycleInformationPanel(result.getProjectID(), LifecycleInformationPanel lip = new LifecycleInformationPanel(result.getProjectID(),
result.getProfileID(), result.getProjectAsJSON(), lcDV, true); result.getProfileID(), result.getProjectAsJSON(), lcDV, false);
modalContainerPanel.add(lip); modalContainerPanel.add(lip);
@ -774,10 +792,10 @@ public class GeoPortalDataEntryApp implements EntryPoint {
public void onGetList(GetListOfRecordsEvent getListOfRecordsEvent) { public void onGetList(GetListOfRecordsEvent getListOfRecordsEvent) {
GWT.log("Fired: " + getListOfRecordsEvent); GWT.log("Fired: " + getListOfRecordsEvent);
SearchingFilter searchingFilter = getListOfRecordsEvent.getSearchingFilter(); SearchingFilter searchingFilter = getListOfRecordsEvent.getSearchingFilter();
CacheSearchingFilterParametersFromConfig seachingFilterParameters = geoportalCaches
CacheSearchingFilterParametersFromConfig seachingFilterParameters = .getFilterParametersForProfileId(getListOfRecordsEvent.getProfileID(),
geoportalCaches.getFilterParametersForProfileId(getListOfRecordsEvent.getProfileID(), GEOPORTAL_DATA_HANDLER.geoportal_data_list); GEOPORTAL_DATA_HANDLER.geoportal_data_list);
// CacheSearchingFilterParametersFromConfig seachingFilterParameters = geoportalCaches // CacheSearchingFilterParametersFromConfig seachingFilterParameters = geoportalCaches
// .getFilterParametersForProfileId(getListOfRecordsEvent.getProfileID()); // .getFilterParametersForProfileId(getListOfRecordsEvent.getProfileID());
@ -863,6 +881,20 @@ public class GeoPortalDataEntryApp implements EntryPoint {
switch (createRelationHE.getRelactionActionType()) { switch (createRelationHE.getRelactionActionType()) {
case DELETE: { case DELETE: {
GcubeUserRole myRole = myRights.getRoleRights().getUserRole();
// TODO REMOVE THIS IF AFTER ADDING ALL THE OPERATIONS IN THE IS
// OPERATIONS/RIGHTS CONFIGURATION
if (!myRole.equals(GcubeUserRole.DATA_MANAGER) && !myRole.equals(GcubeUserRole.DATA_EDITOR)) {
String action = RELACTION_ACTION_TYPE.DELETE + " Relation";
String msg = "You are not authorized to perform the action: " + action;
ModalWindow modalW = new ModalWindow(new Image(Images.ICONS.accessDenied()),
"Forbidden: " + action, msg, AlertType.WARNING);
modalW.show();
return;
}
if (createRelationHE.getFromProject() == null || createRelationHE.getToProject() == null) { if (createRelationHE.getFromProject() == null || createRelationHE.getToProject() == null) {
DialogInform di = new DialogInform(null, "No selection", "You must select a Project"); DialogInform di = new DialogInform(null, "No selection", "You must select a Project");
di.center(); di.center();
@ -1195,56 +1227,70 @@ public class GeoPortalDataEntryApp implements EntryPoint {
modalContainerPanel.remove(loader); modalContainerPanel.remove(loader);
} catch (Exception e) { } catch (Exception e) {
} }
String stepString = wActionOnItem.getAction().getCallSteps().length==1?"Step":"Steps"; String stepString = wActionOnItem.getAction().getCallSteps().length == 1
? "Step"
: "Steps";
String stepsToString = ""; String stepsToString = "";
for (String step : wActionOnItem.getAction().getCallSteps()) { for (String step : wActionOnItem.getAction().getCallSteps()) {
stepsToString+=step+", "; stepsToString += step + ", ";
} }
Alert alert = new Alert( Alert alert = new Alert(
stepString +" "+ stepsToString stepString + " " + stepsToString + "performed correclty!");
+ "performed correclty!");
alert.setType(AlertType.INFO); alert.setType(AlertType.INFO);
alert.setClose(false); alert.setClose(false);
modal.add(alert); modal.add(alert);
GeoportalDataEntryServiceAsync.Util.getInstance().getResultDocumentFoProjectByID(result.getProfileID(), result.getId(), new AsyncCallback<ResultDocumentDV>() {
@Override GeoportalDataEntryServiceAsync.Util.getInstance()
public void onFailure(Throwable caught) { .getResultDocumentFoProjectByID(result.getProfileID(),
// TODO Auto-generated method stub result.getId(), new AsyncCallback<ResultDocumentDV>() {
}
@Override @Override
public void onSuccess(ResultDocumentDV theResultDocument) { public void onFailure(Throwable caught) {
VerticalPanel vp = new VerticalPanel(); // TODO Auto-generated method stub
vp.getElement().getStyle().setMarginTop(20, Unit.PX);
vp.add(new Label("Check outcome in the Publication Report"));
Button buttonShowPublicationReport = new Button(
"Show Publication Report");
buttonShowPublicationReport.setType(ButtonType.INFO);
buttonShowPublicationReport.addClickHandler(new ClickHandler() {
@Override }
public void onClick(ClickEvent event) {
modal.hide();
appManagerBus.fireEvent(new OperationOnItemEvent<DocumentDV>(
Arrays.asList(theResultDocument),
OPERATION_ON_ITEM.VIEW_REPORT));
} @Override
}); public void onSuccess(
buttonShowPublicationReport.getElement().getStyle().setMarginTop(10, Unit.PX); ResultDocumentDV theResultDocument) {
buttonShowPublicationReport.getElement().getStyle().setMarginBottom(20, Unit.PX); VerticalPanel vp = new VerticalPanel();
vp.add(buttonShowPublicationReport); vp.getElement().getStyle().setMarginTop(20,
Unit.PX);
vp.add(new Label(
"Check outcome in the Publication Report"));
Button buttonShowPublicationReport = new Button(
"Show Publication Report");
buttonShowPublicationReport
.setType(ButtonType.INFO);
buttonShowPublicationReport
.addClickHandler(new ClickHandler() {
modal.add(vp); @Override
public void onClick(
} ClickEvent event) {
}); modal.hide();
appManagerBus.fireEvent(
new OperationOnItemEvent<DocumentDV>(
Arrays.asList(
theResultDocument),
OPERATION_ON_ITEM.VIEW_REPORT));
}
});
buttonShowPublicationReport.getElement()
.getStyle().setMarginTop(10, Unit.PX);
buttonShowPublicationReport.getElement()
.getStyle()
.setMarginBottom(20, Unit.PX);
vp.add(buttonShowPublicationReport);
modal.add(vp);
}
});
appManagerBus.fireEvent(new GetListOfRecordsEvent(false, appManagerBus.fireEvent(new GetListOfRecordsEvent(false,
resultDocumentDV.getProfileID(), resultDocumentDV.getProfileID(),
@ -1398,32 +1444,72 @@ public class GeoPortalDataEntryApp implements EntryPoint {
case VIEW_ON_MAP: { case VIEW_ON_MAP: {
final Modal modal = new Modal(true, true); final Modal modal = new Modal(true, true);
modal.setTitle("Show on Map the Project...");
modal.setCloseVisible(true); modal.setCloseVisible(true);
if (resultDocumentDV.getLifecycleInfo() != null) {
String phase = resultDocumentDV.getLifecycleInfo().getPhase();
// IF the project is not in DRAFT phase, showing an alert and no Update Mode
// will
// be activated
if (phase != null && phase.compareToIgnoreCase(WORKFLOW_PHASE.DRAFT.getLabel()) == 0) {
Alert alert = new Alert(
ConstantsGeoPortalDataEntryApp.SHOW_ON_MAP_NOT_AVAILABLE_IN_DRAFT);
alert.setType(AlertType.WARNING);
alert.setClose(false);
modal.add(alert);
modal.show();
return;
}
}
final HorizontalPanel hpGetLink = new HorizontalPanel(); final HorizontalPanel hpGetLink = new HorizontalPanel();
final LoaderIcon lc = new LoaderIcon("Just moment getting link..."); final LoaderIcon lc = new LoaderIcon("Just moment getting link...");
hpGetLink.add(lc); hpGetLink.add(lc);
modal.add(hpGetLink); modal.add(hpGetLink);
final NewBrowserWindow newBrowserWindow = NewBrowserWindow.open("", "_blank", "");
GeoportalDataEntryServiceAsync.Util.getInstance().getLinksFor(resultDocumentDV.getId(), GeoportalDataEntryServiceAsync.Util.getInstance().getLinksFor(resultDocumentDV.getId(),
resultDocumentDV.getProfileID(), new AsyncCallback<GeoportalItemReferences>() { resultDocumentDV.getProfileID(), new AsyncCallback<GeoportalItemReferences>() {
@Override @Override
public void onFailure(Throwable caught) { public void onFailure(Throwable caught) {
hpGetLink.clear(); try {
hpGetLink.setVisible(false);
modal.remove(hpGetLink);
} catch (Exception e) {
// TODO: handle exception
}
Alert alert = new Alert(caught.getMessage(), AlertType.ERROR); Alert alert = new Alert(caught.getMessage(), AlertType.ERROR);
alert.setClose(false); alert.setClose(false);
hpGetLink.add(alert); hpGetLink.add(alert);
newBrowserWindow.close(); // newBrowserWindow.close();
} }
@Override @Override
public void onSuccess(GeoportalItemReferences result) { public void onSuccess(GeoportalItemReferences result) {
try {
hpGetLink.setVisible(false);
modal.remove(hpGetLink);
} catch (Exception e) {
// TODO: handle exception
}
String theURL = result.getRestrictedLink().getShortURL() != null String theURL = result.getRestrictedLink().getShortURL() != null
? result.getRestrictedLink().getShortURL() ? result.getRestrictedLink().getShortURL()
: result.getRestrictedLink().getCompleteURL(); : result.getRestrictedLink().getCompleteURL();
newBrowserWindow.setUrl(theURL); // newBrowserWindow.setUrl(theURL);
modal.hide();
Anchor anchor = new Anchor(theURL);
anchor.setHref(theURL);
anchor.setTarget("_blank");
anchor.setTitle(
"Show on Map the project with id: " + resultDocumentDV.getId());
com.github.gwtbootstrap.client.ui.Label label = new com.github.gwtbootstrap.client.ui.Label(
"Go to Map by clicking the link");
label.setType(LabelType.SUCCESS);
modal.add(label);
modal.add(new HTML("<br>"));
modal.add(anchor);
} }
}); });
@ -1472,23 +1558,76 @@ public class GeoPortalDataEntryApp implements EntryPoint {
} }
case EDIT_PROJECT: { case EDIT_PROJECT: {
final Modal modal3 = new Modal(true, true); final Modal modal3 = new Modal(true, true);
modal3.setTitle( modal3.setTitle(
"<span style='font-size:20px;'>Edit: <span style='color:#555; font-size:20px;'>" "<span style='font-size:20px;'>Update Project with id: <span style='color:#555; font-size:20px;'>"
+ resultDocumentDV.getId() + "</span></span>"); + resultDocumentDV.getId() + "</span></span>");
modal3.setWidth(950); // modal3.setWidth(950);
modal3.setHeight("700px"); // modal3.setHeight("700px");
modal3.setCloseVisible(true); modal3.setCloseVisible(true);
((Element) modal3.getElement().getChildNodes().getItem(1)) ((Element) modal3.getElement().getChildNodes().getItem(1)).addClassName("modal-body-edit");
.addClassName("modal-body-custom"); int height = Window.getClientHeight() * 70 / 100;
EditModeRecord emr = new EditModeRecord(appManagerBus, resultDocumentDV);
modal3.add(emr); int width = Window.getClientWidth() * 70 / 100;
modal3.setWidth(width);
modal3.setHeight(height + "px");
// #24569
boolean isNotInDRAFT = false;
if (resultDocumentDV.getLifecycleInfo() != null) {
String phase = resultDocumentDV.getLifecycleInfo().getPhase();
// IF the project is not in DRAFT phase, showing an alert and no Update Mode
// will
// be activated
if (phase != null && phase.compareToIgnoreCase(WORKFLOW_PHASE.DRAFT.getLabel()) != 0) {
Alert alert = new Alert(
ConstantsGeoPortalDataEntryApp.ALERT_MESSAGE_PROJECT_NOT_EDITABLE);
alert.setType(AlertType.WARNING);
alert.setClose(false);
modal3.add(alert);
isNotInDRAFT = true;
}
}
UpdateRecord ur = new UpdateRecord(appManagerBus, resultDocumentDV.getProfileID(),
resultDocumentDV.getId(), width, height);
if (isNotInDRAFT) {
ur.noUpdateMode();
}
modal3.add(ur);
modal3.show(); modal3.show();
break; break;
} }
case CREATE_RELATION: { case CREATE_RELATION: {
mainTabPanel.showCreateRelationPanel(true, resultDocumentDV); // #24571
boolean isNotInDRAFT = false;
if (resultDocumentDV.getLifecycleInfo() != null) {
String phase = resultDocumentDV.getLifecycleInfo().getPhase();
// IF the project is not in DRAFT, showing an alert and the no Update Mode will
// be activated
if (phase != null && phase.compareToIgnoreCase(WORKFLOW_PHASE.DRAFT.getLabel()) != 0) {
String msg = ConstantsGeoPortalDataEntryApp.ALERT_MESSAGE_CREATE_RELATION_FORBIDDEN;
ModalWindow modalW = new ModalWindow(new Image(Images.ICONS.accessDenied()),
"Forbidden: " + action, msg, AlertType.WARNING);
modalW.show();
isNotInDRAFT = true;
}
}
// Allowing the Create Relation only in DRAFT phase
if (!isNotInDRAFT) {
mainTabPanel.showCreateRelationPanel(true, resultDocumentDV);
}
break; break;
} }
@ -1500,6 +1639,79 @@ public class GeoPortalDataEntryApp implements EntryPoint {
break; break;
} }
// It is the show document
case VIEW_PROJECT_AS_DOCUMENT: {
GWT.log("VIEW VIEW_PROJECT_AS_DOCUMENT fired");
final Modal modal = new Modal(true, true);
modal.setCloseVisible(true);
final int height = Window.getClientHeight() * 70 / 100;
int width = Window.getClientWidth() * 70 / 100;
modal.setMaxHeigth("none");
modal.setWidth(width);
modal.setHeight(height + "px");
modal.setTitle(
"<span style='font-size:20px;'>View Document for Project ID: <span style='color:#555; font-size:20px;'>"
+ resultDocumentDV.getId() + "</span></span>");
final HorizontalPanel hp = new HorizontalPanel();
final LoaderIcon lc = new LoaderIcon("Loading Project... please wait");
hp.add(lc);
modal.add(hp);
GeoportalDataEntryServiceAsync.Util.getInstance().getProjectView(
resultDocumentDV.getProfileID(), resultDocumentDV.getProjectID(),
new AsyncCallback<ProjectView>() {
@Override
public void onFailure(Throwable caught) {
hp.clear();
modal.setTitle("Error :-(");
Alert alert = new Alert(
"Sorry, I cannot show the Project with id '"
+ resultDocumentDV.getId()
+ "' Refresh an try again. Error: " + caught.getMessage(),
AlertType.ERROR);
alert.setClose(false);
hp.add(alert);
}
@Override
public void onSuccess(ProjectView result) {
hp.clear();
GeoportalDataViewerWidget wid = new GeoportalDataViewerWidget();
ProjectViewer viewer = wid.getProjectViewer(result);
viewer.setTocContentVisible(true);
viewer.setHeight((height - 80) + "px");
modal.add(viewer);
}
});
modal.show();
break;
}
case VIEW_PROJECT_AS_JSON: {
GWT.log("VIEW VIEW_PROJECT_AS_JSON fired");
final Modal modal = new Modal(true, true);
modal.setCloseVisible(true);
final int height = Window.getClientHeight() * 70 / 100;
int width = Window.getClientWidth() * 70 / 100;
modal.setMaxHeigth("none");
modal.setWidth(width);
modal.setHeight(height + "px");
modal.setTitle(
"<span style='font-size:20px;'>View as JSON for Project ID: <span style='color:#555; font-size:20px;'>"
+ resultDocumentDV.getId() + "</span></span>");
EditModeRecord editMode = new EditModeRecord(appManagerBus, resultDocumentDV, height);
modal.add(editMode);
modal.show();
break;
}
case DELETE_PROJECT: { case DELETE_PROJECT: {
String htmlMsg = "Going to delete the project with:"; String htmlMsg = "Going to delete the project with:";
@ -1536,7 +1748,7 @@ public class GeoPortalDataEntryApp implements EntryPoint {
@Override @Override
public void onFailure(Throwable caught) { public void onFailure(Throwable caught) {
hp.clear(); hp.clear();
modal.setTitle("Error"); modal.setTitle("Error :-(");
Alert alert = new Alert( Alert alert = new Alert(
"Sorry, I cannot delete the Project with id '" "Sorry, I cannot delete the Project with id '"
+ resultDocumentDV.getId() + resultDocumentDV.getId()
@ -1610,7 +1822,7 @@ public class GeoPortalDataEntryApp implements EntryPoint {
NodeItem theRootNode = (NodeItem) root.getWidget(); NodeItem theRootNode = (NodeItem) root.getWidget();
GeoNaFormCardModel nodeCard = theRootNode.getGeoNaFormCardModel(); GeoNaFormCardModel nodeCard = theRootNode.getGeoNaFormCardModel();
GeoNaFormCardModel newNodeFormCard = buildNewFormCardModelFromProfile(nodeCard.getGcubeProfile(), -1, GeoNaFormCardModel newNodeFormCard = buildNewFormCardModelFromProfile(nodeCard.getGcubeProfile(), -1,
nodeCard.getMetadataProfileBean(), OPERATION.UPDATE); nodeCard.getMetadataProfileBean(), OPERATION.UPDATE, appManagerBus);
// create a new node with the same data as the root node // create a new node with the same data as the root node
boolean canBeDuplicated = newNodeFormCard.getFormCard().isInternalRepeatibleForm(); boolean canBeDuplicated = newNodeFormCard.getFormCard().isInternalRepeatibleForm();
@ -1704,4 +1916,91 @@ public class GeoPortalDataEntryApp implements EntryPoint {
}); });
} }
/**
* Builds the new form card model from profile.
*
* @param gcubeProfile the gcube profile
* @param order the order
* @param metaDataProfileBean the meta data profile bean
* @param operation the operation
* @param appManagerBus the app manager bus
* @return the geo na form card model
*/
public static <T extends MetaDataProfileBean> GeoNaFormCardModel buildNewFormCardModelFromProfile(
GcubeProfileDV gcubeProfile, int order, T metaDataProfileBean, OPERATION operation,
HandlerManager appManagerBus) {
// Managing Forms Repeatability
int minOccurs = gcubeProfile.getMinOccurs();
minOccurs = minOccurs <= 0 ? 0 : minOccurs;
int maxOccurs = gcubeProfile.getMaxOccurs();
maxOccurs = maxOccurs <= 0 ? Integer.MAX_VALUE : maxOccurs;
// TODO MUST BE MANAGED MIN_OCCURS
ProjectFormCard cct = new ProjectFormCard(gcubeProfile.getSectionName(), gcubeProfile.getSectionTitle(), order,
maxOccurs > 1, minOccurs, maxOccurs);
List<FilesetDV> fileset = null;
if (metaDataProfileBean instanceof MetaDataProfileBeanExt) {
MetaDataProfileBeanExt metaDataProfileBeanExt = (MetaDataProfileBeanExt) metaDataProfileBean;
fileset = metaDataProfileBeanExt.getListFileset();
}
GeoNaFormCardModel geoNaFormCardModel = new GeoNaFormCardModel(metaDataProfileBean, null, cct, gcubeProfile);
// In case of UPDATE operation, the fields of kind File will be not mandatory.
if (operation != null && operation.equals(OPERATION.UPDATE)) {
List<MetadataFieldWrapper> fields = geoNaFormCardModel.getMetadataProfileBean().getMetadataFields();
for (MetadataFieldWrapper metadataFieldWrapper : fields) {
if (metadataFieldWrapper.getMandatory()
&& metadataFieldWrapper.getType().equals(DataTypeWrapper.File)) {
metadataFieldWrapper.setMandatory(false);
}
}
}
CreateMetadataForm baseForm = null;
if (fileset == null) {
GWT.log("Instancing CreateMetadataForm without files");
baseForm = new CreateMetadataForm(Arrays.asList(geoNaFormCardModel.getMetadataProfileBean()), appManagerBus,
operation);
} else {
GWT.log("Instancing CreateMetadataForm with files");
List<? extends FileUploaded> files = toListFileUploadedRemote(fileset);
GWT.log("files are: " + files);
baseForm = new CreateMetadataForm(Arrays.asList(geoNaFormCardModel.getMetadataProfileBean()), appManagerBus,
operation, files);
}
geoNaFormCardModel.setMetadataForm(baseForm);
return geoNaFormCardModel;
}
public static List<? extends FileUploaded> toListFileUploadedRemote(List<FilesetDV> fileset) {
if (fileset == null || fileset.size() == 0)
return null;
List<FileUploadedRemote> fileUploaded = new ArrayList<FileUploadedRemote>();
for (FilesetDV filesetDV : fileset) {
GWT.log("filesetDV fieldName: " + filesetDV.getFilesetFieldName() + " profile: "
+ filesetDV.getGcubeProfileFieldName());
for (PayloadDV payload : filesetDV.getListPayload()) {
FileUploadedRemote fu = new FileUploadedRemote();
fu.setFileName(payload.getName());
fu.setUrl(payload.getLink());
fu.setMimeType(payload.getMimetype());
// adding FilePath according to spefic file registred in the UCD
FilePath filePath = new FilePath(filesetDV.getGcubeProfileFieldName(), filesetDV.getFilesetFieldName());
fu.setFilePath(filePath);
fileUploaded.add(fu);
}
}
return fileUploaded;
}
} }

View File

@ -7,11 +7,14 @@ import org.gcube.application.geoportalcommon.shared.ResultSetPaginatedData;
import org.gcube.application.geoportalcommon.shared.SearchingFilter; import org.gcube.application.geoportalcommon.shared.SearchingFilter;
import org.gcube.application.geoportalcommon.shared.geoportal.ResultDocumentDV; import org.gcube.application.geoportalcommon.shared.geoportal.ResultDocumentDV;
import org.gcube.application.geoportalcommon.shared.geoportal.config.ActionDefinitionDV; import org.gcube.application.geoportalcommon.shared.geoportal.config.ActionDefinitionDV;
import org.gcube.application.geoportalcommon.shared.geoportal.config.FilePathDV;
import org.gcube.application.geoportalcommon.shared.geoportal.project.LifecycleInformationDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.LifecycleInformationDV;
import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV;
import org.gcube.application.geoportalcommon.shared.geoportal.project.TemporalReferenceDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.TemporalReferenceDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.RelationshipDefinitionDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.RelationshipDefinitionDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.UseCaseDescriptorDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.UseCaseDescriptorDV;
import org.gcube.application.geoportalcommon.shared.geoportal.view.ProjectView;
import org.gcube.application.geoportaldatamapper.shared.ProjectEdit;
import org.gcube.portlets.user.geoportaldataentry.shared.CommitReport; import org.gcube.portlets.user.geoportaldataentry.shared.CommitReport;
import org.gcube.portlets.user.geoportaldataentry.shared.GNADataEntryExtendedConfigProfile; import org.gcube.portlets.user.geoportaldataentry.shared.GNADataEntryExtendedConfigProfile;
import org.gcube.portlets.user.geoportaldataentry.shared.GeoNaFormDataObject; import org.gcube.portlets.user.geoportaldataentry.shared.GeoNaFormDataObject;
@ -31,6 +34,15 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
@RemoteServiceRelativePath("geoportaldataentryservice") @RemoteServiceRelativePath("geoportaldataentryservice")
public interface GeoportalDataEntryService extends RemoteService { public interface GeoportalDataEntryService extends RemoteService {
/**
* Save geona data forms.
*
* @param profileID the profile ID
* @param tree_Node the tree node
* @param stepsOnPostCreation the steps on post creation
* @return the commit report
* @throws Exception the exception
*/
CommitReport saveGeonaDataForms(String profileID, Tree_Node<GeoNaFormDataObject> tree_Node, CommitReport saveGeonaDataForms(String profileID, Tree_Node<GeoNaFormDataObject> tree_Node,
List<String> stepsOnPostCreation) throws Exception; List<String> stepsOnPostCreation) throws Exception;
@ -184,7 +196,7 @@ public interface GeoportalDataEntryService extends RemoteService {
* @param id the id * @param id the id
* @param toProfileID the to profile ID * @param toProfileID the to profile ID
* @param toProjectID the to project ID * @param toProjectID the to project ID
* @return * @return the result document DV
* @throws Exception the exception * @throws Exception the exception
*/ */
ResultDocumentDV deleteRelationship(String fromProfileID, String fromProjectID, String id, String toProfileID, ResultDocumentDV deleteRelationship(String fromProfileID, String fromProjectID, String id, String toProfileID,
@ -199,4 +211,30 @@ public interface GeoportalDataEntryService extends RemoteService {
*/ */
TemporalReferenceDV temporalReferenceForProject(String profileID, String projectID); TemporalReferenceDV temporalReferenceForProject(String profileID, String projectID);
/**
* Gets the project edit.
*
* @param profileID the profile ID
* @param projectID the project ID
* @return the project edit
* @throws Exception the exception
*/
ProjectEdit getProjectEdit(String profileID, String projectID) throws Exception;
/**
* Update geportal data form.
*
* @param profileID the profile ID
* @param projectID the project ID
* @param section the section
* @param sectionPath the section path
* @param listFilePaths the list file paths
* @return the commit report
* @throws Exception the exception
*/
CommitReport updateGeportalDataForm(String profileID, String projectID, GeoNaFormDataObject section,
String sectionPath, List<FilePathDV> listFilePaths) throws Exception;
ProjectView getProjectView(String profileID, String projectID) throws Exception;
} }

View File

@ -7,11 +7,14 @@ import org.gcube.application.geoportalcommon.shared.ResultSetPaginatedData;
import org.gcube.application.geoportalcommon.shared.SearchingFilter; import org.gcube.application.geoportalcommon.shared.SearchingFilter;
import org.gcube.application.geoportalcommon.shared.geoportal.ResultDocumentDV; import org.gcube.application.geoportalcommon.shared.geoportal.ResultDocumentDV;
import org.gcube.application.geoportalcommon.shared.geoportal.config.ActionDefinitionDV; import org.gcube.application.geoportalcommon.shared.geoportal.config.ActionDefinitionDV;
import org.gcube.application.geoportalcommon.shared.geoportal.config.FilePathDV;
import org.gcube.application.geoportalcommon.shared.geoportal.project.LifecycleInformationDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.LifecycleInformationDV;
import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV;
import org.gcube.application.geoportalcommon.shared.geoportal.project.TemporalReferenceDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.TemporalReferenceDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.RelationshipDefinitionDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.RelationshipDefinitionDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.UseCaseDescriptorDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.UseCaseDescriptorDV;
import org.gcube.application.geoportalcommon.shared.geoportal.view.ProjectView;
import org.gcube.application.geoportaldatamapper.shared.ProjectEdit;
import org.gcube.portlets.user.geoportaldataentry.shared.CommitReport; import org.gcube.portlets.user.geoportaldataentry.shared.CommitReport;
import org.gcube.portlets.user.geoportaldataentry.shared.GNADataEntryExtendedConfigProfile; import org.gcube.portlets.user.geoportaldataentry.shared.GNADataEntryExtendedConfigProfile;
import org.gcube.portlets.user.geoportaldataentry.shared.GeoNaFormDataObject; import org.gcube.portlets.user.geoportaldataentry.shared.GeoNaFormDataObject;
@ -50,6 +53,9 @@ public interface GeoportalDataEntryServiceAsync {
void saveGeonaDataForms(String profileID, Tree_Node<GeoNaFormDataObject> tree_Node, void saveGeonaDataForms(String profileID, Tree_Node<GeoNaFormDataObject> tree_Node,
List<String> stepsOnPostCreation, AsyncCallback<CommitReport> callback); List<String> stepsOnPostCreation, AsyncCallback<CommitReport> callback);
void updateGeportalDataForm(String profileID, String projectID, GeoNaFormDataObject section,
String sectionPath, List<FilePathDV> listFilePaths, AsyncCallback<CommitReport> callback);
void getGeonaInitConfig(AsyncCallback<GeoportalISConfig> callback); void getGeonaInitConfig(AsyncCallback<GeoportalISConfig> callback);
@ -88,4 +94,8 @@ public interface GeoportalDataEntryServiceAsync {
void temporalReferenceForProject(String profileID, String projectID, AsyncCallback<TemporalReferenceDV> callback); void temporalReferenceForProject(String profileID, String projectID, AsyncCallback<TemporalReferenceDV> callback);
void getProjectEdit(String profileID, String projectID, AsyncCallback<ProjectEdit> callback);
void getProjectView(String profileID, String projectID, AsyncCallback<ProjectView> callback);
} }

View File

@ -22,7 +22,6 @@ import org.gcube.application.geoportalcommon.shared.guipresentation.Header;
import org.gcube.portlets.user.geoportaldataentry.client.ConstantsGeoPortalDataEntryApp; import org.gcube.portlets.user.geoportaldataentry.client.ConstantsGeoPortalDataEntryApp;
import org.gcube.portlets.user.geoportaldataentry.client.GeoPortalClientCaches.CacheSearchingFilterParametersFromConfig; import org.gcube.portlets.user.geoportaldataentry.client.GeoPortalClientCaches.CacheSearchingFilterParametersFromConfig;
import org.gcube.portlets.user.geoportaldataentry.client.events.CreateNewProjectEvent; import org.gcube.portlets.user.geoportaldataentry.client.events.CreateNewProjectEvent;
import org.gcube.portlets.user.geoportaldataentry.client.events.GetListOfRecordsEvent;
import org.gcube.portlets.user.geoportaldataentry.client.events.OperationOnItemEvent; import org.gcube.portlets.user.geoportaldataentry.client.events.OperationOnItemEvent;
import org.gcube.portlets.user.geoportaldataentry.client.ui.form.GeonaDataEntryMainForm; import org.gcube.portlets.user.geoportaldataentry.client.ui.form.GeonaDataEntryMainForm;
import org.gcube.portlets.user.geoportaldataentry.client.ui.projects.ListOfProjectTablePanel; import org.gcube.portlets.user.geoportaldataentry.client.ui.projects.ListOfProjectTablePanel;
@ -99,6 +98,12 @@ public class GeonaMainTabPanel extends Composite {
@UiField @UiField
Tab tabGetListOfProjects; Tab tabGetListOfProjects;
@UiField
NavLink navViewAsDocument;
@UiField
NavLink navViewAsJSON;
@UiField @UiField
NavLink navShowOnMap; NavLink navShowOnMap;
@ -245,6 +250,36 @@ public class GeonaMainTabPanel extends Composite {
} }
}); });
navViewAsDocument.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
List<DocumentDV> listDocuments = null;
if (grpw != null && grpw.getSelectItems() != null) {
listDocuments = grpw.getSelectItems();
}
appManagerBus.fireEvent(new OperationOnItemEvent<DocumentDV>(listDocuments,
OPERATION_ON_ITEM.VIEW_PROJECT_AS_DOCUMENT));
}
});
navViewAsJSON.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
List<DocumentDV> listDocuments = null;
if (grpw != null && grpw.getSelectItems() != null) {
listDocuments = grpw.getSelectItems();
}
appManagerBus.fireEvent(
new OperationOnItemEvent<DocumentDV>(listDocuments, OPERATION_ON_ITEM.VIEW_PROJECT_AS_JSON));
}
});
navShowReport.addClickHandler(new ClickHandler() { navShowReport.addClickHandler(new ClickHandler() {
@Override @Override
@ -457,20 +492,8 @@ public class GeonaMainTabPanel extends Composite {
GEOPORTAL_DATA_HANDLER.geoportal_data_list); GEOPORTAL_DATA_HANDLER.geoportal_data_list);
if (dataListHandler != null) { if (dataListHandler != null) {
NavLink link = new NavLink(ucd.getName());
link.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
appManagerBus.fireEvent(new GetListOfRecordsEvent(false, ucd.getProfileID(),
getCurrentProjectsSearchingFilter(), true));
}
});
ucdProjectTypesForListingDataView.add(ucd); ucdProjectTypesForListingDataView.add(ucd);
listOfProjectTablePanel.addProjectType(ucd);
listOfProjectTablePanel.addProjectType(link);
} }

View File

@ -74,7 +74,8 @@
<g:HTMLPanel ui:field="introGNA"> <g:HTMLPanel ui:field="introGNA">
<b:Hero ui:field="introGNAHero"> <b:Hero ui:field="introGNAHero">
<b:Heading size="2" ui:field="welcomeTitle">Welcome <b:Heading size="2" ui:field="welcomeTitle">Welcome
to GeoPortal Data Entry</b:Heading> to GeoPortal Data
Entry</b:Heading>
<b:Paragraph ui:field="welcomeDescription"></b:Paragraph> <b:Paragraph ui:field="welcomeDescription"></b:Paragraph>
<b:Paragraph>select "Create New Project"</b:Paragraph> <b:Paragraph>select "Create New Project"</b:Paragraph>
</b:Hero> </b:Hero>
@ -99,12 +100,18 @@
<g:FlowPanel> <g:FlowPanel>
<g:FlowPanel addStyleNames="move-sticky"> <g:FlowPanel addStyleNames="move-sticky">
<b:NavPills> <b:NavPills>
<b:NavLink ui:field="navViewAsDocument"
title="View Document" icon="FILE">View Document</b:NavLink>
<b:NavLink ui:field="navViewAsJSON"
title="View Document as JSON" icon="CODE">View as JSON</b:NavLink>
<b:Divider addStyleNames="{style.divider-border-right}" />
<b:NavLink ui:field="navShowOnMap" title="Show on Map" <b:NavLink ui:field="navShowOnMap" title="Show on Map"
icon="MAP_MARKER">Show on Map</b:NavLink> icon="MAP_MARKER">Show on Map</b:NavLink>
<b:Divider addStyleNames="{style.divider-border-right}" />
<b:NavLink ui:field="navShowReport" <b:NavLink ui:field="navShowReport"
title="Show Publication Report" icon="FILE_TEXT_ALT">Publication Report</b:NavLink> title="Show Publication Report" icon="FILE_TEXT_ALT">Publication Report</b:NavLink>
<b:NavLink ui:field="navEditMode" title="Edit" <b:NavLink ui:field="navEditMode" title="Edit"
icon="PENCIL">Edit</b:NavLink> icon="PENCIL">Update</b:NavLink>
<b:NavLink ui:field="navDelete" title="Delete Project" <b:NavLink ui:field="navDelete" title="Delete Project"
icon="TRASH">Delete Project</b:NavLink> icon="TRASH">Delete Project</b:NavLink>
<b:Divider addStyleNames="{style.divider-border-right}" /> <b:Divider addStyleNames="{style.divider-border-right}" />

View File

@ -38,7 +38,8 @@ public class ActionListPanel extends Composite {
private List<ActionDefinitionDV> listActionDefinition; private List<ActionDefinitionDV> listActionDefinition;
private HandlerManager appManagerBus; private HandlerManager appManagerBus;
public ActionListPanel(HandlerManager appManagerBus,String projectName, String profileID, List<ActionDefinitionDV> listActionDef) { public ActionListPanel(HandlerManager appManagerBus, String projectName, String profileID,
List<ActionDefinitionDV> listActionDef) {
initWidget(uiBinder.createAndBindUi(this)); initWidget(uiBinder.createAndBindUi(this));
GWT.log("Adding list of actions: " + listActionDef); GWT.log("Adding list of actions: " + listActionDef);
this.appManagerBus = appManagerBus; this.appManagerBus = appManagerBus;
@ -60,7 +61,7 @@ public class ActionListPanel extends Composite {
private void initActions(List<ActionDefinitionDV> listActionDef) { private void initActions(List<ActionDefinitionDV> listActionDef) {
if (listActionDef.size() > 0) { if (listActionDef.size() > 0) {
//actionListBasePanel.setVisible(true); // actionListBasePanel.setVisible(true);
ButtonGroup buttonGroup = new ButtonGroup(); ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.getElement().addClassName("actions-button-group"); buttonGroup.getElement().addClassName("actions-button-group");
@ -68,22 +69,24 @@ public class ActionListPanel extends Composite {
mapPhaseListButtons = new LinkedHashMap<String, List<ActionDefButton>>(); mapPhaseListButtons = new LinkedHashMap<String, List<ActionDefButton>>();
for (ActionDefinitionDV actionDefinitionDV : listActionDef) { for (ActionDefinitionDV actionDefinitionDV : listActionDef) {
//skipping the special workflow action // skipping the special workflow action
if(actionDefinitionDV.getId().equals(ConstantsGeoPortalDataEntryApp.WORKFLOW_ACTION_POST_CREATION_ACTION_ID)) { if (actionDefinitionDV.getId()
.equals(ConstantsGeoPortalDataEntryApp.WORKFLOW_ACTION_POST_CREATION_ACTION_ID)) {
continue; continue;
} }
Button butt = new Button(); Button butt = new Button();
butt.setText(actionDefinitionDV.getTitle()); butt.setText(actionDefinitionDV.getTitle());
butt.setTitle(actionDefinitionDV.getDescription()); butt.setTitle(actionDefinitionDV.getDescription());
butt.setType(ButtonType.LINK); butt.setType(ButtonType.INFO);
butt.addClickHandler(new ClickHandler() { butt.addClickHandler(new ClickHandler() {
@Override @Override
public void onClick(ClickEvent event) { public void onClick(ClickEvent event) {
appManagerBus.fireEvent(new WorkflowActionOnSelectedItemEvent<ResultDocumentDV>(actionDefinitionDV)); appManagerBus
.fireEvent(new WorkflowActionOnSelectedItemEvent<ResultDocumentDV>(actionDefinitionDV));
} }
}); });
@ -110,9 +113,9 @@ public class ActionListPanel extends Composite {
public <T> void showActionsOnSelected(List<T> listSelected, GcubeUserRole userRole) { public <T> void showActionsOnSelected(List<T> listSelected, GcubeUserRole userRole) {
setAllActionsVisible(false); setAllActionsVisible(false);
if (listSelected.size() == 1) { if (listSelected.size() == 1) {
for (T item : listSelected) { for (T item : listSelected) {
if (item instanceof ResultDocumentDV) { if (item instanceof ResultDocumentDV) {
@ -120,20 +123,25 @@ public class ActionListPanel extends Composite {
String itemPhase = ((ResultDocumentDV) item).getLifecycleInfo().getPhase(); String itemPhase = ((ResultDocumentDV) item).getLifecycleInfo().getPhase();
List<ActionDefButton> listButtons = mapPhaseListButtons.get(itemPhase); List<ActionDefButton> listButtons = mapPhaseListButtons.get(itemPhase);
for (ActionDefButton actionDefButton : listButtons) {
if (listButtons != null) {
Set<String> roles = actionDefButton.getActionDefinitionDV().getRoles();
for (ActionDefButton actionDefButton : listButtons) {
//No role/s defined means enable the action by default
if(roles.isEmpty()) { Set<String> roles = actionDefButton.getActionDefinitionDV().getRoles();
actionDefButton.getButton().setVisible(true);
actionListBasePanel.setVisible(true); // No role/s defined means enable the action by default
}else { if (roles.isEmpty()) {
//Checking if the userRole is matching the role defined in the ActionDefinition
boolean isRoleIntoActionDef= roles.stream().anyMatch(userRole.getName()::equalsIgnoreCase);
if(isRoleIntoActionDef) {
actionDefButton.getButton().setVisible(true); actionDefButton.getButton().setVisible(true);
actionListBasePanel.setVisible(true); actionListBasePanel.setVisible(true);
} else {
// Checking if the userRole is matching the role defined in the ActionDefinition
boolean isRoleIntoActionDef = roles.stream()
.anyMatch(userRole.getName()::equalsIgnoreCase);
if (isRoleIntoActionDef) {
actionDefButton.getButton().setVisible(true);
actionListBasePanel.setVisible(true);
}
} }
} }
} }
@ -144,13 +152,19 @@ public class ActionListPanel extends Composite {
} }
private void setAllActionsVisible(boolean bool) { private void setAllActionsVisible(boolean bool) {
Iterator<List<ActionDefButton>> collIterator = mapPhaseListButtons.values().iterator();
while (collIterator.hasNext()) {
List<ActionDefButton> listButton = collIterator.next();
for (ActionDefButton actionDefButton : listButton) {
actionDefButton.getButton().setVisible(bool);
}
if (mapPhaseListButtons != null && mapPhaseListButtons.values().size() > 0) {
Iterator<List<ActionDefButton>> collIterator = mapPhaseListButtons.values().iterator();
if (collIterator != null) {
while (collIterator.hasNext()) {
List<ActionDefButton> listButton = collIterator.next();
for (ActionDefButton actionDefButton : listButton) {
actionDefButton.getButton().setVisible(bool);
}
}
}
} }
} }
} }

View File

@ -5,9 +5,9 @@ import org.gcube.portlets.user.geoportaldataentry.client.ProjectFormCard;
import org.gcube.portlets.widgets.mpformbuilder.client.form.generic.CreateMetadataForm; import org.gcube.portlets.widgets.mpformbuilder.client.form.generic.CreateMetadataForm;
import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean; import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean;
public class GeoNaFormCardModel { public class GeoNaFormCardModel<T extends MetaDataProfileBean> {
private MetaDataProfileBean metadataProfileBean; private T metadataProfileBean;
private CreateMetadataForm metadataForm; private CreateMetadataForm metadataForm;
private ProjectFormCard formCard; // matching with metadata profile private ProjectFormCard formCard; // matching with metadata profile
private GcubeProfileDV gcubeProfile; private GcubeProfileDV gcubeProfile;
@ -16,8 +16,8 @@ public class GeoNaFormCardModel {
} }
public GeoNaFormCardModel(MetaDataProfileBean metadataProfileBean, CreateMetadataForm metadataForm, public GeoNaFormCardModel(T metadataProfileBean, CreateMetadataForm metadataForm, ProjectFormCard formCard,
ProjectFormCard formCard, GcubeProfileDV gcubeProfile) { GcubeProfileDV gcubeProfile) {
super(); super();
this.metadataProfileBean = metadataProfileBean; this.metadataProfileBean = metadataProfileBean;
this.metadataForm = metadataForm; this.metadataForm = metadataForm;
@ -25,11 +25,11 @@ public class GeoNaFormCardModel {
this.gcubeProfile = gcubeProfile; this.gcubeProfile = gcubeProfile;
} }
public MetaDataProfileBean getMetadataProfileBean() { public T getMetadataProfileBean() {
return metadataProfileBean; return metadataProfileBean;
} }
public void setMetadataProfileBean(MetaDataProfileBean metadataProfileBean) { public void setMetadataProfileBean(T metadataProfileBean) {
this.metadataProfileBean = metadataProfileBean; this.metadataProfileBean = metadataProfileBean;
} }

View File

@ -14,8 +14,10 @@ import org.gcube.portlets.user.geoportaldataentry.client.ui.edit.jseditor.JSONEd
import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.DialogInform; import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.DialogInform;
import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.LoaderIcon; import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.LoaderIcon;
import com.github.gwtbootstrap.client.ui.Alert;
import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.Tab; import com.github.gwtbootstrap.client.ui.Tab;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.core.client.Scheduler.ScheduledCommand;
@ -27,11 +29,11 @@ import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Random; import com.google.gwt.user.client.Random;
import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
/** /**
@ -68,6 +70,8 @@ public class EditModeRecord extends Composite {
private final HandlerManager editorManagerBus = new HandlerManager(null); private final HandlerManager editorManagerBus = new HandlerManager(null);
private int modalHeight;
/** /**
* The Interface EditModeRecordUiBinder. * The Interface EditModeRecordUiBinder.
* *
@ -78,12 +82,14 @@ public class EditModeRecord extends Composite {
interface EditModeRecordUiBinder extends UiBinder<Widget, EditModeRecord> { interface EditModeRecordUiBinder extends UiBinder<Widget, EditModeRecord> {
} }
public EditModeRecord(HandlerManager appManagerBus, ResultDocumentDV selectedProject) { public EditModeRecord(HandlerManager appManagerBus, ResultDocumentDV selectedProject, int modalHeight) {
initWidget(uiBinder.createAndBindUi(this)); initWidget(uiBinder.createAndBindUi(this));
this.modalHeight = modalHeight;
this.selectedProject = selectedProject; this.selectedProject = selectedProject;
this.appManagerBus = appManagerBus; this.appManagerBus = appManagerBus;
this.filesUpdatePanel.setHeight("490px"); this.filesUpdatePanel.setHeight((modalHeight - 50) + "px");
// filesUpdatePanel.getElement().getStyle().setProperty("maxHeight", "550px"); // filesUpdatePanel.getElement().modalHeight().setProperty("maxHeight",
// "550px");
// TODO Must be instanceUpdateFilesetEditor // TODO Must be instanceUpdateFilesetEditor
tabUploadFiles.asWidget().getElement().getStyle().setVisibility(Visibility.HIDDEN); tabUploadFiles.asWidget().getElement().getStyle().setVisibility(Visibility.HIDDEN);
@ -114,12 +120,21 @@ public class EditModeRecord extends Composite {
} }
public void noUpdateMode() {
buttonJSONUpdate.setVisible(false);
}
private void instanceJSONEditor() { private void instanceJSONEditor() {
rawUpdatePanel.clear(); rawUpdatePanel.clear();
final HorizontalPanel hpLoader = new HorizontalPanel();
final LoaderIcon lc = new LoaderIcon("Loading Project... please wait");
hpLoader.add(lc);
rawUpdatePanel.add(hpLoader);
final FlowPanel fp = new FlowPanel(); final FlowPanel fp = new FlowPanel();
fp.getElement().setId("jsoneditor" + Random.nextInt()); fp.getElement().setId("jsoneditor" + Random.nextInt());
fp.setHeight("410px"); fp.setHeight((modalHeight - 160) + "px");
rawUpdatePanel.add(fp); rawUpdatePanel.add(fp);
Scheduler.get().scheduleDeferred(new ScheduledCommand() { Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@ -130,6 +145,7 @@ public class EditModeRecord extends Composite {
@Override @Override
public void onSuccess(String jsonData) { public void onSuccess(String jsonData) {
hpLoader.clear();
GWT.log("Instance JSON Editor with: " + jsonData); GWT.log("Instance JSON Editor with: " + jsonData);
jsEditor = JSONEditorWrapper.init(fp.getElement().getId()); jsEditor = JSONEditorWrapper.init(fp.getElement().getId());
jsEditor.setName(selectedProject.getId()); jsEditor.setName(selectedProject.getId());
@ -148,7 +164,13 @@ public class EditModeRecord extends Composite {
@Override @Override
public void onFailure(Throwable caught) { public void onFailure(Throwable caught) {
Window.alert(caught.getMessage()); rawUpdatePanel.clear();
Alert alert = new Alert(
"Sorry, I cannot show the source Project with id '" + selectedProject.getId()
+ "' Refresh an try again. Error: " + caught.getMessage(),
AlertType.ERROR);
alert.setClose(false);
rawUpdatePanel.add(alert);
} }
}); });

View File

@ -21,13 +21,13 @@
<g:HTMLPanel> <g:HTMLPanel>
<b:TabPanel tabPosition="left" ui:field="tabPanel"> <b:TabPanel tabPosition="left" ui:field="tabPanel">
<b:Tab icon="PENCIL" active="true" heading="Edit the Project" <b:Tab icon="CODE" active="true" heading="Project"
ui:field="tabRawUpdate"> ui:field="tabRawUpdate">
<b:Heading size="3">Source Project Editor</b:Heading> <b:Heading size="3">Source Project as JSON</b:Heading>
<b:Label type="INFO">You can update the project by editing <b:Label type="INFO" visible="false">You can update the project by editing
the the
model data displayed in the following editor.</b:Label> model data displayed in the following editor.</b:Label>
<g:HTML addStyleNames="{style.info-panel}"> <g:HTML visible="false" addStyleNames="{style.info-panel}">
<p style='color: #585858'> <p style='color: #585858'>
Be careful not to change the Be careful not to change the
keys (e.g. nome, introduzione, keys (e.g. nome, introduzione,
@ -52,7 +52,7 @@
</g:FlowPanel> </g:FlowPanel>
<b:Button icon="SAVE" type="INFO" <b:Button icon="SAVE" type="INFO"
addStyleNames="{style.button-save-style}" addStyleNames="{style.button-save-style}"
ui:field="buttonJSONUpdate">UPDATE</b:Button> ui:field="buttonJSONUpdate" visible="false">UPDATE</b:Button>
</b:Tab> </b:Tab>
<b:Tab icon="UPLOAD_ALT" heading="Manage File/s" <b:Tab icon="UPLOAD_ALT" heading="Manage File/s"
ui:field="tabUploadFiles"> ui:field="tabUploadFiles">

View File

@ -1,550 +0,0 @@
//package org.gcube.portlets.user.geoportaldataentry.client.ui.edit;
//
//import java.util.ArrayList;
//import java.util.Collection;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//import org.gcube.application.geoportalcommon.shared.products.BaseConcessioneDV;
//import org.gcube.application.geoportalcommon.shared.products.ConcessioneDV;
//import org.gcube.application.geoportalcommon.shared.products.content.WorkspaceContentDV;
//import org.gcube.application.geoportalcommon.shared.products.model.AbstractRelazioneScavoDV;
//import org.gcube.application.geoportalcommon.shared.products.model.LayerConcessioneDV;
//import org.gcube.application.geoportalcommon.shared.products.model.RelazioneScavoDV;
//import org.gcube.application.geoportalcommon.shared.products.model.UploadedImageDV;
//import org.gcube.portlets.user.geoportaldataentry.client.GeoportalDataEntryServiceAsync;
//import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.DialogInform;
//import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.ModalConfirm;
//import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.StringUtil;
//import org.gcube.portlets.widgets.mpformbuilder.client.form.MetaDataField;
//import org.gcube.portlets.widgets.mpformbuilder.client.form.generic.CreateMetadataForm.OPERATION;
//import org.gcube.portlets.widgets.mpformbuilder.client.ui.metadata.MetaDataFieldSkeleton;
//import org.gcube.portlets.widgets.mpformbuilder.client.ui.upload.DialogUpload;
//import org.gcube.portlets.widgets.mpformbuilder.shared.GenericDatasetBean;
//import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.DataTypeWrapper;
//import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetadataFieldWrapper;
//import org.gcube.portlets.widgets.mpformbuilder.shared.upload.FileUploaded;
//
//import com.github.gwtbootstrap.client.ui.Button;
//import com.github.gwtbootstrap.client.ui.ControlGroup;
//import com.github.gwtbootstrap.client.ui.Controls;
//import com.github.gwtbootstrap.client.ui.Label;
//import com.github.gwtbootstrap.client.ui.ListBox;
//import com.github.gwtbootstrap.client.ui.constants.IconType;
//import com.github.gwtbootstrap.client.ui.constants.LabelType;
//import com.google.gwt.core.client.GWT;
//import com.google.gwt.dom.client.Document;
//import com.google.gwt.dom.client.Style.Unit;
//import com.google.gwt.event.dom.client.ChangeEvent;
//import com.google.gwt.event.dom.client.ChangeHandler;
//import com.google.gwt.event.dom.client.ClickEvent;
//import com.google.gwt.event.dom.client.ClickHandler;
//import com.google.gwt.event.dom.client.DomEvent;
//import com.google.gwt.event.shared.HandlerManager;
//import com.google.gwt.uibinder.client.UiBinder;
//import com.google.gwt.uibinder.client.UiField;
//import com.google.gwt.user.client.Window;
//import com.google.gwt.user.client.rpc.AsyncCallback;
//import com.google.gwt.user.client.ui.Composite;
//import com.google.gwt.user.client.ui.FlexTable;
//import com.google.gwt.user.client.ui.HTML;
//import com.google.gwt.user.client.ui.HTMLPanel;
//import com.google.gwt.user.client.ui.Widget;
//
///**
// * The Class UpdateFileset.
// *
// * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
// *
// * Sep 27, 2021
// */
//public class UpdateFileset extends Composite {
//
// private static final String SECTION_PIANTE = "piante";
//
// private static final String SECTION_POSIZIONAMENTO_SCAVO = "posizionamentoScavo";
//
// private static final String SECTION_RELAZIONE = "relazione";
//
// private static final String SECTION_IMMAGINI = "immagini";
//
// private static final String SECTION_ABSTRACT_RELAZIONE = "abstract_relazione";
//
// private static final String _FORM_WIDTH_FIELDS_SIZE = "730px";
//
// private static UpdateFilesetUiBinder uiBinder = GWT.create(UpdateFilesetUiBinder.class);
//
// /**
// * The Interface UpdateFilesetUiBinder.
// *
// * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
// *
// * Sep 27, 2021
// */
// interface UpdateFilesetUiBinder extends UiBinder<Widget, UpdateFileset> {
// }
//
// @UiField
// ListBox listBoxPaths;
//
// @UiField
// ControlGroup cgSelectFile;
//
// @UiField
// Controls controlsContent;
//
// @UiField
// HTMLPanel uploadFileContainer;
//
// @UiField
// Button buttonUpdate;
//
// private List<String> listFileSetPaths;
//
// private boolean placeholderListBoxPaths = true;
//
// private BaseConcessioneDV selectedConcessione;
//
// private ConcessioneDV fullConcessione;
//
// private boolean placeholderListBoxIndex = true;
//
// private HandlerManager uiBus = new HandlerManager(null);
//
// private MetaDataField fieldUploadWidget;
//
// private Integer pathIndex = null;
//
// private Map<Integer, WorkspaceContentDV> mapForCCUploading = null;
//
// private Map<Integer, List<WorkspaceContentDV>> mapWSContentListBox = null;
//
// private HandlerManager editorManagerBus;
//
// private String profileID;
//
//
// /**
// * Instantiates a new update fileset.
// *
// * @param editorManagerBus the editor manager bus
// * @param selectedConcessione the selected concessione
// * @param recordType the record type
// * @param listFileSetPaths the list file set paths
// */
// public UpdateFileset(HandlerManager editorManagerBus, BaseConcessioneDV selectedConcessione, String profileID, List<String> listFileSetPaths) {
// initWidget(uiBinder.createAndBindUi(this));
// this.editorManagerBus = editorManagerBus;
// this.selectedConcessione = selectedConcessione;
// this.profileID = profileID;
// this.listFileSetPaths = listFileSetPaths;
// listBoxPaths.addItem("Select a section...");
// for (String path : listFileSetPaths) {
// listBoxPaths.addItem(path);
// }
// listBoxPaths.setWidth(_FORM_WIDTH_FIELDS_SIZE);
//
// // add handler on select
// listBoxPaths.addChangeHandler(new ChangeHandler() {
//
// @Override
// public void onChange(ChangeEvent event) {
// GWT.log("Profile type selection changed...");
// cgSelectFile.setVisible(false);
//
// if (placeholderListBoxPaths) {
// listBoxPaths.removeItem(0); // this is the placeholder, removing it once
// placeholderListBoxPaths = false;
// }
// showUploadFileGUI();
// }
//
// });
//
//
// Window.alert("This part must be revisited");
//
//// GeoPortalDataEntryApp.geoportalDataEntryService.getRecord(selectedConcessione.getItemId(), recordType,
//// new AsyncCallback<ConcessioneDV>() {
////
//// @Override
//// public void onSuccess(ConcessioneDV theRecord) {
//// fullConcessione = theRecord;
//// }
////
//// @Override
//// public void onFailure(Throwable caught) {
//// Window.alert(caught.getMessage());
//// }
//// });
//
// buttonUpdate.addClickHandler(new ClickHandler() {
//
// @Override
// public void onClick(ClickEvent event) {
//
// String errorMsg = checkValidUpload();
// if (errorMsg == null) {
// List<FileUploaded> listFilesUploaded = new ArrayList<FileUploaded>();
// List<MetaDataFieldSkeleton> listMetaDataFieldSkeleton = fieldUploadWidget.getListOfMetadataFields();
// for (MetaDataFieldSkeleton field : listMetaDataFieldSkeleton) {
// DialogUpload dUpload = (DialogUpload) field.getHolder();
// // adding it only if exists
// if (dUpload.getFileUploadingState() != null)
// listFilesUploaded.add(dUpload.getFileUploadingState().getFile());
// }
//
// GenericDatasetBean gdb = new GenericDatasetBean();
// gdb.setFilesUploaded(listFilesUploaded);
// // adding it only if exists
//
// GWT.log("Section selected: " + listBoxPaths.getSelectedItemText());
// GWT.log("Content index selected: " + pathIndex);
// GWT.log("FileUploaded selected: " + gdb.getFilesUploaded());
//
// List<WorkspaceContentDV> listCurrentContent = new ArrayList<WorkspaceContentDV>();
// if (mapForCCUploading != null) {
// Collection<WorkspaceContentDV> currentContent = mapForCCUploading.values();
// if (currentContent != null)
// listCurrentContent.addAll(currentContent);
// }
//
// String htmlMsg = "Going to update the section " + listBoxPaths.getSelectedItemText() + ":";
// htmlMsg += "<ul>";
// htmlMsg += "<li>keeping " + listCurrentContent.size() + " current file/s </li>";
// htmlMsg += "<li>uploading " + listFilesUploaded.size() + " new file/s </li>";
// htmlMsg += "</ul>";
// htmlMsg += "<br>";
// htmlMsg += "This operation cannot be undone. Would you like to proceed?";
//
// GWT.log(htmlMsg);
//
// final ModalConfirm dialogConfirm = new ModalConfirm(null, "Update Confirm?", htmlMsg);
// dialogConfirm.getElement().getStyle().setZIndex(100000);
// dialogConfirm.getYesButton().addClickHandler(new ClickHandler() {
//
// @Override
// public void onClick(ClickEvent event) {
// dialogConfirm.hide();
// buttonUpdate.setEnabled(false);
//
// final DialogInform dialogInf = new DialogInform(null, "Updating Project...", "");
// dialogInf.setZIndex(100000);
// dialogInf.showLoader("Updating file/s for project: "+fullConcessione.getNome());
// //dialogInf.setWidth("400px");
//
// GeoportalDataEntryServiceAsync.Util.getInstance().updateSectionForRecord(
// fullConcessione.getItemId(), fullConcessione.getRecordType(),
// listBoxPaths.getSelectedItemText(), pathIndex, listCurrentContent, gdb,
// new AsyncCallback<ConcessioneDV>() {
//
// @Override
// public void onFailure(Throwable caught) {
// dialogInf.hideLoader();
// dialogInf.setMsg(
// "Sorry error occurred during project update. Error reported: "
// + caught.getMessage());
// buttonUpdate.setEnabled(true);
// showUploadFileGUI();
//
// }
//
// @Override
// public void onSuccess(ConcessioneDV result) {
// dialogInf.hideLoader();
// dialogInf.setText("Project updated!");
// dialogInf.setMsg(result.getNome() + " updated correclty");
// dialogInf.center();
// fullConcessione = result;
// GWT.log("new concessione: "+fullConcessione);
// buttonUpdate.setEnabled(true);
// showUploadFileGUI();
//
// Window.alert("updateSectionForRecord must be revisited");
//
// /*
// editorManagerBus.fireEvent(
// new OperationPerformedOnItemEvent<ConcessioneDV>(Arrays.asList(fullConcessione), ACTION_PERFORMED_ON_ITEM.UPDATED_PROJECT));
//
// */
//
// }
// });
// dialogInf.center();
// }
// });
// dialogConfirm.show();
//
// } else {
// Window.alert(errorMsg);
// }
//
// }
// });
//
// }
//
// /**
// * Show upload file GUI.
// */
// private void showUploadFileGUI() {
// uploadFileContainer.setVisible(true);
// buttonUpdate.setVisible(false);
// uploadFileContainer.clear();
// controlsContent.clear();
// placeholderListBoxIndex = true;
// fieldUploadWidget = null;
// pathIndex = null;
// mapForCCUploading = null;
// mapWSContentListBox = null;
//
//// listBoxIndex.clear();
// cgSelectFile.setVisible(true);
//
// ListBox listBoxContentIndex = new ListBox();
// listBoxContentIndex.setWidth(_FORM_WIDTH_FIELDS_SIZE);
// listBoxContentIndex.addItem("Select a content...");
// String section = null;
// Integer posizIndex = 0;
// if (listBoxPaths.getSelectedItemText().contains(SECTION_ABSTRACT_RELAZIONE)) {
// section = SECTION_ABSTRACT_RELAZIONE;
// AbstractRelazioneScavoDV ar = fullConcessione.getAbstractRelazioneScavo();
//
// if (ar == null) {
// showMessage(SECTION_ABSTRACT_RELAZIONE + " NOT AVAILABLE", LabelType.WARNING);
//// pathIndex = 0;
//// showNewFileUpload();
// return;
// }
//
// fillListBoxToBeReplaced(listBoxContentIndex, section, posizIndex, ar.getTitolo(),
// ar.getListWsContent());
//
// } else if (listBoxPaths.getSelectedItemText().contains(SECTION_IMMAGINI)) {
// section = SECTION_IMMAGINI;
// List<UploadedImageDV> listImmagini = fullConcessione.getImmaginiRappresentative();
// if (listImmagini == null || listImmagini.isEmpty()) {
// showMessage(SECTION_IMMAGINI + " NOT AVAILABLE", LabelType.WARNING);
//// pathIndex = 0;
//// showNewFileUpload();
// return;
// }
//
// for (UploadedImageDV uploadedImageDV : listImmagini) {
// fillListBoxToBeReplaced(listBoxContentIndex, section, posizIndex, StringUtil.ellipsize(uploadedImageDV.getDidascalia(),30),
// uploadedImageDV.getListWsContent());
// posizIndex++;
// }
//
// } else if (listBoxPaths.getSelectedItemText().contains(SECTION_RELAZIONE)) {
// section = SECTION_RELAZIONE;
// RelazioneScavoDV relazioneScavo = fullConcessione.getRelazioneScavo();
// if (relazioneScavo == null) {
// showMessage(SECTION_RELAZIONE + " NOT AVAILABLE", LabelType.WARNING);
//// pathIndex = 0;
//// showNewFileUpload();
// return;
// }
//
// fillListBoxToBeReplaced(listBoxContentIndex, section, posizIndex, relazioneScavo.getTitolo(),
// relazioneScavo.getListWsContent());
//
// } else if (listBoxPaths.getSelectedItemText().contains(SECTION_POSIZIONAMENTO_SCAVO)) {
// section = SECTION_POSIZIONAMENTO_SCAVO;
// LayerConcessioneDV posiz = fullConcessione.getPosizionamentoScavo();
// if (posiz == null) {
// showMessage(SECTION_POSIZIONAMENTO_SCAVO + " NOT AVAILABLE", LabelType.WARNING);
//// pathIndex = 0;
//// showNewFileUpload();
// return;
// }
//
// fillListBoxToBeReplaced(listBoxContentIndex, section, posizIndex, posiz.getTitolo(),
// posiz.getListWsContent());
//
// } else if (listBoxPaths.getSelectedItemText().contains(SECTION_PIANTE)) {
// section = SECTION_PIANTE;
// List<LayerConcessioneDV> piante = fullConcessione.getPianteFineScavo();
// if (piante == null || piante.isEmpty()) {
// showMessage(SECTION_PIANTE + " NOT AVAILABLE", LabelType.WARNING);
//// pathIndex = 0;
//// showNewFileUpload();
// return;
// }
//
// for (LayerConcessioneDV lcDV : piante) {
// fillListBoxToBeReplaced(listBoxContentIndex, SECTION_PIANTE, posizIndex, lcDV.getTitolo(),
// lcDV.getListWsContent());
// posizIndex++;
// }
//
// }
//
// controlsContent.add(listBoxContentIndex);
//
// if (listBoxContentIndex.getItemCount() == 2) {
// // listBoxContentIndex.setSelectedIndex(1);
// listBoxContentIndex.setSelectedValue(listBoxContentIndex.getItemText(1));
//
// DomEvent.fireNativeEvent(Document.get().createChangeEvent(), listBoxContentIndex);
// }
//
// }
//
// private void fillListBoxToBeReplaced(ListBox listBoxContentIndex, String section, int posizIndex, String title,
// List<WorkspaceContentDV> listWSC) {
// GWT.log("fillListBoxToBeReplaced called, posizIndex: "+posizIndex+", listWSC: "+listWSC);
//
// if(mapWSContentListBox==null) {
// mapWSContentListBox = new HashMap<Integer, List<WorkspaceContentDV>>();
// }
//
// listBoxContentIndex.addItem(title, posizIndex + "");
// mapWSContentListBox.put(posizIndex, listWSC);
//
// // adding handler once
// if (posizIndex == 0) {
//
// listBoxContentIndex.addChangeHandler(new ChangeHandler() {
//
// @Override
// public void onChange(ChangeEvent event) {
// GWT.log("listBoxContentIndex changed, value: "+listBoxContentIndex.getSelectedValue());
//
// if (placeholderListBoxIndex) {
// listBoxContentIndex.removeItem(0); // this is the placeholder, removing it once
// placeholderListBoxIndex = false;
// }
// int selectedIndex = listBoxContentIndex.getSelectedIndex();
// GWT.log("selected index: "+selectedIndex);
// List<WorkspaceContentDV> theListWC = mapWSContentListBox.get(selectedIndex);
//
// if (theListWC == null || theListWC.isEmpty()) {
// uploadFileContainer.clear();
// showMessage(section + " does not contain file!", LabelType.WARNING);
// pathIndex = posizIndex;
// showNewFileUpload();
// return;
// }
//
// showFileBrowseInteraction(selectedIndex, mapWSContentListBox.get(selectedIndex));
// }
// });
// }
////
//
// }
//
// private void showFileBrowseInteraction(int pathContentIndex, List<WorkspaceContentDV> listWSC) {
// uploadFileContainer.clear();
// pathIndex = pathContentIndex;
// GWT.log("showing pathContentIndex: "+pathContentIndex);
// GWT.log("showing ws content: "+listWSC);
//
// // map for current content uploading
// mapForCCUploading = new HashMap<Integer, WorkspaceContentDV>(listWSC.size());
// int index = 0;
// for (WorkspaceContentDV workspaceContentDV : listWSC) {
// workspaceContentDV.setCliendId(index);
// mapForCCUploading.put(index, workspaceContentDV);
// index++;
// }
//
// if (listWSC.size() > 0) {
// FlexTable table = new FlexTable();
// table.addStyleName("table-current-content");
// table.setHTML(0, 0, "<span style='color:rgb(155, 80, 78); font-weight:bold;'>Current content:</span>");
// table.setHTML(1, 0, "<span style='color:rgb(155, 80, 78);'>Filename</span>");
// table.setHTML(1, 1, "<span style='color:rgb(155, 80, 78);'>MimeType<span>");
// table.setHTML(1, 2, "<span style='color:rgb(155, 80, 78);'>Link</span>");
//
// int i = 2;
// for (final WorkspaceContentDV wsContent : listWSC) {
// table.setHTML(i, 0, wsContent.getName());
// table.setHTML(i, 1, wsContent.getMimetype());
// String link = "<a target=\"_blank\" href=" + wsContent.getLink() + ">View</a>";
// table.setHTML(i, 2, link);
//
// final int rowIndexToRem = i;
// Button buttonRemoveFile = new Button();
// buttonRemoveFile.setIcon(IconType.TRASH);
// buttonRemoveFile.setTitle("Remove this file");
// buttonRemoveFile.addClickHandler(new ClickHandler() {
//
// @Override
// public void onClick(ClickEvent event) {
// mapForCCUploading.remove(wsContent.getCliendId());
// table.getRowFormatter().getElement(rowIndexToRem).setAttribute("hidden", "hidden");
// }
// });
// table.setWidget(i, 3, buttonRemoveFile);
// i++;
// }
//
// uploadFileContainer.add(table);
// }
//
// showNewFileUpload();
// }
//
//
// private void showNewFileUpload() {
//
// HTML label = new HTML();
// label.getElement().getStyle().setMarginTop(10, Unit.PX);
// label.getElement().getStyle().setMarginBottom(10, Unit.PX);
// label.setHTML("<b>Add new file/s:</b>");
// uploadFileContainer.add(label);
// // mDU = new MultipleDilaogUpload();
//
// MetadataFieldWrapper uploadField = new MetadataFieldWrapper();
// uploadField.setFieldName("File");
// uploadField.setMandatory(false);
// uploadField.setType(DataTypeWrapper.File);
// uploadField.setMaxOccurs(1000);
//
// try {
// fieldUploadWidget = new MetaDataField(uploadField, uiBus, OPERATION.NEW);
// uploadFileContainer.add(fieldUploadWidget);
//
// buttonUpdate.setVisible(true);
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// }
//
// /**
// * Test if profile data are valid.
// *
// * @return the string
// */
// private String checkValidUpload() {
//
// if (fieldUploadWidget == null)
// return "No file uploaded";
//
// for (MetaDataFieldSkeleton field : fieldUploadWidget.getListOfMetadataFields()) {
//
// field.removeError();
//
// String error = field.isFieldValueValid();
// if (error != null) {
// field.showError();
// String errorMsg = field.getFieldNameOriginal() + " is not valid. Suggestion: " + error;
// return errorMsg;
// }
// }
//
// return null;
// }
//
// private void showMessage(String txt, LabelType type) {
// Label l = new Label();
// l.setType(type);
// l.setText(txt);
// uploadFileContainer.add(l);
// }
//
//}

View File

@ -1,50 +0,0 @@
<!-- <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:b="urn:import:com.github.gwtbootstrap.client.ui">
<ui:style>
.important {
font-weight: bold;
}
.button-save-style {
margin-top: 10px;
float: right;
}
.max-height-500 {
max-height: 450px;
}
</ui:style>
<g:HTMLPanel>
<g:ScrollPanel addStyleNames="{style.max-height-500}">
<b:Form type="INLINE">
<b:Fieldset addStyleNames="form-fieldset-edit">
<b:ControlGroup>
<b:ControlLabel>Section</b:ControlLabel>
<b:Controls>
<b:ListBox ui:field="listBoxPaths"></b:ListBox>
</b:Controls>
</b:ControlGroup>
<b:ControlGroup ui:field="cgSelectFile"
visible="false">
<b:ControlLabel>Manage the content of</b:ControlLabel>
<b:Controls ui:field="controlsContent">
<b:ListBox ui:field="listBoxIndex"
addStyleNames="{style.width-500}"></b:ListBox>
</b:Controls>
</b:ControlGroup>
<b:ControlGroup>
<g:ScrollPanel>
<g:HTMLPanel ui:field="uploadFileContainer"
addStyleNames="upload-file-container"></g:HTMLPanel>
</g:ScrollPanel>
</b:ControlGroup>
</b:Fieldset>
</b:Form>
</g:ScrollPanel>
<b:Button icon="SAVE" type="INFO"
addStyleNames="{style.button-save-style}" ui:field="buttonUpdate"
visible="false">UPDATE</b:Button>
</g:HTMLPanel>
</ui:UiBinder> -->

View File

@ -0,0 +1,383 @@
package org.gcube.portlets.user.geoportaldataentry.client.ui.edit;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.gcube.application.geoportalcommon.shared.geoportal.DocumentDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ResultDocumentDV;
import org.gcube.application.geoportalcommon.shared.geoportal.config.FilePathDV;
import org.gcube.application.geoportalcommon.shared.geoportal.config.GcubeProfileDV;
import org.gcube.application.geoportaldatamapper.shared.MetaDataProfileBeanExt;
import org.gcube.application.geoportaldatamapper.shared.ProjectEdit;
import org.gcube.portlets.user.geoportaldataentry.client.ConstantsGeoPortalDataEntryApp.ACTION_PERFORMED_ON_ITEM;
import org.gcube.portlets.user.geoportaldataentry.client.GeoPortalDataEntryApp;
import org.gcube.portlets.user.geoportaldataentry.client.GeoportalDataEntryServiceAsync;
import org.gcube.portlets.user.geoportaldataentry.client.events.OperationPerformedOnItemEvent;
import org.gcube.portlets.user.geoportaldataentry.client.ui.card.GeoNaFormCardModel;
import org.gcube.portlets.user.geoportaldataentry.client.ui.report.ReportTemplateToHTML;
import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.LoaderIcon;
import org.gcube.portlets.user.geoportaldataentry.shared.CommitReport;
import org.gcube.portlets.user.geoportaldataentry.shared.GeoNaFormDataObject;
import org.gcube.portlets.widgets.mpformbuilder.client.form.generic.CreateMetadataForm.OPERATION;
import org.gcube.portlets.widgets.mpformbuilder.client.form.generic.GenericFormEvents.GenericFormEventsListener;
import org.gcube.portlets.widgets.mpformbuilder.shared.GenericDatasetBean;
import com.github.gwtbootstrap.client.ui.Alert;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.ControlGroup;
import com.github.gwtbootstrap.client.ui.ListBox;
import com.github.gwtbootstrap.client.ui.Modal;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
public class UpdateRecord extends Composite {
private static UpdateRecordUiBinder uiBinder = GWT.create(UpdateRecordUiBinder.class);
interface UpdateRecordUiBinder extends UiBinder<Widget, UpdateRecord> {
}
@UiField
ListBox listBoxSections;
@UiField
ScrollPanel scrollSectionContent;
@UiField
HTMLPanel htmlPanelContainer;
@UiField
HTMLPanel alertHTMLPanel;
@UiField
ControlGroup controlsControlGroup;
@UiField
Button buttonUpdate;
public static final String PLACEHOLDER_LIST_BOX = "Select section...";
private LoaderIcon loaderProjectSections = new LoaderIcon("Loading Project sections... please wait");
private GeoNaFormCardModel currentCardSelected;
private String profileID;
private String projectID;
private HashMap<String, List<FilePathDV>> sectionPathFilePaths = new HashMap<>();
private MetadataFormCardEventHandler formCardEventHandler = new MetadataFormCardEventHandler();
private ProjectEdit projectEditDTO;
private HandlerManager appManagerBus;
public UpdateRecord(HandlerManager appManagerBus, String profileID, String projectID, int modalWidth, int modalHeight) {
initWidget(uiBinder.createAndBindUi(this));
this.appManagerBus = appManagerBus;
this.profileID = profileID;
this.projectID = projectID;
setUpdateButtonEnabled(false);
htmlPanelContainer.setVisible(false);
alertHTMLPanel.add(loaderProjectSections);
scrollSectionContent.setHeight((modalHeight-350)+"px");
listBoxSections.setWidth((modalWidth-50)+"px");
GeoportalDataEntryServiceAsync.Util.getInstance().getProjectEdit(profileID, projectID,
new AsyncCallback<ProjectEdit>() {
@Override
public void onSuccess(ProjectEdit result) {
projectEditDTO = result;
htmlPanelContainer.setVisible(true);
try {
alertHTMLPanel.remove(loaderProjectSections);
} catch (Exception e) {
}
listBoxSections.addItem(PLACEHOLDER_LIST_BOX, PLACEHOLDER_LIST_BOX);
listBoxSections.getElement().getElementsByTagName("option").getItem(0).setAttribute("disabled",
"disabled");
listBoxSections.setSelectedValue(PLACEHOLDER_LIST_BOX);
int sectionArray = 0;
for (final MetaDataProfileBeanExt profileBean : result.getTheProfileBeans()) {
GcubeProfileDV profileDV = profileBean.getGcubeProfileDV();
String sectionPath = profileDV.getParentName() != null ? profileDV.getParentName() : "";
sectionPath += profileDV.getSectionName();
// increment section stored as array
if (profileDV.getMaxOccurs() == 0 || profileDV.getMaxOccurs() > 1) {
sectionPath += "[" + sectionArray + "]";
sectionArray++;
} else {
sectionArray = 0;
}
List<FilePathDV> filePaths = profileDV.getFilePaths();
if (filePaths != null)
sectionPathFilePaths.put(sectionPath, filePaths);
GWT.log("Adding type: " + profileBean.getType() + ", in the section path: " + sectionPath);
listBoxSections.addItem(profileBean.getType(), sectionPath);
}
listBoxSections.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
setUpdateButtonEnabled(false);
// -1 because the first element is the PLACEHOLDER "Select section..."
int selectedIndex = listBoxSections.getSelectedIndex() - 1;
MetaDataProfileBeanExt selectedBean = result.getTheProfileBeans()
.get(selectedIndex);
GWT.log("Change handler fired " + selectedBean);
controlsControlGroup.setVisible(true);
scrollSectionContent.clear();
GcubeProfileDV gcubeProfile = selectedBean.getGcubeProfileDV();
currentCardSelected = GeoPortalDataEntryApp.buildNewFormCardModelFromProfile(
gcubeProfile, 1, selectedBean, OPERATION.UPDATE, appManagerBus);
currentCardSelected.getMetadataForm().addListener(formCardEventHandler);
scrollSectionContent.add(currentCardSelected.getMetadataForm());
}
});
}
@Override
public void onFailure(Throwable caught) {
projectEditDTO = null;
htmlPanelContainer.setVisible(true);
alertHTMLPanel.remove(loaderProjectSections);
String errorMsg = caught.getMessage();
Alert alert = new Alert(errorMsg, AlertType.ERROR);
alert.setClose(false);
try {
alertHTMLPanel.remove(loaderProjectSections);
} catch (Exception e) {
}
alertHTMLPanel.add(alert);
Window.alert(errorMsg);
}
});
bindEvents();
}
private void setUpdateButtonEnabled(boolean bool) {
buttonUpdate.setEnabled(bool);
}
private void bindEvents() {
buttonUpdate.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
alertHTMLPanel.clear();
boolean isFormValid = currentCardSelected.getMetadataForm().isFormDataValid();
if (!isFormValid) {
Alert alert = new Alert("Error/s detected, please check your data entry...", AlertType.WARNING);
alert.setClose(true);
alertHTMLPanel.add(alert);
return;
}
GeoNaFormDataObject gfdo = new GeoNaFormDataObject(
Arrays.asList(currentCardSelected.getMetadataForm().getFormDataBean()),
currentCardSelected.getGcubeProfile());
String sectionPath = listBoxSections.getSelectedValue();
GWT.log("sectionPath is: " + sectionPath);
List<FilePathDV> listFilePaths = sectionPathFilePaths.get(sectionPath);
final Modal modal = new Modal(true, true);
DocumentDV theDocument = projectEditDTO.getTheProjectDV().getTheDocument();
modal.setTitle("Updating...");
final FlowPanel panelContainer = new FlowPanel();
LoaderIcon loader = new LoaderIcon("Operation in progress... please wait");
modal.add(loader);
String htmlMsg = "Updating the section <b>"+listBoxSections.getSelectedItemText()+"</b> of the project with:";
htmlMsg += "<ul>";
htmlMsg += "<li>id: " + projectID + "</li>";
htmlMsg += "<li>" + theDocument.getFirstEntryOfMap().getKey() + ": "
+ theDocument.getFirstEntryOfMap().getValue() + "</li>";
htmlMsg += "</ul>";
htmlMsg += "<br>";
panelContainer.add(new HTML(htmlMsg));
panelContainer.add(loader);
panelContainer.add(new HTML("<br><br>"));
modal.add(panelContainer);
// modal3.setWidth(950);
// modal3.setHeight("700px");
modal.setCloseVisible(false);
GeoportalDataEntryServiceAsync.Util.getInstance().updateGeportalDataForm(profileID, projectID, gfdo,
sectionPath, listFilePaths, new AsyncCallback<CommitReport>() {
@Override
public void onFailure(Throwable caught) {
modal.setCloseVisible(true);
modal.setTitle("Error :-(");
panelContainer.clear();
String errorMsg = "Sorry, an error occurred when updating the project with id: "+projectID+". Please, try again. If the problem persists, please contact the support";
Alert alert = new Alert(errorMsg, AlertType.ERROR);
alert.setClose(false);
modal.add(alert);
}
@Override
public void onSuccess(CommitReport result) {
modal.setCloseVisible(true);
modal.setTitle("Project updated!");
panelContainer.clear();
Alert alert = new Alert();
alert.setClose(false);
alert.setType(AlertType.SUCCESS);
String htmlMsg = "The project with:";
htmlMsg += "<ul>";
htmlMsg += "<li>id: " + projectID + "</li>";
htmlMsg += "<li>" + theDocument.getFirstEntryOfMap().getKey() + ": "
+ theDocument.getFirstEntryOfMap().getValue() + "</li>";
htmlMsg += "</ul>";
htmlMsg += "<br>";
htmlMsg += "has been updated successfully!";
alert.setHTML(htmlMsg);
ReportTemplateToHTML rtth2 = new ReportTemplateToHTML("Project", result.getProjectAsJSON(),
false, false);
rtth2.showAsJSON(false);
panelContainer.add(alert);
panelContainer.add(rtth2);
appManagerBus.fireEvent(new OperationPerformedOnItemEvent<ResultDocumentDV>(
profileID, null, ACTION_PERFORMED_ON_ITEM.UPDATED_PROJECT));
}
});
modal.show();
}
});
}
public void noUpdateMode() {
buttonUpdate.setVisible(false);
}
/**
* The Class MetadataFormCardEventHandler.
*
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
*
* Oct 12, 2020
*/
private class MetadataFormCardEventHandler implements GenericFormEventsListener {
/**
* On form data valid.
*
* @param genericDatasetBean the generic dataset bean
*/
@Override
public void onFormDataValid(GenericDatasetBean genericDatasetBean) {
setUpdateButtonEnabled(true);
//Disabling option not selected
int selectedIndex = listBoxSections.getSelectedIndex();
NodeList<Element> elementOption = listBoxSections.getElement().getElementsByTagName("option");
for (int i = 0; i < listBoxSections.getItemCount(); i++) {
if (i != selectedIndex) {
elementOption.getItem(i).setAttribute("disabled", "disabled");
}
}
}
/**
* On form data edit.
*/
@Override
public void onFormDataEdit() {
setUpdateButtonEnabled(false);
NodeList<Element> elementOption = listBoxSections.getElement().getElementsByTagName("option");
//i==0 is the PLACEHOLDER
for (int i = 1; i < listBoxSections.getItemCount(); i++) {
elementOption.getItem(i).removeAttribute("disabled");
}
}
/**
* On form aborted.
*/
@Override
public void onFormAborted() {
}
/**
* On validation error.
*
* @param throwable the throwable
* @param errorMsg the error msg
*/
@Override
public void onValidationError(Throwable throwable, String errorMsg) {
}
}
}

View File

@ -0,0 +1,70 @@
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:b="urn:import:com.github.gwtbootstrap.client.ui">
<ui:style>
.important {
font-weight: bold;
}
.button-save-style {
margin-top: 10px;
float: right;
}
.max-height-500 {
max-height: 450px;
}
.margin-top-10 {
margin-top: 10px;
}
.info-operation {
font-size: 12px;
color: gray;
}
</ui:style>
<g:HTMLPanel>
<g:HTMLPanel ui:field="alertHTMLPanel">
</g:HTMLPanel>
<g:HTMLPanel ui:field="htmlPanelContainer">
<b:Form type="INLINE">
<b:Fieldset addStyleNames="form-fieldset-edit">
<b:ControlGroup>
<b:Label type="INFO">Select the section of the document you want
to update...</b:Label>
<b:Controls>
<b:ListBox ui:field="listBoxSections"></b:ListBox>
</b:Controls>
</b:ControlGroup>
<b:ControlGroup ui:field="controlsControlGroup"
visible="false">
<b:Label type="INFO">Manage the content of</b:Label>
<b:Controls>
<g:ScrollPanel ui:field="scrollSectionContent"></g:ScrollPanel>
</b:Controls>
</b:ControlGroup>
<b:ControlGroup>
<g:ScrollPanel>
<g:HTMLPanel ui:field="uploadFileContainer"
addStyleNames="upload-file-container"></g:HTMLPanel>
</g:ScrollPanel>
</b:ControlGroup>
</b:Fieldset>
</b:Form>
</g:HTMLPanel>
<g:HTMLPanel>
<g:HTMLPanel addStyleNames="{style.info-operation}">
To update the document:
"Select the Section you wish to update, update the metadata and/or
the
file/s and then confirm by clicking on "Create".
Finally select
"Update".
</g:HTMLPanel>
<b:Button icon="SAVE" type="INFO"
addStyleNames="{style.button-save-style}" ui:field="buttonUpdate">UPDATE</b:Button>
</g:HTMLPanel>
</g:HTMLPanel>
</ui:UiBinder>

View File

@ -203,15 +203,16 @@ public class ListOfProjectTablePanel extends Composite {
alertSearchFor.setText(searchForFields.get(0).getDisplayName()); alertSearchFor.setText(searchForFields.get(0).getDisplayName());
alertSortBy.setText(toLabelFilter((sortByFields.get(0)), SearchingFilter.ORDER.ASC)); alertSortBy.setText(toLabelFilter((sortByFields.get(0)), SearchingFilter.ORDER.ASC));
for (ItemFieldDV record_FIELD : searchForFields) { for (final ItemFieldDV record_FIELD : searchForFields) {
NavLink nav = new NavLink(record_FIELD.getDisplayName()); final NavLink navSearch = new NavLink(record_FIELD.getDisplayName());
dropdownSearchFor.add(nav); dropdownSearchFor.add(navSearch);
nav.addClickHandler(new ClickHandler() { navSearch.addClickHandler(new ClickHandler() {
@Override @Override
public void onClick(ClickEvent event) { public void onClick(ClickEvent event) {
GWT.log("Search for: " + record_FIELD.getDisplayName());
alertSearchFor.setText(record_FIELD.getDisplayName()); alertSearchFor.setText(record_FIELD.getDisplayName());
if (searchField.getText().length() >= MIN_LENGHT_SERCHING_STRING) { if (searchField.getText().length() >= MIN_LENGHT_SERCHING_STRING) {
@ -313,22 +314,22 @@ public class ListOfProjectTablePanel extends Composite {
this.ucdProjectTypesForListingDataView = ucdProjectTypesForListingDataView; this.ucdProjectTypesForListingDataView = ucdProjectTypesForListingDataView;
Scheduler.get().scheduleDeferred(new ScheduledCommand() { Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override @Override
public void execute() { public void execute() {
//noProjectSelectionMessage.setVisible(true); // noProjectSelectionMessage.setVisible(true);
// SELECTION on the first item // Selecting directly the unique UCD type.
if (ucdProjectTypesForListingDataView.size() > 0) { if (ucdProjectTypesForListingDataView.size() == 1) {
//noProjectSelectionMessage.setVisible(false); // noProjectSelectionMessage.setVisible(false);
UseCaseDescriptorDV singleUCD = ucdProjectTypesForListingDataView.get(0); UseCaseDescriptorDV singleUCD = ucdProjectTypesForListingDataView.get(0);
alertProjectType.setText(singleUCD.getName()); alertProjectType.setText(singleUCD.getName());
// setFilteringParameters(displayFields, sortByFields, searchForFields, // setFilteringParameters(displayFields, sortByFields, searchForFields,
// currentSearchingFilter); // currentSearchingFilter);
appManagerBus.fireEvent( appManagerBus.fireEvent(new GetListOfRecordsEvent(true, singleUCD.getProfileID(),
new GetListOfRecordsEvent(true, singleUCD.getProfileID(), getCurrentSearchingFilter(), true)); getCurrentSearchingFilter(), true));
} }
} }
}); });
@ -449,12 +450,19 @@ public class ListOfProjectTablePanel extends Composite {
} }
/** public void addProjectType(final UseCaseDescriptorDV ucd) {
* Adds the project type.
* NavLink link = new NavLink(ucd.getName());
* @param link the link link.addClickHandler(new ClickHandler() {
*/
public void addProjectType(NavLink link) { @Override
public void onClick(ClickEvent event) {
alertProjectType.setText(ucd.getName());
appManagerBus
.fireEvent(new GetListOfRecordsEvent(false, ucd.getProfileID(), builtSearchingFilter(), true));
}
});
ddProjectType.add(link); ddProjectType.add(link);
} }

View File

@ -4,12 +4,17 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import org.gcube.application.geoportalcommon.shared.config.OPERATION_ON_ITEM;
import org.gcube.application.geoportalcommon.shared.geoportal.ResultDocumentDV; import org.gcube.application.geoportalcommon.shared.geoportal.ResultDocumentDV;
import org.gcube.application.geoportalcommon.shared.geoportal.WORKFLOW_PHASE;
import org.gcube.application.geoportalcommon.shared.geoportal.project.RelationshipDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.RelationshipDV;
import org.gcube.application.geoportalcommon.shared.geoportal.project.TemporalReferenceDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.TemporalReferenceDV;
import org.gcube.portlets.user.geoportaldataentry.client.ConstantsGeoPortalDataEntryApp;
import org.gcube.portlets.user.geoportaldataentry.client.GeoportalDataEntryServiceAsync; import org.gcube.portlets.user.geoportaldataentry.client.GeoportalDataEntryServiceAsync;
import org.gcube.portlets.user.geoportaldataentry.client.events.CloseCreateRelationGUIEvent; import org.gcube.portlets.user.geoportaldataentry.client.events.CloseCreateRelationGUIEvent;
import org.gcube.portlets.user.geoportaldataentry.client.events.RelationActionHandlerEvent; import org.gcube.portlets.user.geoportaldataentry.client.events.RelationActionHandlerEvent;
import org.gcube.portlets.user.geoportaldataentry.client.resource.Images;
import org.gcube.portlets.user.geoportaldataentry.client.ui.ModalWindow;
import org.gcube.portlets.user.geoportaldataentry.client.ui.report.ReportTemplateToHTML; import org.gcube.portlets.user.geoportaldataentry.client.ui.report.ReportTemplateToHTML;
import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.HTMLUtil; import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.HTMLUtil;
import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.LoaderIcon; import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.LoaderIcon;
@ -17,6 +22,7 @@ import org.gcube.portlets.user.geoportaldataentry.client.ui.utils.LoaderIcon;
import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.Label; import com.github.gwtbootstrap.client.ui.Label;
import com.github.gwtbootstrap.client.ui.Modal; import com.github.gwtbootstrap.client.ui.Modal;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.github.gwtbootstrap.client.ui.constants.ButtonType; import com.github.gwtbootstrap.client.ui.constants.ButtonType;
import com.github.gwtbootstrap.client.ui.constants.IconSize; import com.github.gwtbootstrap.client.ui.constants.IconSize;
import com.github.gwtbootstrap.client.ui.constants.IconType; import com.github.gwtbootstrap.client.ui.constants.IconType;
@ -35,6 +41,7 @@ import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
public class ViewRelationshipPanel extends Composite { public class ViewRelationshipPanel extends Composite {
@ -170,18 +177,40 @@ public class ViewRelationshipPanel extends Composite {
Label label = new Label(); Label label = new Label();
label.setType(LabelType.INFO); label.setType(LabelType.INFO);
label.setText(relationDV.getRelationshipName()); label.setText(relationDV.getRelationshipName());
FlowPanel panelContainer = new FlowPanel(); FlowPanel panelContainer = new FlowPanel();
Button deleteRelation = new Button("", IconType.TRASH); Button deleteRelation = new Button("", IconType.TRASH);
deleteRelation.setTitle("Delete this releation"); deleteRelation.setTitle("Delete this relation");
deleteRelation.setType(ButtonType.LINK); deleteRelation.setType(ButtonType.LINK);
deleteRelation.addClickHandler(new ClickHandler() { deleteRelation.addClickHandler(new ClickHandler() {
@Override @Override
public void onClick(ClickEvent event) { public void onClick(ClickEvent event) {
ResultDocumentDV toProject = mapOfTargetProjectForId.get(relationDV.getTargetUCD());
appManagerBus.fireEvent( // #24571
new RelationActionHandlerEvent(project, relationDV.getRelationshipName(), toProject)); boolean isNotInDRAFT = false;
if (fromTheProject.getLifecycleInfo() != null) {
String phase = fromTheProject.getLifecycleInfo().getPhase();
// IF the project is not in DRAFT, showing an alert and the no Update Mode will
// be activated
if (phase != null && phase.compareToIgnoreCase(WORKFLOW_PHASE.DRAFT.getLabel()) != 0) {
String msg = ConstantsGeoPortalDataEntryApp.ALERT_MESSAGE_DELETE_RELATION_FORBIDDEN;
ModalWindow modalW = new ModalWindow(new Image(Images.ICONS.accessDenied()),
"Forbidden: " + OPERATION_ON_ITEM.DELETE_RELATION, msg, AlertType.WARNING);
modalW.show();
isNotInDRAFT = true;
}
}
//If the project is in DRAFT, going to delete the releation after confirm
if(!isNotInDRAFT) {
ResultDocumentDV toProject = mapOfTargetProjectForId.get(relationDV.getTargetUCD());
appManagerBus.fireEvent(
new RelationActionHandlerEvent(project, relationDV.getRelationshipName(), toProject));
}
} }
}); });

View File

@ -143,6 +143,9 @@ public class ItemsTable<T extends DocumentDV> extends AbstractItemsCellTable<T>
String key = itemField.getJsonFields().get(0) String key = itemField.getJsonFields().get(0)
.replace(ConstantsGeoPortalDataEntryApp.DEFAULT_DOCUMENT_PROJECTION_NAME + ".", ""); .replace(ConstantsGeoPortalDataEntryApp.DEFAULT_DOCUMENT_PROJECTION_NAME + ".", "");
Object value = documentDV.getDocumentAsMap().get(key); Object value = documentDV.getDocumentAsMap().get(key);
if(value==null)
return "";
return value.toString(); return value.toString();
} catch (Exception e) { } catch (Exception e) {
GWT.log("Error e: " + e); GWT.log("Error e: " + e);
@ -164,6 +167,9 @@ public class ItemsTable<T extends DocumentDV> extends AbstractItemsCellTable<T>
.replace(ConstantsGeoPortalDataEntryApp.DEFAULT_DOCUMENT_PROJECTION_NAME + ".", ""); .replace(ConstantsGeoPortalDataEntryApp.DEFAULT_DOCUMENT_PROJECTION_NAME + ".", "");
Object value = documentDV.getDocumentAsMap().get(key); Object value = documentDV.getDocumentAsMap().get(key);
// GWT.log("key: "+key+" is instance of: "+value.getClass()); // GWT.log("key: "+key+" is instance of: "+value.getClass());
if(value==null)
return;
if (value instanceof ArrayList) { if (value instanceof ArrayList) {
ArrayList<Object> arrayValues = (ArrayList<Object>) value; ArrayList<Object> arrayValues = (ArrayList<Object>) value;

View File

@ -56,28 +56,6 @@ public class TreeItemPanel {
root = new TreeItem(rootNode); root = new TreeItem(rootNode);
treeItemParents.put(JSON_ROOT_PATH, Arrays.asList(root)); treeItemParents.put(JSON_ROOT_PATH, Arrays.asList(root));
/*
for (GeoNaFormCardModel geoNaFormCardModel : gnaCardsModels) {
GcubeProfileDV profile = geoNaFormCardModel.getGcubeProfile();
String parentName = profile.getParentName();
if (profile.getSectionName().compareTo("relazioneScavo") == 0) {
profile.setParentName(JSON_ROOT_PATH + "abstractRelazione");
}
if (profile.getSectionName().compareTo("posizionamentoScavo") == 0) {
profile.setParentName(JSON_ROOT_PATH + "immaginiRappresentative");
}
if (profile.getSectionName().compareTo("pianteFineScavo") == 0) {
profile.setParentName(JSON_ROOT_PATH + "immaginiRappresentative.posizionamentoScavo");
}
GWT.log(" print tree parentName: " + parentName + " name: " + profile.getSectionName() + " title: "
+ profile.getSectionTitle());
}*/
for (GeoNaFormCardModel geoNaFormCardModel : gnaCardsModels) { for (GeoNaFormCardModel geoNaFormCardModel : gnaCardsModels) {

View File

@ -47,7 +47,7 @@ public class FormDataObjectToJSON {
// the root, instancing new json document // the root, instancing new json document
if (tree_Node.isRoot()) { if (tree_Node.isRoot()) {
theRootDocument = JSONObjecOrdered.instance(); theRootDocument = JSONObjectOrdered.instance();
} }
Configuration configuration = Configuration.builder().jsonProvider(new JsonOrgJsonProvider()).build(); Configuration configuration = Configuration.builder().jsonProvider(new JsonOrgJsonProvider()).build();
@ -55,7 +55,7 @@ public class FormDataObjectToJSON {
for (Tree_Node<GeoNaFormDataObject> treeNodeChild : tree_Node.getChildren()) { for (Tree_Node<GeoNaFormDataObject> treeNodeChild : tree_Node.getChildren()) {
GeoNaFormDataObject gnaFO = treeNodeChild.getData(); GeoNaFormDataObject gnaFO = treeNodeChild.getData();
// Reading data and profile // Reading data and profile
List<GenericDatasetBean> listGDB = gnaFO.getListGDB(); List<GenericDatasetBean> listGDB = gnaFO.getListGDB();
GcubeProfileDV profile = gnaFO.getGcubeProfileDV(); GcubeProfileDV profile = gnaFO.getGcubeProfileDV();
@ -161,9 +161,9 @@ public class FormDataObjectToJSON {
* @return the JSON object * @return the JSON object
* @throws JSONException the JSON exception * @throws JSONException the JSON exception
*/ */
private JSONObject genericDatasetBeanToJSON(GenericDatasetBean gdb) throws JSONException { protected JSONObject genericDatasetBeanToJSON(GenericDatasetBean gdb) throws JSONException {
JSONObject sectJSONObject = JSONObjecOrdered.instance(); JSONObject sectJSONObject = JSONObjectOrdered.instance();
LinkedHashMap<String, List<String>> mapFields = gdb.getFormDataEntryFields(); LinkedHashMap<String, List<String>> mapFields = gdb.getFormDataEntryFields();
LOG.debug("Map ordered: " + mapFields); LOG.debug("Map ordered: " + mapFields);
@ -180,7 +180,9 @@ public class FormDataObjectToJSON {
// value is a list // value is a list
JSONArray array = new JSONArray(); JSONArray array = new JSONArray();
for (String value : listValues) { for (String value : listValues) {
array.put(value); if(value!=null && !value.isEmpty()) {
array.put(value);
}
} }
sectJSONObject.put(key, array); sectJSONObject.put(key, array);
@ -237,6 +239,7 @@ public class FormDataObjectToJSON {
} }
return target; return target;
} }
/** /**
* The Class JSONObjecOrdered. * The Class JSONObjecOrdered.
@ -245,7 +248,7 @@ public class FormDataObjectToJSON {
* *
* Mar 10, 2022 * Mar 10, 2022
*/ */
public static class JSONObjecOrdered { public static class JSONObjectOrdered {
/** /**
* Instance. * Instance.

View File

@ -5,23 +5,33 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.bson.Document; import org.bson.Document;
import org.gcube.application.geoportal.client.utils.Serialization; import org.gcube.application.geoportal.client.utils.Serialization;
import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.document.access.Access;
import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation;
import org.gcube.application.geoportal.common.model.rest.TempFile; import org.gcube.application.geoportal.common.model.rest.TempFile;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.RelationshipDefinition; import org.gcube.application.geoportal.common.model.useCaseDescriptor.RelationshipDefinition;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor;
import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.common.utils.StorageUtils;
import org.gcube.application.geoportalcommon.ConvertToDataServiceModel;
import org.gcube.application.geoportalcommon.ConvertToDataValueObjectModel; import org.gcube.application.geoportalcommon.ConvertToDataValueObjectModel;
import org.gcube.application.geoportalcommon.GeoportalCommon; import org.gcube.application.geoportalcommon.GeoportalCommon;
import org.gcube.application.geoportalcommon.ProjectDVBuilder; import org.gcube.application.geoportalcommon.ProjectDVBuilder;
@ -29,7 +39,6 @@ import org.gcube.application.geoportalcommon.geoportal.GeoportalClientCaller;
import org.gcube.application.geoportalcommon.geoportal.ProjectsCaller; import org.gcube.application.geoportalcommon.geoportal.ProjectsCaller;
import org.gcube.application.geoportalcommon.geoportal.UseCaseDescriptorCaller; import org.gcube.application.geoportalcommon.geoportal.UseCaseDescriptorCaller;
import org.gcube.application.geoportalcommon.shared.GNADataEntryConfigProfile; import org.gcube.application.geoportalcommon.shared.GNADataEntryConfigProfile;
import org.gcube.application.geoportalcommon.shared.GNADataViewerConfigProfile;
import org.gcube.application.geoportalcommon.shared.GeoportalItemReferences; import org.gcube.application.geoportalcommon.shared.GeoportalItemReferences;
import org.gcube.application.geoportalcommon.shared.ResultSetPaginatedData; import org.gcube.application.geoportalcommon.shared.ResultSetPaginatedData;
import org.gcube.application.geoportalcommon.shared.SearchingFilter; import org.gcube.application.geoportalcommon.shared.SearchingFilter;
@ -49,10 +58,15 @@ import org.gcube.application.geoportalcommon.shared.geoportal.project.TemporalRe
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.GEOPORTAL_DATA_HANDLER; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.GEOPORTAL_DATA_HANDLER;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.RelationshipDefinitionDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.RelationshipDefinitionDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.UseCaseDescriptorDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.UseCaseDescriptorDV;
import org.gcube.application.geoportalcommon.shared.geoportal.view.ProjectView;
import org.gcube.application.geoportaldatamapper.Geoportal_JSON_Mapper;
import org.gcube.application.geoportaldatamapper.shared.ProjectEdit;
import org.gcube.common.portal.PortalContext; import org.gcube.common.portal.PortalContext;
import org.gcube.contentmanagement.blobstorage.transport.backend.RemoteBackendException; import org.gcube.contentmanagement.blobstorage.transport.backend.RemoteBackendException;
import org.gcube.portlets.user.geoportaldataentry.client.GeoportalDataEntryService; import org.gcube.portlets.user.geoportaldataentry.client.GeoportalDataEntryService;
import org.gcube.portlets.user.geoportaldataentry.client.ProjectFormCard; import org.gcube.portlets.user.geoportaldataentry.client.ProjectFormCard;
import org.gcube.portlets.user.geoportaldataentry.server.json.JsonMerge;
import org.gcube.portlets.user.geoportaldataentry.server.json.JsonMerge.MERGE_OPTION;
import org.gcube.portlets.user.geoportaldataentry.shared.CommitReport; import org.gcube.portlets.user.geoportaldataentry.shared.CommitReport;
import org.gcube.portlets.user.geoportaldataentry.shared.GNADataEntryExtendedConfigProfile; import org.gcube.portlets.user.geoportaldataentry.shared.GNADataEntryExtendedConfigProfile;
import org.gcube.portlets.user.geoportaldataentry.shared.GeoNaFormDataObject; import org.gcube.portlets.user.geoportaldataentry.shared.GeoNaFormDataObject;
@ -61,6 +75,7 @@ import org.gcube.portlets.user.geoportaldataentry.shared.Tree_Node;
import org.gcube.portlets.user.geoportaldataentry.shared.UserRights; import org.gcube.portlets.user.geoportaldataentry.shared.UserRights;
import org.gcube.portlets.widgets.mpformbuilder.shared.GenericDatasetBean; import org.gcube.portlets.widgets.mpformbuilder.shared.GenericDatasetBean;
import org.gcube.portlets.widgets.mpformbuilder.shared.upload.FileUploaded; import org.gcube.portlets.widgets.mpformbuilder.shared.upload.FileUploaded;
import org.gcube.portlets.widgets.mpformbuilder.shared.upload.FileUploadedRemote;
import org.gcube.vomanagement.usermanagement.RoleManager; import org.gcube.vomanagement.usermanagement.RoleManager;
import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault; import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault;
import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault; import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault;
@ -71,7 +86,14 @@ import org.json.JSONObject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gwt.user.client.Random;
import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.spi.json.GsonJsonProvider;
/** /**
* The server side implementation of the RPC service. * The server side implementation of the RPC service.
@ -209,6 +231,187 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
} }
} }
/**
* Update geportal data form.
*
* @param profileID the profile ID
* @param projectID the project ID
* @param section the section
* @param sectionPath the section path
* @param listFilePaths the list file paths
* @return the commit report
* @throws Exception the exception
*/
@Override
public CommitReport updateGeportalDataForm(String profileID, String projectID, GeoNaFormDataObject section,
String sectionPath, List<FilePathDV> listFilePaths) throws Exception {
LOG.info("updateGeonaDataForm called for profileID {}", profileID);
LOG.info("and sectionPath {}", sectionPath);
LOG.info("and listFilePaths {}", listFilePaths);
ProjectsCaller client = null;
Project currentProject = null;
JSONObject updatedSectionObject = null;
Configuration configurationGson = null;
GenericDatasetBean sectionBean = null;
try {
if (projectID == null)
throw new Exception("projectID is null");
if (profileID == null)
throw new Exception("profileID is null");
if (section == null || section.getListGDB() == null || section.getListGDB().get(0) == null)
throw new Exception("Input error. The section is null");
sectionBean = section.getListGDB().get(0);
// Converter
FormDataObjectToJSON metadataConverter = new FormDataObjectToJSON();
// JSON Section to update converted as JSONObject
updatedSectionObject = metadataConverter.genericDatasetBeanToJSON(sectionBean);
LOG.info("Input Json Section (to update): {}", updatedSectionObject.toString());
configurationGson = Configuration.builder().jsonProvider(new GsonJsonProvider()).build();
// Type type = new TypeToken<Set<LinkedTreeMap<String, Object>>>() {}.getType();
// Set<LinkedTreeMap<String, Object>> myMap = gson.fromJson(json, type);
} catch (Exception e) {
LOG.error("Error on converting form data: ", e);
throw new Exception(
"Error occurred on converting data, try again or contact the support. Error: " + e.getMessage());
}
Boolean errorOccurred = false;
try {
client = GeoportalClientCaller.projects();
SessionUtil.getCurrentContext(getThreadLocalRequest(), true);
currentProject = client.getProjectByID(profileID, projectID);
Document currentDoc = currentProject.getTheDocument();
// Source Project
String theDocumentJson = currentDoc.toJson();
LOG.debug("Source document: {}", theDocumentJson);
// If the section path is the Root document, passed as "$.", fixing as "$"
if (sectionPath.compareTo(FormDataObjectToJSON.JSON_$_POINTER + ".") == 0)
sectionPath = FormDataObjectToJSON.JSON_$_POINTER;
com.google.gson.JsonObject targetSectionJObject = JsonPath.parse(theDocumentJson, configurationGson)
.read(sectionPath);
LOG.debug("Current Section path {} in the Document is {}", sectionPath, targetSectionJObject.toString());
String srcJ = updatedSectionObject.toString();
String trgJ = targetSectionJObject.toString();
LOG.debug("Merging src {} in the target: {}", srcJ, trgJ);
String mergedDoc = JsonMerge.merge(srcJ, trgJ, MERGE_OPTION.REPLACE);
LOG.debug("mergedDoc: {}", mergedDoc);
String newDocJson;
// If Updating path is first level of the root
if (sectionPath.equals(FormDataObjectToJSON.JSON_$_POINTER)) {
// The merged DOC is the root Document, no action required
newDocJson = mergedDoc;
} else {
// If the merged DOC is a child of the root Document, setting it as child of the
// Document in the proper section
Gson gson = new Gson();
JsonObject gsonOject = gson.fromJson(mergedDoc, JsonObject.class);
// Putting the merged section into Document
DocumentContext newContextDocJson = JsonPath.parse(theDocumentJson, configurationGson).set(sectionPath,
gsonOject);
newDocJson = newContextDocJson.json().toString();
}
Document updatedDocument = Serialization.read(newDocJson.toString(), Document.class);
LOG.info("New document is: {}", updatedDocument.toJson());
Project updatedProject = client.updateProject(profileID, projectID, updatedDocument);
// Project project = client.getProjectByID(profileID, projectID);
LOG.debug("Medatata Updated with document: {}", updatedProject.getTheDocument());
SessionUtil.getCurrentContext(getThreadLocalRequest(), true);
if (listFilePaths != null) {
// Collecting new files
List<? extends FileUploaded> filesUploaded = sectionBean.getFilesUploaded();
Map<String, FileSetDataObject> mapFilesToRegistrer = null;
if (filesUploaded != null && !filesUploaded.isEmpty()) {
mapFilesToRegistrer = collectFiles(currentProject, sectionPath, section.getGcubeProfileDV(),
filesUploaded);
}
// Cleaning all the fileset path of the section (defined in the UCD)
for (FilePathDV filePath : listFilePaths) {
String filesetFieldName = filePath.getFieldName();
String filesetPath = sectionPath + "." + filesetFieldName;
// // Replacing $.abc with $..abc
// filesetPath = filesetPath.replaceFirst("\\.", "..");
LOG.info("Going to delete fileset path: {}", filesetPath);
try {
client.deleteFileset(profileID, projectID, filesetPath, true, true);
} catch (Exception e) {
LOG.warn("Error deleting the fileset path {} for the project {}", filesetPath, projectID);
}
}
// Registering fileset in the section according to mapFilesToRegistrer
if (mapFilesToRegistrer != null && mapFilesToRegistrer.size()>0) {
LOG.info("Cluster of fileset per fieldDefinition is: " + mapFilesToRegistrer);
String theJSONDocument = currentProject.getTheDocument().toJson();
MongoServiceUtil mongoService = new MongoServiceUtil();
for (String fieldDefinition : mapFilesToRegistrer.keySet()) {
FileSetDataObject uploadedFileset = mapFilesToRegistrer.get(fieldDefinition);
LOG.info("Uploading fileset: " + uploadedFileset);
File[] fileset = uploadedFileset.getFileset();
FilePathDV filePath = uploadedFileset.getFilePathDV();
Access access = ConvertToDataServiceModel.getAccessFromDocumentSection(theJSONDocument,
sectionPath);
LOG.info("Going to register fileset: " + Arrays.asList(fileset).toString());
mongoService.registerFileSet(currentProject.getProfileID(), currentProject, sectionPath,
filePath.getFieldName(), filePath.getFieldDefinition(), access, fileset);
}
}
}
LOG.info("Project with id " + currentProject.getId() + " updated correclty");
ProjectDVBuilder projectBuilder = ProjectDVBuilder.newBuilder().fullDocumentMap(true);
// Reading again the project to be sure
updatedProject = client.getProjectByID(profileID, projectID);
ProjectDV toProjectDV = ConvertToDataValueObjectModel.toProjectDV(updatedProject, projectBuilder);
String newDocumentString = toProjectDV.getTheDocument().getDocumentAsJSON();
LOG.info("Got Document: {} ", newDocumentString);
return new CommitReport(projectID, profileID, newDocumentString, null);
} catch (Exception e) {
errorOccurred = true;
LOG.error("Error on updating data: ", e);
throw new Exception("Error occurred on updating data, try again or contact the support. Error: "
+ e.getMessage() + ". Tried to revert the project to the previous version");
} finally {
// If an error occurs on updating, the previous version of the document will be
// restored
if (errorOccurred && currentProject != null) {
Document currentDocument = currentProject.getTheDocument();
try {
Project updatedProject = client.updateProject(profileID, projectID, currentDocument);
} catch (Exception e) {
// Silent
}
}
}
}
/** /**
* Recursive upload fileset. * Recursive upload fileset.
* *
@ -234,6 +437,8 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
sectionJSONPathIndexer = new HashMap<String, Integer>(); sectionJSONPathIndexer = new HashMap<String, Integer>();
} }
String theJSONDocument = theProject.getTheDocument().toJson();
for (Tree_Node<GeoNaFormDataObject> treeNodeChild_GNA_DO : tree_Node.getChildren()) { for (Tree_Node<GeoNaFormDataObject> treeNodeChild_GNA_DO : tree_Node.getChildren()) {
LOG.debug("Going to upload the files of tree node: " + treeNodeChild_GNA_DO); LOG.debug("Going to upload the files of tree node: " + treeNodeChild_GNA_DO);
@ -326,20 +531,25 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
File[] fileset = uploadedFileset.getFileset(); File[] fileset = uploadedFileset.getFileset();
FilePathDV filePath = uploadedFileset.getFilePathDV(); FilePathDV filePath = uploadedFileset.getFilePathDV();
Access access;
// If the maxOccurs is not 1 // If the maxOccurs is not 1
if (profile.getMaxOccurs() == 0 || profile.getMaxOccurs() > 1) { if (profile.getMaxOccurs() == 0 || profile.getMaxOccurs() > 1) {
LOG.info("The gCube Profile with the section " + sectionJSONPath LOG.info("The gCube Profile with the section " + sectionJSONPath
+ " has maxOccurs > 1 need to manage it as array, going to add the array index"); + " has maxOccurs > 1 need to manage it as array, going to add the array index");
String arraySectionJSONPAth = String.format("%s[%d]", sectionJSONPath, jpcV); String arraySectionJSONPAth = String.format("%s[%d]", sectionJSONPath, jpcV);
LOG.debug("registering the fileset in the array section: " + sectionJSONPath); LOG.debug("registering the fileset in the array section: " + sectionJSONPath);
access = ConvertToDataServiceModel.getAccessFromDocumentSection(theJSONDocument,
arraySectionJSONPAth);
mongoService.registerFileSet(profileID, theProject, arraySectionJSONPAth, mongoService.registerFileSet(profileID, theProject, arraySectionJSONPAth,
filePath.getFieldName(), filePath.getFieldDefinition(), fileset); filePath.getFieldName(), filePath.getFieldDefinition(), access, fileset);
} else { } else {
LOG.info("The gCube Profile with the section " + sectionJSONPath + " has maxOccurs = 1"); LOG.info("The gCube Profile with the section " + sectionJSONPath + " has maxOccurs = 1");
LOG.debug("registering the fileset in the section: " + sectionJSONPath); LOG.debug("registering the fileset in the section: " + sectionJSONPath);
access = ConvertToDataServiceModel.getAccessFromDocumentSection(theJSONDocument,
sectionJSONPath);
mongoService.registerFileSet(profileID, theProject, sectionJSONPath, filePath.getFieldName(), mongoService.registerFileSet(profileID, theProject, sectionJSONPath, filePath.getFieldName(),
filePath.getFieldDefinition(), fileset); filePath.getFieldDefinition(), access, fileset);
} }
} }
@ -354,6 +564,176 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
} }
/**
* Collect files.
*
* @param theProject the the project
* @param sectionJSONPath the section JSON path
* @param gcubeProfile the gcube profile
* @param files the files
* @return the map of files that must be registered
* @throws Exception the exception
*/
protected Map<String, FileSetDataObject> collectFiles(Project theProject, String sectionJSONPath,
GcubeProfileDV gcubeProfile, List<? extends FileUploaded> files) throws Exception {
LOG.debug("collectFiles called [projectID: " + theProject.getId() + "], [sectionJSONPath: " + sectionJSONPath
+ "], [files: " + files + "]");
Map<String, FileSetDataObject> collectFilesetPerFieldDef = new HashMap<String, FileSetDataObject>();
if (files.size() > 0) {
// Iterating on the files upload for the section
for (int i = 0; i < files.size(); i++) {
FileUploaded file = files.get(i);
String formFieldName = file.getFilePath().getFormFieldLabel();
LOG.debug("Uploading file: " + file.getFileName() + ", from formFieldName: " + formFieldName);
FilePathDV filePath = retrieveFilePathForGcubeProfileFieldName(formFieldName, gcubeProfile);
LOG.info("Found {} for the form fieldName {}", filePath, formFieldName);
if (filePath == null) {
String error = "It is not possible to register the file " + formFieldName
+ ", missing configuration in the filePaths config of: " + gcubeProfile;
throw new Exception(error);
}
// Collecting Fileset per Field Definition
FileSetDataObject collFieldDef = collectFilesetPerFieldDef.get(filePath.getFieldDefinition());
if (collFieldDef == null) {
collFieldDef = new FileSetDataObject();
collFieldDef.setFilePathDV(filePath);
}
try {
File tempDir = Files.createTempDirectory("GEOPORTAL_REPLACE_FILES_").toFile();
String tmpDirPath = tempDir.getAbsolutePath();
File input;
File output;
if (file instanceof FileUploadedRemote) {
FileUploadedRemote remote = (FileUploadedRemote) file;
LOG.info("Uploaded file is remote: " + remote.getUrl());
InputStream in = new URL(remote.getUrl()).openStream();
String fileName = (remote.getFileName() == null || remote.getFileName().isEmpty())
? "file_" + Random.nextInt()
: remote.getFileName();
output = new File(tmpDirPath, fileName);
Path outputAbsolutePath = Paths.get(output.getAbsolutePath());
Files.copy(in, outputAbsolutePath, StandardCopyOption.REPLACE_EXISTING);
LOG.info("Remote file: " + remote.getUrl() + ", copied to new file: " + output.getName());
} else {
LOG.info("Uploaded file is local: " + file.getTempSystemPath());
input = new File(file.getTempSystemPath());
output = new File(tmpDirPath, file.getFileName());
copyContent(input, output);
LOG.info(
"Temp file: " + file.getTempSystemPath() + ", copied to new file: " + output.getName());
}
collFieldDef.addFile(output);
tempDir.deleteOnExit();
} catch (Exception e) {
LOG.warn("Skipping file: " + file.getFileName() + ". Error: " + e.getMessage());
}
collectFilesetPerFieldDef.put(filePath.getFieldDefinition(), collFieldDef);
}
}
return collectFilesetPerFieldDef;
}
/**
* Replace files.
*
* @param theProject the the project
* @param sectionJSONPath the section JSON path
* @param gcubeProfile the gcube profile
* @param files the files
* @throws Exception the exception
*/
protected void replaceFiles(Project theProject, String sectionJSONPath, GcubeProfileDV gcubeProfile,
List<? extends FileUploaded> files) throws Exception {
LOG.debug("replaceFiles called [projectID: " + theProject.getId() + "], [sectionJSONPath: " + sectionJSONPath
+ "], [files: " + files + "]");
Map<String, FileSetDataObject> collectFilesetPerFieldDef = new HashMap<String, FileSetDataObject>();
if (files.size() > 0) {
// Iterating on the files upload for the section
for (int i = 0; i < files.size(); i++) {
FileUploaded file = files.get(i);
String formFieldName = file.getFilePath().getFormFieldLabel();
LOG.debug("Uploading file: " + file.getFileName() + ", from formFieldName: " + formFieldName);
FilePathDV filePath = retrieveFilePathForGcubeProfileFieldName(formFieldName, gcubeProfile);
LOG.info("Found {} for the form fieldName {}", filePath, formFieldName);
if (filePath == null) {
String error = "It is not possible to register the file " + formFieldName
+ ", missing configuration in the filePaths config of: " + gcubeProfile;
throw new Exception(error);
}
// Collecting Fileset per Field Definition
FileSetDataObject collFieldDef = collectFilesetPerFieldDef.get(filePath.getFieldDefinition());
if (collFieldDef == null) {
collFieldDef = new FileSetDataObject();
collFieldDef.setFilePathDV(filePath);
}
try {
File tempDir = Files.createTempDirectory("GEOPORTAL_REPLACE_FILES_").toFile();
String tmpDirPath = tempDir.getAbsolutePath();
File input;
File output;
if (file instanceof FileUploadedRemote) {
FileUploadedRemote remote = (FileUploadedRemote) file;
LOG.info("Uploaded file is remote: " + remote.getUrl());
InputStream in = new URL(remote.getUrl()).openStream();
String fileName = (remote.getFileName() == null || remote.getFileName().isEmpty())
? "file_" + Random.nextInt()
: remote.getFileName();
output = new File(tmpDirPath, fileName);
Path outputAbsolutePath = Paths.get(output.getAbsolutePath());
Files.copy(in, outputAbsolutePath, StandardCopyOption.REPLACE_EXISTING);
LOG.info("Remote file: " + remote.getUrl() + ", copied to new file: " + output.getName());
} else {
LOG.info("Uploaded file is local: " + file.getTempSystemPath());
input = new File(file.getTempSystemPath());
output = new File(tmpDirPath, file.getFileName());
copyContent(input, output);
LOG.info(
"Temp file: " + file.getTempSystemPath() + ", copied to new file: " + output.getName());
}
collFieldDef.addFile(output);
tempDir.deleteOnExit();
} catch (Exception e) {
LOG.warn("Skipping file: " + file.getFileName() + ". Error: " + e.getMessage());
}
collectFilesetPerFieldDef.put(filePath.getFieldDefinition(), collFieldDef);
}
}
LOG.info("Cluster of fileset per fieldDefinition is: " + collectFilesetPerFieldDef);
String theJSONDocument = theProject.getTheDocument().toJson();
MongoServiceUtil mongoService = new MongoServiceUtil();
for (String fieldDefinition : collectFilesetPerFieldDef.keySet()) {
FileSetDataObject uploadedFileset = collectFilesetPerFieldDef.get(fieldDefinition);
LOG.info("Uploading fileset: " + uploadedFileset);
File[] fileset = uploadedFileset.getFileset();
FilePathDV filePath = uploadedFileset.getFilePathDV();
Access access = ConvertToDataServiceModel.getAccessFromDocumentSection(theJSONDocument, sectionJSONPath);
LOG.info("Going to register files: " + Arrays.asList(fileset).toString());
mongoService.registerFileSet(theProject.getProfileID(), theProject, sectionJSONPath,
filePath.getFieldName(), filePath.getFieldDefinition(), access, fileset);
}
}
/** /**
* Creates the temp file on storage. * Creates the temp file on storage.
* *
@ -473,12 +853,11 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
public GeoportalItemReferences getLinksFor(String itemId, String profileID) throws Exception { public GeoportalItemReferences getLinksFor(String itemId, String profileID) throws Exception {
LOG.info("getLinksFor called"); LOG.info("getLinksFor called");
SessionUtil.getCurrentContext(this.getThreadLocalRequest(), true); String scope = SessionUtil.getCurrentContext(this.getThreadLocalRequest(), true);
GNADataViewerConfigProfile grViewerProfile = SessionUtil //GNADataViewerConfigProfile grViewerProfile = SessionUtil.getGeportalViewerResourceProfile(getThreadLocalRequest());
.getGeportalViewerResourceProfile(getThreadLocalRequest()); GeoportalCommon gc = new GeoportalCommon();
GeoportalCommon gc = new GeoportalCommon(grViewerProfile);
GeoportalItemReferences item = new GeoportalItemReferences(itemId, profileID); GeoportalItemReferences item = new GeoportalItemReferences(itemId, profileID);
item = gc.getPublicLinksFor(item, false); item = gc.getPublicLinksFor(scope, item, true);
LOG.info("Returning: " + item); LOG.info("Returning: " + item);
return item; return item;
} }
@ -505,33 +884,67 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
ProjectsCaller client = GeoportalClientCaller.projects(); ProjectsCaller client = GeoportalClientCaller.projects();
SessionUtil.getCurrentContext(getThreadLocalRequest(), true); SessionUtil.getCurrentContext(getThreadLocalRequest(), true);
Integer totalProjectForProfile = SessionUtil.getTotalDocumentForProfileID(getThreadLocalRequest(), ResultSetPaginatedData searchedData = new ResultSetPaginatedData();
theProfileID);
// If reloadFromService = true, loads the document from the service
Integer totalProjectForProfile = null;
// Loading total documents from the session
if (!reloadFromService) {
totalProjectForProfile = SessionUtil.getTotalDocumentForProfileID(getThreadLocalRequest(),
theProfileID);
}
if (totalProjectForProfile == null) { if (totalProjectForProfile == null) {
totalProjectForProfile = client.getTotalDocument(theProfileID); totalProjectForProfile = client.getTotalDocument(theProfileID);
SessionUtil.setTotalDocumentForProfileID(getThreadLocalRequest(), theProfileID, totalProjectForProfile); SessionUtil.setTotalDocumentForProfileID(getThreadLocalRequest(), theProfileID, totalProjectForProfile);
} }
searchedData.setTotalItems(totalProjectForProfile);
LOG.info("Total Docs read from config: " + totalProjectForProfile); LOG.info("Total Docs read from config: " + totalProjectForProfile);
Iterator<Project> projects = client.queryOnMongo(theProfileID, totalProjectForProfile, start, limit, // Saving client PROJECTION
filter); LinkedHashMap<String, Object> originalProjection = filter.getProjection();
int totalItems = totalProjectForProfile;
// PERFORMING FIRST QUERY FOR IDS IF AND ONLY IF WHERE CONDITIONS IN THE QUERY.
// SEARCHING FACILITY IS ENACTING.
if (filter.getConditions() != null) {
ResultSetPaginatedData searchedData = new ResultSetPaginatedData(start, limit, false); // Setting PROJECTION ONLY FOR PROEJCT ID
searchedData.setTotalItems(totalProjectForProfile); LinkedHashMap<String, Object> projectionForIDs = new LinkedHashMap<String, Object>();
projectionForIDs.put(Project.ID, 1);
filter.setProjection(projectionForIDs);
// FIRST QUERY TO RETRIEVE IDs
// LIMIT IS NULL MEANS THAT IT IS EQUAL TO NUMBER TOTAL OF DOCUMENTS
// Calculating always the size starting from 0
final Iterator<Project> projectsIDs = client.queryOnMongo(theProfileID, totalProjectForProfile, 0, null,
filter);
// Getting the Project IDs from the Iterable
Iterable<Project> itP = () -> projectsIDs;
Stream<Project> targetStream = StreamSupport.stream(itP.spliterator(), false);
List<String> listProjectIDs = targetStream.map(Project::getId).collect(Collectors.toList());
totalItems = listProjectIDs.size();
searchedData.setTotalItems(totalItems);
LOG.info("Total Docs read from query per ID: " + totalItems);
}
// NOW PERFORMING THE (REAL) SECOND QUERY FROM CLIENT
// SETTING ORIGINAL PROJECTION FROM CLIENT
filter.setProjection(originalProjection);
// LIMIT IS FROM CLIENT
Iterator<Project> projects = client.queryOnMongo(theProfileID, totalItems, start, limit, filter);
searchedData.setClientStartIndex(start);
searchedData.setLimit(limit);
searchedData.setServerSearchFinished(false);
List<ResultDocumentDV> toReturnList = ConvertToDataValueObjectModel.toListResultDocument(projects); List<ResultDocumentDV> toReturnList = ConvertToDataValueObjectModel.toListResultDocument(projects);
searchedData.setData(toReturnList); searchedData.setData(toReturnList);
// TODO BUGGY WORKAROUND. BLOCKED BY #22487 IT MUST BE REMOVE AFTER THE QUERY LOG.info(
// COUNT "Total Docs page size returned:" + toReturnList.size() + ", start: " + start + ", limit: " + limit);
// AND LIST.SIZE BY QUERY WILL BE AVAILABLE IN THE SERVICE
if (filter.getConditions() != null) {
int totalItems = toReturnList.size();
searchedData.setTotalItems(totalItems);
}
if (totalProjectForProfile == limit || totalProjectForProfile == 0) { if (totalProjectForProfile == limit || totalProjectForProfile == 0) {
LOG.debug("Page completed returning " + totalProjectForProfile + " projects"); LOG.debug("Page completed returning " + totalProjectForProfile + " projects");
@ -578,7 +991,7 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
ProjectsCaller client = GeoportalClientCaller.projects(); ProjectsCaller client = GeoportalClientCaller.projects();
SessionUtil.getCurrentContext(getThreadLocalRequest(), true); SessionUtil.getCurrentContext(getThreadLocalRequest(), true);
client.deleteProject(profileID, projectID, false); client.deleteProject(profileID, projectID, true);
// Updating count of Documents in session per profileID // Updating count of Documents in session per profileID
Integer totalProjectForProfile = client.getTotalDocument(profileID); Integer totalProjectForProfile = client.getTotalDocument(profileID);
SessionUtil.setTotalDocumentForProfileID(getThreadLocalRequest(), profileID, totalProjectForProfile); SessionUtil.setTotalDocumentForProfileID(getThreadLocalRequest(), profileID, totalProjectForProfile);
@ -1097,6 +1510,84 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
return null; return null;
} }
/**
* Gets the project edit.
*
* @param profileID the profile ID
* @param projectID the project ID
* @return the project edit
* @throws Exception the exception
*/
@Override
public ProjectEdit getProjectEdit(String profileID, String projectID) throws Exception {
LOG.info("getProjectEdit called for profileID: {}, and projectID: {}", profileID, projectID);
try {
PortalContext pContext = PortalContext.getConfiguration();
GCubeUser user = pContext.getCurrentUser(this.getThreadLocalRequest());
String scope = SessionUtil.getCurrentContext(getThreadLocalRequest(), true);
ProjectsCaller clientProjects = GeoportalClientCaller.projects();
Project theProject = clientProjects.getProjectByID(profileID, projectID);
ProjectDVBuilder projectBuilder = ProjectDVBuilder.newBuilder().fullDocumentMap(true);
projectBuilder.relationships(true);
ProjectDV theProjectDV = ConvertToDataValueObjectModel.toProjectDV(theProject, projectBuilder);
ProjectEdit projectEdit = Geoportal_JSON_Mapper.loadProjectEdit(theProjectDV, scope, user.getUsername());
if (LOG.isDebugEnabled() || !SessionUtil.isIntoPortal()) {
Geoportal_JSON_Mapper.prettyPrintProjectEdit(projectEdit);
}
LOG.info(ProjectEdit.class.getSimpleName() + " returing not null: " + (projectEdit != null));
return projectEdit;
} catch (Exception e) {
String erroMsg = "Error occurred on reading " + ProjectEdit.class.getSimpleName() + " DTO for id: "
+ projectID;
LOG.warn(erroMsg, e);
throw new Exception(
erroMsg + ". Error: " + e.getMessage() + ". Refresh and try again or contact the support");
}
}
/**
* Gets the project view.
*
* @param profileID the profile ID
* @param projectID the project ID
* @return the project view
* @throws Exception the exception
*/
@Override
public ProjectView getProjectView(String profileID, String projectID) throws Exception {
LOG.info("getProjectEdit called for profileID: {}, and projectID: {}", profileID, projectID);
try {
PortalContext pContext = PortalContext.getConfiguration();
GCubeUser user = pContext.getCurrentUser(this.getThreadLocalRequest());
String scope = SessionUtil.getCurrentContext(getThreadLocalRequest(), true);
ProjectsCaller clientProjects = GeoportalClientCaller.projects();
Project theProject = clientProjects.getProjectByID(profileID, projectID);
ProjectDVBuilder projectBuilder = ProjectDVBuilder.newBuilder().fullDocumentMap(true);
projectBuilder.relationships(true);
ProjectDV theProjectDV = ConvertToDataValueObjectModel.toProjectDV(theProject, projectBuilder);
ProjectView projectView = Geoportal_JSON_Mapper.loadProjectView(theProjectDV, scope, user.getUsername());
if (LOG.isDebugEnabled()) {
Geoportal_JSON_Mapper.prettyPrintProjectView(projectView);
}
LOG.info(ProjectView.class.getSimpleName() + " returing not null: " + (projectView != null));
return projectView;
} catch (Exception e) {
String erroMsg = "Error occurred on reading " + ProjectView.class.getSimpleName() + " DTO for id: "
+ projectID;
LOG.warn(erroMsg, e);
throw new Exception(
erroMsg + ". Error: " + e.getMessage() + ". Refresh and try again or contact the support");
}
}
/** /**
* Pretty print client data entry map. * Pretty print client data entry map.
* *
@ -1117,9 +1608,9 @@ public class GeoportalDataEntryServiceImpl extends RemoteServiceServlet implemen
for (String keyEntry : map.keySet()) { for (String keyEntry : map.keySet()) {
LOG.debug("\t " + keyEntry + ": " + map.get(keyEntry)); LOG.debug("\t " + keyEntry + ": " + map.get(keyEntry));
} }
for (FileUploaded fup : gbd.getFilesUploaded()) { // for (FileUploaded fup : gbd.getFilesUploaded()) {
LOG.debug("\t " + fup); // LOG.debug("\t " + fup);
} // }
} }
} }
} }

View File

@ -6,7 +6,9 @@ import static org.gcube.application.geoportal.client.plugins.GeoportalAbstractPl
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL;
import java.rmi.RemoteException; import java.rmi.RemoteException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -15,6 +17,7 @@ import org.bson.Document;
import org.gcube.application.geoportal.client.utils.Serialization; import org.gcube.application.geoportal.client.utils.Serialization;
import org.gcube.application.geoportal.common.faults.InvalidRequestException; import org.gcube.application.geoportal.common.faults.InvalidRequestException;
import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.document.access.Access;
import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest;
import org.gcube.application.geoportal.common.model.rest.TempFile; import org.gcube.application.geoportal.common.model.rest.TempFile;
import org.gcube.application.geoportal.common.rest.MongoConcessioni; import org.gcube.application.geoportal.common.rest.MongoConcessioni;
@ -24,6 +27,7 @@ import org.gcube.application.geoportal.common.utils.FileSets;
import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.common.utils.StorageUtils;
import org.gcube.contentmanagement.blobstorage.transport.backend.RemoteBackendException; import org.gcube.contentmanagement.blobstorage.transport.backend.RemoteBackendException;
import org.gcube.portlets.widgets.mpformbuilder.shared.upload.FileUploaded; import org.gcube.portlets.widgets.mpformbuilder.shared.upload.FileUploaded;
import org.gcube.portlets.widgets.mpformbuilder.shared.upload.FileUploadedRemote;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -42,16 +46,35 @@ public class MongoServiceUtil {
UseCaseDescriptorsI client = null; UseCaseDescriptorsI client = null;
/**
* Use case descriptors client.
*
* @return the use case descriptors I
*/
public UseCaseDescriptorsI useCaseDescriptorsClient() { public UseCaseDescriptorsI useCaseDescriptorsClient() {
LOG.debug("useCaseDescriptorsClient called"); LOG.debug("useCaseDescriptorsClient called");
return useCaseDescriptors().build(); return useCaseDescriptors().build();
} }
/**
* Gets the projects client.
*
* @param profileID the profile ID
* @return the projects client
*/
public Projects<Project> getProjectsClient(String profileID) { public Projects<Project> getProjectsClient(String profileID) {
LOG.debug("getProjectsClient called for profileID: " + profileID); LOG.debug("getProjectsClient called for profileID: " + profileID);
return projects(profileID).build(); return projects(profileID).build();
} }
/**
* Creates the new.
*
* @param profileID the profile ID
* @param jsonDocument the json document
* @return the project
* @throws RemoteException the remote exception
*/
public Project createNew(String profileID, String jsonDocument) throws RemoteException { public Project createNew(String profileID, String jsonDocument) throws RemoteException {
LOG.debug("createNew called for profileID: " + profileID); LOG.debug("createNew called for profileID: " + profileID);
Document myDocument = Document.parse(jsonDocument); Document myDocument = Document.parse(jsonDocument);
@ -62,16 +85,38 @@ public class MongoServiceUtil {
return project; return project;
} }
/**
* Register file set.
*
* @param profileID the profile ID
* @param project the project
* @param parentPath the parent path
* @param fieldName the field name
* @param fieldDefinition the field definition
* @param access the access
* @param files the files
* @throws RemoteException the remote exception
* @throws FileNotFoundException the file not found exception
* @throws JsonProcessingException the json processing exception
* @throws InvalidRequestException the invalid request exception
*/
public void registerFileSet(String profileID, Project project, String parentPath, String fieldName, public void registerFileSet(String profileID, Project project, String parentPath, String fieldName,
String fieldDefinition, File... files) String fieldDefinition, Access access, File... files)
throws RemoteException, FileNotFoundException, JsonProcessingException, InvalidRequestException { throws RemoteException, FileNotFoundException, JsonProcessingException, InvalidRequestException {
LOG.debug("registerFileSet called for profileID: " + profileID); LOG.info("registerFileSet called for profileID: " + profileID);
LOG.info("and for parentPath: " + parentPath);
LOG.info("and for fieldName: " + fieldName);
LOG.info("and for fieldDefinition: " + fieldDefinition);
LOG.info("and for access: " + access);
Projects<Project> client = getProjectsClient(profileID); Projects<Project> client = getProjectsClient(profileID);
// Prepare request // Prepare request
RegisterFileSetRequest fsRequest = FileSets.prepareRequest(new StorageUtils(), parentPath, fieldName, RegisterFileSetRequest fsRequest = FileSets.prepareRequest(new StorageUtils(), parentPath, fieldName,
fieldDefinition, files); fieldDefinition, files);
fsRequest.setToSetAccess(access);
project = client.registerFileSet(project.getId(), fsRequest); project = client.registerFileSet(project.getId(), fsRequest);
LOG.trace("Resulting Project : " + project); LOG.trace("Resulting Project : " + project);
LOG.debug("Resulting Project as JSON: " + Serialization.write(project)); LOG.debug("Resulting Project as JSON: " + Serialization.write(project));
} }
@ -135,32 +180,31 @@ public class MongoServiceUtil {
return files; return files;
} }
// /**
// * To tem files from WSC. /**
// * * To temp file from remote.
// * @param listFiles the list files *
// * @return the list * @param file the file
// */ * @return the temp file
// public List<TempFile> toTemFilesFromWSC(List<WorkspaceContentDV> listFiles) { */
// LOG.debug("toTemFilesFromWSC called"); public TempFile toTempFileFromRemote(FileUploadedRemote file) {
// if (listFiles == null || listFiles.isEmpty()) LOG.debug("toTemFilesFromRemote called");
// return null; if (file == null)
// return null;
// // Building TempFile
// List<TempFile> files = new ArrayList<TempFile>(listFiles.size()); // Building TempFile
// for (WorkspaceContentDV fileUploaded : listFiles) { TempFile storageTempFile = null;
// InputStream is; try {
// try { InputStream is = new URL(file.getUrl()).openStream();
// is = new URL(fileUploaded.getLink()).openStream(); // Creating TempFile
// // Creating TempFile storageTempFile = createTempFileOnStorage(is, file.getFileName());
// TempFile storageTempFile = createTempFileOnStorage(is, fileUploaded.getName()); } catch (IOException e) {
// files.add(storageTempFile); LOG.error("Error on creating temp file from URL: " + file.getUrl(), e);
// } catch (IOException e) { }
// LOG.error("Error on creating temp file from URL: " + fileUploaded.getLink(), e);
// } return storageTempFile;
// } }
// return files;
// }
/** /**
* To JSON. * To JSON.

View File

@ -12,9 +12,7 @@ import javax.servlet.http.HttpSession;
import org.gcube.application.geoportal.common.model.legacy.Concessione; import org.gcube.application.geoportal.common.model.legacy.Concessione;
import org.gcube.application.geoportal.common.rest.MongoConcessioni; import org.gcube.application.geoportal.common.rest.MongoConcessioni;
import org.gcube.application.geoportalcommon.GeoportalCommon;
import org.gcube.application.geoportalcommon.shared.GNADataEntryConfigProfile; import org.gcube.application.geoportalcommon.shared.GNADataEntryConfigProfile;
import org.gcube.application.geoportalcommon.shared.GNADataViewerConfigProfile;
import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV; import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV;
import org.gcube.application.geoportalcommon.shared.geoportal.ucd.RelationshipDefinitionDV; import org.gcube.application.geoportalcommon.shared.geoportal.ucd.RelationshipDefinitionDV;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
@ -43,7 +41,7 @@ public class SessionUtil {
private static final String GNA_DATAENTRY_CONFIG_PROFILE = "GNA_DATAENTRY_CONFIG_PROFILE"; private static final String GNA_DATAENTRY_CONFIG_PROFILE = "GNA_DATAENTRY_CONFIG_PROFILE";
private static final String LATEST_RESULT_SET_SORTED = "LATEST_RESULT_SET_SORTED"; private static final String LATEST_RESULT_SET_SORTED = "LATEST_RESULT_SET_SORTED";
private static final String GEONA_DATAVIEWER_PROFILE = "GEONA_DATAVIEWER_PROFILE"; //private static final String GEONA_DATAVIEWER_PROFILE = "GEONA_DATAVIEWER_PROFILE";
private static final String LIST_OF_CONCESSIONI = "LIST_OF_CONCESSIONI"; private static final String LIST_OF_CONCESSIONI = "LIST_OF_CONCESSIONI";
private static final String LIST_OF_RELATIONSHIP_DEFINITION = "LIST_OF_RELATIONSHIP_DEFINITION"; private static final String LIST_OF_RELATIONSHIP_DEFINITION = "LIST_OF_RELATIONSHIP_DEFINITION";
@ -232,28 +230,28 @@ public class SessionUtil {
return listOfConcessioni; return listOfConcessioni;
} }
/** // /**
* Gets the geportal viewer resource profile. // * Gets the geportal viewer resource profile.
* // *
* @param httpServletRequest the http servlet request // * @param httpServletRequest the http servlet request
* @return the geportal viewer resource profile // * @return the geportal viewer resource profile
* @throws Exception the exception // * @throws Exception the exception
*/ // */
public static GNADataViewerConfigProfile getGeportalViewerResourceProfile(HttpServletRequest httpServletRequest) // public static GNADataViewerConfigProfile getGeportalViewerResourceProfile(HttpServletRequest httpServletRequest)
throws Exception { // throws Exception {
HttpSession session = httpServletRequest.getSession(); // HttpSession session = httpServletRequest.getSession();
GNADataViewerConfigProfile geoNaDataViewerProfile = (GNADataViewerConfigProfile) session // GNADataViewerConfigProfile geoNaDataViewerProfile = (GNADataViewerConfigProfile) session
.getAttribute(GEONA_DATAVIEWER_PROFILE); // .getAttribute(GEONA_DATAVIEWER_PROFILE);
//
if (geoNaDataViewerProfile == null) { // if (geoNaDataViewerProfile == null) {
GeoportalCommon gc = new GeoportalCommon(); // GeoportalCommon gc = new GeoportalCommon();
geoNaDataViewerProfile = gc.readGNADataViewerConfig(null); // geoNaDataViewerProfile = gc.readGNADataViewerConfig(null);
session.setAttribute(GEONA_DATAVIEWER_PROFILE, geoNaDataViewerProfile); // session.setAttribute(GEONA_DATAVIEWER_PROFILE, geoNaDataViewerProfile);
} // }
//
return geoNaDataViewerProfile; // return geoNaDataViewerProfile;
//
} // }
/** /**
* Gets the latest result set sorted. * Gets the latest result set sorted.

View File

@ -0,0 +1,328 @@
package org.gcube.portlets.user.geoportaldataentry.server.json;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* This class provides methods to merge two json of any nested level into a
* single json.
*
* copied from: https://github.com/hemantsonu20/json-merge
*
* @maintainer updated by Francesco Mangiacrapa at ISTI-CNR
* francesco.mangiacrapa@isti.cnr.it
*
* Apr 21, 2023
*/
public class JsonMerge {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
/**
* The Enum MERGE_OPTION.
*
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
*
* Apr 21, 2023
*/
public static enum MERGE_OPTION {
MERGE, REPLACE
}
/**
* Method to merge two json objects into single json object.
*
* <p>
* It merges two json of any nested level into a single json following below
* logic.
* </p>
* <ul>
* <li>When keys are different, both keys with there values will be copied at
* same level.</li>
* <li>
* <p>
* When keys are same at some level, following table denotes what value will be
* used.
* </p>
* <table border="1" summary="">
* <thead>
* <tr>
* <th align="left">Src / Target</th>
* <th align="left">JSON Value</th>
* <th align="left">JSON Array</th>
* <th align="left">JSON Object</th>
* </tr>
* </thead> <tbody>
* <tr>
* <td align="left">JSON Value<sup>1</sup></td>
* <td align="left">Src</td>
* <td align="left">Src</td>
* <td align="left">Src</td>
* </tr>
* <tr>
* <td align="left">JSON Array</td>
* <td align="left">Src<sup>2</sup></td>
* <td align="left">Merge</td>
* <td align="left">Src</td>
* </tr>
* <tr>
* <td align="left">JSON Object</td>
* <td align="left">Src</td>
* <td align="left">Src</td>
* <td align="left">Merge<sup>3</sup></td>
* </tr>
* </tbody>
* </table>
* <ul>
* <li><sup><strong>1</strong></sup> Json Value denotes boolean, number or
* string value in json.</li>
* <li><sup><strong>2</strong></sup> Src denotes <code>Src</code> value will be
* copied.</li>
* <li><sup><strong>3</strong></sup> Merge denotes both <code>Src</code> and
* <code>Target</code> values will be merged.</li>
* </ul>
* </li>
* </ul>
*
* <h2>Examples</h2>
* <h3>Example 1</h3>
* <p>
* <strong>Source Json</strong>
* </p>
*
* <pre>
* {@code
* {
* "name": "json-merge-src"
* }
* }
* </pre>
* <p>
* <strong>Target Json</strong>
* </p>
*
* <pre>
* {@code
* {
* "name": "json-merge-target"
* }
* }
* </pre>
* <p>
* <strong>Output</strong>
* </p>
*
* <pre>
* {@code
* {
* "name": "json-merge-src"
* }
* }
* </pre>
*
* <h3>Example 2</h3>
* <p>
* <strong>Source Json</strong>
* </p>
*
* <pre>
* {@code
* {
* "level1": {
* "key1": "SrcValue1"
* }
* }
* }
* </pre>
* <p>
* <strong>Target Json</strong>
* </p>
*
* <pre>
* {@code
* {
* "level1": {
* "key1": "targetValue1",
* "level2": {
* "key2": "value2"
* }
* }
* }
* }
* </pre>
* <p>
* <strong>Output</strong>
* </p>
*
* <pre>
* {@code
* {
* "level1": {
* "key1": "SrcValue1",
* "level2": {
* "key2": "value2"
* }
* }
* }
* }
* </pre>
*
* @param srcJsonStr source json string
* @param targetJsonStr target json string
* @param option the option
* @return merged json as a string
*/
public static String merge(String srcJsonStr, String targetJsonStr, MERGE_OPTION option) {
try {
if (option == null)
option = MERGE_OPTION.MERGE;
JsonNode srcNode = OBJECT_MAPPER.readTree(srcJsonStr);
JsonNode targetNode = OBJECT_MAPPER.readTree(targetJsonStr);
JsonNode result = merge(srcNode, targetNode, option);
return OBJECT_MAPPER.writeValueAsString(result);
} catch (IOException e) {
throw new JsonMergeException("Unable to merge json", e);
}
}
/**
* Merge.
*
* @param srcNode the src node
* @param targetNode the target node
* @param option the option
* @return the json node
*/
public static JsonNode merge(JsonNode srcNode, JsonNode targetNode, MERGE_OPTION option) {
if (option == null)
option = MERGE_OPTION.MERGE;
// if both nodes are object node, merged object node is returned
if (srcNode.isObject() && targetNode.isObject()) {
return merge((ObjectNode) srcNode, (ObjectNode) targetNode, option);
}
// if both nodes are array node, merged array node is returned
if (srcNode.isArray() && targetNode.isArray()) {
return mergeArray((ArrayNode) srcNode, (ArrayNode) targetNode, option);
}
// special case when src node is null
if (srcNode.isNull()) {
return targetNode;
}
return srcNode;
}
/**
* Merge.
*
* @param srcNode the src node
* @param targetNode the target node
* @param option the option
* @return the object node
*/
public static ObjectNode merge(ObjectNode srcNode, ObjectNode targetNode, MERGE_OPTION option) {
ObjectNode result = OBJECT_MAPPER.createObjectNode();
Iterator<Map.Entry<String, JsonNode>> srcItr = srcNode.fields();
while (srcItr.hasNext()) {
Map.Entry<String, JsonNode> entry = srcItr.next();
// check key in src json exists in target json or not at same level
if (targetNode.has(entry.getKey())) {
result.set(entry.getKey(), merge(entry.getValue(), targetNode.get(entry.getKey()), option));
} else {
// if key in src json doesn't exist in target json, just copy the same in result
result.set(entry.getKey(), entry.getValue());
}
}
// copy fields from target json into result which were missing in src json
Iterator<Map.Entry<String, JsonNode>> targetItr = targetNode.fields();
while (targetItr.hasNext()) {
Map.Entry<String, JsonNode> entry = targetItr.next();
if (!result.has(entry.getKey())) {
result.set(entry.getKey(), entry.getValue());
}
}
return result;
}
/**
* Merge.
*
* @param srcNode the src node
* @param targetNode the target node
* @param option the option
* @return the array node
*/
public static ArrayNode mergeArray(ArrayNode srcNode, ArrayNode targetNode, MERGE_OPTION option) {
ArrayNode result = OBJECT_MAPPER.createArrayNode();
switch (option) {
case REPLACE:
//Replacing source json value as result
return result.addAll(srcNode);
//return result.addAll(srcNode).addAll(targetNode);
default:
return mergeSet(srcNode, targetNode);
}
}
/**
* Added by Francesco Mangiacrapa Merge set.
*
* @param srcNode the src node
* @param targetNode the target node
* @return the array node
*/
public static ArrayNode mergeSet(ArrayNode srcNode, ArrayNode targetNode) {
ArrayNode result = OBJECT_MAPPER.createArrayNode();
HashSet<JsonNode> set = new HashSet<>();
set = toHashSet(set, srcNode);
set = toHashSet(set, targetNode);
Iterator<JsonNode> itr = set.iterator();
while (itr != null && itr.hasNext()) {
JsonNode arrayValue = itr.next();
result.add(arrayValue);
}
return result;
}
/**
* To hash set.
*
* @param set the set
* @param srcNode the src node
* @return the hash set
*/
public static HashSet<JsonNode> toHashSet(HashSet<JsonNode> set, ArrayNode srcNode) {
if (srcNode != null) {
Iterator<JsonNode> itr = srcNode.elements();
while (itr != null && itr.hasNext()) {
JsonNode arrayValue = itr.next();
set.add(arrayValue);
}
}
return set;
}
}

View File

@ -0,0 +1,20 @@
package org.gcube.portlets.user.geoportaldataentry.server.json;
/**
* Exception to be thrown in case of any error occured while merging two json.
*
*/
public class JsonMergeException extends RuntimeException {
public JsonMergeException() {
super();
}
public JsonMergeException(String msg) {
super(msg);
}
public JsonMergeException(String msg, Throwable th) {
super(msg, th);
}
}

View File

@ -12,28 +12,31 @@
<inherits name="com.google.gwt.json.JSON" /> <inherits name="com.google.gwt.json.JSON" />
<inherits
name='org.gcube.application.geoportalcommon.GeoportalDataCommon' />
<inherits
name='org.gcube.application.geoportaldatamapper.GeoportalDataMapper' />
<inherits
name='org.gcube.portlets.widgets.gdvw.geoportal_data_viewer_widget' />
<inherits <inherits
name='org.gcube.portlets.widgets.mpformbuilder.MetadataProfileFormBuilder' /> name='org.gcube.portlets.widgets.mpformbuilder.MetadataProfileFormBuilder' />
<inherits name='org.gcube.application.geoportalcommon.GeoportalDataCommon' />
<!-- Inherit the default GWT style sheet. You can change --> <!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
<!-- the theme of your GWT application by uncommenting --> <!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/> -->
<!-- any one of the following lines. -->
<!--<inherits name='com.google.gwt.user.theme.standard.Standard' /> -->
<inherits name='org.gcube.portlets.widgets.mpformbuilder.MetadataProfileFormBuilder' />
<!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> --> <!-- Other module inherits -->
<!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/> -->
<!-- Other module inherits --> <!-- Specify the app entry point class. -->
<entry-point
class='org.gcube.portlets.user.geoportaldataentry.client.GeoPortalDataEntryApp' />
<!-- Specify the app entry point class. --> <!-- Specify the paths for translatable code -->
<entry-point class='org.gcube.portlets.user.geoportaldataentry.client.GeoPortalDataEntryApp' /> <source path='client' />
<source path='shared' />
<!-- Specify the paths for translatable code -->
<source path='client' />
<source path='shared' />
</module> </module>

View File

@ -100,6 +100,9 @@ h1 {
max-height: 700px !important; max-height: 700px !important;
} }
.modal-body-edit {
max-height: none !important;
}
.disable-div { .disable-div {
pointer-events: none; pointer-events: none;
} }
@ -110,12 +113,16 @@ h1 {
padding: 10px !important; padding: 10px !important;
} }
.gna-dataentry-form-fieldset fieldset { .form-fieldset-edit .control-group {
margin: 10px !important; margin-bottom: 15px !important;
border: 1px groove #ddd !important;
padding: 10px !important;
} }
.form-fieldset-edit .control-group > span {
padding-top: 3px !important;
padding-bottom: 3px !important;
font-size: 14px;
margin-bottom: 10px;
}
.table-current-content { .table-current-content {
width: 100%; width: 100%;
background-color: #efefef !important; background-color: #efefef !important;
@ -270,4 +277,42 @@ h1 {
.no_modal_body_max_height .modal-body { .no_modal_body_max_height .modal-body {
max-height: 90% !important; max-height: 90% !important;
} }
/** OVERRDING legend-style into 'metadata-profile-form-builder-widget' */
.legend-style {
width: auto !important;
padding-left: 10px !important;
padding-top: 0px !important;
padding-right: 10px !important;
margin-bottom: 0px !important;
border-bottom: 0px !important;
}
.legend-style small {
display: block;
font-size: 12px !important;
}
/** END OVERRDING legend-style into 'metadata-profile-form-builder-widget' */
/** OVERRDING legend-style into 'metadata-profile-form-builder-widget' */
.legend-style {
width: auto !important;
padding-left: 10px !important;
padding-top: 0px !important;
padding-right: 10px !important;
margin-bottom: 0px !important;
border-bottom: 0px !important;
}
.legend-style small {
display: block;
font-size: 12px !important;
}
/** END OVERRDING legend-style into 'metadata-profile-form-builder-widget' */

View File

@ -0,0 +1,231 @@
package org.gcube.application;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.List;
import java.util.Properties;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import org.gcube.application.geoportal.common.model.JSONPathWrapper;
import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.document.access.Access;
import org.gcube.application.geoportal.common.model.document.access.AccessPolicy;
import org.gcube.application.geoportalcommon.geoportal.GeoportalClientCaller;
import org.gcube.application.geoportalcommon.geoportal.ProjectsCaller;
import org.gcube.application.geoportalcommon.geoportal.UseCaseDescriptorCaller;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.portlets.user.geoportaldataentry.server.MongoServiceUtil;
import org.gcube.portlets.widgets.mpformbuilder.shared.upload.FileUploadedRemote;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gwt.user.client.Random;
public class Service_Tests {
private static final String GCUBE_CONFIG_PROPERTIES_FILENAME = "gcube_config.properties";
// APP Working Directory + /src/test/resources must be the location of
// gcube_config.properties
private static String gcube_config_path = String.format("%s/%s",
System.getProperty("user.dir") + "/src/test/resources", GCUBE_CONFIG_PROPERTIES_FILENAME);
private static String CONTEXT;
private static String TOKEN;
private UseCaseDescriptorCaller clientUCD = null;
private ProjectsCaller clientPrj = null;
private static String PROFILE_ID = "profiledConcessioni";
private static String PROJECT_ID = "644a66e944aad51c80409a3b";
private static String MY_LOGIN = "francesco.mangiacrapa";
public static final String JSON_$_POINTER = "$";
private static final Logger LOG = LoggerFactory.getLogger(Service_Tests.class);
/**
* Read context settings.
*/
public static void readContextSettings() {
try (InputStream input = new FileInputStream(gcube_config_path)) {
Properties prop = new Properties();
// load a properties file
prop.load(input);
CONTEXT = prop.getProperty("CONTEXT");
TOKEN = prop.getProperty("TOKEN");
// get the property value and print it out
System.out.println("CONTEXT: " + CONTEXT);
System.out.println("TOKEN: " + TOKEN);
} catch (IOException ex) {
ex.printStackTrace();
}
}
//@Before
public void init() {
readContextSettings();
ScopeProvider.instance.set(CONTEXT);
SecurityTokenProvider.instance.set(TOKEN);
clientPrj = GeoportalClientCaller.projects();
clientUCD = GeoportalClientCaller.useCaseDescriptors();
}
//@Test
public void deleteFileSet_ServiceTest() throws Exception {
ScopeProvider.instance.set(CONTEXT);
SecurityTokenProvider.instance.set(TOKEN);
boolean ignore_errors = false;
String path = "$.abstractRelazione.filesetIta";
Project doc = clientPrj.getProjectByID(PROFILE_ID, PROJECT_ID);
// JSONPathWrapper wrapper = new JSONPathWrapper(doc.getTheDocument().toJson());
// List<String> matchingPaths = wrapper.getMatchingPaths(path);
//
// LOG.info("matchingPaths is: " + matchingPaths);
//
// String error = null;
// if (matchingPaths.isEmpty()) {
// error = "No Registered FileSet found at " + path;
// if (!ignore_errors) {
// throw new WebApplicationException(error, Response.Status.BAD_REQUEST);
// }
// }
// if (matchingPaths.size() > 1 && !ignore_errors) {
// error = "Multiple Fileset (" + matchingPaths.size() + ") matching " + path;
// if (!ignore_errors)
// throw new WebApplicationException(error, Response.Status.BAD_REQUEST);
// }
//
// if (error != null && ignore_errors) {
// LOG.info("Error detected {}. Ignoring it and returning input doc", error);
//
// }
//
// List<Object> listPath = wrapper.getByPath(path);
// LOG.info("List path: " + listPath);
// RegisteredFileSet fs = Serialization.convert(listPath.get(0), RegisteredFileSet.class);
// LOG.info("Going to delete {}", fs);
LOG.info("Going to delete {}", path);
Project newDoc = clientPrj.deleteFileset(PROFILE_ID, PROJECT_ID, path, true, true);
LOG.info("newDoc {}", newDoc);
}
//@Test
public void registerFileSet() throws Exception {
ScopeProvider.instance.set(CONTEXT);
SecurityTokenProvider.instance.set(TOKEN);
Project theProject = clientPrj.getProjectByID(PROFILE_ID, PROJECT_ID);
MongoServiceUtil mongoService = new MongoServiceUtil();
Access access = new Access();
access.setLicense("CC-BY");
access.setPolicy(AccessPolicy.OPEN);
String sectionJSONPath = "$.abstractRelazione";
String fieldName = "filesetIta";
String fieldDefinition = "$.abstractRelazione._children[?(@.filesetIta)]";
String theFileName = "Application_Profile_for_CSW_2.0-2.pdf";
String theFileURL = "https://data.dev.d4science.org/shub/E_bnN2aDJZZUMySy9peE9ScEVLNVFNWjBOZWx0cXQ2UUFkQ2E3Rjc1S29EelJIMEJGbDRoczBnbHVPWHczZTNQTw==";
FileUploadedRemote file = new FileUploadedRemote();
file.setUrl(theFileURL);
file.setFileName(theFileName);
File input = null;
File output = null;
try {
File tempDir = Files.createTempDirectory("GEOPORTAL_REPLACE_FILES_").toFile();
String tmpDirPath = tempDir.getAbsolutePath();
if (file instanceof FileUploadedRemote) {
FileUploadedRemote remote = (FileUploadedRemote) file;
LOG.info("Uploaded file is remote: " + remote.getUrl());
InputStream in = new URL(remote.getUrl()).openStream();
String fileName = (remote.getFileName() == null || remote.getFileName().isEmpty())
? "file_" + Random.nextInt()
: remote.getFileName();
LOG.info("the fileName is: " + fileName);
output = new File(tmpDirPath, fileName);
Path outputAbsolutePath = Paths.get(output.getAbsolutePath());
Files.copy(in, outputAbsolutePath, StandardCopyOption.REPLACE_EXISTING);
LOG.info("Remote file: " + remote.getUrl() + ", copied to new file: " + output.getName());
} else {
LOG.info("Uploaded file is local: " + file.getTempSystemPath());
input = new File(file.getTempSystemPath());
output = new File(tmpDirPath, file.getFileName());
copyContent(input, output);
LOG.info("Temp file: " + file.getTempSystemPath() + ", copied to new file: " + output.getName());
}
//tempDir.deleteOnExit();
} catch (Exception e) {
LOG.warn("Skipping file: " + file.getFileName() + ". Error: " + e.getMessage(), e);
}
File fileset = output;
LOG.info("final fileName is: " + fileset.getName());
mongoService.registerFileSet(theProject.getProfileID(), theProject, sectionJSONPath, fieldName, fieldDefinition, access, fileset);
LOG.info("registerFileSet: finished!");
}
/**
* Copy content.
*
* @param a the a
* @param b the b
* @throws Exception the exception
*/
public static void copyContent(File a, File b) throws Exception {
FileInputStream in = new FileInputStream(a);
FileOutputStream out = new FileOutputStream(b);
try {
int n;
// read() function to read the
// byte of data
while ((n = in.read()) != -1) {
// write() function to write
// the byte of data
out.write(n);
}
} finally {
if (in != null) {
// close() function to close the
// stream
in.close();
}
// close() function to close
// the stream
if (out != null) {
out.close();
}
}
LOG.debug("File Copied");
}
}

View File

@ -1,15 +1,34 @@
package org.gcube.portlets.user.geoportaldataentry; package org.gcube.portlets.user.geoportaldataentry;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Properties;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import org.bson.Document; import org.bson.Document;
import org.gcube.application.geoportal.client.utils.Serialization; import org.gcube.application.geoportal.client.utils.Serialization;
import org.gcube.application.geoportal.common.model.JSONPathWrapper;
import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.document.access.Access;
import org.gcube.application.geoportal.common.model.document.access.AccessPolicy;
import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.HandlerDeclaration; import org.gcube.application.geoportal.common.model.useCaseDescriptor.HandlerDeclaration;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor;
import org.gcube.application.geoportalcommon.ConvertToDataServiceModel;
import org.gcube.application.geoportalcommon.ConvertToDataValueObjectModel; import org.gcube.application.geoportalcommon.ConvertToDataValueObjectModel;
import org.gcube.application.geoportalcommon.ProjectDVBuilder; import org.gcube.application.geoportalcommon.ProjectDVBuilder;
import org.gcube.application.geoportalcommon.geoportal.GeoportalClientCaller; import org.gcube.application.geoportalcommon.geoportal.GeoportalClientCaller;
@ -31,10 +50,18 @@ import org.gcube.application.geoportalcommon.shared.geoportal.view.SectionView;
import org.gcube.application.geoportalcommon.shared.geoportal.view.SubDocumentView; import org.gcube.application.geoportalcommon.shared.geoportal.view.SubDocumentView;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.portlets.user.geoportaldataentry.server.FileSetDataObject;
import org.gcube.portlets.user.geoportaldataentry.server.FormDataObjectToJSON;
import org.gcube.portlets.user.geoportaldataentry.server.FormDataObjectToJSON.JSONObjectOrdered;
import org.gcube.portlets.user.geoportaldataentry.server.MongoServiceUtil;
import org.gcube.portlets.user.geoportaldataentry.server.json.JsonMerge;
import org.gcube.portlets.user.geoportaldataentry.server.json.JsonMerge.MERGE_OPTION;
import org.gcube.portlets.widgets.mpformbuilder.server.MetadataProfileFormBuilderServiceImpl; import org.gcube.portlets.widgets.mpformbuilder.server.MetadataProfileFormBuilderServiceImpl;
import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean; import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean;
import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetadataFieldWrapper; import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetadataFieldWrapper;
import org.gcube.portlets.widgets.mpformbuilder.shared.upload.FileUploadedRemote;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -44,18 +71,28 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
import com.google.gwt.user.client.Random;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.spi.json.GsonJsonProvider;
import com.jayway.jsonpath.spi.json.JsonOrgJsonProvider; import com.jayway.jsonpath.spi.json.JsonOrgJsonProvider;
public class Complex_Tests { public class Complex_Tests {
private static final String GCUBE_CONFIG_PROPERTIES_FILENAME = "gcube_config.properties";
// APP Working Directory + /src/test/resources must be the location of
// gcube_config.properties
private static String gcube_config_path = String.format("%s/%s",
System.getProperty("user.dir") + "/src/test/resources", GCUBE_CONFIG_PROPERTIES_FILENAME);
private static String CONTEXT;
private static String TOKEN;
private UseCaseDescriptorCaller clientUCD = null; private UseCaseDescriptorCaller clientUCD = null;
private ProjectsCaller clientPrj = null; private ProjectsCaller clientPrj = null;
private static String CONTEXT = "/gcube/devsec/devVRE";
private static String TOKEN = ""; // devVRE
private static String PROFILE_ID = "profiledConcessioni";
private static String PROJECT_ID = "632c633155e2947b0278c999"; private static String PROFILE_ID = "profiledConcessioni";
private static String PROJECT_ID = "644a66e944aad51c80409a3b";
private static String MY_LOGIN = "francesco.mangiacrapa"; private static String MY_LOGIN = "francesco.mangiacrapa";
@ -94,15 +131,149 @@ public class Complex_Tests {
} }
//@Before /**
* Read context settings.
*/
public static void readContextSettings() {
try (InputStream input = new FileInputStream(gcube_config_path)) {
Properties prop = new Properties();
// load a properties file
prop.load(input);
CONTEXT = prop.getProperty("CONTEXT");
TOKEN = prop.getProperty("TOKEN");
// get the property value and print it out
System.out.println("CONTEXT: " + CONTEXT);
System.out.println("TOKEN: " + TOKEN);
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Before
public void init() { public void init() {
readContextSettings();
ScopeProvider.instance.set(CONTEXT); ScopeProvider.instance.set(CONTEXT);
SecurityTokenProvider.instance.set(TOKEN); SecurityTokenProvider.instance.set(TOKEN);
clientPrj = GeoportalClientCaller.projects(); clientPrj = GeoportalClientCaller.projects();
clientUCD = GeoportalClientCaller.useCaseDescriptors(); clientUCD = GeoportalClientCaller.useCaseDescriptors();
} }
//@Before // @Test
public void testSectionPathInnerParse() throws Exception {
String sectionPath = "$.abstractRelazione";
String profileID = "profiledConcessioni";
String projectID = "6425598a8593b215a1281e1c";
Configuration configurationGSON = Configuration.builder().jsonProvider(new GsonJsonProvider()).build();
ProjectsCaller client = GeoportalClientCaller.projects();
Project proejct = client.getProjectByID(profileID, projectID);
String jsonSourceProject = proejct.getTheDocument().toJson();
// If the section path is the Root document, passed as "$.", fixing as "$"
if (sectionPath.compareTo(FormDataObjectToJSON.JSON_$_POINTER + ".") == 0)
sectionPath = FormDataObjectToJSON.JSON_$_POINTER;
LOG.info("theString: {}", jsonSourceProject);
com.google.gson.JsonObject currentSectionJObject = JsonPath.parse(jsonSourceProject, configurationGSON)
.read(sectionPath);
LOG.info("currentSectionJObject: {}", currentSectionJObject.toString());
LOG.info("sourceSectionObject: {}", currentSectionJObject.toString());
JSONObject targetSectionJObject = new JSONObjectOrdered().instance();
targetSectionJObject.put("abstractIta", "Prova REJECT 1");
targetSectionJObject.put("titolo", "Prova REJECT abstract relazione di scavo 1");
LOG.info("targetSectionJObject: {}", targetSectionJObject.toString());
String mergedDoc = JsonMerge.merge(targetSectionJObject.toString(), currentSectionJObject.toString(),
MERGE_OPTION.REPLACE);
LOG.info("output: {}", mergedDoc);
String newDocJson;
// Updating path is first level of the root
if (sectionPath.equals(FormDataObjectToJSON.JSON_$_POINTER)) {
// The merged DOC is the root Document
newDocJson = mergedDoc;
} else {
// The merged DOC is a child of the root Document
Gson gson = new Gson();
JsonObject gsonOject = gson.fromJson(mergedDoc, JsonObject.class);
// Putting the merged section into Document
DocumentContext newContextDocJson = JsonPath.parse(jsonSourceProject, configurationGSON).set(sectionPath,
gsonOject);
newDocJson = newContextDocJson.json().toString();
}
Document updatedDocument = Serialization.read(newDocJson.toString(), Document.class);
LOG.info("New document is: {}", updatedDocument.toJson());
}
// @Test
public void testSectionPathRootParse() throws Exception {
String sectionPath = "$.";
String profileID = "profiledConcessioni";
String projectID = "6425598a8593b215a1281e1c";
Configuration configurationGSON = Configuration.builder().jsonProvider(new GsonJsonProvider()).build();
ProjectsCaller client = GeoportalClientCaller.projects();
Project proejct = client.getProjectByID(profileID, projectID);
String jsonSourceProject = proejct.getTheDocument().toJson();
// If the section path is the Root document, passed as "$.", fixing as "$"
if (sectionPath.compareTo(FormDataObjectToJSON.JSON_$_POINTER + ".") == 0)
sectionPath = FormDataObjectToJSON.JSON_$_POINTER;
LOG.info("theString: {}", jsonSourceProject);
com.google.gson.JsonObject currentSectionJObject = JsonPath.parse(jsonSourceProject, configurationGSON)
.read(sectionPath);
LOG.info("currentSectionJObject: {}", currentSectionJObject.toString());
LOG.info("sourceSectionObject: {}", currentSectionJObject.toString());
JSONObject targetSectionJObject = new JSONObjectOrdered().instance();
targetSectionJObject.put("nome", proejct.getTheDocument().get("nome") + " 1");
targetSectionJObject.put("titolo", proejct.getTheDocument().get("introduzione") + " 1");
LOG.info("targetSectionJObject: {}", targetSectionJObject.toString());
// JSONObject mergedSection = FormDataObjectToJSON.deepMerge(sourceSectionObject,
// targetSectionJObject);
String output = JsonMerge.merge(targetSectionJObject.toString(), currentSectionJObject.toString(),
MERGE_OPTION.REPLACE);
LOG.info("output: {}", output);
Gson gson = new Gson();
JsonObject gsonOject = gson.fromJson(output, JsonObject.class);
// Putting the merged section into Document
DocumentContext newContextDocJson = JsonPath.parse(jsonSourceProject, configurationGSON).set(sectionPath,
gsonOject);
// DocumentContext newDocument = JsonPath.parse(jsonSourceProject,
// configurationGSON).set(sectionPath, new JSONObject(output));
// String newDocJson = JsonPath.parse(jsonSourceProject).set(sectionPath, new
// JSONObject(output)).jsonString();
String newDocJson = newContextDocJson.json().toString();
LOG.info("Going to call updateProject with document: {}", newDocJson);
Document updatedDocument = Serialization.read(newDocJson.toString(), Document.class);
LOG.info("New document is: {}", updatedDocument.toJson());
}
// @Before
public void preloadgCubeProfilesForUCDs() { public void preloadgCubeProfilesForUCDs() {
LOG.debug("preloadgCubeProfilesForUCDs called"); LOG.debug("preloadgCubeProfilesForUCDs called");
try { try {
@ -164,6 +335,145 @@ public class Complex_Tests {
} }
//@Test //@Test
public void deleteFileSet_ServiceTest() throws Exception {
ScopeProvider.instance.set(CONTEXT);
SecurityTokenProvider.instance.set(TOKEN);
boolean ignore_errors = false;
String path = "$.abstractRelazione.filesetIta";
Project doc = clientPrj.getProjectByID(PROFILE_ID, PROJECT_ID);
JSONPathWrapper wrapper = new JSONPathWrapper(doc.getTheDocument().toJson());
List<String> matchingPaths = wrapper.getMatchingPaths(path);
LOG.info("matchingPaths is: " + matchingPaths);
String error = null;
if (matchingPaths.isEmpty()) {
error = "No Registered FileSet found at " + path;
if (!ignore_errors) {
throw new WebApplicationException(error, Response.Status.BAD_REQUEST);
}
}
if (matchingPaths.size() > 1 && !ignore_errors) {
error = "Multiple Fileset (" + matchingPaths.size() + ") matching " + path;
if (!ignore_errors)
throw new WebApplicationException(error, Response.Status.BAD_REQUEST);
}
if (error != null && ignore_errors) {
LOG.info("Error detected {}. Ignoring it and returning input doc", error);
}
List<Object> listPath = wrapper.getByPath(path);
LOG.info("List path: "+listPath);
// RegisteredFileSet fs = Serialization.convert(listPath.get(0), RegisteredFileSet.class);
// LOG.info("Going to delete {}", fs);
}
//@Test
public void registerFileSet() throws Exception {
ScopeProvider.instance.set(CONTEXT);
SecurityTokenProvider.instance.set(TOKEN);
Project theProject = clientPrj.getProjectByID(PROFILE_ID, PROJECT_ID);
MongoServiceUtil mongoService = new MongoServiceUtil();
Access access = new Access();
access.setLicense("CC-BY");
access.setPolicy(AccessPolicy.OPEN);
String sectionJSONPath = "$.abstractRelazione";
String fieldName = "filesetIta";
String fieldDefinition = "$.abstractRelazione._children[?(@.filesetIta)]";
String theFileName = "Application_Profile_for_CSW_2.0-2.pdf";
String theFileURL = "https://data.dev.d4science.org/shub/E_bnN2aDJZZUMySy9peE9ScEVLNVFNWjBOZWx0cXQ2UUFkQ2E3Rjc1S29EelJIMEJGbDRoczBnbHVPWHczZTNQTw==";
FileUploadedRemote file = new FileUploadedRemote();
file.setUrl(theFileURL);
file.setFileName(theFileName);
File input = null;
File output = null;
try {
File tempDir = Files.createTempDirectory("GEOPORTAL_REPLACE_FILES_").toFile();
String tmpDirPath = tempDir.getAbsolutePath();
if (file instanceof FileUploadedRemote) {
FileUploadedRemote remote = (FileUploadedRemote) file;
LOG.info("Uploaded file is remote: " + remote.getUrl());
InputStream in = new URL(remote.getUrl()).openStream();
String fileName = (remote.getFileName() == null || remote.getFileName().isEmpty())
? "file_" + Random.nextInt()
: remote.getFileName();
LOG.info("the fileName is: " + fileName);
output = new File(tmpDirPath, fileName);
Path outputAbsolutePath = Paths.get(output.getAbsolutePath());
Files.copy(in, outputAbsolutePath, StandardCopyOption.REPLACE_EXISTING);
LOG.info("Remote file: " + remote.getUrl() + ", copied to new file: " + output.getName());
} else {
LOG.info("Uploaded file is local: " + file.getTempSystemPath());
input = new File(file.getTempSystemPath());
output = new File(tmpDirPath, file.getFileName());
copyContent(input, output);
LOG.info("Temp file: " + file.getTempSystemPath() + ", copied to new file: " + output.getName());
}
// tempDir.deleteOnExit();
} catch (Exception e) {
LOG.warn("Skipping file: " + file.getFileName() + ". Error: " + e.getMessage(), e);
}
File fileset = output;
LOG.info("the fileName is: " + fileset.getName());
mongoService.registerFileSet(theProject.getProfileID(), theProject, sectionJSONPath, fieldName, fieldDefinition,
access, fileset);
}
/**
* Copy content.
*
* @param a the a
* @param b the b
* @throws Exception the exception
*/
public static void copyContent(File a, File b) throws Exception {
FileInputStream in = new FileInputStream(a);
FileOutputStream out = new FileOutputStream(b);
try {
int n;
// read() function to read the
// byte of data
while ((n = in.read()) != -1) {
// write() function to write
// the byte of data
out.write(n);
}
} finally {
if (in != null) {
// close() function to close the
// stream
in.close();
}
// close() function to close
// the stream
if (out != null) {
out.close();
}
}
LOG.debug("File Copied");
}
// @Test
public void testReadProjectForUCDDataEntry() { public void testReadProjectForUCDDataEntry() {
ScopeProvider.instance.set(CONTEXT); ScopeProvider.instance.set(CONTEXT);
SecurityTokenProvider.instance.set(TOKEN); SecurityTokenProvider.instance.set(TOKEN);
@ -295,7 +605,7 @@ public class Complex_Tests {
String filesetJSONPath = String.format("%s.%s", JSON_$_POINTER, filePath.getFieldName()); String filesetJSONPath = String.format("%s.%s", JSON_$_POINTER, filePath.getFieldName());
List<Payload> listPayloads = readPayloadsForFileset(filesetJSONPath, fromSectionDocJSON); List<Payload> listPayloads = readPayloadsForFileset(filesetJSONPath, fromSectionDocJSON);
FilesetDV filesetDV = new FilesetDV(); FilesetDV filesetDV = new FilesetDV();
filesetDV.setName(filePath.getGcubeProfileFieldName()); filesetDV.setGcubeProfileFieldName(filePath.getGcubeProfileFieldName());
for (Payload payload : listPayloads) { for (Payload payload : listPayloads) {
PayloadDV payloadDV = ConvertToDataValueObjectModel.toPayloadDV(payload); PayloadDV payloadDV = ConvertToDataValueObjectModel.toPayloadDV(payload);
filesetDV.addPayloadDV(payloadDV); filesetDV.addPayloadDV(payloadDV);
@ -330,7 +640,7 @@ public class Complex_Tests {
System.out.println("***** Files"); System.out.println("***** Files");
if (subDocument.getListFiles() != null) { if (subDocument.getListFiles() != null) {
for (FilesetDV filesetDV : subDocument.getListFiles()) { for (FilesetDV filesetDV : subDocument.getListFiles()) {
System.out.println("******* File Fileset name: " + filesetDV.getName()); System.out.println("******* File Fileset name: " + filesetDV.getGcubeProfileFieldName());
for (PayloadDV payload : filesetDV.getListPayload()) { for (PayloadDV payload : filesetDV.getListPayload()) {
System.out.println("********* Payload: " + payload); System.out.println("********* Payload: " + payload);
} }
@ -339,7 +649,7 @@ public class Complex_Tests {
System.out.println("***** Images"); System.out.println("***** Images");
if (subDocument.getListImages() != null) { if (subDocument.getListImages() != null) {
for (FilesetDV filesetDV : subDocument.getListImages()) { for (FilesetDV filesetDV : subDocument.getListImages()) {
System.out.println("******* Image Fileset name: " + filesetDV.getName()); System.out.println("******* Image Fileset name: " + filesetDV.getGcubeProfileFieldName());
for (PayloadDV payload : filesetDV.getListPayload()) { for (PayloadDV payload : filesetDV.getListPayload()) {
System.out.println("********* Payload: " + payload); System.out.println("********* Payload: " + payload);
} }

View File

@ -13,3 +13,4 @@
/ISTI.gcubekey /ISTI.gcubekey
/d4science.research-infrastructures.eu.gcubekey /d4science.research-infrastructures.eu.gcubekey
/howto.txt /howto.txt
/gcube_config.properties