Compare commits
No commits in common. "master" and "feature/23167" have entirely different histories.
master
...
feature/23
|
@ -1,4 +1,3 @@
|
||||||
target
|
target
|
||||||
.classpath
|
.classpath
|
||||||
.project
|
.project
|
||||||
/.DS_Store
|
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
encoding//src/main/java=UTF-8
|
encoding//src/main/java=UTF-8
|
||||||
encoding//src/main/resources=UTF-8
|
|
||||||
encoding//src/test/java=UTF-8
|
encoding//src/test/java=UTF-8
|
||||||
encoding//src/test/resources=UTF-8
|
|
||||||
encoding/<project>=UTF-8
|
encoding/<project>=UTF-8
|
||||||
|
|
17
CHANGELOG.md
17
CHANGELOG.md
|
@ -3,24 +3,9 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [v1.13.3]
|
## [v1.13.1-SNAPSHOT]
|
||||||
|
|
||||||
- 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]
|
- 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]
|
## [v1.13.0]
|
||||||
|
|
||||||
|
|
20
pom.xml
20
pom.xml
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
<groupId>org.gcube.data-catalogue</groupId>
|
<groupId>org.gcube.data-catalogue</groupId>
|
||||||
<artifactId>grsf-publisher-ws</artifactId>
|
<artifactId>grsf-publisher-ws</artifactId>
|
||||||
<version>1.13.3</version>
|
<version>1.13.1-SNAPSHOT</version>
|
||||||
<packaging>war</packaging>
|
<packaging>war</packaging>
|
||||||
<name>grsf-publisher-ws</name>
|
<name>grsf-publisher-ws</name>
|
||||||
<description>Utility library to publish GRSF products on GRSF catalogue.</description>
|
<description>Utility library to publish GRSF products on GRSF catalogue.</description>
|
||||||
|
@ -26,7 +26,6 @@
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<jsoup.version>1.10.1</jsoup.version>
|
<jsoup.version>1.10.1</jsoup.version>
|
||||||
<serviceClass>DataPublishing</serviceClass>
|
<serviceClass>DataPublishing</serviceClass>
|
||||||
<maven.compiler.release>8</maven.compiler.release>
|
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<scm>
|
<scm>
|
||||||
|
@ -40,7 +39,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.distribution</groupId>
|
<groupId>org.gcube.distribution</groupId>
|
||||||
<artifactId>gcube-smartgears-bom</artifactId>
|
<artifactId>gcube-smartgears-bom</artifactId>
|
||||||
<version>2.2.0</version>
|
<version>2.1.1</version>
|
||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
<scope>import</scope>
|
<scope>import</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
@ -51,17 +50,12 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.data-catalogue</groupId>
|
<groupId>org.gcube.data-catalogue</groupId>
|
||||||
<artifactId>grsf-common-library</artifactId>
|
<artifactId>grsf-common-library</artifactId>
|
||||||
<version>[2.0.0, 3.0.0-SNAPSHOT)</version>
|
<version>[1-0-0, 2.0.0-SNAPSHOT)</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.common</groupId>
|
<groupId>org.gcube.common</groupId>
|
||||||
<artifactId>storagehub-client-library</artifactId>
|
<artifactId>storagehub-client-library</artifactId>
|
||||||
</dependency>
|
</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/ -->
|
<!-- jsoup HTML parser library @ http://jsoup.org/ -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jsoup</groupId>
|
<groupId>org.jsoup</groupId>
|
||||||
|
@ -168,14 +162,6 @@
|
||||||
<artifactId>jersey-test-framework-provider-jetty</artifactId>
|
<artifactId>jersey-test-framework-provider-jetty</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</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>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -21,8 +21,8 @@ public @interface Group {
|
||||||
String condition() default "";
|
String condition() default "";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If this value is set, it is used as name of the group in place of the filed value.
|
* 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
|
||||||
* (apart the source, i.e. "grsf", "ram", "firms", "fishsource" that will be prepended depending on prependSourceToGroupName)
|
* record needs to be put.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
String groupNameOverValue() default "";
|
String groupNameOverValue() default "";
|
||||||
|
@ -32,6 +32,6 @@ public @interface Group {
|
||||||
* Set to false to avoid source prepending
|
* Set to false to avoid source prepending
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
boolean prependSourceToGroupName() default false;
|
boolean prependSourceToGroupName() default true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ public abstract class Common extends Base {
|
||||||
|
|
||||||
@JsonProperty(Constants.SDG_FLAG_JSON_KEY)
|
@JsonProperty(Constants.SDG_FLAG_JSON_KEY)
|
||||||
@CustomField(key=Constants.SDG_FLAG_CUSTOM_KEY)
|
@CustomField(key=Constants.SDG_FLAG_CUSTOM_KEY)
|
||||||
@Group(condition="true", groupNameOverValue=Constants.SDG_FLAG_GROUP_NAME, prependSourceToGroupName=false) // record is added to group grsf-sdg-flag if sdg Flag is true
|
@Group(condition="true", groupNameOverValue=Constants.SDG_FLAG_CUSTOM_KEY, prependSourceToGroupName=true) // record is added to group grsf-sdg-flag if sdg Flag is true
|
||||||
private Boolean sdgFlag;
|
private Boolean sdgFlag;
|
||||||
|
|
||||||
@JsonProperty(Constants.STATUS_OF_THE_GRSF_RECORD_JSON_KEY)
|
@JsonProperty(Constants.STATUS_OF_THE_GRSF_RECORD_JSON_KEY)
|
||||||
|
@ -177,6 +177,7 @@ public abstract class Common extends Base {
|
||||||
this.landings = landings;
|
this.landings = landings;
|
||||||
this.species = species;
|
this.species = species;
|
||||||
this.similarGRSFRecords = similarGRSFRecords;
|
this.similarGRSFRecords = similarGRSFRecords;
|
||||||
|
// this.similarSourceRecords = similarSourceRecords;
|
||||||
this.domain = domain;
|
this.domain = domain;
|
||||||
this.uuid = uuid;
|
this.uuid = uuid;
|
||||||
this.managementBodyAuthorities = managementBodyAuthorities;
|
this.managementBodyAuthorities = managementBodyAuthorities;
|
||||||
|
@ -369,6 +370,7 @@ public abstract class Common extends Base {
|
||||||
+ ", landings=" + landings
|
+ ", landings=" + landings
|
||||||
+ ", species=" + species
|
+ ", species=" + species
|
||||||
+ ", similarGRSFRecords=" + similarGRSFRecords
|
+ ", similarGRSFRecords=" + similarGRSFRecords
|
||||||
|
// + ", similarSourceRecords=" + similarSourceRecords
|
||||||
+ ", domain=" + domain
|
+ ", domain=" + domain
|
||||||
+ ", uuid=" + uuid
|
+ ", uuid=" + uuid
|
||||||
+ ", managementBodyAuthorities=" + managementBodyAuthorities
|
+ ", managementBodyAuthorities=" + managementBodyAuthorities
|
||||||
|
|
|
@ -33,7 +33,7 @@ public class FisheryRecord extends Common {
|
||||||
|
|
||||||
@JsonProperty(Constants.TRACEABILITY_FLAG_JSON_KEY)
|
@JsonProperty(Constants.TRACEABILITY_FLAG_JSON_KEY)
|
||||||
@CustomField(key=Constants.TRACEABILITY_FLAG_CUSTOM_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
|
@Group(condition="true", groupNameOverValue=Constants.TRACEABILITY_FLAG_CUSTOM_KEY, prependSourceToGroupName=true) // record is added to group grsf-traceability-flag if Traceability Flag is true
|
||||||
private Boolean traceabilityFlag;
|
private Boolean traceabilityFlag;
|
||||||
|
|
||||||
@JsonProperty(Constants.FISHING_AREA_JSON_KEY)
|
@JsonProperty(Constants.FISHING_AREA_JSON_KEY)
|
||||||
|
@ -62,6 +62,7 @@ public class FisheryRecord extends Common {
|
||||||
|
|
||||||
@JsonProperty(Constants.GRSF_TYPE_JSON_KEY)
|
@JsonProperty(Constants.GRSF_TYPE_JSON_KEY)
|
||||||
@CustomField(key=Constants.GRSF_TYPE_CUSTOM_KEY)
|
@CustomField(key=Constants.GRSF_TYPE_CUSTOM_KEY)
|
||||||
|
@Group
|
||||||
@Tag
|
@Tag
|
||||||
private Fishery_Type type;
|
private Fishery_Type type;
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,6 @@ public class StockRecord extends Common{
|
||||||
|
|
||||||
@JsonProperty(Constants.ASSESSMENT_METHODS_JSON_KEY)
|
@JsonProperty(Constants.ASSESSMENT_METHODS_JSON_KEY)
|
||||||
@CustomField(key=Constants.ASSESSMENT_METHODS_CUSTOM_KEY)
|
@CustomField(key=Constants.ASSESSMENT_METHODS_CUSTOM_KEY)
|
||||||
@Group(groupNameOverValue=Constants.ASSESSMENT_METHODS_CUSTOM_KEY, prependSourceToGroupName=false)
|
|
||||||
private List<String> assessmentMethods;
|
private List<String> assessmentMethods;
|
||||||
|
|
||||||
@JsonProperty(Constants.FIRMS_ABUNDANCE_LEVEL_JSON_KEY)
|
@JsonProperty(Constants.FIRMS_ABUNDANCE_LEVEL_JSON_KEY)
|
||||||
|
@ -110,6 +109,7 @@ public class StockRecord extends Common{
|
||||||
|
|
||||||
@JsonProperty(Constants.GRSF_TYPE_JSON_KEY)
|
@JsonProperty(Constants.GRSF_TYPE_JSON_KEY)
|
||||||
@CustomField(key=Constants.GRSF_TYPE_CUSTOM_KEY)
|
@CustomField(key=Constants.GRSF_TYPE_CUSTOM_KEY)
|
||||||
|
@Group
|
||||||
@Tag
|
@Tag
|
||||||
private Stock_Type type;
|
private Stock_Type type;
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ import eu.trentorise.opendata.jackan.model.CkanDataset;
|
||||||
* @author Costantino Perciante (ISTI - CNR)
|
* @author Costantino Perciante (ISTI - CNR)
|
||||||
* @author Luca Frosini (ISTI - CNR)
|
* @author Luca Frosini (ISTI - CNR)
|
||||||
*/
|
*/
|
||||||
@Path("{source:firms|FIRMS|grsf|GRSF|FishSource|fishsource|sdg|SDG}/fishery/")
|
@Path("{source:firms|FIRMS|grsf|GRSF|FishSource|fishsource}/fishery/")
|
||||||
public class GrsfPublisherFisheryService {
|
public class GrsfPublisherFisheryService {
|
||||||
|
|
||||||
// the context
|
// the context
|
||||||
|
@ -257,7 +257,7 @@ public class GrsfPublisherFisheryService {
|
||||||
String type = fisheryInCkan.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY);
|
String type = fisheryInCkan.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY);
|
||||||
|
|
||||||
if((fisheryInCkan.getOrganization().getName().equalsIgnoreCase(source)
|
if((fisheryInCkan.getOrganization().getName().equalsIgnoreCase(source)
|
||||||
|| fisheryInCkan.getOrganization().getName().toLowerCase().startsWith(source.toLowerCase()))
|
|| fisheryInCkan.getOrganization().getName().toLowerCase().contains(source))
|
||||||
&& Product_Type.FISHERY.getOrigName().equals(type)) {
|
&& Product_Type.FISHERY.getOrigName().equals(type)) {
|
||||||
|
|
||||||
logger.debug("Ok, this is a fishery of the right source, removing it");
|
logger.debug("Ok, this is a fishery of the right source, removing it");
|
||||||
|
@ -551,7 +551,7 @@ public class GrsfPublisherFisheryService {
|
||||||
|
|
||||||
// check system type
|
// check system type
|
||||||
boolean isGRSF = !record.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY)
|
boolean isGRSF = !record.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY)
|
||||||
.equals(Constants.SYSTEM_TYPE_LEGACY_RECORD);
|
.equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE);
|
||||||
|
|
||||||
if(!isGRSF)
|
if(!isGRSF)
|
||||||
throw new Exception("You are trying to modify a Legacy record!");
|
throw new Exception("You are trying to modify a Legacy record!");
|
||||||
|
|
|
@ -51,7 +51,7 @@ import eu.trentorise.opendata.jackan.model.CkanDataset;
|
||||||
* @author Costantino Perciante (ISTI - CNR)
|
* @author Costantino Perciante (ISTI - CNR)
|
||||||
* @author Luca Frosini (ISTI - CNR)
|
* @author Luca Frosini (ISTI - CNR)
|
||||||
*/
|
*/
|
||||||
@Path("{source:firms|FIRMS|ram|RAM|grsf|GRSF|FishSource|fishsource|sdg|SDG}/stock/")
|
@Path("{source:firms|FIRMS|ram|RAM|grsf|GRSF|FishSource|fishsource}/stock/")
|
||||||
public class GrsfPublisherStockService {
|
public class GrsfPublisherStockService {
|
||||||
|
|
||||||
// the context
|
// the context
|
||||||
|
@ -260,7 +260,7 @@ public class GrsfPublisherStockService {
|
||||||
// check it is in the right source and it is a stock
|
// check it is in the right source and it is a stock
|
||||||
String type = stockInCkan.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY);
|
String type = stockInCkan.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY);
|
||||||
if((stockInCkan.getOrganization().getName().equalsIgnoreCase(source)
|
if((stockInCkan.getOrganization().getName().equalsIgnoreCase(source)
|
||||||
|| stockInCkan.getOrganization().getName().toLowerCase().startsWith(source.toLowerCase()))
|
|| stockInCkan.getOrganization().getName().toLowerCase().contains(source))
|
||||||
&& Product_Type.STOCK.getOrigName().equals(type)) {
|
&& Product_Type.STOCK.getOrigName().equals(type)) {
|
||||||
|
|
||||||
logger.debug("Ok, this is a stock of the right type, removing it");
|
logger.debug("Ok, this is a stock of the right type, removing it");
|
||||||
|
@ -554,7 +554,7 @@ public class GrsfPublisherStockService {
|
||||||
|
|
||||||
// check system type
|
// check system type
|
||||||
boolean isGRSF = !record.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY)
|
boolean isGRSF = !record.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY)
|
||||||
.equals(Constants.SYSTEM_TYPE_LEGACY_RECORD);
|
.equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE);
|
||||||
|
|
||||||
if(!isGRSF)
|
if(!isGRSF)
|
||||||
throw new Exception("You are trying to modify a Legacy record!");
|
throw new Exception("You are trying to modify a Legacy record!");
|
||||||
|
|
|
@ -4,6 +4,7 @@ import java.beans.PropertyDescriptor;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -35,6 +36,7 @@ import org.gcube.datacatalogue.common.Constants;
|
||||||
import org.gcube.datacatalogue.common.enums.Product_Type;
|
import org.gcube.datacatalogue.common.enums.Product_Type;
|
||||||
import org.gcube.datacatalogue.common.enums.Sources;
|
import org.gcube.datacatalogue.common.enums.Sources;
|
||||||
import org.gcube.datacatalogue.common.enums.Status;
|
import org.gcube.datacatalogue.common.enums.Status;
|
||||||
|
import org.gcube.datacatalogue.common.enums.Stock_Type;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -217,90 +219,6 @@ 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
|
* Retrieve the list of groups' names for this object
|
||||||
*/
|
*/
|
||||||
|
@ -308,22 +226,74 @@ public class CommonServiceUtils {
|
||||||
Sources source) {
|
Sources source) {
|
||||||
if(field.isAnnotationPresent(Group.class)) {
|
if(field.isAnnotationPresent(Group.class)) {
|
||||||
Group group = field.getAnnotation(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 {
|
try {
|
||||||
Object f = new PropertyDescriptor(field.getName(), current).getReadMethod().invoke(record);
|
Object f = new PropertyDescriptor(field.getName(), current).getReadMethod().invoke(record);
|
||||||
if(f != null) {
|
if(f != null) {
|
||||||
if(f instanceof List<?>) {
|
if(f instanceof List<?>) {
|
||||||
List asList = ((List) f);
|
List asList = ((List) f);
|
||||||
if(!asList.isEmpty()) {
|
if(!asList.isEmpty()) {
|
||||||
|
|
||||||
logger.debug("The object annotated with @Group is a list. Adding ... ");
|
logger.debug("The object annotated with @Group is a list. Adding ... ");
|
||||||
// add all the available elements
|
|
||||||
|
// else add all the available elements
|
||||||
for(int i = 0; i < asList.size(); i++) {
|
for(int i = 0; i < asList.size(); i++) {
|
||||||
String value = asList.get(i).toString().trim();
|
boolean match = conditionToCheck.isEmpty() ? true
|
||||||
addGroup(group, source, value, groups);
|
: 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 {
|
}else {
|
||||||
String value = f.toString().trim();
|
groups.add(groupName);
|
||||||
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,6 +301,7 @@ public class CommonServiceUtils {
|
||||||
logger.error("Failed to read value for field " + field.getName() + " skipping", e);
|
logger.error("Failed to read value for field " + field.getName() + " skipping", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -542,13 +513,13 @@ public class CommonServiceUtils {
|
||||||
if(databaseSources!=null) {
|
if(databaseSources!=null) {
|
||||||
for(Resource<Sources> source : databaseSources) {
|
for(Resource<Sources> source : databaseSources) {
|
||||||
Sources sourceName = source.getName();
|
Sources sourceName = source.getName();
|
||||||
sourcesList.add(sourceName.getURLPath());
|
sourcesList.add(sourceName.getOrigName().toLowerCase());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addRecordToGroups(groups, sourcesList, productType, sourceInPath);
|
// append to groups: we need to add this record to the correspondent group of the sources
|
||||||
|
addRecordToGroupSources(groups, new ArrayList(sourcesList), productType, sourceInPath);
|
||||||
|
|
||||||
// validate
|
// validate
|
||||||
CommonServiceUtils.validateAggregatedRecord(record, sourceInPath);
|
CommonServiceUtils.validateAggregatedRecord(record, sourceInPath);
|
||||||
|
@ -561,41 +532,57 @@ public class CommonServiceUtils {
|
||||||
sourceInPath.equals(Sources.GRSF)
|
sourceInPath.equals(Sources.GRSF)
|
||||||
? productType.equals(Product_Type.FISHERY) ? ((FisheryRecord) record).getType().getOrigName()
|
? productType.equals(Product_Type.FISHERY) ? ((FisheryRecord) record).getType().getOrigName()
|
||||||
: ((StockRecord) record).getType().getOrigName()
|
: ((StockRecord) record).getType().getOrigName()
|
||||||
: Constants.SYSTEM_TYPE_LEGACY_RECORD);
|
: Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE);
|
||||||
|
|
||||||
logger.debug("Domain is " + productType.getOrigName() + " and system type " + record.getSystemType());
|
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
|
||||||
* 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
|
||||||
* boolean skipTags = !sourceInPath.equals(Sources.GRSF); // no tags for the Original records
|
CommonServiceUtils.getTagsGroupsResourcesExtrasByRecord(tags, skipTags, groups, false, resources, false,
|
||||||
*/
|
|
||||||
CommonServiceUtils.getTagsGroupsResourcesExtrasByRecord(tags, false, groups, false, resources, false,
|
|
||||||
customFields, record, username, sourceInPath);
|
customFields, record, username, sourceInPath);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// /**
|
/**
|
||||||
// * Fetch the system:type property from a record
|
* Add the record to the group of sources
|
||||||
// * @param itemIdOrName
|
* @param groups
|
||||||
// * @param apiKey
|
* @param sourcesList
|
||||||
// * @return null on error
|
* @param productType
|
||||||
// * @throws Exception
|
* @param sourceInPath
|
||||||
// */
|
*/
|
||||||
// public static String getSystemTypeValue(String itemIdOrName, String apiKey, String context) throws Exception {
|
private static void addRecordToGroupSources(Set<String> groups, List<String> sourcesList, Product_Type productType,
|
||||||
// DataCatalogue catalog = HelperMethods.getDataCatalogueRunningInstance(context);
|
Sources sourceInPath) {
|
||||||
// CkanDataset dataset = catalog.getDataset(itemIdOrName, apiKey);
|
|
||||||
// if(dataset == null) {
|
Collections.sort(sourcesList); // be sure the name are sorted because the groups have been generated this way
|
||||||
// throw new Exception("Unable to find record with id or name " + itemIdOrName);
|
String groupName = sourceInPath.getOrigName().toLowerCase() + "-" + productType.getOrigName().toLowerCase();
|
||||||
// }
|
for(String source : sourcesList) {
|
||||||
// String systemTypeValue = dataset.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY);
|
groupName += "-" + source;
|
||||||
// if(systemTypeValue == null || systemTypeValue.isEmpty()) {
|
}
|
||||||
// throw new Exception(Constants.SYSTEM_TYPE_CUSTOM_KEY + " property not set in record " + itemIdOrName);
|
|
||||||
// }else {
|
groups.add(groupName);
|
||||||
// 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 {
|
public static String getRecordOrganization(String itemIdOrName, String apiKey, String context) throws Exception {
|
||||||
DataCatalogue catalog = HelperMethods.getDataCatalogueRunningInstance(context);
|
DataCatalogue catalog = HelperMethods.getDataCatalogueRunningInstance(context);
|
||||||
|
@ -718,6 +705,6 @@ public class CommonServiceUtils {
|
||||||
return Constants.GRSF_PRE_ORGANIZATION_NAME;
|
return Constants.GRSF_PRE_ORGANIZATION_NAME;
|
||||||
}
|
}
|
||||||
}else
|
}else
|
||||||
return sourceInPath.getURLPath();
|
return sourceInPath.getOrigName().toLowerCase();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -31,7 +31,6 @@ import org.gcube.datacatalogue.common.caches.CacheInterface;
|
||||||
import org.gcube.resources.discovery.client.api.DiscoveryClient;
|
import org.gcube.resources.discovery.client.api.DiscoveryClient;
|
||||||
import org.gcube.resources.discovery.client.queries.api.Query;
|
import org.gcube.resources.discovery.client.queries.api.Query;
|
||||||
import org.gcube.resources.discovery.client.queries.impl.QueryBox;
|
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.Jsoup;
|
||||||
import org.jsoup.safety.Whitelist;
|
import org.jsoup.safety.Whitelist;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -81,6 +80,29 @@ 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, 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);
|
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.replaceAll("\\(", "");
|
||||||
|
modified = origName.replaceAll("\\)", "");
|
||||||
|
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
|
* Retrieve the running instance of the data catalogue for this scope
|
||||||
* @return
|
* @return
|
||||||
|
@ -135,18 +157,21 @@ public abstract class HelperMethods {
|
||||||
* @return
|
* @return
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public static String getUserEmail(String context, String token) throws Exception{
|
public static String getUserEmail(String context, String token){
|
||||||
|
|
||||||
// check in cache
|
// check in cache
|
||||||
String email = null;
|
String result = null;
|
||||||
if((email = (String) userEmailCache.get(token)) != null){
|
if((result = (String) userEmailCache.get(token)) != null){
|
||||||
return email;
|
return result;
|
||||||
}else{
|
}else{
|
||||||
UserClient userClient = new UserClient();
|
String baseUrl = new GcoreEndPointReaderSocial(context).getBasePath();
|
||||||
email = userClient.getEmail();
|
String url = baseUrl.endsWith("/") ? baseUrl + "users/getUserEmail?gcube-token=" + token :
|
||||||
userEmailCache.insert(token, email);
|
baseUrl + "/users/getUserEmail?gcube-token=" + token;
|
||||||
|
logger.debug("Request url is " + url);
|
||||||
|
result = executGETHttpRequest(url, 200);
|
||||||
|
userEmailCache.insert(token, result);
|
||||||
}
|
}
|
||||||
return email;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -156,18 +181,21 @@ public abstract class HelperMethods {
|
||||||
* @return
|
* @return
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public static String getUserFullname(String context, String token) throws Exception{
|
public static String getUserFullname(String context, String token){
|
||||||
|
|
||||||
// check in cache
|
// check in cache
|
||||||
String fullName = null;
|
String result = null;
|
||||||
if((fullName = (String) userFullnameCache.get(token)) != null){
|
if((result = (String) userFullnameCache.get(token)) != null){
|
||||||
return fullName;
|
return result;
|
||||||
}else{
|
}else{
|
||||||
UserClient userClient = new UserClient();
|
String baseUrl = new GcoreEndPointReaderSocial(context).getBasePath();
|
||||||
fullName = userClient.getFullName();
|
String url = baseUrl.endsWith("/") ? baseUrl + "users/getUserFullname?gcube-token=" + token :
|
||||||
userFullnameCache.insert(token, fullName);
|
baseUrl + "/users/getUserFullname?gcube-token=" + token;
|
||||||
|
logger.debug("Request url is " + url);
|
||||||
|
result = executGETHttpRequest(url, 200);
|
||||||
|
userFullnameCache.insert(token, result);
|
||||||
}
|
}
|
||||||
return fullName;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -70,7 +70,7 @@
|
||||||
</field>
|
</field>
|
||||||
<field>
|
<field>
|
||||||
<originalKey>Assessment Method</originalKey>
|
<originalKey>Assessment Method</originalKey>
|
||||||
<modifiedKey>none:none</modifiedKey>
|
<modifiedKey>stock_data:Assessment Method</modifiedKey>
|
||||||
</field>
|
</field>
|
||||||
<field>
|
<field>
|
||||||
<originalKey>Abundance Level (FIRMS Standard)</originalKey>
|
<originalKey>Abundance Level (FIRMS Standard)</originalKey>
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
<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>
|
|
|
@ -270,7 +270,7 @@ public class JTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
//@Test
|
//@Test
|
||||||
public void testCaches() throws Exception{
|
public void testCaches(){
|
||||||
|
|
||||||
String context = "/gcube/devNext/NextNext";
|
String context = "/gcube/devNext/NextNext";
|
||||||
String token = "";
|
String token = "";
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
{
|
|
||||||
"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"
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
<?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>
|
|
Reference in New Issue