diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 38e18cb..0556e5b 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -4,6 +4,12 @@ + + uses + + + uses + diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/ManageProductWidget.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/ManageProductWidget.java index 3e5f5d5..8633ac6 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/ManageProductWidget.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/ManageProductWidget.java @@ -381,7 +381,7 @@ public class ManageProductWidget extends Composite{ cancelButton.setEnabled(true); confirmButton.setEnabled(true); loaderIcon.setVisible(false); - showInfo(STATUS_UPDATE_ERROR, AlertType.ERROR); + showInfo(STATUS_UPDATE_ERROR + ": " + caught.getMessage(), AlertType.ERROR); } }); diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/ConnectToWidget.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/ConnectToWidget.java index e67b2e7..df8f2f8 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/ConnectToWidget.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/ConnectToWidget.java @@ -9,11 +9,13 @@ import org.gcube.datacatalogue.grsf_manage_widget.shared.ConnectedBean; import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean; import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.CheckBox; import com.github.gwtbootstrap.client.ui.Paragraph; import com.github.gwtbootstrap.client.ui.TextBox; import com.github.gwtbootstrap.client.ui.constants.IconType; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Float; +import com.google.gwt.dom.client.Style.FontWeight; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; @@ -23,6 +25,7 @@ import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.event.dom.client.KeyPressHandler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; @@ -46,9 +49,23 @@ public class ConnectToWidget extends Composite{ //private GRSFManageWidgetServiceAsync service; private List connectList = new ArrayList(0); + private List connectedRecords = null; + public ConnectToWidget(final ManageProductBean bean/*, GRSFManageWidgetServiceAsync service*/) { initWidget(uiBinder.createAndBindUi(this)); + // get already connected beans, if any + connectedRecords = bean.getConnectTo(); + + if(connectedRecords != null){ + connectPanel.add(new HTML("
")); + for (ConnectedBean connected : connectedRecords) { + Widget widget = buildWidgetForConnectedRecords(connected); + connectPanel.add(widget); + connectPanel.add(new HTML("
")); + } + + } //this.service = service; String acceptedDomain = bean.getGrsfDomain().equalsIgnoreCase(Product_Type.STOCK.getOrigName()) ? Product_Type.FISHERY.getOrigName() : Product_Type.STOCK.getOrigName(); // inverted suggestRecord.setTitle("Connect this " + bean.getGrsfDomain() + " record to a " + acceptedDomain + " record "); @@ -62,6 +79,7 @@ public class ConnectToWidget extends Composite{ public void onClick(ClickEvent arg0) { ConnectedBean cb = new ConnectedBean(); + cb.setExtra(true); cb.setSourceDomain(bean.getGrsfDomain()); Tuple t = buildWidgetConnect(cb); connectList.add(t); @@ -72,6 +90,57 @@ public class ConnectToWidget extends Composite{ } + /** + * + * @param similarGRSFRecord + * @return + */ + public static Widget buildWidgetForConnectedRecords(final ConnectedBean connected){ + + HorizontalPanel hp = new HorizontalPanel(); + hp.setWidth("95%"); + VerticalPanel leftPanel = new VerticalPanel(); + leftPanel.setWidth("80%"); + leftPanel.getElement().getStyle().setMarginLeft(20, Unit.PX); + Paragraph name = new Paragraph("Record name: " + (connected.getDestShortName() != null? connected.getDestShortName() : "Unavailable")); + leftPanel.add(name); + Paragraph semanticIdentifier = new Paragraph("Semantic Identifier: " + + connected.getDestSemanticIdentifier()); + leftPanel.add(semanticIdentifier); + Paragraph identifier = new Paragraph("Record UUID: " + + connected.getDestKnowledgeBaseId()); + leftPanel.add(identifier); + + Anchor view = new Anchor(); + view.setHref(connected.getUrl()); + view.setText("View"); + view.setTitle("Click to view the similar record"); + view.setTarget("_blank"); + view.getElement().getStyle().setFontWeight(FontWeight.BOLD); + leftPanel.add(view); + + VerticalPanel rightPanel = new VerticalPanel(); + rightPanel.setWidth("20%"); + + final CheckBox removeExtra = new CheckBox("Remove"); + removeExtra.setTitle("Remove this record among the similar ones"); + removeExtra.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent arg0) { + connected.setToBeKept(!removeExtra.getValue()); + } + }); + + rightPanel.getElement().getStyle().setFloat(Float.RIGHT); + rightPanel.add(removeExtra); + hp.add(leftPanel); + hp.add(rightPanel); + hp.getElement().getStyle().setPadding(10, Unit.PX); + hp.getElement().getStyle().setMarginBottom(10, Unit.PX); + return hp; + } + /** * Builds up a widget for connecting records. * @param w the widget @@ -80,14 +149,14 @@ public class ConnectToWidget extends Composite{ private Tuple buildWidgetConnect(final ConnectedBean cb){ VerticalPanel main = new VerticalPanel(); - main.setWidth("90%"); + main.setWidth("95%"); HorizontalPanel hp = new HorizontalPanel(); hp.setWidth("100%"); VerticalPanel vpLeft = new VerticalPanel(); vpLeft.getElement().getStyle().setMarginLeft(15, Unit.PX); vpLeft.setWidth("80%"); - Paragraph semanticIdentifier = new Paragraph("Record Identifier (UUID):"); + Paragraph semanticIdentifier = new Paragraph("Identifier (UUID):"); final TextBox box = new TextBox(); box.setId("identifier-text"); box.addKeyPressHandler(new KeyPressHandler() { @@ -97,7 +166,7 @@ public class ConnectToWidget extends Composite{ String currentText = box.getText().trim(); GWT.log("Text changed to " + currentText); - cb.setDestIdentifier(currentText); + cb.setDestKnowledgeBaseId(currentText); } }); @@ -108,7 +177,7 @@ public class ConnectToWidget extends Composite{ String currentText = box.getText().trim(); GWT.log("Text changed to " + currentText); - cb.setDestIdentifier(currentText); + cb.setDestKnowledgeBaseId(currentText); } }); @@ -158,17 +227,18 @@ public class ConnectToWidget extends Composite{ */ public List getConnectList() { - List toReturn = new ArrayList(0); + if(connectedRecords == null) + connectedRecords = new ArrayList(0); for (Tuple p : connectList) { - String suggestedIdentifier = ((ConnectedBean)p.getO()).getDestIdentifier(); + String suggestedIdentifier = ((ConnectedBean)p.getO()).getDestKnowledgeBaseId(); if(suggestedIdentifier == null || suggestedIdentifier.isEmpty()) continue; else - toReturn.add((ConnectedBean) p.getO()); + connectedRecords.add((ConnectedBean) p.getO()); } - return toReturn; + return connectedRecords; } } diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SimilarGRSFRecordWidget.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SimilarGRSFRecordWidget.java index ab9a561..e0240fb 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SimilarGRSFRecordWidget.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SimilarGRSFRecordWidget.java @@ -59,22 +59,27 @@ public class SimilarGRSFRecordWidget extends Composite { */ public SimilarGRSFRecordWidget(List availableGRSFSimilarRecords/*, GRSFManageWidgetServiceAsync service*/) { initWidget(uiBinder.createAndBindUi(this)); + //this.service = service; this.availableGRSFSimilarRecords = availableGRSFSimilarRecords; - addSimilarRecord.getElement().getStyle().setFloat(Float.RIGHT); - // add the existing ones, if any - for (final SimilarGRSFRecord similarGRSFRecord : availableGRSFSimilarRecords) { - Widget widget = buildWidgetForSimilarRecord(similarGRSFRecord); - similarGrsfRecordsPanel.add(widget); - HTML separator = new HTML("
"); - similarGrsfRecordsPanel.add(separator); + if(availableGRSFSimilarRecords != null){ + + similarGrsfRecordsPanel.add(new HTML("
")); + + // add the existing ones, if any + for (final SimilarGRSFRecord similarGRSFRecord : availableGRSFSimilarRecords) { + Widget widget = buildWidgetForSimilarRecord(similarGRSFRecord); + similarGrsfRecordsPanel.add(widget); + similarGrsfRecordsPanel.add(new HTML("
")); + } + } - // manage the "suggest button" addSimilarRecord.setIcon(IconType.PLUS_SIGN); addSimilarRecord.getElement().getStyle().setFloat(Float.RIGHT); addSimilarRecord.setTitle("Suggest a Similar Record by using its Identifier (UUID)"); + addSimilarRecord.getElement().getStyle().setFloat(Float.RIGHT); // add handler addSimilarRecord.addClickHandler(new ClickHandler() { @@ -101,10 +106,10 @@ public class SimilarGRSFRecordWidget extends Composite { public static Widget buildWidgetForSimilarRecord(final SimilarGRSFRecord similarGRSFRecord){ HorizontalPanel hp = new HorizontalPanel(); - hp.setWidth("90%"); + hp.setWidth("95%"); VerticalPanel leftPanel = new VerticalPanel(); leftPanel.setWidth("80%"); - leftPanel.getElement().getStyle().setMarginLeft(15, Unit.PX); + leftPanel.getElement().getStyle().setMarginLeft(20, Unit.PX); Paragraph name = new Paragraph("Record name: " + (similarGRSFRecord.getShortName() != null? similarGRSFRecord.getShortName() : "Unavailable")); leftPanel.add(name); if(similarGRSFRecord.getDescription() != null){ @@ -117,23 +122,24 @@ public class SimilarGRSFRecordWidget extends Composite { leftPanel.add(description); } Paragraph identifier = new Paragraph("Record UUID: " + - similarGRSFRecord.getIdentifier()); + similarGRSFRecord.getKnowledgeBaseId()); leftPanel.add(identifier); - VerticalPanel rightPanel = new VerticalPanel(); - rightPanel.setWidth("20%"); Anchor view = new Anchor(); view.setHref(similarGRSFRecord.getUrl()); view.setText("View"); view.setTitle("Click to view the similar record"); view.setTarget("_blank"); view.getElement().getStyle().setFontWeight(FontWeight.BOLD); - rightPanel.add(view); + leftPanel.add(view); + + VerticalPanel rightPanel = new VerticalPanel(); + rightPanel.setWidth("20%"); // add merge checkbox final CheckBox mergeSuggested = new CheckBox("Merge"); mergeSuggested.setTitle("Suggest to merge the current record with this similar record"); - mergeSuggested.getElement().getStyle().setPaddingTop(3, Unit.PC); + //mergeSuggested.getElement().getStyle().setPaddingTop(3, Unit.PC); mergeSuggested.setValue(false); mergeSuggested.addClickHandler(new ClickHandler() { @@ -153,7 +159,7 @@ public class SimilarGRSFRecordWidget extends Composite { @Override public void onClick(ClickEvent arg0) { - similarGRSFRecord.setTobeKept(!removeExtra.getValue()); + similarGRSFRecord.setToBeKept(!removeExtra.getValue()); } }); @@ -176,7 +182,7 @@ public class SimilarGRSFRecordWidget extends Composite { private Widget buildWidgetForExtraSimilarRecord(final SimilarGRSFRecord s){ VerticalPanel main = new VerticalPanel(); - main.setWidth("90%"); + main.setWidth("95%"); HorizontalPanel hp = new HorizontalPanel(); hp.setWidth("100%"); @@ -192,7 +198,7 @@ public class SimilarGRSFRecordWidget extends Composite { String currentText = box.getText().trim(); GWT.log("Text changed to " + currentText); - s.setIdentifier(currentText); + s.setKnowledgeBaseId(currentText); } }); @@ -203,7 +209,7 @@ public class SimilarGRSFRecordWidget extends Composite { String currentText = box.getText().trim(); GWT.log("Text changed to " + currentText); - s.setIdentifier(currentText); + s.setKnowledgeBaseId(currentText); } }); @@ -274,7 +280,7 @@ public class SimilarGRSFRecordWidget extends Composite { for (Tuple p : extraSimilarRecordsList) { SimilarGRSFRecord similarRecord = ((SimilarGRSFRecord)p.getO()); - if(similarRecord.isExtra() && similarRecord.getIdentifier() == null || similarRecord.getIdentifier().isEmpty()) + if(similarRecord.isExtra() && similarRecord.getKnowledgeBaseId() == null || similarRecord.getKnowledgeBaseId().isEmpty()) continue; availableGRSFSimilarRecords.add((SimilarGRSFRecord) p.getO()); } diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SourceWidget.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SourceWidget.java index eefda32..92da735 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SourceWidget.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SourceWidget.java @@ -11,6 +11,7 @@ import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; @@ -29,8 +30,9 @@ public class SourceWidget extends Composite { initWidget(uiBinder.createAndBindUi(this)); sourcesInnerPanel.getElement().getStyle().setMarginLeft(15, Unit.PX); + for (SourceRecord sourceRecord : availableSources) { - + VerticalPanel subPanel = new VerticalPanel(); subPanel.setWidth("90%"); String name = sourceRecord.getName(); @@ -41,10 +43,11 @@ public class SourceWidget extends Composite { url.setText(name); url.setTitle("Click to view the source record"); url.setTarget("_blank"); + subPanel.getElement().getStyle().setMarginTop(10, Unit.PX); subPanel.add(url); subPanel.getElement().getStyle().setMarginBottom(15, Unit.PX); sourcesInnerPanel.add(subPanel); - + } } diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFNotificationService.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFNotificationService.java index fe6fa8c..006551d 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFNotificationService.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFNotificationService.java @@ -69,13 +69,14 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS ManageProductBean toReturn = null; - + if(!Utils.isIntoPortal()){ toReturn = new ManageProductBean(); toReturn.setCatalogueIdentifier(UUID.randomUUID().toString()); List connectTo = new ArrayList<>(); - connectTo.add(new ConnectedBean("asfis:WRO+fao:67;FAO", "Stock", "aksldsam asd", "asdasjnk:fas", UUID.randomUUID().toString())); + connectTo.add(new ConnectedBean("91f1e413-dc9f-3b4e-b1c5-0e8560177253","Stock", + "aksldsam asd", "asdasjnk:fas", UUID.randomUUID().toString(), "http://data.d4science.org/ctlg/GRSF_Admin/91f1e413-dc9f-3b4e-b1c5-0e8560177253")); toReturn.setConnectTo(connectTo); toReturn.setGrsfDomain("Stock"); toReturn.setGrsfType("Assessment Unit"); @@ -88,6 +89,8 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS toReturn.setSemanticIdentifier("asfis:WRO+fao:67;FAO"); ArrayList sources = new ArrayList(); sources.add(new SourceRecord("RAM", "http://www.google.it")); + sources.add(new SourceRecord("FIRMS", "http://www.google.it")); + sources.add(new SourceRecord("FishSource", "http://www.google.it")); toReturn.setSources(sources); List similarGrsfRecords = new ArrayList(); similarGrsfRecords.add(new SimilarGRSFRecord("same species overlapping water areas", @@ -169,7 +172,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS List connectedBeans = new ArrayList(0); if(connectedBeansAsStrings != null){ for (String connectedBean : connectedBeansAsStrings) { - connectedBeans.add(Utils.connectedBeanRecordFromJson(connectedBean, uuidKB, grsfDomain)); + connectedBeans.add(Utils.connectedBeanRecordFromJson(connectedBean, uuidKB, grsfDomain, catalogue)); } } @@ -329,7 +332,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS baseUrl = Utils.discoverEndPoint(context); getThreadLocalRequest().getSession().setAttribute(keyPerContext, baseUrl); } - return Utils.updateCatalogueRecord(baseUrl, bean, catalogue, Utils.getCurrentUser(getThreadLocalRequest()).getUsername()); + return Utils.updateRecord(baseUrl, bean, catalogue, Utils.getCurrentUser(getThreadLocalRequest()).getUsername()); }catch(Exception e){ logger.error("Unable to update the product.." + e.getMessage()); diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/Utils.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/Utils.java index b3b4230..71f6b4b 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/Utils.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/Utils.java @@ -5,9 +5,7 @@ import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; import java.io.StringReader; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -38,7 +36,6 @@ 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.SimpleQuery; import org.gcube.resources.discovery.client.queries.impl.QueryBox; -import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager; import org.gcube.vomanagement.usermanagement.model.GCubeUser; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -59,9 +56,7 @@ import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.Closea import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.HttpClientBuilder; import eu.trentorise.opendata.jackan.internal.org.apache.http.util.EntityUtils; import eu.trentorise.opendata.jackan.model.CkanDataset; -import eu.trentorise.opendata.jackan.model.CkanGroup; import eu.trentorise.opendata.jackan.model.CkanPair; -import eu.trentorise.opendata.jackan.model.CkanTag; /** * Utility methods for GRSF Management panel widget. @@ -72,9 +67,7 @@ public class Utils { private static final String GENERIC_RESOURCE_NAME = "GRSFManageEntries"; private static final String GENERIC_RESOURCE_SECONDARY_TYPE = "ApplicationProfile"; private static final Logger logger = LoggerFactory.getLogger(Utils.class); - private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private static final String REGEX_UUID = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"; - private static final int MAX_TRIAL = 5; /** * Look up from the IS other information that can be potentially displayed in read only mode in the management panel. @@ -265,7 +258,7 @@ public class Utils { * @return true on success, false otherwise */ @SuppressWarnings("unchecked") - public static String updateCatalogueRecord(String serviceUrl, ManageProductBean bean, DataCatalogue catalogue, String username){ + public static String updateRecord(String serviceUrl, ManageProductBean bean, DataCatalogue catalogue, String username) throws Exception{ if(serviceUrl == null) throw new IllegalArgumentException("GRSF Updater service url cannot be null"); @@ -278,13 +271,50 @@ public class Utils { JSONObject obj = new JSONObject(); obj.put(Constants.CATALOGUE_ID, bean.getCatalogueIdentifier()); obj.put(Constants.KB_ID, bean.getKnowledgeBaseIdentifier()); - obj.put(Constants.PRODUCT_TYPE, bean.getGrsfDomain().toLowerCase()); - obj.put(Constants.STATUS, bean.getNewStatus().toString().toLowerCase()); + obj.put(Constants.NEW_STATUS, bean.getNewStatus().toString().toLowerCase()); + obj.put(Constants.OLD_STATUS, bean.getCurrentStatus().toString().toLowerCase()); + obj.put(Constants.TRACEABILITY_FLAG, bean.isTraceabilityFlag()); String annotation = bean.getAnnotation(); if(annotation != null) obj.put(Constants.ANNOTATION, annotation.replaceAll("\"", "")); + obj.put(Constants.SHORT_NAME_OLD, bean.getShortName()); + + if(bean.getShortNameUpdated() == null || bean.getShortNameUpdated().isEmpty()) + bean.setShortNameUpdated(bean.getShortName()); + + obj.put(Constants.SHORT_NAME_NEW, bean.getShortNameUpdated()); + obj.put(Constants.OLD_STATUS, bean.getCurrentStatus().toString().toLowerCase()); + + // prepare connections + List connections = bean.getConnectTo(); + JSONArray connectionsJson = new JSONArray(); + + for(ConnectedBean c: connections){ + JSONObject cc = new JSONObject(); + cc.put(Constants.SOURCE_KNOWLEDGE_BASE_ID, c.getSourceKnowledgeBaseId()); + cc.put(Constants.DEST_KNOWLEDGE_BASE_ID, c.getDestKnowledgeBaseId()); + cc.put(Constants.SOURCE_DOMAIN, c.getSourceDomain()); + cc.put(Constants.SUGGESTED, c.isExtra()); + cc.put(Constants.TO_BE_KEPT, c.isToBeKept()); + connectionsJson.add(cc); + } + obj.put(Constants.CONNECTIONS, connectionsJson); + + // prepare similar grsf records + List similarRecords = bean.getSimilarGrsfRecords(); + JSONArray similarRecordsJson = new JSONArray(); + for(SimilarGRSFRecord s: similarRecords){ + JSONObject ss = new JSONObject(); + ss.put(Constants.KB_ID, s.getKnowledgeBaseId()); + ss.put(Constants.SUGGESTED, s.isExtra()); + ss.put(Constants.TO_BE_KEPT, s.isToBeKept()); + ss.put(Constants.MERGE, s.isSuggestedMerge()); + similarRecordsJson.add(ss); + } + obj.put(Constants.SIMILAR_GRSF_RECORDS, similarRecordsJson); + logger.debug("Update request looks like " + obj.toJSONString()); HttpPost request = new HttpPost(serviceUrl + Constants.SERVICE_POST_METHOD); @@ -300,130 +330,22 @@ public class Utils { JSONParser parser = new JSONParser(); JSONObject parsedJSON = (JSONObject)parser.parse(result); - if(response.getStatusLine().getStatusCode() != Constants.STATUS_SUCCESS) + if(response.getStatusLine().getStatusCode() != Constants.STATUS_SUCCESS){ + throw new Exception("Update failed at knowledge base side!"); + }else if(!(boolean) parsedJSON.get(Constants.UPDATE_RESULT)) throw new IllegalArgumentException( - "Error while performing the update request: " + response.getStatusLine().getReasonPhrase() + - "and error in the result bean is " + parsedJSON.get(Constants.ERROR)); + "Update failed for the following reason " + parsedJSON.get(Constants.ERROR_MESSAGE)); - // patch the catalogue product - return patchProduct(catalogue, bean, username); + // patch the catalogue product (no longer needed) + // return patchProduct(catalogue, bean, username); }catch(Exception e){ logger.error("Unable to update this Item " + e.getMessage()); - return e.getMessage(); + throw e; } - } + return null; - /** - * Patch the product - * @param catalogue - * @param bean - * @param username - */ - @SuppressWarnings("unchecked") - private static String patchProduct(DataCatalogue catalogue, - ManageProductBean bean, String username) { - - logger.info("Going to patch record in the catalogue with identifier " + bean.getCatalogueIdentifier() + - " from user " + username); - - String apiKey = catalogue.getApiKeyFromUsername(username); - CkanDataset dataset = catalogue.getDataset(bean.getCatalogueIdentifier(), apiKey); - String errorMessage = null; - - for (int i = 0; i < MAX_TRIAL; i++) { - - try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();){ - - JSONObject jsonRequest = new JSONObject(); - JSONArray tagsAsJson = new JSONArray(); - JSONArray groupsAsJson = new JSONArray(); - JSONArray customFieldsAsJson = new JSONArray(); - - // manage the custom fields - List extras = dataset.getExtras(); - for (CkanPair ckanPair : extras) { - if(ckanPair.getKey().equals(Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY) && ckanPair.getValue().equals(bean.getCurrentStatus().toString())) - continue; - - JSONObject obj = new JSONObject(); - obj.put("key", ckanPair.getKey()); - obj.put("value", ckanPair.getValue()); - customFieldsAsJson.add(obj); - } - - // add the new one and the annotation message - JSONObject newStatus = new JSONObject(); - newStatus.put("key", Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY); - newStatus.put("value", bean.getNewStatus().toString()); - customFieldsAsJson.add(newStatus); - - JSONObject newAnnotation = new JSONObject(); - newAnnotation.put("key", Constants.ANNOTATION_CUSTOM_KEY); - newAnnotation.put("value", "date: " + DATE_FORMAT.format(new Date()) - + ", admin: " + new LiferayUserManager().getUserByUsername(username).getFullname() - + ", message: " + (bean.getAnnotation() != null ? bean.getAnnotation().replaceAll("\"", "") : "none") - + ", old status: " + bean.getCurrentStatus().toString() - + ", new status: " + bean.getNewStatus().toString() - ); - customFieldsAsJson.add(newAnnotation); - - // manage the tags - List tags = dataset.getTags(); - - for(CkanTag ckanTag : tags){ - if(!ckanTag.getName().equals(bean.getCurrentStatus().toString())){ - JSONObject obj = new JSONObject(); - obj.put("vocabulary_id", ckanTag.getVocabularyId()); - obj.put("state", ckanTag.getState().toString()); - obj.put("display_name", ckanTag.getDisplayName()); - obj.put("id", ckanTag.getId()); - obj.put("name", ckanTag.getName()); - tagsAsJson.add(obj); - } - } - - // add the new one - JSONObject newTag = new JSONObject(); - newTag.put("name", bean.getNewStatus().toString()); - newTag.put("display_name", bean.getNewStatus().toString()); - tagsAsJson.add(newTag); - - // manage the groups - List groups = dataset.getGroups(); - for (CkanGroup ckanGroup : groups) { - if(!ckanGroup.getName().equals("grsf" + "-" + bean.getCurrentStatus().toString().toLowerCase())){ - JSONObject obj = new JSONObject(); - obj.put("name", ckanGroup.getName()); - groupsAsJson.add(obj); - } - } - - JSONObject newGroup = new JSONObject(); - newGroup.put("name", "grsf" + "-" + bean.getNewStatus().toString().toLowerCase()); - groupsAsJson.add(newGroup); - - // perform the request - jsonRequest.put("id", bean.getCatalogueIdentifier()); - jsonRequest.put("tags", tagsAsJson); - jsonRequest.put("extras", customFieldsAsJson); - jsonRequest.put("groups", groupsAsJson); - - logger.debug("Request param is going to be " + jsonRequest); - - if((errorMessage = catalogue.patchProductWithJSON(bean.getCatalogueIdentifier(), jsonRequest, apiKey)) == null){ - logger.info("Record patched ..."); - break; - }else - continue; // retry - - }catch(Exception e){ - logger.error("Error while trying to patch grsf record (iteration " + i + " of " + MAX_TRIAL + ")" + e.getMessage()); - errorMessage = e.getMessage(); - } - } - return errorMessage; } /** @@ -529,7 +451,7 @@ public class Utils { logger.warn(message); throw new Exception(message); } - + logger.info("Result size is " + datasets.size()); if(datasets.size() == 1) @@ -542,7 +464,7 @@ public class Utils { if(extra.getKey().contains(Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY) && extra.getValue().equals(suggestedRecordSemanticIdentifier)){ logger.info("Matching dataset has id " + dataset.getId() + " with value " + Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY); return dataset; - } + } } @@ -576,7 +498,7 @@ public class Utils { return null; } - + /** * Exploits the fact that in GRSF the url of a record contains the name (which is unique) of the record itself * @param url @@ -630,7 +552,7 @@ public class Utils { // } // // } - + /** * Get a {@link SimilarGRSFRecord} from a json string * @param json @@ -654,7 +576,7 @@ public class Utils { ); } - + /** * Checks if is into portal. * @@ -678,21 +600,26 @@ public class Utils { * @return * @throws ParseException */ - public static ConnectedBean connectedBeanRecordFromJson(String json, String sourceIdentifier, String sourceDomain) throws ParseException { + public static ConnectedBean connectedBeanRecordFromJson(String json, String sourceIdentifier, String sourceDomain, + DataCatalogue clg) throws ParseException { + if(json == null) return null; JSONParser parser = new JSONParser(); JSONObject object = (JSONObject)parser.parse(json); - + + String uuidDest = (String)object.get(Constants.CONNECTED_RECORD_KNOWLEDGE_BASE_ID_JSON_KEY); + String url = clg.getUrlFromDatasetIdOrName(uuidDest); return new ConnectedBean( sourceIdentifier, sourceDomain, (String)object.get(Constants.CONNECTED_RECORD_SHORT_NAME_JSON_KEY), (String)object.get(Constants.CONNECTED_RECORD_SEMANTIC_IDENTIFIER_JSON_KEY), - (String)object.get(Constants.CONNECTED_RECORD_KNOWLEDGE_BASE_ID_JSON_KEY) + uuidDest, + url ); - + } } diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/ConnectedBean.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/ConnectedBean.java index 7aa5ed1..f447ed4 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/ConnectedBean.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/ConnectedBean.java @@ -10,11 +10,12 @@ import java.io.Serializable; public class ConnectedBean implements Serializable{ private static final long serialVersionUID = -4863776727351488790L; - private String sourceIdentifier; + private String sourceKnowledgeBaseId; private String sourceDomain; // i.e. Stock or Fishery private String destShortName; private String destSemanticIdentifier; - private String destIdentifier; // the dest indentifier of a Fishery or Stock (the link is from a Stock to a Fishery and viceversa) + private String destKnowledgeBaseId; // the dest indentifier of a Fishery or Stock (the link is from a Stock to a Fishery and viceversa) + private String url; private boolean isExtra; private boolean toBeKept = true; @@ -23,22 +24,25 @@ public class ConnectedBean implements Serializable{ } /** - * @param sourceIdentifier + * + * @param sourceKnowledgeBaseId * @param sourceDomain * @param destShortName * @param destSemanticIdentifier - * @param destIdentifier - * @param toBeKept + * @param destKnowledgeBaseId + * @param url */ - public ConnectedBean(String sourceIdentifier, String sourceDomain, + public ConnectedBean(String sourceKnowledgeBaseId, String sourceDomain, String destShortName, String destSemanticIdentifier, - String destIdentifier) { + String destKnowledgeBaseId, String url) { super(); - this.sourceIdentifier = sourceIdentifier; + this.sourceKnowledgeBaseId = sourceKnowledgeBaseId; this.sourceDomain = sourceDomain; this.destShortName = destShortName; this.destSemanticIdentifier = destSemanticIdentifier; - this.destIdentifier = destIdentifier; + this.destKnowledgeBaseId = destKnowledgeBaseId; + this.url = url; + } public String getDestShortName() { @@ -56,19 +60,22 @@ public class ConnectedBean implements Serializable{ public void setDestSemanticIdentifier(String destSemanticIdentifier) { this.destSemanticIdentifier = destSemanticIdentifier; } + public String getSourceKnowledgeBaseId() { + return sourceKnowledgeBaseId; + } - public String getSourceIdentifier() { - return sourceIdentifier; + public void setSourceKnowledgeBaseId(String sourceKnowledgeBaseId) { + this.sourceKnowledgeBaseId = sourceKnowledgeBaseId; } - public void setSourceIdentifier(String sourceIdentifier) { - this.sourceIdentifier = sourceIdentifier; + + public String getDestKnowledgeBaseId() { + return destKnowledgeBaseId; } - public String getDestIdentifier() { - return destIdentifier; - } - public void setDestIdentifier(String destIdentifier) { - this.destIdentifier = destIdentifier; + + public void setDestKnowledgeBaseId(String destKnowledgeBaseId) { + this.destKnowledgeBaseId = destKnowledgeBaseId; } + public String getSourceDomain() { return sourceDomain; } @@ -91,14 +98,20 @@ public class ConnectedBean implements Serializable{ public void setExtra(boolean isExtra) { this.isExtra = isExtra; } - + + public String getUrl() { + return url; + } + public void setUrl(String url) { + this.url = url; + } @Override public String toString() { - return "ConnectedBean [sourceIdentifier=" + sourceIdentifier + return "ConnectedBean [sourceKnowledgeBaseId=" + sourceKnowledgeBaseId + ", sourceDomain=" + sourceDomain + ", destShortName=" + destShortName + ", destSemanticIdentifier=" - + destSemanticIdentifier + ", destIdentifier=" + destIdentifier - + ", isExtra=" + isExtra + ", toBeKept=" + toBeKept + "]"; + + destSemanticIdentifier + ", destKnowledgeBaseId=" + + destKnowledgeBaseId + ", url=" + url + ", isExtra=" + isExtra + + ", toBeKept=" + toBeKept + "]"; } - } diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/SimilarGRSFRecord.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/SimilarGRSFRecord.java index 218bf53..3147243 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/SimilarGRSFRecord.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/SimilarGRSFRecord.java @@ -66,6 +66,10 @@ public class SimilarGRSFRecord implements Serializable{ this.toBeKept = toBeKept; } + public boolean isToBeKept() { + return toBeKept; + } + public String getShortName() { return shortName; }