Compare commits

...

85 Commits

Author SHA1 Message Date
luca.frosini ce3c4af8eb Ignored MacOs File 2023-06-21 11:39:41 +02:00
Luca Frosini 8427224976 Removed -SNAPSHOT to release the component 2022-10-26 16:04:49 +02:00
Luca Frosini 8eb0e30897 Fixing JDK 11 compiling issue 2022-10-26 11:27:01 +02:00
Luca Frosini 54b20686aa added dependency scope 2022-10-26 11:02:52 +02:00
Luca Frosini 10b4c7dbf6 Fixing pom to compile di JDK 11 2022-10-26 10:32:13 +02:00
Luca Frosini d1ff03affc Merge branch 'master' of gitea@code-repo.d4science.org:gCubeSystem/grsf-publisher-ws.git 2022-10-26 10:22:45 +02:00
Luca Frosini f985363878 Merge remote-tracking branch 'origin/feature/23670' 2022-10-26 10:22:30 +02:00
Luca Frosini abb21c3988 Merge remote-tracking branch 'origin/feature/23670'
Conflicts:
	pom.xml
2022-09-12 10:28:18 +02:00
Luca Frosini 9e3bdeff3b Fixed bug on retriving email and fullname 2022-09-12 10:25:46 +02:00
Luca Frosini 84781a9a8d Fixed bug on retriving email and fullname 2022-09-12 10:24:30 +02:00
Luca Frosini 9f8e8a5f5e Changed sdg path 2022-09-09 16:24:05 +02:00
Luca Frosini 98eda28a8e Fixed project 2022-09-09 16:22:53 +02:00
Luca Frosini f00306cbb6 Fixed changelog 2022-09-02 14:53:48 +02:00
Luca Frosini 0fd88f657c Fixed changelog 2022-09-02 14:53:07 +02:00
Luca Frosini 9f182ededd fixed changelog 2022-09-02 14:52:52 +02:00
Luca Frosini dd8874178d Fixed changelog 2022-09-02 14:49:21 +02:00
Luca Frosini 40ea1235d9 Added "Assessment Methods" as group 2022-09-02 14:48:48 +02:00
Luca Frosini ca752576bc Added support for "Assessment Method" group 2022-09-02 14:44:37 +02:00
Luca Frosini 587c0971ad Improved test 2022-09-02 12:47:01 +02:00
Luca Frosini 3f29a00f05 Added test for json deserialization 2022-09-02 12:42:03 +02:00
Luca Frosini 13e9f7309e Fixed range 2022-08-31 12:09:47 +02:00
Luca Frosini 490619efe7 Upgraded grsf-common-library range 2022-08-31 12:09:03 +02:00
Luca Frosini 044d2edd05 Upgraded the version 2022-08-31 12:03:39 +02:00
Luca Frosini d6d373a94c Added change in changelog 2022-08-31 11:22:19 +02:00
Luca Frosini c28f0dcd65 Adding support for "FAO SDG 14.4.1 Questionnaire" source 2022-08-31 11:20:24 +02:00
Luca Frosini dbad160e36 Fixed test 2022-08-01 14:40:10 +02:00
Luca Frosini 6d37e4b939 Migrated request to social-service-client refs #23679 2022-08-01 14:39:25 +02:00
Luca Frosini 75b55cc8bb Hidden sensitive field from GRSF VRE 2022-05-23 15:17:50 +02:00
Luca Frosini 2f284188c2 Patched also Fishery 2022-05-10 17:09:12 +02:00
Luca Frosini 8d2ce659b3 Fixed issue 2022-05-10 16:49:08 +02:00
Luca Frosini d61fbf77ef Downgraded gcube-smartgears-bom 2022-05-04 15:06:59 +02:00
Luca Frosini 2083dfb95e Removed -SNAPSHOT to release the component 2022-04-28 17:38:08 +02:00
Luca Frosini 8b710aef9b Fixed suffix 2022-04-28 15:15:31 +02:00
Luca Frosini 13097d3ab9 Added _group as suffix of group id 2022-04-28 10:49:05 +02:00
Luca Frosini d316a10887 Added resource file 2022-04-27 16:50:52 +02:00
Luca Frosini f08534b53f Fixed code which generated groups id from name 2022-04-27 16:21:19 +02:00
Luca Frosini 312f3945a5 Fixed code which generated groups id from name 2022-04-27 16:19:48 +02:00
Luca Frosini 1103c11626 Fixed CHANGELOG 2022-04-27 16:07:49 +02:00
Luca Frosini 745aaf417d Fixing groups assign 2022-04-27 15:56:19 +02:00
Luca Frosini 0458379cb4 Properly generated Fishery and Stock group 2022-04-27 13:13:21 +02:00
Luca Frosini 503a66596b REvisiting code to properly generate group name/id 2022-04-27 13:12:13 +02:00
Luca Frosini 51c91a3878 Fixing groups refs #23215 2022-04-27 13:10:23 +02:00
Luca Frosini 5c1e3bc164 Removed commented code 2022-04-27 12:50:22 +02:00
Luca Frosini f6a7857875 Fixed Group creation 2022-04-26 15:14:26 +02:00
Luca Frosini a9a927ab97 Removed -SNAPSHOT from range 2022-04-22 18:44:58 +02:00
Luca Frosini ce0d1dd1a2 Fixed changelog 2022-04-22 18:44:37 +02:00
Luca Frosini 1940ec02b9 Renamed resources 2022-04-22 18:18:35 +02:00
Luca Frosini 315287e885 Fixed mapping 2022-04-22 16:34:52 +02:00
Luca Frosini 1319930380 Added IS Resources for fields mappings 2022-04-22 16:31:12 +02:00
Luca Frosini 932cc783f5 Fixed group 2022-04-22 16:10:10 +02:00
Luca Frosini 2b984aa712 Aligned code 2022-04-22 15:57:00 +02:00
Luca Frosini eac93b33c5 Fixed field label 2022-04-22 12:02:58 +02:00
Luca Frosini 0480a58130 Fixed code 2022-04-22 11:23:31 +02:00
Luca Frosini a9894c18a2 Removed no more need constant 2022-04-13 18:07:16 +02:00
Luca Frosini e18d427efd Aligned doc and code 2022-04-13 17:31:27 +02:00
Luca Frosini ac22e2dddb Aligning code and documentation 2022-04-13 09:46:46 +02:00
Luca Frosini 92b68df8c5 Fixed imported gcube-smartgears-bom 2022-04-12 13:51:44 +02:00
Luca Frosini 22d311d807 Reordered properties to be aligned with wiki 2022-02-09 16:18:23 +01:00
Luca Frosini 2b06179f12 Enhanced range of storagehub-client-library to 2.0.0,3.0.0-SNAPSHOT 2022-02-09 16:17:53 +01:00
Luca Frosini 8e0bdf0df3 Removed -SNAPSHOT from bom import 2021-11-08 16:42:59 +01:00
Luca Frosini 0c0892337d Removed -SNAPSHOT to release the component 2021-11-08 14:52:30 +01:00
Luca Frosini 043d55e2bb Merge branch 'master' of gitea@code-repo.d4science.org:gCubeSystem/grsf-publisher-ws.git 2021-11-08 14:50:27 +01:00
Luca Frosini 42b608d019 Fixed bug 2021-11-05 11:14:40 +01:00
Luca Frosini ed467d1160 Fixing issues evidenced in #21995 2021-11-04 17:06:38 +01:00
Luca Frosini 0e39b9aa85 Fixed CHANGELOG 2021-10-28 13:18:58 +02:00
Luca Frosini 255357bac4 Changed the none representation in a more opaque way 2021-10-13 17:05:25 +02:00
Luca Frosini 1f60fa9f12 Removing filed with key mapped as none 2021-10-13 17:04:22 +02:00
Luca Frosini 9105f4ba52 updated version in gcube-app.xml 2021-09-13 15:56:33 +02:00
lucio.lelii 3519fc2888 moved to Storagehub 2021-09-10 15:51:41 +02:00
Luca Frosini a2233d4de1 Fixed pom to be used in new container 2020-10-08 19:06:10 +02:00
Luca Frosini 8d6214de7b Fixed CHANGELOG 2020-10-08 18:05:26 +02:00
Luca Frosini daede10445 Fixed CHANGELOG 2020-10-08 15:39:19 +02:00
Luca Frosini fbcbf7975c Ignored eclipse project files 2020-10-08 15:18:50 +02:00
Fabio Sinibaldi b7a6b02820 adoption of gcube-smartgears-bom.2.0.0-SNAPSHOT 2020-10-07 16:26:07 +02:00
Luca Frosini aa80ff3800 Added GRSF_Pre VRE in web.xml 2020-06-23 16:06:28 +02:00
Luca Frosini bd5e253dbc Added descriptor.xml 2020-06-19 15:01:54 +02:00
Luca Frosini 8ef7f70e47 Removed -SNAPSHOT 2020-06-19 13:04:24 +02:00
Luca Frosini 13f94741de Fixed CHANGELOG 2020-06-19 12:39:14 +02:00
Luca Frosini 8a64bcbe44 Added new CHANGELOG 2020-06-19 12:30:14 +02:00
Luca Frosini f5e011535b Added -SNAPSHOT 2020-06-19 12:08:02 +02:00
Luca Frosini ee8911fde4 Aligning project with the new rules 2020-06-19 11:50:20 +02:00
Luca Frosini f190296d00 Fixed support for GRSF_Pre VRE 2020-06-18 15:51:45 +02:00
Luca Frosini 51d7bdd928 Enhanced version and fixed changelog 2020-06-08 15:47:54 +02:00
Luca Frosini 0e63ac3796 Fixed GRSF_pre fix 2020-06-08 15:45:07 +02:00
Luca Frosini 6b21a61e6c Added the support for grsf_pre VRE. 2020-06-08 14:51:50 +02:00
36 changed files with 1423 additions and 644 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
target
.classpath
.project
/.DS_Store

1
.settings/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/org.eclipse.jdt.core.prefs

View File

@ -1,4 +1,6 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/test/java=UTF-8
encoding//src/test/resources=UTF-8
encoding/<project>=UTF-8

View File

@ -1,2 +0,0 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning

View File

@ -1,12 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="grsf-publisher-ws">
<wb-module deploy-name="grsf-publisher-ws-1.12.1-SNAPSHOT">
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
<dependent-module archiveName="grsf-common-library-1.0.3-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/grsf-common-library/grsf-common-library">
<dependent-module archiveName="storagehub-model-1.1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/storagehub-model/storagehub-model">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="common-gcube-calls-1.3.1-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/common-gcube-calls/common-gcube-calls">
<dependency-type>uses</dependency-type>
</dependent-module>
<property name="context-root" value="grsf-publisher-ws"/>
<property name="java-output-path" value="/grsf-publisher-ws/target/classes"/>
</wb-module>
</project-modules>

139
CHANGELOG.md Normal file
View File

@ -0,0 +1,139 @@
# Changelog
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).
## [v1.13.3]
- Adding support for "FAO SDG 14.4.1 Questionnaire" source [#23670]
## [v1.13.2]
- Migrated request to social-service-client [#23679]
- Added "Assessment Methods" as Group [#23409]
## [v1.13.1]
- Aligned code and wiki to the new requirements [#23167]
- Changed group assign strategy [#23211] [#23215]
- Tag are added also to legacy records [#23216]
- Fixed code which generated groups id from name [#23215]
## [v1.13.0]
### Added
- Added support to not include in records time dependant metadata [#21995]
### Changed
- Switched dependency management to gcube-bom 2.0.0
- Migrated code to storagehub [#21432]
## [v1.12.0] - 2020-06-19
### Added
**Features**
- [#19166] Added support for GRSF_pre VRE with the behaviour of GRSF Admin
## [v1.11.0] - 2020-03-30
### Changed
- [#18293] Traceability flag is assigned only to Fishery records
## [v1.10.0] - 2019-11-11
### Changed
- [#17965] Tags longer than 100 characters are truncated instead of skipped
## [v1.9.0] - 2019-05-27
### Changed
- [#13347] refers_to can be null while publishing legacy records
- [#12421] Removed the non-ascii clean from extra fields
- [#12421] Properly supporting UTF-8 characters
- [#16395] Title is updated according to Stock/Fishery Name
## [v1.8.0] - 2019-02-26
### Changed
- [#12861] The sources in GRSF VRE are calculated using 'database_sources' field
## [v1.7.0] - 2018-10-10
### Changed
- [#12510] Fixed pom to exclude libraries already provided by the container
## [v1.6.0] - 2018-07-18
### Changed
- [#11464] Added biomass timeseries support to stock data
- [#11749] Added 'With Similarities'-'No Similarities' tag to GRSF Records
- [#11748] Added Tag for 'Fishing Gears' and 'Flag State' fields
- [#11766] Added 'Connected'-'Not Connected' tag to GRSF Records
- [#11767] Added group for SDG flag
- [#11811] Added citation field
- [#11832] Added sub-groups support for available time series related to GRSF Type "Assessment Unit"
- [#11967] Added Biomass group
- [#11968] Changed 'State and trend of Marine Resource' to 'State and Trend'
- [#11969] Changed 'Scientific advice' to 'Scientific Advice'
## [v1.5.0] - 2017-01-10
### Changed
- Model enhancements
## [v1.4.0] - 2017-11-02
### Changed
- Some fixes and improvements: added a common library between service and management widget
## [v1.3.0] - 2017-08-01
### Changed
- Model upgrade
## [v1.2.0] - 2017-07-01
### Changed
- [#8719] Model changed
## [v1.1.2] - 2017-05-15
- [#8719] Updates for ticket
- Minor fixes
## [v1.1.1] - 2017-04-02
- Minor fixes
## [v1.1.0] - 2017-02-28
- Model update
## [v1.0.1] - 2017-02-10
- Minor fixes
## [v1.0.0] - 2016-12-10
- First Release

312
LICENSE.md Normal file
View File

@ -0,0 +1,312 @@
# European Union Public Licence V. 1.1
EUPL © the European Community 2007
This European Union Public Licence (the “EUPL”) applies to the Work or Software
(as defined below) which is provided under the terms of this Licence. Any use of
the Work, other than as authorised under this Licence is prohibited (to the
extent such use is covered by a right of the copyright holder of the Work).
The Original Work is provided under the terms of this Licence when the Licensor
(as defined below) has placed the following notice immediately following the
copyright notice for the Original Work:
Licensed under the EUPL V.1.1
or has expressed by any other mean his willingness to license under the EUPL.
## 1. Definitions
In this Licence, the following terms have the following meaning:
- The Licence: this Licence.
- The Original Work or the Software: the software distributed and/or
communicated by the Licensor under this Licence, available as Source Code and
also as Executable Code as the case may be.
- Derivative Works: the works or software that could be created by the Licensee,
based upon the Original Work or modifications thereof. This Licence does not
define the extent of modification or dependence on the Original Work required
in order to classify a work as a Derivative Work; this extent is determined by
copyright law applicable in the country mentioned in Article 15.
- The Work: the Original Work and/or its Derivative Works.
- The Source Code: the human-readable form of the Work which is the most
convenient for people to study and modify.
- The Executable Code: any code which has generally been compiled and which is
meant to be interpreted by a computer as a program.
- The Licensor: the natural or legal person that distributes and/or communicates
the Work under the Licence.
- Contributor(s): any natural or legal person who modifies the Work under the
Licence, or otherwise contributes to the creation of a Derivative Work.
- The Licensee or “You”: any natural or legal person who makes any usage of the
Software under the terms of the Licence.
- Distribution and/or Communication: any act of selling, giving, lending,
renting, distributing, communicating, transmitting, or otherwise making
available, on-line or off-line, copies of the Work or providing access to its
essential functionalities at the disposal of any other natural or legal
person.
## 2. Scope of the rights granted by the Licence
The Licensor hereby grants You a world-wide, royalty-free, non-exclusive,
sub-licensable licence to do the following, for the duration of copyright vested
in the Original Work:
- use the Work in any circumstance and for all usage, reproduce the Work, modify
- the Original Work, and make Derivative Works based upon the Work, communicate
- to the public, including the right to make available or display the Work or
- copies thereof to the public and perform publicly, as the case may be, the
- Work, distribute the Work or copies thereof, lend and rent the Work or copies
- thereof, sub-license rights in the Work or copies thereof.
Those rights can be exercised on any media, supports and formats, whether now
known or later invented, as far as the applicable law permits so.
In the countries where moral rights apply, the Licensor waives his right to
exercise his moral right to the extent allowed by law in order to make effective
the licence of the economic rights here above listed.
The Licensor grants to the Licensee royalty-free, non exclusive usage rights to
any patents held by the Licensor, to the extent necessary to make use of the
rights granted on the Work under this Licence.
## 3. Communication of the Source Code
The Licensor may provide the Work either in its Source Code form, or as
Executable Code. If the Work is provided as Executable Code, the Licensor
provides in addition a machine-readable copy of the Source Code of the Work
along with each copy of the Work that the Licensor distributes or indicates, in
a notice following the copyright notice attached to the Work, a repository where
the Source Code is easily and freely accessible for as long as the Licensor
continues to distribute and/or communicate the Work.
## 4. Limitations on copyright
Nothing in this Licence is intended to deprive the Licensee of the benefits from
any exception or limitation to the exclusive rights of the rights owners in the
Original Work or Software, of the exhaustion of those rights or of other
applicable limitations thereto.
## 5. Obligations of the Licensee
The grant of the rights mentioned above is subject to some restrictions and
obligations imposed on the Licensee. Those obligations are the following:
Attribution right: the Licensee shall keep intact all copyright, patent or
trademarks notices and all notices that refer to the Licence and to the
disclaimer of warranties. The Licensee must include a copy of such notices and a
copy of the Licence with every copy of the Work he/she distributes and/or
communicates. The Licensee must cause any Derivative Work to carry prominent
notices stating that the Work has been modified and the date of modification.
Copyleft clause: If the Licensee distributes and/or communicates copies of the
Original Works or Derivative Works based upon the Original Work, this
Distribution and/or Communication will be done under the terms of this Licence
or of a later version of this Licence unless the Original Work is expressly
distributed only under this version of the Licence. The Licensee (becoming
Licensor) cannot offer or impose any additional terms or conditions on the Work
or Derivative Work that alter or restrict the terms of the Licence.
Compatibility clause: If the Licensee Distributes and/or Communicates Derivative
Works or copies thereof based upon both the Original Work and another work
licensed under a Compatible Licence, this Distribution and/or Communication can
be done under the terms of this Compatible Licence. For the sake of this clause,
“Compatible Licence” refers to the licences listed in the appendix attached to
this Licence. Should the Licensees obligations under the Compatible Licence
conflict with his/her obligations under this Licence, the obligations of the
Compatible Licence shall prevail.
Provision of Source Code: When distributing and/or communicating copies of the
Work, the Licensee will provide a machine-readable copy of the Source Code or
indicate a repository where this Source will be easily and freely available for
as long as the Licensee continues to distribute and/or communicate the Work.
Legal Protection: This Licence does not grant permission to use the trade names,
trademarks, service marks, or names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the copyright notice.
## 6. Chain of Authorship
The original Licensor warrants that the copyright in the Original Work granted
hereunder is owned by him/her or licensed to him/her and that he/she has the
power and authority to grant the Licence.
Each Contributor warrants that the copyright in the modifications he/she brings
to the Work are owned by him/her or licensed to him/her and that he/she has the
power and authority to grant the Licence.
Each time You accept the Licence, the original Licensor and subsequent
Contributors grant You a licence to their contributions to the Work, under the
terms of this Licence.
## 7. Disclaimer of Warranty
The Work is a work in progress, which is continuously improved by numerous
contributors. It is not a finished work and may therefore contain defects or
“bugs” inherent to this type of software development.
For the above reason, the Work is provided under the Licence on an “as is” basis
and without warranties of any kind concerning the Work, including without
limitation merchantability, fitness for a particular purpose, absence of defects
or errors, accuracy, non-infringement of intellectual property rights other than
copyright as stated in Article 6 of this Licence.
This disclaimer of warranty is an essential part of the Licence and a condition
for the grant of any rights to the Work.
## 8. Disclaimer of Liability
Except in the cases of wilful misconduct or damages directly caused to natural
persons, the Licensor will in no event be liable for any direct or indirect,
material or moral, damages of any kind, arising out of the Licence or of the use
of the Work, including without limitation, damages for loss of goodwill, work
stoppage, computer failure or malfunction, loss of data or any commercial
damage, even if the Licensor has been advised of the possibility of such
damage. However, the Licensor will be liable under statutory product liability
laws as far such laws apply to the Work.
## 9. Additional agreements
While distributing the Original Work or Derivative Works, You may choose to
conclude an additional agreement to offer, and charge a fee for, acceptance of
support, warranty, indemnity, or other liability obligations and/or services
consistent with this Licence. However, in accepting such obligations, You may
act only on your own behalf and on your sole responsibility, not on behalf of
the original Licensor or any other Contributor, and only if You agree to
indemnify, defend, and hold each Contributor harmless for any liability incurred
by, or claims asserted against such Contributor by the fact You have accepted
any such warranty or additional liability.
## 10. Acceptance of the Licence
The provisions of this Licence can be accepted by clicking on an icon “I agree”
placed under the bottom of a window displaying the text of this Licence or by
affirming consent in any other similar way, in accordance with the rules of
applicable law. Clicking on that icon indicates your clear and irrevocable
acceptance of this Licence and all of its terms and conditions.
Similarly, you irrevocably accept this Licence and all of its terms and
conditions by exercising any rights granted to You by Article 2 of this Licence,
such as the use of the Work, the creation by You of a Derivative Work or the
Distribution and/or Communication by You of the Work or copies thereof.
## 11. Information to the public
In case of any Distribution and/or Communication of the Work by means of
electronic communication by You (for example, by offering to download the Work
from a remote location) the distribution channel or media (for example, a
website) must at least provide to the public the information requested by the
applicable law regarding the Licensor, the Licence and the way it may be
accessible, concluded, stored and reproduced by the Licensee.
## 12. Termination of the Licence
The Licence and the rights granted hereunder will terminate automatically upon
any breach by the Licensee of the terms of the Licence.
Such a termination will not terminate the licences of any person who has
received the Work from the Licensee under the Licence, provided such persons
remain in full compliance with the Licence.
## 13. Miscellaneous
Without prejudice of Article 9 above, the Licence represents the complete
agreement between the Parties as to the Work licensed hereunder.
If any provision of the Licence is invalid or unenforceable under applicable
law, this will not affect the validity or enforceability of the Licence as a
whole. Such provision will be construed and/or reformed so as necessary to make
it valid and enforceable.
The European Commission may publish other linguistic versions and/or new
versions of this Licence, so far this is required and reasonable, without
reducing the scope of the rights granted by the Licence. New versions of the
Licence will be published with a unique version number.
All linguistic versions of this Licence, approved by the European Commission,
have identical value. Parties can take advantage of the linguistic version of
their choice.
## 14. Jurisdiction
Any litigation resulting from the interpretation of this License, arising
between the European Commission, as a Licensor, and any Licensee, will be
subject to the jurisdiction of the Court of Justice of the European Communities,
as laid down in article 238 of the Treaty establishing the European Community.
Any litigation arising between Parties, other than the European Commission, and
resulting from the interpretation of this License, will be subject to the
exclusive jurisdiction of the competent court where the Licensor resides or
conducts its primary business.
## 15. Applicable Law
This Licence shall be governed by the law of the European Union country where
the Licensor resides or has his registered office.
This licence shall be governed by the Belgian law if:
- a litigation arises between the European Commission, as a Licensor, and any
- Licensee; the Licensor, other than the European Commission, has no residence
- or registered office inside a European Union country.
## Appendix
“Compatible Licences” according to article 5 EUPL are:
- GNU General Public License (GNU GPL) v. 2
- Open Software License (OSL) v. 2.1, v. 3.0
- Common Public License v. 1.0
- Eclipse Public License v. 1.0
- Cecill v. 2.0

69
README.md Normal file
View File

@ -0,0 +1,69 @@
# GRSF Publisher Service
This service allows any client to publish on GRSF Catalogue.
## Built With
* [OpenJDK](https://openjdk.java.net/) - The JDK used
* [Maven](https://maven.apache.org/) - Dependency Management
## Documentation
[GRSF Publisher Service](https://wiki.gcube-system.org/gcube/GCube_Data_Catalogue_for_GRSF)
## Change log
See [Releases](https://code-repo.d4science.org/gCubeSystem/grsf-publisher-ws/releases).
## Authors
* **Luca Frosini** ([ORCID](https://orcid.org/0000-0003-3183-2291)) - [ISTI-CNR Infrascience Group](http://nemis.isti.cnr.it/groups/infrascience)
## How to Cite this Software
Tell people how to cite this software.
* Cite an associated paper?
* Use a specific BibTeX entry for the software?
@Manual{,
title = {GRSF Publisher Service},
author = {{Perciante, Costantino}, {Frosini, Luca}},
organization = {ISTI - CNR},
address = {Pisa, Italy},
year = 2019,
url = {http://www.gcube-system.org/}
}
## License
This project is licensed under the EUPL V.1.1 License - see the [LICENSE.md](LICENSE.md) file for details.
## About the gCube Framework
This software is part of the [gCubeFramework](https://www.gcube-system.org/ "gCubeFramework"): an
open-source software toolkit used for building and operating Hybrid Data
Infrastructures enabling the dynamic deployment of Virtual Research Environments
by favouring the realisation of reuse oriented policies.
The projects leading to this software have received funding from a series of European Union programmes including:
- the Sixth Framework Programme for Research and Technological Development
- DILIGENT (grant no. 004260).
- the Seventh Framework Programme for research, technological development and demonstration
- D4Science (grant no. 212488);
- D4Science-II (grant no.239019);
- ENVRI (grant no. 283465);
- iMarine(grant no. 283644);
- EUBrazilOpenBio (grant no. 288754).
- the H2020 research and innovation programme
- SoBigData (grant no. 654024);
- PARTHENOS (grant no. 654119);
- EGIEngage (grant no. 654142);
- ENVRIplus (grant no. 654182);
- BlueBRIDGE (grant no. 675680);
- PerformFish (grant no. 727610);
- AGINFRAplus (grant no. 731001);
- DESIRA (grant no. 818194);
- ARIADNEplus (grant no. 823914);
- RISIS2 (grant no. 824091);

View File

@ -1,7 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<ReleaseNotes>
<Changeset component="org.gcube.data-catalogue.grsf-publisher-ws.1-11-0" date="${buildDate}">
<Changeset component="org.gcube.data-catalogue.grsf-publisher-ws.1-12-0" date="${buildDate}">
<Change>Added support for GRSF_pre VRE with the behaviour of GRSF Admin #19166</Change>
</Changeset>
<Changeset component="org.gcube.data-catalogue.grsf-publisher-ws.1-11-0" date="2020-03-30">
<Change>Traceability flag is assigned only to Fishery records refs #18293</Change>
</Changeset>
<Changeset component="org.gcube.data-catalogue.grsf-publisher-ws.1-10-0" date="2019-11-11">

View File

@ -13,10 +13,10 @@
<outputDirectory>/</outputDirectory>
<useDefaultExcludes>true</useDefaultExcludes>
<includes>
<include>README</include>
<include>LICENSE</include>
<include>changelog.xml</include>
<include>profile.xml</include>
<include>LICENSE.md</include>
<include>README.md</include>
<include>CHANGELOG.md</include>
<include>gcube-app.xml</include>
</includes>
<fileMode>755</fileMode>
<filtered>true</filtered>

View File

@ -1 +0,0 @@
${gcube.license}

View File

@ -1,62 +0,0 @@
The gCube System - ${name}
--------------------------------------------------
${description}
${gcube.description}
${gcube.funding}
Version
--------------------------------------------------
${version} (${buildDate})
Please see the file named "changelog.xml" in this directory for the release notes.
Authors
--------------------------------------------------
* Costantino Perciante (costantino.perciante-AT-isti.cnr.it), Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" - CNR, Pisa (Italy).
Maintainers
-----------
* Costantino Perciante (costantino.perciante-AT-isti.cnr.it), Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" - CNR, Pisa (Italy).
Download information
--------------------------------------------------
Source code is available from SVN:
${scm.url}
Binaries can be downloaded from the gCube website:
${gcube.website}
Installation
--------------------------------------------------
Installation documentation is available on-line in the gCube Wiki:
${gcube.wikiRoot}
Documentation
--------------------------------------------------
Documentation is available on-line in the gCube Wiki:
${gcube.wikiRoot}
Support
--------------------------------------------------
Bugs and support requests can be reported in the gCube issue tracking tool:
${gcube.issueTracking}
Licensing
--------------------------------------------------
This software is licensed under the terms you may find in the file named "LICENSE" in this directory.

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ID></ID>
<Type>Library</Type>
<Profile>
<Description>${description}</Description>
<Class>DataCatalogue</Class>
<Name>${artifactId}</Name>
<Version>1.0.0</Version>
<Packages>
<Software>
<Name>${artifactId}</Name>
<Version>${version}</Version>
<MavenCoordinates>
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
</MavenCoordinates>
<Files>
<File>${build.finalName}.war</File>
</Files>
</Software>
</Packages>
</Profile>
</Resource>

10
gcube-app.xml Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<application mode='online'>
<name>GRSFPublisher</name>
<group>Data-Catalogue</group>
<version>${project.version}</version>
<description>${project.description}</description>
<local-persistence location='target' />
</application>

125
pom.xml
View File

@ -11,7 +11,7 @@
<groupId>org.gcube.data-catalogue</groupId>
<artifactId>grsf-publisher-ws</artifactId>
<version>1.11.0</version>
<version>1.13.3</version>
<packaging>war</packaging>
<name>grsf-publisher-ws</name>
<description>Utility library to publish GRSF products on GRSF catalogue.</description>
@ -19,12 +19,14 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<version.jersey>2.22.4</version.jersey>
<version.jackson>2.6.0</version.jackson>
<version.jackson>2.8.11</version.jackson>
<distroDirectory>${project.basedir}/distro</distroDirectory>
<webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory>
<distroDirectory>distro</distroDirectory>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jsoup.version>1.10.1</jsoup.version>
<serviceClass>DataPublishing</serviceClass>
<maven.compiler.release>8</maven.compiler.release>
</properties>
<scm>
@ -34,18 +36,11 @@
</scm>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.gcube.distribution</groupId>
<artifactId>gcube-bom</artifactId>
<version>1.3.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependencies>
<dependency>
<groupId>org.gcube.distribution</groupId>
<artifactId>gcube-smartgears-bom</artifactId>
<version>1.0.2</version>
<version>2.2.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
@ -56,7 +51,16 @@
<dependency>
<groupId>org.gcube.data-catalogue</groupId>
<artifactId>grsf-common-library</artifactId>
<version>[1-0-0-SNAPSHOT, 2.0.0-SNAPSHOT)</version>
<version>[2.0.0, 3.0.0-SNAPSHOT)</version>
</dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>storagehub-client-library</artifactId>
</dependency>
<dependency>
<groupId>org.gcube.social-networking</groupId>
<artifactId>social-service-client</artifactId>
<version>[1.0.0, 2.0.0-SNAPSHOT)</version>
</dependency>
<!-- jsoup HTML parser library @ http://jsoup.org/ -->
<dependency>
@ -106,12 +110,7 @@
<artifactId>authorization-client</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>home-library-jcr</artifactId>
<version>[2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT)</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>common-authorization</artifactId>
@ -120,32 +119,26 @@
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>${version.jersey}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${version.jersey}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-processing</artifactId>
<version>${version.jersey}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>${version.jersey}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-sse</artifactId>
<version>${version.jersey}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-bean-validation</artifactId>
<version>${version.jersey}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
@ -163,99 +156,37 @@
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>${version.jackson}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<scope>provided</scope>
</dependency>
<!-- SmartGears -->
<dependency>
<groupId>org.gcube.core</groupId>
<artifactId>common-smartgears</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>home-library</artifactId>
<version>[2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT)</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-jetty</artifactId>
<version>2.23.2</version>
<scope>test</scope>
</dependency>
<!-- Added to support Java 11 JDK -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- END Added to support Java 11 JDK -->
</dependencies>
<build>
<finalName>${name}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<phase>compile</phase>
</execution>
</executions>
<configuration>
<webappDirectory>${webappDirectory}</webappDirectory>
</configuration>
</plugin>
<!-- SA Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>${distroDirectory}/descriptor.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>servicearchive</id>
<phase>install</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>copy-profile</id>
<phase>install</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>target</outputDirectory>
<resources>
<resource>
<directory>${distroDirectory}</directory>
<filtering>true</filtering>
<includes>
<include>profile.xml</include>
</includes>
</resource>
</resources>
</configuration>
<id>make-servicearchive</id>
<phase>package</phase>
</execution>
</executions>
</plugin>

View File

@ -21,8 +21,8 @@ public @interface Group {
String condition() default "";
/**
* If this value is set, it is the name of the group (apart the source, i.e. "grsf", "ram", "firms", "fishsource" that will be prepended) to which the
* record needs to be put.
* If this value is set, it is used as name of the group in place of the filed value.
* (apart the source, i.e. "grsf", "ram", "firms", "fishsource" that will be prepended depending on prependSourceToGroupName)
* @return
*/
String groupNameOverValue() default "";
@ -32,6 +32,6 @@ public @interface Group {
* Set to false to avoid source prepending
* @return
*/
boolean prependSourceToGroupName() default true;
boolean prependSourceToGroupName() default false;
}

View File

@ -202,12 +202,18 @@ public abstract class Base {
@Override
public String toString() {
return "Base [catalogId=" + catalogId + ", description=" + description
+ ", license=" + license + ", author=" + author
+ ", authorContact=" + authorContact + ", version=" + version
+ ", maintainer=" + maintainer + ", maintainerContact="
+ maintainerContact + ", extrasFields=" + extrasFields
+ ", extrasResources=" + extrasResources + "]";
return "Base ["
+ "catalogId=" + catalogId
+ ", description=" + description
+ ", license=" + license
+ ", author=" + author
+ ", authorContact=" + authorContact
+ ", version=" + version
+ ", maintainer=" + maintainer
+ ", maintainerContact=" + maintainerContact
+ ", extrasFields=" + extrasFields
+ ", extrasResources=" + extrasResources
+ "]";
}
}

View File

@ -28,13 +28,14 @@ import com.fasterxml.jackson.annotation.JsonProperty;
* @author Luca Frosini (ISTI - CNR)
*
*/
public abstract class Common extends Base{
public abstract class Common extends Base {
@JsonProperty(Constants.DATA_OWNER_JSON_KEY)
@CustomField(key=Constants.DATA_OWNER_CUSTOM_KEY)
private List<String> dataOwner;
@JsonProperty(Constants.DATABASE_SOURCES_JSON_KEY)
@CustomField(key=Constants.DATABASE_SOURCES_CUSTOM_KEY)
@CkanResource
@Valid
private List<Resource<Sources>> databaseSources;
@ -54,7 +55,7 @@ public abstract class Common extends Base{
@JsonProperty(Constants.SDG_FLAG_JSON_KEY)
@CustomField(key=Constants.SDG_FLAG_CUSTOM_KEY)
@Group(condition="true", groupNameOverValue=Constants.SDG_FLAG_GROUP_NAME) // record is added to group grsf-sdg-flag if sdg Flag is true
@Group(condition="true", groupNameOverValue=Constants.SDG_FLAG_GROUP_NAME, prependSourceToGroupName=false) // record is added to group grsf-sdg-flag if sdg Flag is true
private Boolean sdgFlag;
@JsonProperty(Constants.STATUS_OF_THE_GRSF_RECORD_JSON_KEY)
@ -88,10 +89,6 @@ public abstract class Common extends Base{
@CustomField(key=Constants.SIMILAR_GRSF_RECORDS_CUSTOM_KEY)
private List<SimilarRecordBean> similarGRSFRecords;
@JsonProperty(Constants.SIMILAR_SOURCE_RECORDS_JSON_KEY)
@CustomField(key=Constants.SIMILAR_SOURCE_RECORDS_CUSTOM_KEY)
private List<SimilarRecordBean> similarSourceRecords;
// automatically set
@CustomField(key=Constants.DOMAIN_CUSTOM_KEY)
private String domain;
@ -113,7 +110,11 @@ public abstract class Common extends Base{
@JsonProperty(Constants.CONNECTED_JSON_KEY)
@CustomField(key=Constants.CONNECTED_CUSTOM_KEY)
private List<String> connectedBeans;
@JsonProperty(Constants.CONNECTIONS_INDICATOR)
@Tag
private String connectionsIndicator;
@JsonProperty(Constants.ANNOTATION_PUBLISHER_JSON_KEY)
@CustomField(key=Constants.ANNOTATION_PUBLISHER_CUSTOM_KEY)
private List<AnnotationBean> annotations;
@ -122,10 +123,6 @@ public abstract class Common extends Base{
@Tag
private String similaritiesIndicator;
@JsonProperty(Constants.CONNECTIONS_INDICATOR)
@Tag
private String connectionsIndicator;
@JsonProperty(Constants.CITATION_JSON_KEY)
@CustomField(key=Constants.CITATION_CUSTOM_KEY)
private String citation;
@ -180,7 +177,6 @@ public abstract class Common extends Base{
this.landings = landings;
this.species = species;
this.similarGRSFRecords = similarGRSFRecords;
this.similarSourceRecords = similarSourceRecords;
this.domain = domain;
this.uuid = uuid;
this.managementBodyAuthorities = managementBodyAuthorities;
@ -228,6 +224,7 @@ public abstract class Common extends Base{
public void setRefersTo(List<RefersToBean> refersTo) {
this.refersTo = refersTo;
}
public List<Resource<Sources>> getDatabaseSources() {
return databaseSources;
}
@ -300,14 +297,6 @@ public abstract class Common extends Base{
this.similarGRSFRecords = similarGRSFRecords;
}
public List<SimilarRecordBean> getSimilarSourceRecords() {
return similarSourceRecords;
}
public void setSimilarSourceRecords(List<SimilarRecordBean> similarSourceRecords) {
this.similarSourceRecords = similarSourceRecords;
}
public String getSpatial() {
return spatial;
}
@ -367,17 +356,28 @@ public abstract class Common extends Base{
@Override
public String toString() {
return "Common [dataOwner=" + dataOwner + ", databaseSources="
+ databaseSources + ", sourceOfInformation="
+ sourceOfInformation + ", refersTo=" + refersTo
+ ", shortName=" + shortName + ", sdgFlag=" + sdgFlag + ", status="
+ status + ", systemType=" + systemType + ", catches="
+ catches + ", landings=" + landings + ", species=" + species
return super.toString() + " - Common ["
+ " dataOwner=" + dataOwner
+ ", databaseSources=" + databaseSources
+ ", sourceOfInformation=" + sourceOfInformation
+ ", refersTo=" + refersTo
+ ", shortName=" + shortName
+ ", sdgFlag=" + sdgFlag
+ ", status=" + status
+ ", systemType=" + systemType
+ ", catches=" + catches
+ ", landings=" + landings
+ ", species=" + species
+ ", similarGRSFRecords=" + similarGRSFRecords
+ ", similarSourceRecords=" + similarSourceRecords
+ ", domain=" + domain + ", uuid=" + uuid
+ ", domain=" + domain
+ ", uuid=" + uuid
+ ", managementBodyAuthorities=" + managementBodyAuthorities
+ ", spatial=" + spatial + ", connectedBeans=" + connectedBeans
+ ", annotations=" + annotations + "]";
+ ", spatial=" + spatial
+ ", connectedBeans=" + connectedBeans
+ ", annotations=" + annotations
+ ", similaritiesIndicator=" + similaritiesIndicator
+ ", connectionsIndicator=" + connectionsIndicator
+ ", citation=" + citation
+ "]";
}
}

View File

@ -21,38 +21,35 @@ import com.fasterxml.jackson.annotation.JsonProperty;
*/
public class FisheryRecord extends Common {
@JsonProperty(Constants.TRACEABILITY_FLAG_JSON_KEY)
@CustomField(key=Constants.TRACEABILITY_FLAG_CUSTOM_KEY)
@Group(condition="true", groupNameOverValue=Constants.TRACEABILITY_FLAG_GROUP_NAME) // record is added to group grsf-traceability-flag if Traceability Flag is true
private Boolean traceabilityFlag;
@JsonProperty(Constants.FISHERY_NAME_JSON_KEY)
@CustomField(key=Constants.FISHERY_NAME_CUSTOM_KEY)
@NotNull(message="fishery_name cannot be null")
@Size(min=1, message="fishery_name cannot be empty")
@CustomField(key=Constants.FISHERY_NAME_CUSTOM_KEY)
private String fisheryName;
@JsonProperty(Constants.GRSF_SEMANTIC_IDENTIFIER_JSON_KEY)
@CustomField(key=Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY)
private String fisheryId;
@JsonProperty(Constants.TRACEABILITY_FLAG_JSON_KEY)
@CustomField(key=Constants.TRACEABILITY_FLAG_CUSTOM_KEY)
@Group(condition="true", groupNameOverValue=Constants.TRACEABILITY_FLAG_GROUP_NAME, prependSourceToGroupName=false) // record is added to group grsf-traceability-flag if Traceability Flag is true
private Boolean traceabilityFlag;
@JsonProperty(Constants.FISHING_AREA_JSON_KEY)
@CustomField(key=Constants.FISHING_AREA_CUSTOM_KEY)
@Tag
private List<String> fishingArea;
@JsonProperty(Constants.JURISDICTION_AREA_JSON_KEY)
@CustomField(key=Constants.JURISDICTION_AREA_CUSTOM_KEY)
@Tag
private List<String> jurisdictionArea;
@JsonProperty(Constants.RESOURCES_EXPLOITED_JSON_KEY)
@CustomField(key=Constants.RESOURCES_EXPLOITED_CUSTOM_KEY)
private List<String> resourcesExploited;
@JsonProperty(Constants.JURISDICTION_AREA_JSON_KEY)
@CustomField(key=Constants.JURISDICTION_AREA_CUSTOM_KEY)
private List<String> jurisdictionArea;
@JsonProperty(Constants.PRODUCTION_SYSTEM_TYPE_JSON_KEY)
@CustomField(key=Constants.PRODUCTION_SYSTEM_TYPE_CUSTOM_KEY)
private List<Production_System_Type> productionSystemType;
@JsonProperty(Constants.FLAG_STATE_JSON_KEY)
@CustomField(key=Constants.FLAG_STATE_CUSTOM_KEY)
@Tag
@ -65,7 +62,6 @@ public class FisheryRecord extends Common {
@JsonProperty(Constants.GRSF_TYPE_JSON_KEY)
@CustomField(key=Constants.GRSF_TYPE_CUSTOM_KEY)
@Group
@Tag
private Fishery_Type type;
@ -97,7 +93,6 @@ public class FisheryRecord extends Common {
this.fishingArea = fishingArea;
this.resourcesExploited = resourcesExploited;
this.jurisdictionArea = jurisdictionArea;
this.productionSystemType = productionSystemType;
this.flagState = flagState;
this.fishingGear = fishingGear;
this.type = type;
@ -165,15 +160,6 @@ public class FisheryRecord extends Common {
this.resourcesExploited = resourcesExploited;
}
public List<Production_System_Type> getProductionSystemType() {
return productionSystemType;
}
public void setProductionSystemType(
List<Production_System_Type> productionSystemType) {
this.productionSystemType = productionSystemType;
}
public List<String> getFlagState() {
return flagState;
}
@ -197,7 +183,6 @@ public class FisheryRecord extends Common {
+ ", traceabilityFlag=" + traceabilityFlag
+ ", resourcesExploited=" + resourcesExploited
+ ", jurisdictionArea=" + jurisdictionArea
+ ", productionSystemType=" + productionSystemType
+ ", flagState=" + flagState + ", fishingGear=" + fishingGear
+ ", type=" + type + "]";
}

View File

@ -26,9 +26,9 @@ import com.fasterxml.jackson.annotation.JsonProperty;
public class StockRecord extends Common{
@JsonProperty(Constants.STOCK_NAME_JSON_KEY)
@CustomField(key=Constants.STOCK_NAME_CUSTOM_KEY)
@NotNull(message=Constants.STOCK_NAME_JSON_KEY + " cannot be null")
@Size(min=2, message=Constants.STOCK_NAME_JSON_KEY + " cannot be empty")
@CustomField(key=Constants.STOCK_NAME_CUSTOM_KEY)
private String stockName;
@JsonProperty(Constants.GRSF_SEMANTIC_IDENTIFIER_JSON_KEY)
@ -46,6 +46,7 @@ public class StockRecord extends Common{
@JsonProperty(Constants.ASSESSMENT_METHODS_JSON_KEY)
@CustomField(key=Constants.ASSESSMENT_METHODS_CUSTOM_KEY)
@Group(groupNameOverValue=Constants.ASSESSMENT_METHODS_CUSTOM_KEY, prependSourceToGroupName=false)
private List<String> assessmentMethods;
@JsonProperty(Constants.FIRMS_ABUNDANCE_LEVEL_JSON_KEY)
@ -99,8 +100,9 @@ public class StockRecord extends Common{
@JsonProperty(Constants.SCIENTIFIC_ADVICE_JSON_KEY)
@CustomField(key=Constants.SCIENTIFIC_ADVICE_CUSTOM_KEY)
@TimeSeries
@Group(groupNameOverValue=Constants.SCIENTIFIC_ADVICE_CUSTOM_KEY, prependSourceToGroupName=false)
private List<String> scientificAdvice;
private List<TimeSeriesBean<String, Void>> scientificAdvice;
@JsonProperty(Constants.ASSESSOR_JSON_KEY)
@CustomField(key=Constants.ASSESSOR_CUSTOM_KEY)
@ -108,7 +110,6 @@ public class StockRecord extends Common{
@JsonProperty(Constants.GRSF_TYPE_JSON_KEY)
@CustomField(key=Constants.GRSF_TYPE_CUSTOM_KEY)
@Group
@Tag
private Stock_Type type;
@ -146,7 +147,7 @@ public class StockRecord extends Common{
List<TimeSeriesBean<String, String>> fishingPressure,
List<TimeSeriesBean<String, Void>> narrativeState,
List<TimeSeriesBean<String, Void>> faoState,
List<String> scientificAdvice, String assessor, Stock_Type type) {
List<TimeSeriesBean<String, Void>> scientificAdvice, String assessor, Stock_Type type) {
super();
this.stockName = stockName;
this.stockId = stockId;
@ -262,11 +263,11 @@ public class StockRecord extends Common{
this.narrativeState = narrativeState;
}
public List<String> getScientificAdvice() {
public List<TimeSeriesBean<String, Void>> getScientificAdvice() {
return scientificAdvice;
}
public void setScientificAdvice(List<String> scientificAdvice) {
public void setScientificAdvice(List<TimeSeriesBean<String, Void>> scientificAdvice) {
this.scientificAdvice = scientificAdvice;
}

View File

@ -51,7 +51,7 @@ import eu.trentorise.opendata.jackan.model.CkanDataset;
* @author Costantino Perciante (ISTI - CNR)
* @author Luca Frosini (ISTI - CNR)
*/
@Path("{source:firms|FIRMS|grsf|GRSF|FishSource|fishsource}/fishery/")
@Path("{source:firms|FIRMS|grsf|GRSF|FishSource|fishsource|sdg|SDG}/fishery/")
public class GrsfPublisherFisheryService {
// the context
@ -120,6 +120,8 @@ public class GrsfPublisherFisheryService {
String apiKey = catalogue.getApiKeyFromUsername(username);
String organization = HelperMethods.retrieveOrgNameFromScope(context);
CommonServiceUtils.hasAdminRole(username, catalogue, apiKey, organization);
// extend this role to the other organizations in this context
@ -255,7 +257,7 @@ public class GrsfPublisherFisheryService {
String type = fisheryInCkan.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY);
if((fisheryInCkan.getOrganization().getName().equalsIgnoreCase(source)
|| fisheryInCkan.getOrganization().getName().toLowerCase().contains(source))
|| fisheryInCkan.getOrganization().getName().toLowerCase().startsWith(source.toLowerCase()))
&& Product_Type.FISHERY.getOrigName().equals(type)) {
logger.debug("Ok, this is a fishery of the right source, removing it");
@ -549,7 +551,7 @@ public class GrsfPublisherFisheryService {
// check system type
boolean isGRSF = !record.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY)
.equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE);
.equals(Constants.SYSTEM_TYPE_LEGACY_RECORD);
if(!isGRSF)
throw new Exception("You are trying to modify a Legacy record!");

View File

@ -51,7 +51,7 @@ import eu.trentorise.opendata.jackan.model.CkanDataset;
* @author Costantino Perciante (ISTI - CNR)
* @author Luca Frosini (ISTI - CNR)
*/
@Path("{source:firms|FIRMS|ram|RAM|grsf|GRSF|FishSource|fishsource}/stock/")
@Path("{source:firms|FIRMS|ram|RAM|grsf|GRSF|FishSource|fishsource|sdg|SDG}/stock/")
public class GrsfPublisherStockService {
// the context
@ -260,7 +260,7 @@ public class GrsfPublisherStockService {
// check it is in the right source and it is a stock
String type = stockInCkan.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY);
if((stockInCkan.getOrganization().getName().equalsIgnoreCase(source)
|| stockInCkan.getOrganization().getName().toLowerCase().contains(source))
|| stockInCkan.getOrganization().getName().toLowerCase().startsWith(source.toLowerCase()))
&& Product_Type.STOCK.getOrigName().equals(type)) {
logger.debug("Ok, this is a stock of the right type, removing it");
@ -554,7 +554,7 @@ public class GrsfPublisherStockService {
// check system type
boolean isGRSF = !record.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY)
.equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE);
.equals(Constants.SYSTEM_TYPE_LEGACY_RECORD);
if(!isGRSF)
throw new Exception("You are trying to modify a Legacy record!");

View File

@ -4,7 +4,6 @@ import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@ -36,7 +35,6 @@ import org.gcube.datacatalogue.common.Constants;
import org.gcube.datacatalogue.common.enums.Product_Type;
import org.gcube.datacatalogue.common.enums.Sources;
import org.gcube.datacatalogue.common.enums.Status;
import org.gcube.datacatalogue.common.enums.Stock_Type;
import org.json.simple.JSONObject;
import org.slf4j.LoggerFactory;
@ -219,6 +217,90 @@ public class CommonServiceUtils {
}
}
public static final String GROUP_SUFFIX = "-group";
/**
* Convert a group name to its id on ckan
* @param origName
* @return
*/
private static String getGroupIDOnCkan(String origName){
if(origName == null) {
throw new IllegalArgumentException("origName cannot be null");
}
String modified = origName.replaceAll("\\(", "");
modified = modified.replaceAll("\\)", "");
modified = modified.trim().toLowerCase().replaceAll("[^A-Za-z0-9-]", "-");
if(modified.startsWith("-")) {
modified = modified.substring(1);
}
if(modified.endsWith("-")) {
modified = modified.substring(0, modified.length() -1);
}
return modified;
}
public static String getGroupId(String groupName) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(groupName);
/*
* The "_group" suffix is added to all groups to
* avoid issues on groups and organizations having the same name
* e.g. RAM organization (id=ram) and RAM group (id=ram_group)
*/
if(!groupName.endsWith(GROUP_SUFFIX)) {
stringBuffer.append(GROUP_SUFFIX);
}
return getGroupIDOnCkan(stringBuffer.toString());
}
private static void addGroup(Group group, Sources source, String value, Set<String> groups) {
String conditionToCheck = group.condition();
String groupNameOverValue = group.groupNameOverValue();
boolean prependSource = group.prependSourceToGroupName();
boolean match = conditionToCheck.isEmpty() ? true
: value.matches(conditionToCheck);
if(match) {
StringBuffer stringBuffer = new StringBuffer();
if(prependSource) {
stringBuffer.append(source.getURLPath());
stringBuffer.append(" ");
}
if(groupNameOverValue.isEmpty()) {
stringBuffer.append(value);
}else {
stringBuffer.append(groupNameOverValue);
}
String groupId = getGroupId(stringBuffer.toString());
groups.add(groupId);
}
}
/**
* Add the record to the group of sources
* @param groups
* @param sourcesList
* @param productType
* @param sourceInPath
*/
private static void addRecordToGroups(Set<String> groups, Set<String> sourcesList, Product_Type productType, Sources sourceInPath) {
if(sourceInPath == Sources.GRSF) {
groups.add(getGroupId(Sources.GRSF.getURLPath())); // i.e. grsf_group
}else {
groups.add(getGroupId(Constants.SYSTEM_TYPE_LEGACY_RECORD)); // i.e. legacy_group
}
// evaluate the custom fields/tags, resources and groups
groups.add(getGroupId(productType.getOrigName())); //i.e. stock_group or fishery_group
for(String source : sourcesList) {
groups.add(getGroupId(source)); // i.e. firms_group, fishsource_group, ram_group
}
}
/**
* Retrieve the list of groups' names for this object
*/
@ -226,74 +308,22 @@ public class CommonServiceUtils {
Sources source) {
if(field.isAnnotationPresent(Group.class)) {
Group group = field.getAnnotation(Group.class);
String conditionToCheck = group.condition();
String groupNameOverValue = group.groupNameOverValue();
// See https://support.d4science.org/issues/11832
boolean assessmentUnit = false;
boolean prependSource = group.prependSourceToGroupName();
if(record instanceof StockRecord) {
StockRecord stockRecord = (StockRecord) record;
Stock_Type stock_Type = stockRecord.getType();
if(stock_Type != Stock_Type.Assessment_Unit) {
prependSource = false;
}else {
assessmentUnit = true;
}
}
// end patch for https://support.d4science.org/issues/11832
try {
Object f = new PropertyDescriptor(field.getName(), current).getReadMethod().invoke(record);
if(f != null) {
if(f instanceof List<?>) {
List asList = ((List) f);
if(!asList.isEmpty()) {
logger.debug("The object annotated with @Group is a list. Adding ... ");
// else add all the available elements
// add all the available elements
for(int i = 0; i < asList.size(); i++) {
boolean match = conditionToCheck.isEmpty() ? true
: asList.get(i).toString().trim().matches(conditionToCheck);
if(match) {
String groupName = groupNameOverValue.isEmpty()
? HelperMethods.getGroupNameOnCkan(source.toString().toLowerCase() + "-"
+ asList.get(i).toString().trim())
: source.toString().toLowerCase() + "-" + groupNameOverValue;
if(assessmentUnit && !prependSource) {
groups.add(groupNameOverValue);
}else {
groups.add(groupName);
}
}
String value = asList.get(i).toString().trim();
addGroup(group, source, value, groups);
}
}
} else {
// also convert to the group name that should be on ckan
boolean match = conditionToCheck.isEmpty() ? true
: f.toString().trim().matches(conditionToCheck);
if(match) {
String groupName = groupNameOverValue.isEmpty()
? HelperMethods.getGroupNameOnCkan(
source.toString().toLowerCase() + "-" + f.toString().trim())
: source.toString().toLowerCase() + "-" + groupNameOverValue;
if(assessmentUnit && !prependSource) {
groups.add(groupNameOverValue);
}else {
groups.add(groupName);
}
}
String value = f.toString().trim();
addGroup(group, source, value, groups);
}
}
@ -301,7 +331,6 @@ public class CommonServiceUtils {
logger.error("Failed to read value for field " + field.getName() + " skipping", e);
}
}
}
/**
@ -485,7 +514,7 @@ public class CommonServiceUtils {
// validate the record if it is a GRSF one and set the record type and in manage context
// Status field is needed only in the Manage context for GRSF records
if(context.equals((String) contextServlet.getInitParameter(HelperMethods.MANAGE_CONTEX_KEY))) {
if( (context.equals((String) contextServlet.getInitParameter(HelperMethods.MANAGE_CONTEX_KEY))) || (context.equals((String) contextServlet.getInitParameter(HelperMethods.PREVALIDATE_CONTEX_KEY)))) {
if(sourceInPath.equals(Sources.GRSF)) {
List<RefersToBean> refersTo = record.getRefersTo();
@ -513,13 +542,13 @@ public class CommonServiceUtils {
if(databaseSources!=null) {
for(Resource<Sources> source : databaseSources) {
Sources sourceName = source.getName();
sourcesList.add(sourceName.getOrigName().toLowerCase());
sourcesList.add(sourceName.getURLPath());
}
}
}
// append to groups: we need to add this record to the correspondent group of the sources
addRecordToGroupSources(groups, new ArrayList(sourcesList), productType, sourceInPath);
addRecordToGroups(groups, sourcesList, productType, sourceInPath);
// validate
CommonServiceUtils.validateAggregatedRecord(record, sourceInPath);
@ -532,57 +561,41 @@ public class CommonServiceUtils {
sourceInPath.equals(Sources.GRSF)
? productType.equals(Product_Type.FISHERY) ? ((FisheryRecord) record).getType().getOrigName()
: ((StockRecord) record).getType().getOrigName()
: Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE);
: Constants.SYSTEM_TYPE_LEGACY_RECORD);
logger.debug("Domain is " + productType.getOrigName() + " and system type " + record.getSystemType());
// evaluate the custom fields/tags, resources and groups
groups.add(sourceInPath.getOrigName().toLowerCase() + "-" + productType.getOrigName().toLowerCase()); //e.g. grsf-fishery
boolean skipTags = !sourceInPath.equals(Sources.GRSF); // no tags for the Original records
CommonServiceUtils.getTagsGroupsResourcesExtrasByRecord(tags, skipTags, groups, false, resources, false,
/*
* It has been decided to add tags also for legacy records see #23216
* boolean skipTags = !sourceInPath.equals(Sources.GRSF); // no tags for the Original records
*/
CommonServiceUtils.getTagsGroupsResourcesExtrasByRecord(tags, false, groups, false, resources, false,
customFields, record, username, sourceInPath);
}
/**
* Add the record to the group of sources
* @param groups
* @param sourcesList
* @param productType
* @param sourceInPath
*/
private static void addRecordToGroupSources(Set<String> groups, List<String> sourcesList, Product_Type productType,
Sources sourceInPath) {
Collections.sort(sourcesList); // be sure the name are sorted because the groups have been generated this way
String groupName = sourceInPath.getOrigName().toLowerCase() + "-" + productType.getOrigName().toLowerCase();
for(String source : sourcesList) {
groupName += "-" + source;
}
groups.add(groupName);
}
/**
* Fetch the system:type property from a record
* @param itemIdOrName
* @param apiKey
* @return null on error
* @throws Exception
*/
public static String getSystemTypeValue(String itemIdOrName, String apiKey, String context) throws Exception {
DataCatalogue catalog = HelperMethods.getDataCatalogueRunningInstance(context);
CkanDataset dataset = catalog.getDataset(itemIdOrName, apiKey);
if(dataset == null)
throw new Exception("Unable to find record with id or name " + itemIdOrName);
String systemTypeValue = dataset.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY);
if(systemTypeValue == null || systemTypeValue.isEmpty())
throw new Exception(Constants.SYSTEM_TYPE_CUSTOM_KEY + " property not set in record " + itemIdOrName);
else
return systemTypeValue;
}
// /**
// * Fetch the system:type property from a record
// * @param itemIdOrName
// * @param apiKey
// * @return null on error
// * @throws Exception
// */
// public static String getSystemTypeValue(String itemIdOrName, String apiKey, String context) throws Exception {
// DataCatalogue catalog = HelperMethods.getDataCatalogueRunningInstance(context);
// CkanDataset dataset = catalog.getDataset(itemIdOrName, apiKey);
// if(dataset == null) {
// throw new Exception("Unable to find record with id or name " + itemIdOrName);
// }
// String systemTypeValue = dataset.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY);
// if(systemTypeValue == null || systemTypeValue.isEmpty()) {
// throw new Exception(Constants.SYSTEM_TYPE_CUSTOM_KEY + " property not set in record " + itemIdOrName);
// }else {
// return systemTypeValue;
// }
//
// }
public static String getRecordOrganization(String itemIdOrName, String apiKey, String context) throws Exception {
DataCatalogue catalog = HelperMethods.getDataCatalogueRunningInstance(context);
@ -697,9 +710,14 @@ public class CommonServiceUtils {
* @return
*/
public static String evaluateOrganization(String organization, Sources sourceInPath) {
if(sourceInPath.equals(Sources.GRSF) && organization.equals(Constants.GRSF_ADMIN_ORGANIZATION_NAME))
return Constants.GRSF_ADMIN_ORGANIZATION_NAME;
else
return sourceInPath.getOrigName().toLowerCase();
if(sourceInPath.equals(Sources.GRSF) &&
(organization.compareTo(Constants.GRSF_ADMIN_ORGANIZATION_NAME)==0 || organization.compareTo(Constants.GRSF_PRE_ORGANIZATION_NAME)==0)){
if(organization.compareTo(Constants.GRSF_ADMIN_ORGANIZATION_NAME)==0) {
return Constants.GRSF_ADMIN_ORGANIZATION_NAME;
}else {
return Constants.GRSF_PRE_ORGANIZATION_NAME;
}
}else
return sourceInPath.getURLPath();
}
}

View File

@ -5,7 +5,6 @@ import static org.gcube.resources.discovery.icclient.ICFactory.client;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
@ -20,15 +19,11 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.homelibrary.home.exceptions.InternalErrorException;
import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder;
import org.gcube.common.homelibrary.home.workspace.WorkspaceItem;
import org.gcube.common.homelibrary.home.workspace.exceptions.InsufficientPrivilegesException;
import org.gcube.common.homelibrary.home.workspace.exceptions.ItemAlreadyExistException;
import org.gcube.common.homelibrary.home.workspace.exceptions.ItemNotFoundException;
import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalFile;
import org.gcube.common.resources.gcore.utils.XPathHelper;
import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.common.storagehub.client.dsl.FileContainer;
import org.gcube.common.storagehub.client.dsl.FolderContainer;
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogue;
import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogueFactory;
import org.gcube.datacatalogue.common.caches.CacheImpl;
@ -36,6 +31,7 @@ import org.gcube.datacatalogue.common.caches.CacheInterface;
import org.gcube.resources.discovery.client.api.DiscoveryClient;
import org.gcube.resources.discovery.client.queries.api.Query;
import org.gcube.resources.discovery.client.queries.impl.QueryBox;
import org.gcube.social_networking.social_networking_client_library.UserClient;
import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;
import org.slf4j.LoggerFactory;
@ -72,9 +68,12 @@ public abstract class HelperMethods {
// to be retrieved from the web.xml
public static final String MANAGE_CONTEX_KEY = "ManageVRE";
public static final String PREVALIDATE_CONTEX_KEY = "PreValidateVRE";
public static final String PUBLIC_CONTEX_KEY = "PublicVRE";
private static final String CSV_MIME = "text/csv";
private static final String PATH_SEPARATOR = "/";
// This key is used in replaceFieldsKey() function to indicate to remove the metadata field
private static final String NONE_KEY = "none:none";
// caches
private static CacheInterface<String, String> userEmailCache = new CacheImpl<String, String>(1000 * 60 * 60 * 24);
@ -82,27 +81,6 @@ public abstract class HelperMethods {
private static CacheInterface<String, Map<String, String>> namespacesCache = new CacheImpl<String, Map<String, String>>(1000 * 60 * 60 * 24);
private static CacheInterface<String, DataCatalogue> catalogueCache = new CacheImpl<String, DataCatalogue>(1000 * 60 * 60 * 24);
/**
* Convert a group name to its id on ckan
* @param origName
* @return
*/
public static String getGroupNameOnCkan(String origName){
if(origName == null)
throw new IllegalArgumentException("origName cannot be null");
String modified = origName.trim().toLowerCase().replaceAll("[^A-Za-z0-9-]", "-");
if(modified.startsWith("-"))
modified = modified.substring(1);
if(modified.endsWith("-"))
modified = modified.substring(0, modified.length() -1);
logger.info("Group name generated is " + modified);
return modified;
}
/**
* Retrieve the running instance of the data catalogue for this scope
* @return
@ -157,21 +135,18 @@ public abstract class HelperMethods {
* @return
* @throws Exception
*/
public static String getUserEmail(String context, String token){
public static String getUserEmail(String context, String token) throws Exception{
// check in cache
String result = null;
if((result = (String) userEmailCache.get(token)) != null){
return result;
String email = null;
if((email = (String) userEmailCache.get(token)) != null){
return email;
}else{
String baseUrl = new GcoreEndPointReaderSocial(context).getBasePath();
String url = baseUrl.endsWith("/") ? baseUrl + "users/getUserEmail?gcube-token=" + token :
baseUrl + "/users/getUserEmail?gcube-token=" + token;
logger.debug("Request url is " + url);
result = executGETHttpRequest(url, 200);
userEmailCache.insert(token, result);
UserClient userClient = new UserClient();
email = userClient.getEmail();
userEmailCache.insert(token, email);
}
return result;
return email;
}
/**
@ -181,21 +156,18 @@ public abstract class HelperMethods {
* @return
* @throws Exception
*/
public static String getUserFullname(String context, String token){
public static String getUserFullname(String context, String token) throws Exception{
// check in cache
String result = null;
if((result = (String) userFullnameCache.get(token)) != null){
return result;
String fullName = null;
if((fullName = (String) userFullnameCache.get(token)) != null){
return fullName;
}else{
String baseUrl = new GcoreEndPointReaderSocial(context).getBasePath();
String url = baseUrl.endsWith("/") ? baseUrl + "users/getUserFullname?gcube-token=" + token :
baseUrl + "/users/getUserFullname?gcube-token=" + token;
logger.debug("Request url is " + url);
result = executGETHttpRequest(url, 200);
userFullnameCache.insert(token, result);
UserClient userClient = new UserClient();
fullName = userClient.getFullName();
userFullnameCache.insert(token, fullName);
}
return result;
return fullName;
}
/**
@ -257,29 +229,20 @@ public abstract class HelperMethods {
* @param csvFile
* @return
*/
public static ExternalFile uploadExternalFile(WorkspaceFolder resourceFormatFolder, String resourceToAttachName, String description, File csvFile) {
public static FileContainer uploadExternalFile(FolderContainer resourceFormatFolder, String resourceToAttachName, String description, File csvFile) {
try {
try (InputStream is= new FileInputStream(csvFile)) {
FileContainer fileContainer = resourceFormatFolder.uploadFile(is , resourceToAttachName, description);
return fileContainer;
}
WorkspaceItem existsFile = resourceFormatFolder.find(resourceToAttachName);
if(existsFile == null)
return resourceFormatFolder.createExternalFileItem(resourceToAttachName, description, CSV_MIME, csvFile);
else{
InputStream targetStream = new FileInputStream(csvFile);
existsFile.updateItem(targetStream);
return (ExternalFile)existsFile;
}
} catch (InsufficientPrivilegesException | ItemAlreadyExistException
| InternalErrorException e) {
logger.error("Failed to upload the file into the workspace shared folder for " + resourceToAttachName, e);
} catch (FileNotFoundException e) {
} catch (StorageHubException she) {
logger.error("Failed to upload the file into the workspace shared folder for " + resourceToAttachName, she);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ItemNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
@ -290,9 +253,10 @@ public abstract class HelperMethods {
* @param subPath
* @return null if an error occurred
*/
public static WorkspaceFolder createOrGetSubFoldersByPath(WorkspaceFolder folder, String subPath){
WorkspaceFolder parentFolder = folder;
public static FolderContainer createOrGetSubFoldersByPath(FolderContainer folder, String subPath){
FolderContainer parentFolder = folder;
if(folder == null)
throw new IllegalArgumentException("Root folder is null!");
@ -311,8 +275,9 @@ public abstract class HelperMethods {
String[] splittedPaths = subPath.split(PATH_SEPARATOR);
for (String path : splittedPaths) {
WorkspaceFolder createdFolder = getFolderOrCreate(parentFolder, path, "");
logger.debug("Created subfolder with path " + createdFolder.getPath());
FolderContainer createdFolder = getFolderOrCreate(parentFolder, path, "");
logger.debug("Created subfolder with path " + createdFolder.get().getPath());
parentFolder = createdFolder;
}
@ -328,23 +293,18 @@ public abstract class HelperMethods {
* Get a folder within the catalogue folder or create it if it doesn't exist.
* @return
*/
public static WorkspaceFolder getFolderOrCreate(WorkspaceFolder folder, String relativePath, String descriptionFolder){
WorkspaceFolder result = null;
public static FolderContainer getFolderOrCreate(FolderContainer folder, String relativePath, String descriptionFolder){
FolderContainer result = null;
try {
WorkspaceItem foundFolder = folder.find(relativePath);
if(foundFolder != null && foundFolder.isFolder())
result = (WorkspaceFolder)foundFolder;
if(result != null)
logger.debug("Folder found with name " + result.getName() + ", it has id " + result.getId());
else
throw new Exception("There is no folder with name " + relativePath + " under folder " + folder.getName());
result = folder.openByRelativePath(relativePath).asFolder();
} catch (Exception e) {
logger.debug("Probably the folder doesn't exist");
try{
result = folder.createFolder(relativePath, descriptionFolder);
} catch (InsufficientPrivilegesException | InternalErrorException | ItemAlreadyExistException e2) {
logger.error("Failed to get or generate this folder", e2);
result = folder.newFolder(relativePath, descriptionFolder);
} catch (StorageHubException se) {
logger.error("Failed to get or generate this folder", se);
}
}
return result;
@ -588,16 +548,18 @@ public abstract class HelperMethods {
if(namespaces.containsKey(entry.getKey())){
usedKey = namespaces.get(entry.getKey());
}
else{
} else{
usedKey = entry.getKey();
}
if(isSourceRecord)
if(isSourceRecord) {
usedKey = usedKey.replace("GRSF", "").trim();
}
toReturn.put(usedKey, entry.getValue());
// When the replaced key is none the metadata field must be removed
if(usedKey.compareTo(NONE_KEY)!=0) {
toReturn.put(usedKey, entry.getValue());
}
}
return toReturn;

View File

@ -1,6 +1,5 @@
package org.gcube.data_catalogue.grsf_publish_ws.utils.csv;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.lang.reflect.Field;
@ -8,18 +7,11 @@ import java.lang.reflect.InvocationTargetException;
import java.util.List;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.homelibrary.home.HomeLibrary;
import org.gcube.common.homelibrary.home.exceptions.HomeNotFoundException;
import org.gcube.common.homelibrary.home.exceptions.InternalErrorException;
import org.gcube.common.homelibrary.home.exceptions.UserNotFoundException;
import org.gcube.common.homelibrary.home.workspace.Workspace;
import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder;
import org.gcube.common.homelibrary.home.workspace.WorkspaceSharedFolder;
import org.gcube.common.homelibrary.home.workspace.catalogue.WorkspaceCatalogue;
import org.gcube.common.homelibrary.home.workspace.exceptions.ItemNotFoundException;
import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException;
import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalFile;
import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.common.storagehub.client.dsl.FileContainer;
import org.gcube.common.storagehub.client.dsl.FolderContainer;
import org.gcube.common.storagehub.client.dsl.StorageHubClient;
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
import org.gcube.data_catalogue.grsf_publish_ws.custom_annotations.CustomField;
import org.gcube.data_catalogue.grsf_publish_ws.custom_annotations.TimeSeries;
import org.gcube.data_catalogue.grsf_publish_ws.json.input.record.Common;
@ -42,13 +34,15 @@ public class ManageTimeSeriesThread extends Thread{
private static final String PATH_SEPARATOR = "/";
private static final String CATALOGUE_FOLDER = ".catalogue";
// Logger
private static final org.slf4j.Logger logger = LoggerFactory.getLogger(ManageTimeSeriesThread.class);
// try to attach the source at most CHANCES times ..
private static final int CHANCES = 10;
private static CacheInterface<String, WorkspaceCatalogue> vreFolderCache = new CacheImpl<String, WorkspaceCatalogue>(1000 * 60 * 60 * 24);
private static CacheInterface<String, FolderContainer> vreFolderCache = new CacheImpl<String, FolderContainer>(1000 * 60 * 60 * 24);
private static final int MAX_NAME_CSV_FILE_WITHOUT_MEASURE = 50;
@ -96,17 +90,7 @@ public class ManageTimeSeriesThread extends Thread{
logger.error("Error was " + e.getMessage());
} catch (InvocationTargetException e) {
logger.error("Error was " + e.getMessage());
} catch (WorkspaceFolderNotFoundException e) {
logger.error("Error was " + e.getMessage());
} catch (ItemNotFoundException e) {
logger.error("Error was " + e.getMessage());
} catch (IntrospectionException e) {
logger.error("Error was " + e.getMessage());
} catch (InternalErrorException e) {
logger.error("Error was " + e.getMessage());
} catch (HomeNotFoundException e) {
logger.error("Error was " + e.getMessage());
} catch (UserNotFoundException e) {
} catch (StorageHubException e) {
logger.error("Error was " + e.getMessage());
} catch (Exception e) {
logger.error("Error was " + e.getMessage());
@ -130,17 +114,26 @@ public class ManageTimeSeriesThread extends Thread{
if(record == null)
throw new IllegalArgumentException("The given record is null!!");
StorageHubClient shClient = new StorageHubClient();
String token = SecurityTokenProvider.instance.get();
WorkspaceCatalogue catalogueFolder = null;
FolderContainer catalogueFolder = null;
//WorkspaceCatalogue catalogueFolder = null;
if((catalogueFolder = vreFolderCache.get(token)) == null){
Workspace ws = HomeLibrary.getHomeManagerFactory().getHomeManager().getHome().getWorkspace();
WorkspaceSharedFolder vreFolder = ws.getVREFolderByScope(ScopeProvider.instance.get());
catalogueFolder = vreFolder.getVRECatalogue();
//Workspace ws = HomeLibrary.getHomeManagerFactory().getHomeManager().getHome().getWorkspace();
FolderContainer vreFolder = shClient.openVREFolder();
try {
catalogueFolder = vreFolder.openByRelativePath(CATALOGUE_FOLDER).asFolder();
}catch (StorageHubException e) {
catalogueFolder = vreFolder.newHiddenFolder(CATALOGUE_FOLDER, "catalogue folder");
}
vreFolderCache.insert(token, catalogueFolder);
}
logger.debug("Catalogue folder in vre has path " + catalogueFolder.getPath());
logger.debug("Catalogue folder in vre has path " + catalogueFolder.get().getPath());
// the structure under the .catalogue will be as follows:
// .catalogue:
@ -167,7 +160,7 @@ public class ManageTimeSeriesThread extends Thread{
// the whole path of the directory is going to be...
String csvDirectoryForThisProduct = recordTypeFolderName + PATH_SEPARATOR + firstLetter + PATH_SEPARATOR + replaceIllegalChars(uuidKB, "_") + PATH_SEPARATOR + CSVUtils.CSV_EXTENSION.replace(".", "");
logger.debug("The path under which the time series are going to be saved is " + csvDirectoryForThisProduct);
WorkspaceFolder csvFolder = HelperMethods.createOrGetSubFoldersByPath(catalogueFolder, csvDirectoryForThisProduct);
FolderContainer csvFolder = HelperMethods.createOrGetSubFoldersByPath(catalogueFolder, csvDirectoryForThisProduct);
if(csvFolder == null)
logger.error("Failed to create directory where csv files will be deployed in the workspace!!");
@ -192,7 +185,7 @@ public class ManageTimeSeriesThread extends Thread{
String resourceToAttachOnCkanDescription = productName;
CkanResourceBase ckanResource = null;
ExternalFile createdFileOnWorkspace = null;
FileContainer createdFileOnWorkspace = null;
String[] relevantSources = new String[1];
File csvFile = CSVUtils.listToCSV(asList, relevantSources);
if(csvFile != null){
@ -212,7 +205,7 @@ public class ManageTimeSeriesThread extends Thread{
+ customAnnotation.key() + CSVUtils.CSV_EXTENSION, resourceToAttachOnCkanDescription, csvFile);
if(createdFileOnWorkspace != null){
String publicUrlToSetOnCkan = createdFileOnWorkspace.getPublicLink(true);
String publicUrlToSetOnCkan = createdFileOnWorkspace.getPublicLink().toString();
// wait for patching..
Thread.sleep(1500);

View File

@ -0,0 +1,94 @@
<Resource version="0.4.x">
<ID>85480b75-62f5-4708-acd9-382b22cffc90</ID>
<Type>GenericResource</Type>
<Scopes>
<Scope>/d4science.research-infrastructures.eu/FARM/GRSF</Scope>
</Scopes>
<Profile>
<SecondaryType>ApplicationProfile</SecondaryType>
<Name>GRSF Fishery</Name>
<Description>GRSF mapping between fields and namespaces for Fishery
records</Description>
<Body>
<fields>
<field>
<originalKey>Data Owner</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Database Source</originalKey>
<modifiedKey>fishery_identity:Database Source</modifiedKey>
</field>
<field>
<originalKey>Short Name</originalKey>
<modifiedKey>fishery_identity:Short Name</modifiedKey>
</field>
<field>
<originalKey>Catch</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Landing</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Species</originalKey>
<modifiedKey>fishery_identity:Species</modifiedKey>
</field>
<field>
<originalKey>Similar GRSF Record</originalKey>
<modifiedKey>fishery_identity:Similar GRSF Record</modifiedKey>
</field>
<field>
<originalKey>Management Body/Authority</originalKey>
<modifiedKey>fishery_identity:Management Body/Authority</modifiedKey>
</field>
<field>
<originalKey>Connected Record</originalKey>
<modifiedKey>fishery_identity:Connected Record</modifiedKey>
</field>
<field>
<originalKey>Annotation</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>GRSF Fishery Name</originalKey>
<modifiedKey>fishery_identity:GRSF Fishery Name</modifiedKey>
</field>
<field>
<originalKey>GRSF Semantic Identifier</originalKey>
<modifiedKey>fishery_identity:GRSF Semantic Identifier
</modifiedKey>
</field>
<field>
<originalKey>Traceability Flag</originalKey>
<modifiedKey>fishery_identity:Traceability Flag</modifiedKey>
</field>
<field>
<originalKey>Fishing Area</originalKey>
<modifiedKey>fishery_identity:Fishing Area</modifiedKey>
</field>
<field>
<originalKey>Jurisdiction Area</originalKey>
<modifiedKey>fishery_identity:Jurisdiction Area</modifiedKey>
</field>
<field>
<originalKey>Resources Exploited</originalKey>
<modifiedKey>fishery_identity:Resources Exploited</modifiedKey>
</field>
<field>
<originalKey>Flag State</originalKey>
<modifiedKey>fishery_identity:Flag State</modifiedKey>
</field>
<field>
<originalKey>Fishing Gear</originalKey>
<modifiedKey>fishery_identity:Fishing Gear</modifiedKey>
</field>
<field>
<originalKey>GRSF Type</originalKey>
<modifiedKey>fishery_identity:GRSF Type</modifiedKey>
</field>
</fields>
</Body>
</Profile>
</Resource>

View File

@ -0,0 +1,91 @@
<Resource version="0.4.x">
<ID>c3326373-c620-45e8-a7e3-a25a1a2a970b</ID>
<Type>GenericResource</Type>
<Scopes>
<Scope>/d4science.research-infrastructures.eu/FARM/GRSF_Admin</Scope>
<Scope>/d4science.research-infrastructures.eu/FARM</Scope>
</Scopes>
<Profile>
<SecondaryType>ApplicationProfile</SecondaryType>
<Name>GRSF Fishery</Name>
<Description>GRSF mapping between fields and namespaces for Fishery
records</Description>
<Body>
<fields>
<field>
<originalKey>Data Owner</originalKey>
<modifiedKey>fishery_data:Data Owner</modifiedKey>
</field>
<field>
<originalKey>Database Source</originalKey>
<modifiedKey>fishery_identity:Database Source</modifiedKey>
</field>
<field>
<originalKey>Short Name</originalKey>
<modifiedKey>fishery_identity:Short Name</modifiedKey>
</field>
<field>
<originalKey>Catch</originalKey>
<modifiedKey>fishery_data:Catch</modifiedKey>
</field>
<field>
<originalKey>Landing</originalKey>
<modifiedKey>fishery_data:Landing</modifiedKey>
</field>
<field>
<originalKey>Species</originalKey>
<modifiedKey>fishery_identity:Species</modifiedKey>
</field>
<field>
<originalKey>Similar GRSF Record</originalKey>
<modifiedKey>fishery_identity:Similar GRSF Record</modifiedKey>
</field>
<field>
<originalKey>Management Body/Authority</originalKey>
<modifiedKey>fishery_identity:Management Body/Authority</modifiedKey>
</field>
<field>
<originalKey>Connected Record</originalKey>
<modifiedKey>fishery_identity:Connected Record</modifiedKey>
</field>
<field>
<originalKey>GRSF Fishery Name</originalKey>
<modifiedKey>fishery_identity:GRSF Fishery Name</modifiedKey>
</field>
<field>
<originalKey>GRSF Semantic Identifier</originalKey>
<modifiedKey>fishery_identity:GRSF Semantic Identifier
</modifiedKey>
</field>
<field>
<originalKey>Traceability Flag</originalKey>
<modifiedKey>fishery_identity:Traceability Flag</modifiedKey>
</field>
<field>
<originalKey>Fishing Area</originalKey>
<modifiedKey>fishery_identity:Fishing Area</modifiedKey>
</field>
<field>
<originalKey>Jurisdiction Area</originalKey>
<modifiedKey>fishery_identity:Jurisdiction Area</modifiedKey>
</field>
<field>
<originalKey>Resources Exploited</originalKey>
<modifiedKey>fishery_identity:Resources Exploited</modifiedKey>
</field>
<field>
<originalKey>Flag State</originalKey>
<modifiedKey>fishery_identity:Flag State</modifiedKey>
</field>
<field>
<originalKey>Fishing Gear</originalKey>
<modifiedKey>fishery_identity:Fishing Gear</modifiedKey>
</field>
<field>
<originalKey>GRSF Type</originalKey>
<modifiedKey>fishery_identity:GRSF Type</modifiedKey>
</field>
</fields>
</Body>
</Profile>
</Resource>

View File

@ -0,0 +1,118 @@
<Resource version="0.4.x">
<ID>512cca02-e178-420c-a766-b47171e154e2</ID>
<Type>GenericResource</Type>
<Scopes>
<Scope>/d4science.research-infrastructures.eu/FARM/GRSF</Scope>
</Scopes>
<Profile>
<SecondaryType>ApplicationProfile</SecondaryType>
<Name>GRSF Stock</Name>
<Description>GRSF mapping between fields and namespaces for Stock
records
</Description>
<Body>
<fields>
<field>
<originalKey>Data Owner</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Database Source</originalKey>
<modifiedKey>stock_identity:Database Source</modifiedKey>
</field>
<field>
<originalKey>Short Name</originalKey>
<modifiedKey>stock_identity:Short Name</modifiedKey>
</field>
<field>
<originalKey>Catch</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Landing</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Species</originalKey>
<modifiedKey>stock_identity:Species</modifiedKey>
</field>
<field>
<originalKey>Similar GRSF Record</originalKey>
<modifiedKey>stock_identity:Similar GRSF Record</modifiedKey>
</field>
<field>
<originalKey>Management Body/Authority</originalKey>
<modifiedKey>stock_identity:Management Body/Authority</modifiedKey>
</field>
<field>
<originalKey>Connected Record</originalKey>
<modifiedKey>stock_identity:Connected Record</modifiedKey>
</field>
<field>
<originalKey>Annotation</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>GRSF Stock Name</originalKey>
<modifiedKey>stock_identity:GRSF Stock Name</modifiedKey>
</field>
<field>
<originalKey>GRSF Semantic Identifier</originalKey>
<modifiedKey>stock_identity:GRSF Semantic Identifier</modifiedKey>
</field>
<field>
<originalKey>Assessment Area</originalKey>
<modifiedKey>stock_identity:Assessment Area</modifiedKey>
</field>
<field>
<originalKey>Exploiting Fishery</originalKey>
<modifiedKey>stock_identity:Exploiting Fishery</modifiedKey>
</field>
<field>
<originalKey>Assessment Method</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Abundance Level (FIRMS Standard)</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Abundance Level</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Biomass</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Fishing Pressure (FIRMS Standard)</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Fishing Pressure</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>State and Trend</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>FAO Stock Status Category</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Scientific Advice</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>Assessor</originalKey>
<modifiedKey>none:none</modifiedKey>
</field>
<field>
<originalKey>GRSF Type</originalKey>
<modifiedKey>stock_identity:GRSF Type</modifiedKey>
</field>
</fields>
</Body>
</Profile>
</Resource>

View File

@ -0,0 +1,115 @@
<Resource version="0.4.x">
<ID>c9cad3f8-5773-4ca7-95a5-4692db5eae2e</ID>
<Type>GenericResource</Type>
<Scopes>
<Scope>/d4science.research-infrastructures.eu/FARM</Scope>
<Scope>/d4science.research-infrastructures.eu/FARM/GRSF_Admin</Scope>
</Scopes>
<Profile>
<SecondaryType>ApplicationProfile</SecondaryType>
<Name>GRSF Stock</Name>
<Description>GRSF mapping between fields and namespaces for Stock
records</Description>
<Body>
<fields>
<field>
<originalKey>Data Owner</originalKey>
<modifiedKey>stock_data:Data Owner</modifiedKey>
</field>
<field>
<originalKey>Database Source</originalKey>
<modifiedKey>stock_identity:Database Source</modifiedKey>
</field>
<field>
<originalKey>Short Name</originalKey>
<modifiedKey>stock_identity:Short Name</modifiedKey>
</field>
<field>
<originalKey>Catch</originalKey>
<modifiedKey>stock_data:Catch</modifiedKey>
</field>
<field>
<originalKey>Landing</originalKey>
<modifiedKey>stock_data:Landing</modifiedKey>
</field>
<field>
<originalKey>Species</originalKey>
<modifiedKey>stock_identity:Species</modifiedKey>
</field>
<field>
<originalKey>Similar GRSF Record</originalKey>
<modifiedKey>stock_identity:Similar GRSF Record</modifiedKey>
</field>
<field>
<originalKey>Management Body/Authority</originalKey>
<modifiedKey>stock_identity:Management Body/Authority</modifiedKey>
</field>
<field>
<originalKey>Connected Record</originalKey>
<modifiedKey>stock_identity:Connected Record</modifiedKey>
</field>
<field>
<originalKey>GRSF Stock Name</originalKey>
<modifiedKey>stock_identity:GRSF Stock Name</modifiedKey>
</field>
<field>
<originalKey>GRSF Semantic Identifier</originalKey>
<modifiedKey>stock_identity:GRSF Semantic Identifier</modifiedKey>
</field>
<field>
<originalKey>Assessment Area</originalKey>
<modifiedKey>stock_identity:Assessment Area</modifiedKey>
</field>
<field>
<originalKey>Exploiting Fishery</originalKey>
<modifiedKey>stock_identity:Exploiting Fishery</modifiedKey>
</field>
<field>
<originalKey>Assessment Method</originalKey>
<modifiedKey>stock_data:Assessment Method</modifiedKey>
</field>
<field>
<originalKey>Abundance Level (FIRMS Standard)</originalKey>
<modifiedKey>stock_data:Abundance Level (FIRMS Standard)
</modifiedKey>
</field>
<field>
<originalKey>Abundance Level</originalKey>
<modifiedKey>stock_data:Abundance Level</modifiedKey>
</field>
<field>
<originalKey>Biomass</originalKey>
<modifiedKey>stock_data:Biomass</modifiedKey>
</field>
<field>
<originalKey>Fishing Pressure (FIRMS Standard)</originalKey>
<modifiedKey>stock_data:Fishing Pressure (FIRMS Standard)</modifiedKey>
</field>
<field>
<originalKey>Fishing Pressure</originalKey>
<modifiedKey>stock_data:Fishing Pressure</modifiedKey>
</field>
<field>
<originalKey>State and Trend</originalKey>
<modifiedKey>stock_data:State and Trend</modifiedKey>
</field>
<field>
<originalKey>FAO Stock Status Category</originalKey>
<modifiedKey>stock_data:FAO Stock Status Category</modifiedKey>
</field>
<field>
<originalKey>Scientific Advice</originalKey>
<modifiedKey>stock_data:Scientific Advice</modifiedKey>
</field>
<field>
<originalKey>Assessor</originalKey>
<modifiedKey>stock_data:Assessor</modifiedKey>
</field>
<field>
<originalKey>GRSF Type</originalKey>
<modifiedKey>stock_identity:GRSF Type</modifiedKey>
</field>
</fields>
</Body>
</Profile>
</Resource>

View File

@ -0,0 +1,40 @@
<Resource version="0.4.x">
<ID>7ee9c6e9-ff73-4428-88e4-185aeb4b3742</ID>
<Type>GenericResource</Type>
<Scopes>
<Scope>/d4science.research-infrastructures.eu/FARM/GRSF_Pre</Scope>
<Scope>/d4science.research-infrastructures.eu/FARM/GRSF_Admin</Scope>
</Scopes>
<Profile>
<SecondaryType>ApplicationProfile</SecondaryType>
<Name>GRSFManageEntries</Name>
<Description>A list of extras metadata to be looked up and prompted by the GRSF Manage widget. The body reports the key values.</Description>
<Body>
fishery_identity:GRSF Type,
fishery_identity:Short Name,
fishery_identity:Database Source,
fishery_identity:GRSF Semantic Identifier,
fishery_data:Catch,
fishery_data:Landing,
stock_identity:GRSF Type,
stock_identity:Short Name,
stock_identity:Database Source,
stock_identity:GRSF Semantic Identifier,
stock_data:Catch,
stock_data:Landing
</Body>
</Profile>
</Resource>

View File

@ -1,7 +1,7 @@
<application mode='online'>
<name>GRSFPublisher</name>
<group>Data-Catalogue</group>
<version>1.5.0</version>
<version>1.13.0</version>
<description>Data Catalogue Service</description>
<local-persistence location='target' />
<exclude>/rest/</exclude>

View File

@ -33,6 +33,12 @@
<!-- <param-value>/gcube/devsec/devVRE</param-value> -->
<param-value>/d4science.research-infrastructures.eu/FARM/GRSF</param-value>
</context-param>
<context-param>
<description>Context of pending products under manage activities for prevalidation VRE</description>
<param-name>PreValidateVRE</param-name>
<!-- <param-value>/gcube/devNext/NextNext</param-value> -->
<param-value>/d4science.research-infrastructures.eu/FARM/GRSF_Pre</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

View File

@ -13,17 +13,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.homelibrary.home.HomeLibrary;
import org.gcube.common.homelibrary.home.exceptions.InternalErrorException;
import org.gcube.common.homelibrary.home.workspace.Workspace;
import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder;
import org.gcube.common.homelibrary.home.workspace.WorkspaceItem;
import org.gcube.common.homelibrary.home.workspace.WorkspaceSharedFolder;
import org.gcube.common.homelibrary.home.workspace.catalogue.WorkspaceCatalogue;
import org.gcube.common.homelibrary.home.workspace.exceptions.InsufficientPrivilegesException;
import org.gcube.common.homelibrary.home.workspace.exceptions.ItemAlreadyExistException;
import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.data_catalogue.grsf_publish_ws.custom_annotations.CustomField;
import org.gcube.data_catalogue.grsf_publish_ws.custom_annotations.Group;
import org.gcube.data_catalogue.grsf_publish_ws.custom_annotations.Tag;
@ -238,129 +227,8 @@ public class JTests {
instance.uploadResourceFile(csvFile, datasetName, instance.getApiKeyFromUsername("costantino.perciante"), "random_name.csv", null, null, null);
}
// @Test
public void sharedVREFolderWriteTest() throws Exception{
String token = "";
String context = "/gcube/devNext/NextNext";
ScopeProvider.instance.set(context);
SecurityTokenProvider.instance.set(token);
Workspace ws = HomeLibrary.getHomeManagerFactory().getHomeManager().getHome().getWorkspace();
// Get a VRE folder by scope
WorkspaceSharedFolder vreFolder = ws.getVREFolderByScope(context);
//Get the VRE Folder catalogue
WorkspaceCatalogue catalogueFolder = vreFolder.getVRECatalogue();
logger.debug("Catalogue folder retrieved " + catalogueFolder.getName());
// WorkspaceItem stockFolder = catalogueFolder.find("stock");
// vreFolder.removeChild(stockFolder);
/**
* Test is
* .catalogue:
* -test
* - a
* -aproductwiththisname
* - csv
* - testfile.csv
*/
String allSubPath = "/test/a/aproductwiththisname/";
//WorkspaceFolder lastFolder = createGetSubFoldersByPath(catalogueFolder, allSubPath);
// WorkspaceFolder recordFolder = (WorkspaceFolder)getFolderOrCreate(catalogueFolder, "test", "");
// String firstLetter = "a";
// WorkspaceFolder firstLetterFolder = (WorkspaceFolder)getFolderOrCreate(recordFolder, firstLetter, "");
// String folderPath = "aproductwiththisname";
// WorkspaceFolder productFolder = (WorkspaceFolder)getFolderOrCreate(firstLetterFolder, folderPath, "");
//logger.debug("Test folder created/get..its path is " + lastFolder.getPath());
// String ccsvUnderProductFolderName = productFolderName + "/" + "csv";
// WorkspaceFolder csvUnderProductFolder = (WorkspaceFolder)getFolderOrCreate(catalogueFolder, ccsvUnderProductFolderName, "");
//
// logger.debug("FOLDERS created " + csvUnderProductFolder.getPath());
// treeCheck(catalogueFolder);
}
public void treeCheck(WorkspaceFolder rootFolder) throws InternalErrorException{
List<WorkspaceItem> children = rootFolder.getChildren();
for (WorkspaceItem workspaceItem : children) {
if(workspaceItem.isFolder()){
logger.debug("children folder is " + workspaceItem.getName());
treeCheck((WorkspaceFolder)workspaceItem);
}
}
}
/**
* Create subfolders in cascade, returning the last created ones
* It could be also used for getting them if they already exists
* @param folder
* @param subPath
* @return
*/
private static WorkspaceFolder createGetSubFoldersByPath(WorkspaceFolder folder, String subPath){
String pathSeparator = "/";
WorkspaceFolder parentFolder = folder;
if(folder == null)
throw new IllegalArgumentException("Root folder is null!");
if(subPath == null || subPath.isEmpty())
throw new IllegalArgumentException("subPath is null/empty!");
try{
if(subPath.startsWith(pathSeparator))
subPath = subPath.replaceFirst(pathSeparator, "");
if(subPath.endsWith(subPath))
subPath = subPath.substring(0, subPath.length() - 1);
logger.debug("Splitting path " + subPath);
String[] splittedPaths = subPath.split(pathSeparator);
for (String path : splittedPaths) {
WorkspaceFolder createdFolder = getFolderOrCreate(parentFolder, path, "");
logger.debug("Created subfolder with path " + createdFolder.getPath());
parentFolder = createdFolder;
}
}catch(Exception e){
logger.error("Failed to create the subfolders by path " + subPath);
}
return parentFolder;
}
/**
* Get a folder within the catalogue folder or create it if it doesn't exist.
* @return
*/
private static WorkspaceFolder getFolderOrCreate(WorkspaceFolder folder, String relativePath, String descriptionFolder){
WorkspaceFolder result = null;
try {
if(folder.exists(relativePath) && folder.find(relativePath).isFolder())
result = (WorkspaceFolder) folder.find(relativePath);
if(result != null)
logger.debug("Folder found with name " + result.getName() + ", it has id " + result.getId());
else
throw new Exception("There is no folder with name " + relativePath + " under foler " + folder.getName());
} catch (Exception e) {
logger.debug("Probably the folder doesn't exist", e);
try{
result = folder.createFolder(relativePath, descriptionFolder);
} catch (InsufficientPrivilegesException | InternalErrorException | ItemAlreadyExistException e2) {
logger.error("Failed to get or generate this folder", e2);
}
}
return result;
}
//@Test
public void GRSFServiceUrl() throws Exception{
@ -402,7 +270,7 @@ public class JTests {
}
//@Test
public void testCaches(){
public void testCaches() throws Exception{
String context = "/gcube/devNext/NextNext";
String token = "";

View File

@ -0,0 +1,38 @@
package org.gcube.data_catalogue.grsf_publish_ws;
import java.io.File;
import java.net.URL;
import org.gcube.data_catalogue.grsf_publish_ws.json.input.record.StockRecord;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* @author Luca Frosini (ISTI - CNR)
*/
public class TestJson {
private static final Logger logger = LoggerFactory.getLogger(Test.class);
public File getResourcesDirectory() throws Exception {
URL logbackFileURL = TestJson.class.getClassLoader().getResource("logback-test.xml");
File logbackFile = new File(logbackFileURL.toURI());
File resourcesDirectory = logbackFile.getParentFile();
return resourcesDirectory;
}
@Test
public void testJsonDeserialization() throws Exception {
File jsonQueryFile = new File(getResourcesDirectory(), "70ae6895-7d3d-4f4a-86f9-bcb17d41bff6.json");
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonQueryFile);
logger.debug("{}", jsonNode);
StockRecord sr = objectMapper.readValue(jsonQueryFile, StockRecord.class);
logger.debug("{}", sr);
}
}

View File

@ -0,0 +1,34 @@
{
"stock_name" : "European hake - Southern Adriatic",
"license_id" : "CC-BY-SA-4.0",
"version" : 1.0,
"database_sources" : [ {
"name" : "FAO SDG 14.4.1 questionnaire",
"description" : "FAO SDG 14.4.1 questionnaire",
"url" : "https://www.fao.org/sustainable-development-goals/indicators/14.4.1/en/"
} ],
"stock_uri" : "https://github.com/grsf/resource/sdg_14_4_1/stock/70ae6895-7d3d-4f4a-86f9-bcb17d41bff6",
"grsf_uuid" : "70ae6895-7d3d-4f4a-86f9-bcb17d41bff6",
"short_name" : "European hake - Southern Adriatic",
"description" : "European hake - Southern Adriatic",
"grsf_type" : "assessment unit",
"species" : [ "Code: HKE, Classification System: ASFIS, Scientific Name: Merluccius merluccius" ],
"assessment_area" : [ "Code: 18, System: gfcm, Name: Southern Adriatic " ],
"source_of_information" : [ {
"name" : "https://www.fao.org/sustainable-development-goals/indicators/14.4.1/en/sdg-alb-1",
"description" : "",
"url" : "https://www.fao.org/sustainable-development-goals/indicators/14.4.1/en/sdg-alb-1"
} ],
"data_owner" : [ "Albania" ],
"assessment_methods" : [ "The official stock assessment concludes 'Overfished' with respect to abundance reference points. [Rep. Year or Assessment ID: 2019, Ref. Year: 2018]" ],
"connections_indicator" : "not connected",
"similarities_indicator" : "without similar records",
"landings" : [ {
"value" : "872",
"unit" : "Tonnes",
"reference_year" : 2018,
"reporting_year_or_assessment_id" : "2020",
"data_owner" : "Albania"
} ],
"citation" : "citation TBD"
}

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{0}: %msg%n</pattern>
</encoder>
</appender>
<logger name="org.gcube" level="INFO" />
<logger name="org.gcube.data_catalogue.grsf_publish_ws" level="TRACE" />
<root level="WARN">
<appender-ref ref="STDOUT" />
</root>
</configuration>