task_23406 (!1)

Resolved conflicting with `grsf-common-library` on the constant renamed to SYSTEM_TYPE_LEGACY_RECORD

Co-authored-by: francesco.mangiacrapa <francesco.mangiacrapa@isti.cnr.it>
Reviewed-on: #1
This commit is contained in:
Francesco Mangiacrapa 2022-05-26 10:51:59 +02:00
parent 478a4c157e
commit 1a3a3d6b14
7 changed files with 356 additions and 295 deletions

View File

@ -11,13 +11,6 @@
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"> <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes> <attributes>
<attribute name="test" value="true"/> <attribute name="test" value="true"/>
@ -34,5 +27,12 @@
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/> <classpathentry kind="output" path="target/classes"/>
</classpath> </classpath>

View File

@ -1,13 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0"> <?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="grsf-manage-widget"> <wb-module deploy-name="grsf-manage-widget">
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/> <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="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/> <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/> <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/test/java"/>
<dependent-module archiveName="grsf-common-library-1.0.1-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/grsf-common-library/grsf-common-library"> <dependent-module archiveName="grsf-common-library-1.0.1-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/grsf-common-library/grsf-common-library">
<dependency-type>uses</dependency-type> <dependency-type>uses</dependency-type>
</dependent-module> </dependent-module>
<property name="context-root" value="grsf-manage-widget"/> <property name="context-root" value="grsf-manage-widget"/>
<property name="java-output-path" value="/grsf-manage-widget/target/grsf-manage-widget-1.0.0-SNAPSHOT/WEB-INF/classes"/> <property name="java-output-path" value="/grsf-manage-widget/target/grsf-manage-widget-1.0.0-SNAPSHOT/WEB-INF/classes"/>
</wb-module> </wb-module>
</project-modules> </project-modules>

View File

@ -0,0 +1,7 @@
<root>
<facet id="jst.jaxrs">
<node name="libprov">
<attribute name="provider-id" value="jaxrs-no-op-library-provider"/>
</node>
</facet>
</root>

View File

@ -4,4 +4,5 @@
<installed facet="jst.web" version="2.3"/> <installed facet="jst.web" version="2.3"/>
<installed facet="wst.jsdt.web" version="1.0"/> <installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="java" version="1.7"/> <installed facet="java" version="1.7"/>
<installed facet="jst.jaxrs" version="2.0"/>
</faceted-project> </faceted-project>

View File

@ -4,6 +4,16 @@
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.6.0-SNAPSHOT] - 2022-05-25
#### Bug fixes
- [#23408] GRSF Manage widget is buggy
#### Enhancements
- [#23407] Social Post: replace the BR tags with new lines
## [v1.5.0] - 2021-04-12 ## [v1.5.0] - 2021-04-12
[#21153] Upgrade the maven-portal-bom to 3.6.1 version [#21153] Upgrade the maven-portal-bom to 3.6.1 version

View File

@ -13,7 +13,7 @@
<groupId>org.gcube.portlets.widgets</groupId> <groupId>org.gcube.portlets.widgets</groupId>
<artifactId>grsf-manage-widget</artifactId> <artifactId>grsf-manage-widget</artifactId>
<version>1.5.0</version> <version>1.6.0-SNAPSHOT</version>
<name>gCube GRSF Manage widget</name> <name>gCube GRSF Manage widget</name>
<scm> <scm>

View File

@ -44,29 +44,34 @@ import com.liferay.portal.kernel.log.LogFactoryUtil;
/** /**
* Endpoint for sending update records information to GRSF KnowledgeBase. * Endpoint for sending update records information to GRSF KnowledgeBase.
*
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
*/ */
public class GRSFNotificationService extends RemoteServiceServlet implements GRSFManageWidgetService{ public class GRSFNotificationService extends RemoteServiceServlet implements GRSFManageWidgetService {
private static final long serialVersionUID = -4534905087994875893L; private static final long serialVersionUID = -4534905087994875893L;
private static final Log logger = LogFactoryUtil.getLog(GRSFNotificationService.class); private static final Log logger = LogFactoryUtil.getLog(GRSFNotificationService.class);
//private static final Logger logger = LoggerFactory.getLogger(GRSFNotificationService.class); // private static final Logger logger =
// LoggerFactory.getLogger(GRSFNotificationService.class);
/** /**
* Instanciate the ckan util library. * Instanciate the ckan util library. Since it needs the scope, we need to check
* Since it needs the scope, we need to check if it is null or not * if it is null or not
* @param discoverScope if you want to the discover the utils library in this specified scope *
* @param discoverScope if you want to the discover the utils library in this
* specified scope
* @return DataCatalogue object * @return DataCatalogue object
* @throws Exception * @throws Exception
*/ */
public DataCatalogue getCatalogue(String discoverScope) throws Exception{ public DataCatalogue getCatalogue(String discoverScope) throws Exception {
String currentScope = Utils.getCurrentContext(getThreadLocalRequest(), true); String currentScope = Utils.getCurrentContext(getThreadLocalRequest(), true);
DataCatalogue instance = null; DataCatalogue instance = null;
try{ try {
String scopeInWhichDiscover = discoverScope != null && !discoverScope.isEmpty() ? discoverScope : currentScope; String scopeInWhichDiscover = discoverScope != null && !discoverScope.isEmpty() ? discoverScope
: currentScope;
logger.debug("Discovering ckan utils library into scope " + scopeInWhichDiscover); logger.debug("Discovering ckan utils library into scope " + scopeInWhichDiscover);
instance = DataCatalogueFactory.getFactory().getUtilsPerScope(scopeInWhichDiscover); instance = DataCatalogueFactory.getFactory().getUtilsPerScope(scopeInWhichDiscover);
}catch(Exception e){ } catch (Exception e) {
logger.error("Unable to retrieve ckan utils. Error was ", e); logger.error("Unable to retrieve ckan utils. Error was ", e);
throw e; throw e;
} }
@ -74,127 +79,128 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
} }
@Override @Override
public ManageProductBean getProductBeanById(String productIdentifier, boolean requestForRevertingMerge) throws Exception { public ManageProductBean getProductBeanById(String productIdentifier, boolean requestForRevertingMerge)
throws Exception {
ManageProductBean toReturn = null; ManageProductBean toReturn = null;
// check into user's session first // check into user's session first
HttpSession httpSession = getThreadLocalRequest().getSession(); HttpSession httpSession = getThreadLocalRequest().getSession();
// testing case... // // testing case...
if(!Utils.isIntoPortal()){ // if(!Utils.isIntoPortal()){
//
Thread.sleep(2000); // Thread.sleep(2000);
//
toReturn = new ManageProductBean(); // toReturn = new ManageProductBean();
toReturn.setCatalogueIdentifier(UUID.randomUUID().toString()); // toReturn.setCatalogueIdentifier(UUID.randomUUID().toString());
List<ConnectedBean> connectTo = new ArrayList<>(); // List<ConnectedBean> connectTo = new ArrayList<>();
// these are the records alread connected // // these are the records alread connected
connectTo.add(new ConnectedBean( // connectTo.add(new ConnectedBean(
"uuid-of-a-connected-bean", // "uuid-of-a-connected-bean",
"Random description", // "Random description",
"Random shortName", // "Random shortName",
"Random Title", // "Random Title",
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-of-a-connected-bean", // "http://data.d4science.org/ctlg/GRSF_Admin/uuid-of-a-connected-bean",
"semantic identifier of the record", // "semantic identifier of the record",
"Fishery" // "Fishery"
)); // ));
toReturn.setCurrentConnections(connectTo); // toReturn.setCurrentConnections(connectTo);
//
// these are the "suggested connections" // // these are the "suggested connections"
List<ConnectedBean> suggestionsForConnections = new ArrayList<>(); // List<ConnectedBean> suggestionsForConnections = new ArrayList<>();
suggestionsForConnections.add(new ConnectedBean( // suggestionsForConnections.add(new ConnectedBean(
"uuid-of-a-connected-bean-suggested", // "uuid-of-a-connected-bean-suggested",
"Random description", // "Random description",
"Random shortName", // "Random shortName",
"Random Title", // "Random Title",
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-of-a-connected-bean-suggested", // "http://data.d4science.org/ctlg/GRSF_Admin/uuid-of-a-connected-bean-suggested",
"semantic identifier of the record suggested for connection", // "semantic identifier of the record suggested for connection",
"Fishery" // "Fishery"
)); // ));
toReturn.setSuggestedByKnowledgeBaseConnections(suggestionsForConnections); // toReturn.setSuggestedByKnowledgeBaseConnections(suggestionsForConnections);
toReturn.setDomain("Stock"); // toReturn.setDomain("Stock");
toReturn.setCurrentGrsfType("Assessment Unit"); // toReturn.setCurrentGrsfType("Assessment Unit");
toReturn.setKnowledgeBaseId("91f1e413-dc9f-3b4e-b1c5-0e8560177253"); // toReturn.setKnowledgeBaseId("91f1e413-dc9f-3b4e-b1c5-0e8560177253");
toReturn.setShortName("Widow rockfish - US West Coast"); // toReturn.setShortName("Widow rockfish - US West Coast");
toReturn.setShortNameUpdated("Widow rockfish - US West Coast"); // toReturn.setShortNameUpdated("Widow rockfish - US West Coast");
toReturn.setTitle("sebastes entomelas FAO 77 FAO 67"); // toReturn.setTitle("sebastes entomelas FAO 77 FAO 67");
toReturn.setTraceabilityFlag(true); // toReturn.setTraceabilityFlag(true);
toReturn.setCurrentStatus(Status.Pending); // toReturn.setCurrentStatus(Status.Pending);
toReturn.setSemanticIdentifier("asfis:WRO+fao:67;FAO"); // toReturn.setSemanticIdentifier("asfis:WRO+fao:67;FAO");
ArrayList<SourceRecord> sources = new ArrayList<SourceRecord>(); // ArrayList<SourceRecord> sources = new ArrayList<SourceRecord>();
sources.add(new SourceRecord("RAM", "http://www.google.it")); // sources.add(new SourceRecord("RAM", "http://www.google.it"));
sources.add(new SourceRecord("FIRMS", "http://www.google.it")); // sources.add(new SourceRecord("FIRMS", "http://www.google.it"));
sources.add(new SourceRecord("FishSource", "http://www.google.it")); // sources.add(new SourceRecord("FishSource", "http://www.google.it"));
toReturn.setSources(sources); // toReturn.setSources(sources);
List<SimilarGRSFRecord> similarGrsfRecords = new ArrayList<SimilarGRSFRecord>(); // List<SimilarGRSFRecord> similarGrsfRecords = new ArrayList<SimilarGRSFRecord>();
similarGrsfRecords.add(new SimilarGRSFRecord( // similarGrsfRecords.add(new SimilarGRSFRecord(
"uuid-similar-record-1", // "uuid-similar-record-1",
"description similar record", // "description similar record",
"short name similar record 1", // "short name similar record 1",
"title similar record 1", // "title similar record 1",
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-1", // "http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-1",
"semantic identifier record 1", // "semantic identifier record 1",
"Stock 1" // "Stock 1"
)); // ));
similarGrsfRecords.add(new SimilarGRSFRecord( // similarGrsfRecords.add(new SimilarGRSFRecord(
"uuid-similar-record-2", // "uuid-similar-record-2",
"description similar record", // "description similar record",
"short name similar record 2", // "short name similar record 2",
"title similar record 2", // "title similar record 2",
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-2", // "http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-2",
"semantic identifier record 2", // "semantic identifier record 2",
"Stock 2" // "Stock 2"
)); // ));
similarGrsfRecords.add(new SimilarGRSFRecord( // similarGrsfRecords.add(new SimilarGRSFRecord(
"uuid-similar-record-3", // "uuid-similar-record-3",
"description similar record", // "description similar record",
"short name similar record 3", // "short name similar record 3",
"title similar record 3", // "title similar record 3",
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-3", // "http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-3",
"semantic identifier record 3", // "semantic identifier record 3",
"Stock 3" // "Stock 3"
)); // ));
similarGrsfRecords.add(new SimilarGRSFRecord( // similarGrsfRecords.add(new SimilarGRSFRecord(
"uuid-similar-record-4", // "uuid-similar-record-4",
"description similar record", // "description similar record",
"short name similar record 4", // "short name similar record 4",
"title similar record 4", // "title similar record 4",
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-4", // "http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-4",
"semantic identifier record 4", // "semantic identifier record 4",
"Stock 4" // "Stock 4"
)); // ));
similarGrsfRecords.add(new SimilarGRSFRecord( // similarGrsfRecords.add(new SimilarGRSFRecord(
"uuid-similar-record-5", // "uuid-similar-record-5",
"description similar record", // "description similar record",
"short name similar record 5", // "short name similar record 5",
"title similar record 5", // "title similar record 5",
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-5", // "http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-5",
"semantic identifier record 5", // "semantic identifier record 5",
"Stock 5" // "Stock 5"
)); // ));
similarGrsfRecords.add(new SimilarGRSFRecord( // similarGrsfRecords.add(new SimilarGRSFRecord(
"uuid-similar-record-6", // "uuid-similar-record-6",
"description similar record", // "description similar record",
"short name similar record 6", // "short name similar record 6",
"title similar record 6", // "title similar record 6",
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-6", // "http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-6",
"semantic identifier record 6", // "semantic identifier record 6",
"Stock 6" // "Stock 6"
)); // ));
toReturn.setSimilarGrsfRecords(similarGrsfRecords); // toReturn.setSimilarGrsfRecords(similarGrsfRecords);
//
}else{ // }else{
String scopePerCurrentUrl = Utils.getScopeFromClientUrl(getThreadLocalRequest()); String scopePerCurrentUrl = Utils.getScopeFromClientUrl(getThreadLocalRequest());
DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl); DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl);
String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername(); String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername();
CkanDataset record = catalogue.getDataset(productIdentifier,username); CkanDataset record = catalogue.getDataset(productIdentifier, username);
// it cannot be enabled in this case ... // it cannot be enabled in this case ...
if(record == null) if (record == null)
throw new Exception("Unable to retrieve information for the selected record, sorry"); throw new Exception("Unable to retrieve information for the selected record, sorry");
else{ else {
logger.debug("Trying to fetch the record...."); logger.debug("Trying to fetch the record....");
@ -202,25 +208,29 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
Map<String, String> extrasAsMap = record.getExtrasAsHashMap(); Map<String, String> extrasAsMap = record.getExtrasAsHashMap();
String systemType = extrasAsMap.get(Constants.SYSTEM_TYPE_CUSTOM_KEY); String systemType = extrasAsMap.get(Constants.SYSTEM_TYPE_CUSTOM_KEY);
if(systemType == null || systemType.isEmpty() || systemType.equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE)) if (systemType == null || systemType.isEmpty() || systemType.equals(Constants.SYSTEM_TYPE_LEGACY_RECORD))
throw new NoGRSFRecordException("This is not a GRSF Record"); throw new NoGRSFRecordException("This is not a GRSF Record");
boolean isStock = record.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY).contains(Product_Type.STOCK.getOrigName()); boolean isStock = record.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY)
.contains(Product_Type.STOCK.getOrigName());
// fetch map for namespaces // fetch map for namespaces
Map<String, String> fieldsNamespacesMap = Map<String, String> fieldsNamespacesMap = Utils.getFieldToFieldNameSpaceMapping(httpSession,
Utils.getFieldToFieldNameSpaceMapping(httpSession, isStock ? isStock ? Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_STOCK
Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_STOCK : Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_FISHERY); : Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_FISHERY);
// get extras as pairs // get extras as pairs
List<CkanPair> extrasAsPairs = record.getExtras(); List<CkanPair> extrasAsPairs = record.getExtras();
Map<String, List<String>> extrasWithoutNamespaces = Utils.replaceFieldsKey(extrasAsPairs, fieldsNamespacesMap); Map<String, List<String>> extrasWithoutNamespaces = Utils.replaceFieldsKey(extrasAsPairs,
fieldsNamespacesMap);
String catalogueIdentifier = record.getId(); String catalogueIdentifier = record.getId();
String description = record.getNotes(); String description = record.getNotes();
Status status = Status.fromString(extrasWithoutNamespaces.get(Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY).get(0)); Status status = Status
.fromString(extrasWithoutNamespaces.get(Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY).get(0));
if(status.equals(Status.To_be_Merged) && !requestForRevertingMerge) if (status.equals(Status.To_be_Merged) && !requestForRevertingMerge)
throw new GRSFRecordAlreadyManagedStatusException(Status.To_be_Merged, "The record is locked due to a merge request in progress!"); throw new GRSFRecordAlreadyManagedStatusException(Status.To_be_Merged,
"The record is locked due to a merge request in progress!");
String uuidKB = extrasWithoutNamespaces.get(Constants.UUID_KB_CUSTOM_KEY).get(0); String uuidKB = extrasWithoutNamespaces.get(Constants.UUID_KB_CUSTOM_KEY).get(0);
String grsfDomain = extrasWithoutNamespaces.get(Constants.DOMAIN_CUSTOM_KEY).get(0); String grsfDomain = extrasWithoutNamespaces.get(Constants.DOMAIN_CUSTOM_KEY).get(0);
@ -228,29 +238,38 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
String shortName = extrasWithoutNamespaces.get(Constants.SHORT_NAME_CUSTOM_KEY).get(0); String shortName = extrasWithoutNamespaces.get(Constants.SHORT_NAME_CUSTOM_KEY).get(0);
String grsfType = extrasWithoutNamespaces.get(Constants.GRSF_TYPE_CUSTOM_KEY).get(0); String grsfType = extrasWithoutNamespaces.get(Constants.GRSF_TYPE_CUSTOM_KEY).get(0);
String recordUrl = extrasWithoutNamespaces.get(Constants.ITEM_URL_FIELD).get(0); String recordUrl = extrasWithoutNamespaces.get(Constants.ITEM_URL_FIELD).get(0);
String grsfName = extrasWithoutNamespaces.get(grsfDomain.contains(Product_Type.STOCK.getOrigName()) ? Constants.STOCK_NAME_CUSTOM_KEY : Constants.FISHERY_NAME_CUSTOM_KEY).get(0); String grsfName = extrasWithoutNamespaces
.get(grsfDomain.contains(Product_Type.STOCK.getOrigName()) ? Constants.STOCK_NAME_CUSTOM_KEY
: Constants.FISHERY_NAME_CUSTOM_KEY)
.get(0);
boolean traceabilityFlag = false; boolean traceabilityFlag = false;
try{ try {
traceabilityFlag = extrasWithoutNamespaces.get(Constants.TRACEABILITY_FLAG_CUSTOM_KEY).get(0).equalsIgnoreCase("true"); traceabilityFlag = extrasWithoutNamespaces.get(Constants.TRACEABILITY_FLAG_CUSTOM_KEY).get(0)
}catch(Exception e){ .equalsIgnoreCase("true");
} catch (Exception e) {
logger.warn("Unable to fetch traceability flag. Setting it to false", e); logger.warn("Unable to fetch traceability flag. Setting it to false", e);
} }
boolean sdgFlag = false; boolean sdgFlag = false;
try{ try {
sdgFlag = extrasWithoutNamespaces.get(Constants.SDG_FLAG_CUSTOM_KEY).get(0).equalsIgnoreCase("true"); sdgFlag = extrasWithoutNamespaces.get(Constants.SDG_FLAG_CUSTOM_KEY).get(0).equalsIgnoreCase("true");
}catch(Exception e){ } catch (Exception e) {
logger.warn("Unable to fetch sdg flag. Setting it to false", e); logger.warn("Unable to fetch sdg flag. Setting it to false", e);
} }
// Get similar GRSF records, if any (each of which should have name, description, url and id(i.e semantic identifier)) // Get similar GRSF records, if any (each of which should have name,
List<String> similarGrsfRecordsAsStrings = extrasWithoutNamespaces.containsKey(Constants.SIMILAR_GRSF_RECORDS_CUSTOM_KEY) ? extrasWithoutNamespaces.get(Constants.SIMILAR_GRSF_RECORDS_CUSTOM_KEY): null; // description, url and id(i.e semantic identifier))
List<String> similarGrsfRecordsAsStrings = extrasWithoutNamespaces
.containsKey(Constants.SIMILAR_GRSF_RECORDS_CUSTOM_KEY)
? extrasWithoutNamespaces.get(Constants.SIMILAR_GRSF_RECORDS_CUSTOM_KEY)
: null;
List<SimilarGRSFRecord> similarRecords = new ArrayList<SimilarGRSFRecord>(0); List<SimilarGRSFRecord> similarRecords = new ArrayList<SimilarGRSFRecord>(0);
if(similarGrsfRecordsAsStrings != null && !similarGrsfRecordsAsStrings.isEmpty()){ if (similarGrsfRecordsAsStrings != null && !similarGrsfRecordsAsStrings.isEmpty()) {
if(!similarGrsfRecordsAsStrings.get(0).equals(Constants.NO_SIMILAR_GRSF_RECORDS)){ if (!similarGrsfRecordsAsStrings.get(0).equals(Constants.NO_SIMILAR_GRSF_RECORDS)) {
for (String similarGRSFRecord : similarGrsfRecordsAsStrings) { for (String similarGRSFRecord : similarGrsfRecordsAsStrings) {
similarRecords.add(Utils.similarGRSFRecordFromJson(similarGRSFRecord, catalogue, username, httpSession)); similarRecords.add(
Utils.similarGRSFRecordFromJson(similarGRSFRecord, catalogue, username, httpSession));
} }
} }
} }
@ -258,15 +277,17 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
logger.debug("SimilarGRSFRecords are " + similarRecords); logger.debug("SimilarGRSFRecords are " + similarRecords);
// get connected records (and the proposed ones) // get connected records (and the proposed ones)
List<String> connectedBeanUrls = List<String> connectedBeanUrls = extrasWithoutNamespaces.containsKey(Constants.CONNECTED_CUSTOM_KEY)
extrasWithoutNamespaces.containsKey(Constants.CONNECTED_CUSTOM_KEY) ? extrasWithoutNamespaces.get(Constants.CONNECTED_CUSTOM_KEY): null; ? extrasWithoutNamespaces.get(Constants.CONNECTED_CUSTOM_KEY)
: null;
List<ConnectedBean> connectedBeans = new ArrayList<ConnectedBean>(0); List<ConnectedBean> connectedBeans = new ArrayList<ConnectedBean>(0);
if(connectedBeanUrls != null && !connectedBeanUrls.isEmpty()){ if (connectedBeanUrls != null && !connectedBeanUrls.isEmpty()) {
if(!connectedBeanUrls.get(0).equals(Constants.NO_CONNECTED_RECORDS)){ if (!connectedBeanUrls.get(0).equals(Constants.NO_CONNECTED_RECORDS)) {
for (String connectedBean : connectedBeanUrls) { for (String connectedBean : connectedBeanUrls) {
ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(connectedBean, catalogue, username, httpSession); ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(connectedBean, catalogue, username,
if(builtBean != null) httpSession);
if (builtBean != null)
connectedBeans.add(builtBean); connectedBeans.add(builtBean);
} }
} }
@ -276,16 +297,19 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
// get the connections the knowledge base suggests // get the connections the knowledge base suggests
List<ConnectedBean> suggestedConnectionsByKnowledgeBase = new ArrayList<ConnectedBean>(0); List<ConnectedBean> suggestedConnectionsByKnowledgeBase = new ArrayList<ConnectedBean>(0);
List<String> exploitedResourcesUrls = isStock ? List<String> exploitedResourcesUrls = isStock
extrasWithoutNamespaces.containsKey(Constants.EXPLOITING_FISHERY_CUSTOM_KEY) ? ? extrasWithoutNamespaces.containsKey(Constants.EXPLOITING_FISHERY_CUSTOM_KEY)
extrasWithoutNamespaces.get(Constants.EXPLOITING_FISHERY_CUSTOM_KEY) : null: ? extrasWithoutNamespaces.get(Constants.EXPLOITING_FISHERY_CUSTOM_KEY)
extrasWithoutNamespaces.containsKey(Constants.RESOURCES_EXPLOITED_CUSTOM_KEY) ? : null
extrasWithoutNamespaces.get(Constants.RESOURCES_EXPLOITED_CUSTOM_KEY) : null; : extrasWithoutNamespaces.containsKey(Constants.RESOURCES_EXPLOITED_CUSTOM_KEY)
? extrasWithoutNamespaces.get(Constants.RESOURCES_EXPLOITED_CUSTOM_KEY)
: null;
if(exploitedResourcesUrls != null && !exploitedResourcesUrls.isEmpty()){ if (exploitedResourcesUrls != null && !exploitedResourcesUrls.isEmpty()) {
for (String exploited : exploitedResourcesUrls) { for (String exploited : exploitedResourcesUrls) {
ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(exploited, catalogue, username, httpSession); ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(exploited, catalogue, username,
if(builtBean != null) httpSession);
if (builtBean != null)
suggestedConnectionsByKnowledgeBase.add(builtBean); suggestedConnectionsByKnowledgeBase.add(builtBean);
} }
} }
@ -296,19 +320,17 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
List<CkanResource> resources = record.getResources(); List<CkanResource> resources = record.getResources();
List<SourceRecord> sources = new ArrayList<SourceRecord>(3); List<SourceRecord> sources = new ArrayList<SourceRecord>(3);
for (CkanResource ckanResource : resources) { for (CkanResource ckanResource : resources) {
if(Sources.getListNames().contains(ckanResource.getName())) if (Sources.getListNames().contains(ckanResource.getName()))
sources.add(new SourceRecord(ckanResource.getName(), ckanResource.getUrl())); sources.add(new SourceRecord(ckanResource.getName(), ckanResource.getUrl()));
} }
// set the values // set the values
toReturn = new ManageProductBean( toReturn = new ManageProductBean(semanticId, catalogueIdentifier, uuidKB, grsfType, grsfDomain, shortName,
semanticId, catalogueIdentifier, uuidKB, grsfType, description, grsfName, traceabilityFlag, sdgFlag, status, recordUrl, sources, similarRecords,
grsfDomain, shortName, description, grsfName,traceabilityFlag, sdgFlag,
status, recordUrl, sources, similarRecords,
connectedBeans, suggestedConnectionsByKnowledgeBase); connectedBeans, suggestedConnectionsByKnowledgeBase);
} }
} // }
logger.debug("Returning item bean " + toReturn); logger.debug("Returning item bean " + toReturn);
return toReturn; return toReturn;
@ -316,16 +338,17 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
@Override @Override
public boolean isAdminUser() { public boolean isAdminUser() {
try{ try {
Boolean inSession = (Boolean)getThreadLocalRequest().getSession().getAttribute(Constants.GRSF_ADMIN_SESSION_KEY); Boolean inSession = (Boolean) getThreadLocalRequest().getSession()
if(inSession != null) .getAttribute(Constants.GRSF_ADMIN_SESSION_KEY);
if (inSession != null)
return inSession; return inSession;
else{ else {
boolean toSetInSession = false; boolean toSetInSession = false;
if(!Utils.isIntoPortal()){ if (!Utils.isIntoPortal()) {
toSetInSession = true; toSetInSession = true;
}else{ } else {
PortalContext pContext = PortalContext.getConfiguration(); PortalContext pContext = PortalContext.getConfiguration();
RoleManager roleManager = new LiferayRoleManager(); RoleManager roleManager = new LiferayRoleManager();
String username = pContext.getCurrentUser(getThreadLocalRequest()).getUsername(); String username = pContext.getCurrentUser(getThreadLocalRequest()).getUsername();
@ -337,21 +360,22 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
getThreadLocalRequest().getSession().setAttribute(Constants.GRSF_ADMIN_SESSION_KEY, toSetInSession); getThreadLocalRequest().getSession().setAttribute(Constants.GRSF_ADMIN_SESSION_KEY, toSetInSession);
return toSetInSession; return toSetInSession;
} }
}catch(Exception e){ } catch (Exception e) {
logger.error("Failed to check if the user belongs to team " + Constants.GRSF_CATALOGUE_EDITOR_ROLE + " or " + Constants.GRSF_CATALOGUE_REVIEWER_ROLE +"!", e); logger.error("Failed to check if the user belongs to team " + Constants.GRSF_CATALOGUE_EDITOR_ROLE + " or "
+ Constants.GRSF_CATALOGUE_REVIEWER_ROLE + "!", e);
} }
return false; return false;
} }
@Override @Override
public void notifyProductUpdate(ManageProductBean bean) throws Exception{ public void notifyProductUpdate(ManageProductBean bean) throws Exception {
logger.info("Creating notification for the bean " + bean + " to send to the knowledge base"); logger.info("Creating notification for the bean " + bean + " to send to the knowledge base");
if(!Utils.isIntoPortal()){ if (!Utils.isIntoPortal()) {
Thread.sleep(2500); Thread.sleep(2500);
return; return;
} }
try{ try {
String context = Utils.getScopeFromClientUrl(getThreadLocalRequest()); String context = Utils.getScopeFromClientUrl(getThreadLocalRequest());
String token = SecurityTokenProvider.instance.get(); String token = SecurityTokenProvider.instance.get();
@ -360,10 +384,11 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername(); String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername();
// check if the base url of the service is in session // check if the base url of the service is in session
String keyPerContext = CatalogueUtilMethods.concatenateSessionKeyScope(Constants.GRSF_UPDATER_SERVICE, context); String keyPerContext = CatalogueUtilMethods.concatenateSessionKeyScope(Constants.GRSF_UPDATER_SERVICE,
context);
HttpServletRequest threadRequest = getThreadLocalRequest(); HttpServletRequest threadRequest = getThreadLocalRequest();
String baseUrl = (String)threadRequest.getSession().getAttribute(keyPerContext); String baseUrl = (String) threadRequest.getSession().getAttribute(keyPerContext);
if(baseUrl == null || baseUrl.isEmpty()){ if (baseUrl == null || baseUrl.isEmpty()) {
baseUrl = GRSFUpdaterServiceClient.discoverEndPoint(context); baseUrl = GRSFUpdaterServiceClient.discoverEndPoint(context);
threadRequest.getSession().setAttribute(keyPerContext, baseUrl); threadRequest.getSession().setAttribute(keyPerContext, baseUrl);
} }
@ -375,7 +400,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
Utils.updateRecord(baseUrl, bean, catalogue, username, administratorFullName, threadRequest, Utils.updateRecord(baseUrl, bean, catalogue, username, administratorFullName, threadRequest,
PortalContext.getConfiguration().getCurrentGroupId(threadRequest), context, token); PortalContext.getConfiguration().getCurrentGroupId(threadRequest), context, token);
}catch(Exception e){ } catch (Exception e) {
logger.error("Unable to update the product", e); logger.error("Unable to update the product", e);
throw e; throw e;
} }
@ -384,13 +409,13 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
@Override @Override
public RevertableOperationInfo validateRevertOperation(String encryptedUrl) throws Exception { public RevertableOperationInfo validateRevertOperation(String encryptedUrl) throws Exception {
if(!Utils.isIntoPortal()){ if (!Utils.isIntoPortal()) {
Thread.sleep(2000); Thread.sleep(2000);
// random result // random result
boolean throwException = Math.random() > 0.5; boolean throwException = Math.random() > 0.5;
if(throwException) if (throwException)
throw new Exception("Unable to parse the inserted url"); throw new Exception("Unable to parse the inserted url");
String baseUrl = "url of the record here"; String baseUrl = "url of the record here";
@ -399,9 +424,9 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
String uuid = UUID.randomUUID().toString(); String uuid = UUID.randomUUID().toString();
String adminInUrl = "costantino.perciante"; String adminInUrl = "costantino.perciante";
String adminInUrlFullName = "Costantino Perciante"; String adminInUrlFullName = "Costantino Perciante";
long timestamp = System.currentTimeMillis() - 1000 * (long)(Math.random() * 10 * 60 * 60); long timestamp = System.currentTimeMillis() - 1000 * (long) (Math.random() * 10 * 60 * 60);
return new RevertableOperationInfo( return new RevertableOperationInfo(baseUrl, fullName, usernameCurrent, uuid, adminInUrlFullName, adminInUrl,
baseUrl, fullName, usernameCurrent, uuid, adminInUrlFullName, adminInUrl, timestamp, RevertableOperations.MERGE); timestamp, RevertableOperations.MERGE);
} }
PortalContext pContext = PortalContext.getConfiguration(); PortalContext pContext = PortalContext.getConfiguration();
@ -417,21 +442,25 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
boolean isEditor = isEditor(username, teamRolesByUser); boolean isEditor = isEditor(username, teamRolesByUser);
boolean isReviewer = isReviewer(username, teamRolesByUser); boolean isReviewer = isReviewer(username, teamRolesByUser);
if(!(isEditor | isReviewer)) if (!(isEditor | isReviewer))
throw new Exception("You are not allowed to perform this operation. You must be an editor or a reviewer!"); throw new Exception("You are not allowed to perform this operation. You must be an editor or a reviewer!");
// decrypt the url // decrypt the url
RevertOperationUrl decryptedUrl = new RevertOperationUrl(encryptedUrl); RevertOperationUrl decryptedUrl = new RevertOperationUrl(encryptedUrl);
String userNameadminInUrl = decryptedUrl.getAdmin(); // this is the username String userNameadminInUrl = decryptedUrl.getAdmin(); // this is the username
String fullNameadminInUrl = new LiferayUserManager().getUserByUsername(userNameadminInUrl).getFullname(); // this is the fullname String fullNameadminInUrl = new LiferayUserManager().getUserByUsername(userNameadminInUrl).getFullname(); // this
// is
// the
// fullname
String uuid = decryptedUrl.getUuid(); String uuid = decryptedUrl.getUuid();
logger.info("User " + username + " has requested to invert an operation on record with id " + uuid + " and admin in url is " + userNameadminInUrl); logger.info("User " + username + " has requested to invert an operation on record with id " + uuid
+ " and admin in url is " + userNameadminInUrl);
// we need to check the timestamp (it has 24h validity) // we need to check the timestamp (it has 24h validity)
boolean isValidTimestamp = decryptedUrl.isTimestampValid(); boolean isValidTimestamp = decryptedUrl.isTimestampValid();
if(!isValidTimestamp) if (!isValidTimestamp)
throw new Exception("This operation can no longer be reverted (link expired)!"); throw new Exception("This operation can no longer be reverted (link expired)!");
DataCatalogue catalogue = getCatalogue(context); DataCatalogue catalogue = getCatalogue(context);
@ -441,36 +470,36 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
String currentStatus = extras.get(Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY); String currentStatus = extras.get(Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY);
// check current record status // check current record status
if(!currentStatus.equals(Status.To_be_Merged.getOrigName())) if (!currentStatus.equals(Status.To_be_Merged.getOrigName()))
throw new Exception("Record '" + dataset.getTitle() + "' (" + recordUrl + ") is no longer involved in a merge operation!"); throw new Exception("Record '" + dataset.getTitle() + "' (" + recordUrl
+ ") is no longer involved in a merge operation!");
// check if it is a reviewer, than he can do what he wants (no matter the admin) // check if it is a reviewer, than he can do what he wants (no matter the admin)
if(isReviewer){ if (isReviewer) {
return new RevertableOperationInfo(recordUrl, return new RevertableOperationInfo(recordUrl, fullName, username, uuid, fullNameadminInUrl,
fullName, username, uuid, fullNameadminInUrl, userNameadminInUrl, decryptedUrl.getTimestamp(), decryptedUrl.getOperation()); userNameadminInUrl, decryptedUrl.getTimestamp(), decryptedUrl.getOperation());
}else{ } else {
if(!username.equals(userNameadminInUrl)) if (!username.equals(userNameadminInUrl))
throw new Exception("You are not the editor allowed to perform this operation!"); throw new Exception("You are not the editor allowed to perform this operation!");
else else
return new RevertableOperationInfo(recordUrl, return new RevertableOperationInfo(recordUrl, fullName, username, uuid, fullNameadminInUrl,
fullName, username, uuid, fullNameadminInUrl, userNameadminInUrl, decryptedUrl.getTimestamp(), decryptedUrl.getOperation()); userNameadminInUrl, decryptedUrl.getTimestamp(), decryptedUrl.getOperation());
} }
} }
@Override @Override
public Boolean performRevertOperation(RevertableOperationInfo rInfo) public Boolean performRevertOperation(RevertableOperationInfo rInfo) throws Exception {
throws Exception {
if(!Utils.isIntoPortal()){ if (!Utils.isIntoPortal()) {
// random result // random result
boolean toReturn = Math.random() > 0.5; boolean toReturn = Math.random() > 0.5;
if(toReturn){ if (toReturn) {
boolean throwException = Math.random() > 0.5; boolean throwException = Math.random() > 0.5;
if(throwException) if (throwException)
throw new Exception("Unable to execute request for XYZ"); throw new Exception("Unable to execute request for XYZ");
} }
@ -481,23 +510,23 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
String context = Utils.getScopeFromClientUrl(threadRequest); String context = Utils.getScopeFromClientUrl(threadRequest);
String token = SecurityTokenProvider.instance.get(); String token = SecurityTokenProvider.instance.get();
try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();){ try (CloseableHttpClient httpClient = HttpClientBuilder.create().build();) {
String keyPerContext = CatalogueUtilMethods.concatenateSessionKeyScope(Constants.GRSF_UPDATER_SERVICE, context); String keyPerContext = CatalogueUtilMethods.concatenateSessionKeyScope(Constants.GRSF_UPDATER_SERVICE,
String baseUrl = (String)getThreadLocalRequest().getSession().getAttribute(keyPerContext); context);
if(baseUrl == null || baseUrl.isEmpty()){ String baseUrl = (String) getThreadLocalRequest().getSession().getAttribute(keyPerContext);
if (baseUrl == null || baseUrl.isEmpty()) {
baseUrl = GRSFUpdaterServiceClient.discoverEndPoint(context); baseUrl = GRSFUpdaterServiceClient.discoverEndPoint(context);
getThreadLocalRequest().getSession().setAttribute(keyPerContext, baseUrl); getThreadLocalRequest().getSession().setAttribute(keyPerContext, baseUrl);
} }
if(baseUrl == null || baseUrl.isEmpty()) if (baseUrl == null || baseUrl.isEmpty())
throw new Exception("Unable to discover grsf-updater service!"); throw new Exception("Unable to discover grsf-updater service!");
Utils.revertOperation(httpClient, baseUrl, threadRequest, rInfo, token, context, Utils.revertOperation(httpClient, baseUrl, threadRequest, rInfo, token, context,
PortalContext.getConfiguration().getCurrentGroupId(threadRequest)); PortalContext.getConfiguration().getCurrentGroupId(threadRequest));
} } catch (Exception e) {
catch(Exception e){
logger.error("Unable to revert operation ", e); logger.error("Unable to revert operation ", e);
throw e; throw e;
} }
@ -506,14 +535,15 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
/** /**
* Check if the current user is an editor * Check if the current user is an editor
*
* @param username * @param username
* @param teamRoles * @param teamRoles
* @return true if he/she is an editor, false otherwise * @return true if he/she is an editor, false otherwise
*/ */
private boolean isEditor(String username, List<GCubeTeam> teamRolesByUser){ private boolean isEditor(String username, List<GCubeTeam> teamRolesByUser) {
for (GCubeTeam team : teamRolesByUser) { for (GCubeTeam team : teamRolesByUser) {
if(team.getTeamName().equals(Constants.GRSF_CATALOGUE_EDITOR_ROLE)){ if (team.getTeamName().equals(Constants.GRSF_CATALOGUE_EDITOR_ROLE)) {
logger.info("User " + username + " is allowed to modify GRSF records as editor"); logger.info("User " + username + " is allowed to modify GRSF records as editor");
return true; return true;
} }
@ -523,14 +553,15 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
/** /**
* Check if the current user is a reviewer * Check if the current user is a reviewer
*
* @param username * @param username
* @param teamRoles * @param teamRoles
* @return true if he/she is an reviewer, false otherwise * @return true if he/she is an reviewer, false otherwise
*/ */
private boolean isReviewer(String username, List<GCubeTeam> teamRolesByUser){ private boolean isReviewer(String username, List<GCubeTeam> teamRolesByUser) {
for (GCubeTeam team : teamRolesByUser) { for (GCubeTeam team : teamRolesByUser) {
if(team.getTeamName().equals(Constants.GRSF_CATALOGUE_REVIEWER_ROLE)){ if (team.getTeamName().equals(Constants.GRSF_CATALOGUE_REVIEWER_ROLE)) {
logger.info("User " + username + " is allowed to modify GRSF records as reviewer"); logger.info("User " + username + " is allowed to modify GRSF records as reviewer");
return true; return true;
} }
@ -539,32 +570,30 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
} }
@Override @Override
public String checkIdentifierExists(String id) public String checkIdentifierExists(String id) throws Exception {
throws Exception {
String scopePerCurrentUrl = Utils.getScopeFromClientUrl(getThreadLocalRequest()); String scopePerCurrentUrl = Utils.getScopeFromClientUrl(getThreadLocalRequest());
DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl); DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl);
String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername(); String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername();
CkanDataset dataset = catalogue.getDataset(id,username); CkanDataset dataset = catalogue.getDataset(id, username);
if(dataset == null) if (dataset == null)
throw new Exception("A GRSF record with id " + id + " doesn't exist"); throw new Exception("A GRSF record with id " + id + " doesn't exist");
if(!dataset.getOrganization().getName().equals(Constants.GRSF_ADMIN_ORGANIZATION_NAME)) if (!dataset.getOrganization().getName().equals(Constants.GRSF_ADMIN_ORGANIZATION_NAME))
throw new Exception("The suggested record is not a GRSF record"); throw new Exception("The suggested record is not a GRSF record");
return dataset.getExtrasAsHashMap().get(Constants.ITEM_URL_FIELD); return dataset.getExtrasAsHashMap().get(Constants.ITEM_URL_FIELD);
} }
@Override @Override
public String checkIdentifierExistsInDomain(String id, public String checkIdentifierExistsInDomain(String id, String acceptedDomain) throws Exception {
String acceptedDomain) throws Exception {
if(!Utils.isIntoPortal()){ if (!Utils.isIntoPortal()) {
boolean throwException = Math.random() > 0.5; boolean throwException = Math.random() > 0.5;
// simulate some delay... // simulate some delay...
Thread.sleep(2500); Thread.sleep(2500);
if(throwException) if (throwException)
throw new Exception("The suggested record is not a GRSF record"); throw new Exception("The suggested record is not a GRSF record");
return "http://data.d4science.org/catalogue/grsf_admin/" + id; return "http://data.d4science.org/catalogue/grsf_admin/" + id;
@ -575,7 +604,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername(); String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername();
CkanDataset dataset = catalogue.getDataset(id, username); CkanDataset dataset = catalogue.getDataset(id, username);
if(dataset == null) if (dataset == null)
throw new Exception("A record with id " + id + " doesn't exist"); throw new Exception("A record with id " + id + " doesn't exist");
Map<String, String> extras = dataset.getExtrasAsHashMap(); Map<String, String> extras = dataset.getExtrasAsHashMap();
@ -583,11 +612,12 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
String domain = extras.get(Constants.DOMAIN_CUSTOM_KEY); String domain = extras.get(Constants.DOMAIN_CUSTOM_KEY);
String url = extras.get(Constants.ITEM_URL_FIELD); String url = extras.get(Constants.ITEM_URL_FIELD);
if(systemType.equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE)) if (systemType.equals(Constants.SYSTEM_TYPE_LEGACY_RECORD))
throw new Exception("This record is not a GRSF record!"); throw new Exception("This record is not a GRSF record!");
if(!acceptedDomain.equalsIgnoreCase(domain)) if (!acceptedDomain.equalsIgnoreCase(domain))
throw new Exception("You are suggesting a " + domain + " record instead of a " + acceptedDomain + " record!"); throw new Exception(
"You are suggesting a " + domain + " record instead of a " + acceptedDomain + " record!");
return url; return url;
} }