From f1cb4f058ea3c0a6ebec0ea0146dca7f0ae88a58 Mon Sep 17 00:00:00 2001 From: Costantino Perciante Date: Fri, 2 Feb 2018 16:32:30 +0000 Subject: [PATCH] minor fix at server side git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/widgets/grsf-manage-widget@162870 82a268e6-3cf1-43bd-a215-b396298e98cf --- .settings/org.eclipse.wst.common.component | 3 - .../client/GRSFManageWidgetService.java | 4 +- .../client/GRSFManageWidgetServiceAsync.java | 4 +- .../client/view/ManageProductWidget.java | 18 +- .../client/view/ManageProductWidget.ui.xml | 2 +- .../view/subwidgets/ConnectToWidget.java | 116 +++++++----- .../manage/GRSFNotificationService.java | 15 +- .../manage/GRSFUpdaterServiceClient.java | 4 +- .../server/manage/Utils.java | 165 +++++++++--------- .../shared/ConnectedBean.java | 53 ++---- 10 files changed, 196 insertions(+), 188 deletions(-) diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 3afe46d..38e18cb 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -4,9 +4,6 @@ - - uses - diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/GRSFManageWidgetService.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/GRSFManageWidgetService.java index d674253..dad548e 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/GRSFManageWidgetService.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/GRSFManageWidgetService.java @@ -1,5 +1,7 @@ package org.gcube.datacatalogue.grsf_manage_widget.client; +import java.util.List; + import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean; import com.google.gwt.user.client.rpc.RemoteService; @@ -25,7 +27,7 @@ public interface GRSFManageWidgetService extends RemoteService { /** * Notify product update */ - String notifyProductUpdate(ManageProductBean bean) throws Exception; + String notifyProductUpdate(ManageProductBean bean, List hashtags) throws Exception; // /** // * Check that a record with such semantic identifier exists diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/GRSFManageWidgetServiceAsync.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/GRSFManageWidgetServiceAsync.java index df46c05..871dce4 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/GRSFManageWidgetServiceAsync.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/GRSFManageWidgetServiceAsync.java @@ -3,6 +3,8 @@ */ package org.gcube.datacatalogue.grsf_manage_widget.client; +import java.util.List; + import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -13,7 +15,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback; */ public interface GRSFManageWidgetServiceAsync { - void notifyProductUpdate(ManageProductBean bean, + void notifyProductUpdate(ManageProductBean bean, List hashtags, AsyncCallback callback); void getProductBeanById(String identifier, 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 a375ebf..4666335 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 @@ -93,7 +93,7 @@ public class ManageProductWidget extends Composite{ @UiField VerticalPanel panelForSimilarGRSFRecords; - + @UiField VerticalPanel panelForFurtherMerges; @@ -244,7 +244,7 @@ public class ManageProductWidget extends Composite{ List availableGRSFSimilarRecords = bean.getSimilarGrsfRecords(); similarRecordPanel = new SimilarGRSFRecordWidget(availableGRSFSimilarRecords/*, service*/); panelForSimilarGRSFRecords.add(similarRecordPanel); - + // further suggested merges suggestedMergesPanel = new SuggestMerges(service); panelForFurtherMerges.add(suggestedMergesPanel); @@ -344,14 +344,6 @@ public class ManageProductWidget extends Composite{ return; } - annotationAreaGroup.setType(ControlGroupType.NONE); - - // if(annotationArea.getText() == null || annotationArea.getText().isEmpty()){ - // annotationArea.setPlaceholder("An annotation message to send along the update (mandatory)"); - // annotationAreaGroup.setType(ControlGroupType.ERROR); - // return; - // } - manageProductModal.setCloseVisible(false); cancelButton.setEnabled(false); confirmButton.setEnabled(false); @@ -360,8 +352,10 @@ public class ManageProductWidget extends Composite{ // get short name bean.setShortNameUpdated(shortNameTextBox.getText()); + // evaluate the connections and the actions on them + bean.setConnections(connectWidget.getConnectList()); + // update similar records and to connect - bean.setConnectTo(connectWidget.getConnectList()); bean.setSimilarGrsfRecords(similarRecordPanel.getSimilarRecords()); bean.getSimilarGrsfRecords().addAll(suggestedMergesPanel.getSimilarRecords()); @@ -372,7 +366,7 @@ public class ManageProductWidget extends Composite{ // traceability flag bean.setTraceabilityFlag(traceabilityFlag.getValue()); - service.notifyProductUpdate(bean, new AsyncCallback() { + service.notifyProductUpdate(bean, null, new AsyncCallback() { // TODO add hashtags here @Override public void onSuccess(String result) { diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/ManageProductWidget.ui.xml b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/ManageProductWidget.ui.xml index 57b5f4e..fab2dae 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/ManageProductWidget.ui.xml +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/ManageProductWidget.ui.xml @@ -102,7 +102,7 @@ - + Suggest Merges (Notification will be sent): 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 2bdf6b3..fbb0667 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 @@ -36,13 +36,17 @@ import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; +/** + * Connections panel + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ public class ConnectToWidget extends Composite{ private static ConnectToWidgetUiBinder uiBinder = GWT .create(ConnectToWidgetUiBinder.class); 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}"; - + interface ConnectToWidgetUiBinder extends UiBinder { } @@ -52,31 +56,41 @@ public class ConnectToWidget extends Composite{ @UiField Button suggestRecord; - //private GRSFManageWidgetServiceAsync service; private List connectList = new ArrayList(0); - - private List connectedRecords = null; - + private List currentlyConnected = null; + private List suggestedByKnowledgeBase; private GRSFManageWidgetServiceAsync service; public ConnectToWidget(final ManageProductBean bean, GRSFManageWidgetServiceAsync service) { initWidget(uiBinder.createAndBindUi(this)); - + this.service = service; - // get already connected beans, if any - connectedRecords = bean.getConnectTo(); + // add the one suggested by the knowledge base + suggestedByKnowledgeBase = bean.getSuggestedByKnowledgeBase(); - if(connectedRecords != null){ + if(suggestedByKnowledgeBase != null){ connectPanel.add(new HTML("
")); - for (ConnectedBean connected : connectedRecords) { - Widget widget = buildWidgetForConnectedRecords(connected); + for (ConnectedBean connected : suggestedByKnowledgeBase) { + Widget widget = buildWidgetForConnected(connected, true); connectPanel.add(widget); connectPanel.add(new HTML("
")); } - } - //this.service = service; + + // get already connected beans, and suggested ones + currentlyConnected = bean.getCurrentConnections(); + + if(currentlyConnected != null){ + connectPanel.add(new HTML("
")); + for (ConnectedBean connected : currentlyConnected) { + Widget widget = buildWidgetForConnected(connected, false); + connectPanel.add(widget); + connectPanel.add(new HTML("
")); + } + } + + // manage the button for manual suggestion 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 "); suggestRecord.setIcon(IconType.PLUS_SIGN); @@ -89,8 +103,6 @@ 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); connectPanel.add(t.getW()); @@ -105,24 +117,25 @@ public class ConnectToWidget extends Composite{ * @param similarGRSFRecord * @return */ - public static Widget buildWidgetForConnectedRecords(final ConnectedBean connected){ - + public static Widget buildWidgetForConnected(final ConnectedBean connected, boolean suggestedByKb){ 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")); + Paragraph name = new Paragraph("Record name: " + (connected.getDestName() != null? connected.getDestName() : "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.setHref(connected.getDestUrl()); view.setText("View"); view.setTitle("Click to view the similar record"); view.setTarget("_blank"); @@ -131,19 +144,33 @@ public class ConnectToWidget extends Composite{ VerticalPanel rightPanel = new VerticalPanel(); rightPanel.setWidth("20%"); + rightPanel.getElement().getStyle().setFloat(Float.RIGHT); + + if(!suggestedByKb){ + final CheckBox removeExtra = new CheckBox("Remove"); + removeExtra.setTitle("Remove this connections"); + removeExtra.addClickHandler(new ClickHandler() { - final CheckBox removeExtra = new CheckBox("Remove"); - removeExtra.setTitle("Remove this record among the connected ones"); - removeExtra.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent arg0) { + connected.setRemove(removeExtra.getValue()); + } + }); + rightPanel.add(removeExtra); + } + + final CheckBox connect = new CheckBox("Connect"); + connect.setValue(suggestedByKb); // automatically check the value + connect.setTitle("Connect this record"); + connect.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent arg0) { - connected.setToBeKept(!removeExtra.getValue()); + connected.setRemove(connect.getValue()); } }); - - rightPanel.getElement().getStyle().setFloat(Float.RIGHT); - rightPanel.add(removeExtra); + rightPanel.add(connect); + hp.add(leftPanel); hp.add(rightPanel); hp.getElement().getStyle().setPadding(10, Unit.PX); @@ -232,7 +259,7 @@ public class ConnectToWidget extends Composite{ main.add(separator); return new Tuple(cb, main, box); } - + protected void validateUUID(final TextBox box, final ConnectedBean c, final Icon icon, final Anchor view) { final String currentText = box.getText().trim(); @@ -297,22 +324,25 @@ public class ConnectToWidget extends Composite{ * @return */ public List getConnectList() { - - if(connectedRecords == null) - connectedRecords = new ArrayList(0); - - for (Tuple p : connectList) { - String suggestedIdentifier = ((ConnectedBean)p.getO()).getDestKnowledgeBaseId(); - if(suggestedIdentifier == null || suggestedIdentifier.isEmpty()) - continue; - else{ - ConnectedBean connectedRecord = (ConnectedBean) p.getO(); - connectedRecord.setToBeKept(true); - connectedRecords.add((ConnectedBean) p.getO()); - } - } - - return connectedRecords; + + TODO +// List toReturn = new ArrayList<>(); +// +// if(currentlyConnected != null) +// currentlyConnected = new ArrayList(0); +// +// for (Tuple p : connectList) { +// String suggestedIdentifier = ((ConnectedBean)p.getO()).getDestKnowledgeBaseId(); +// if(suggestedIdentifier == null || suggestedIdentifier.isEmpty()) +// continue; +// else{ +// ConnectedBean connectedRecord = (ConnectedBean) p.getO(); +// connectedRecord.setToBeKept(true); +// currentlyConnected.add((ConnectedBean) p.getO()); +// } +// } +// +// return currentlyConnected; } } 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 fe35a55..a9b1caa 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 @@ -86,14 +86,13 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS toReturn = new ManageProductBean(); toReturn.setCatalogueIdentifier(UUID.randomUUID().toString()); List connectTo = new ArrayList<>(); + connectTo.add(new ConnectedBean( - "91f1e413-dc9f-3b4e-b1c5-0e8560177253", - "Stock", - "http://data.d4science.org/ctlg/GRSF_Admin/91f1e413-dc9f-3b4e-b1c5-0e8560177253", "89f1e413-dc9f-3b4e-b1c5-0e8560177254", "Random title", "http://data.d4science.org/ctlg/GRSF_Admin/89f1e413-dc9f-3b4e-b1c5-0e8560177254", - "Fishery" + "Fishery", + "ajklsdkad:akljdnajdna" )); toReturn.setCurrentConnections(connectTo); toReturn.setGrsfDomain("Stock"); @@ -206,7 +205,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS for (String connectedBean : connectedBeanUrls) { if(connectedBean.equals(Constants.NO_CONNECTED_RECORDS)) // stop here if there is a single element with this information break; - ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(recordUrl, connectedBean, uuidKB, grsfDomain, catalogue, apiKey); + ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(connectedBean, catalogue, apiKey, httpSession); if(builtBean != null) connectedBeans.add(builtBean); } @@ -223,7 +222,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS if(exploitedResourcesUrls != null && !exploitedResourcesUrls.isEmpty()){ for (String exploited : exploitedResourcesUrls) { - ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(recordUrl, exploited, uuidKB, grsfDomain, catalogue, apiKey); + ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(exploited, catalogue, apiKey, httpSession); if(builtBean != null) suggestedConnectionsByKnowledgeBase.add(builtBean); } @@ -282,7 +281,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS } @Override - public String notifyProductUpdate(ManageProductBean bean) throws Exception{ + public String notifyProductUpdate(ManageProductBean bean, List hashtags) throws Exception{ logger.info("Creating notification for the bean " + bean + " to send to the knowledge base"); try{ @@ -306,7 +305,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS threadRequest.getSession().removeAttribute(sessionProductKey); return Utils.updateRecord(baseUrl, bean, catalogue, username, administratorFullName, threadRequest, - PortalContext.getConfiguration().getCurrentGroupId(threadRequest), context, token); + PortalContext.getConfiguration().getCurrentGroupId(threadRequest), context, token, hashtags); }catch(Exception e){ logger.error("Unable to update the product", e); diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFUpdaterServiceClient.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFUpdaterServiceClient.java index 01ba036..45091f6 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFUpdaterServiceClient.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFUpdaterServiceClient.java @@ -122,9 +122,9 @@ public class GRSFUpdaterServiceClient { for(ConnectedBean c: connections){ JSONObject cc = new JSONObject(); if(c.isRemove() || (c.isConnect() && !c.isRemove())){ // do not send it if it needs to be unconnected but not removed - cc.put(Constants.SOURCE_KNOWLEDGE_BASE_ID, c.getSourceKnowledgeBaseId()); + cc.put(Constants.SOURCE_KNOWLEDGE_BASE_ID, bean.getKnowledgeBaseIdentifier()); cc.put(Constants.DEST_KNOWLEDGE_BASE_ID, c.getDestKnowledgeBaseId()); - cc.put(Constants.SOURCE_DOMAIN, c.getSourceDomain()); + cc.put(Constants.SOURCE_DOMAIN, bean.getGrsfDomain()); cc.put(Constants.CONNECTION_TO_REMOVE, c.isRemove()); } connectionsJson.add(cc); 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 03360a5..07e604d 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 @@ -1,16 +1,12 @@ package org.gcube.datacatalogue.grsf_manage_widget.server.manage; import static org.gcube.resources.discovery.icclient.ICFactory.client; -import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; -import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; import java.io.StringReader; -import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -23,10 +19,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; -import org.gcube.common.encryption.StringEncrypter; import org.gcube.common.portal.PortalContext; -import org.gcube.common.resources.gcore.ServiceEndpoint; -import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; import org.gcube.common.resources.gcore.utils.XPathHelper; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.datacatalogue.ckanutillibrary.server.ApplicationProfileScopePerUrlReader; @@ -34,23 +27,15 @@ import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogue; import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogueRunningCluster; import org.gcube.datacatalogue.ckanutillibrary.shared.ex.ApplicationProfileNotFoundException; import org.gcube.datacatalogue.common.Constants; +import org.gcube.datacatalogue.common.enums.Product_Type; import org.gcube.datacatalogue.common.enums.Status; -import org.gcube.datacatalogue.grsf_manage_widget.server.manage.RevertOperationUrl.Operation; import org.gcube.datacatalogue.grsf_manage_widget.shared.ConnectedBean; import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean; import org.gcube.datacatalogue.grsf_manage_widget.shared.SimilarGRSFRecord; -import org.gcube.portlets.user.urlshortener.UrlShortener; 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.RoleManager; -import org.gcube.vomanagement.usermanagement.UserManager; -import org.gcube.vomanagement.usermanagement.impl.LiferayRoleManager; -import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager; -import org.gcube.vomanagement.usermanagement.model.GCubeTeam; import org.gcube.vomanagement.usermanagement.model.GCubeUser; -import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; @@ -62,12 +47,8 @@ import org.xml.sax.InputSource; import com.liferay.portal.service.UserLocalServiceUtil; -import eu.trentorise.opendata.jackan.internal.org.apache.http.HttpResponse; -import eu.trentorise.opendata.jackan.internal.org.apache.http.client.methods.HttpPost; -import eu.trentorise.opendata.jackan.internal.org.apache.http.entity.StringEntity; import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.CloseableHttpClient; 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.CkanPair; @@ -177,7 +158,7 @@ public class Utils { } } logger.debug("Map is " + namespacesMap); - + // put them into session for speeding up the operations httpSession.setAttribute(sessionKey, namespacesMap); return namespacesMap; @@ -252,8 +233,17 @@ public class Utils { * @param catalogue * @return true on success, false otherwise */ - public static String updateRecord(String serviceUrl, ManageProductBean bean, DataCatalogue catalogue, String username, - String fullName, HttpServletRequest httpServletRequest, long groupId, String context, String token) throws Exception{ + public static String updateRecord( + String serviceUrl, + ManageProductBean bean, + DataCatalogue catalogue, + String username, + String fullName, + HttpServletRequest httpServletRequest, + long groupId, + String context, + String token, + List hashtags) throws Exception{ if(serviceUrl == null) throw new IllegalArgumentException("GRSF Updater service url cannot be null"); @@ -272,16 +262,21 @@ public class Utils { // manage interactions through a separated thread but set there security token and context new Thread(()->{ - + ScopeProvider.instance.set(context); SecurityTokenProvider.instance.set(token); - - // send email to Editors and Reviewers - SocialCommunications.sendEmailAdministrators(bean, catalogue, username, fullName, groupId, httpServletRequest, bean.isMergesInvolved()); + try{ + + // send email to Editors and Reviewers + SocialCommunications.sendEmailAdministrators(bean, catalogue, username, fullName, groupId, httpServletRequest, bean.isMergesInvolved()); + + // create a post about the operation + SocialCommunications.writeProductPost(bean, username, fullName, hashtags, true); + + }catch(Exception e){ + logger.error("Something failed while alerting editors/reviewers", e); + } - // create a post about the operation - SocialCommunications.createSocialPost(bean, catalogue, username, fullName, hashtags); - }).start(); }catch(Exception e){ @@ -401,49 +396,49 @@ public class Utils { return user; } - /** - * Given a semantic identifier, check if a record exists and return it - * @param suggestedRecordSemanticIdentifier - * @param catalogue - * @return CkanDataset - * @throws Exception in case no record matches the semantic identifier - */ - public static CkanDataset getRecordBySemanticIdentifier( - String suggestedRecordSemanticIdentifier, DataCatalogue catalogue, - String apiKey) throws Exception { - - if(suggestedRecordSemanticIdentifier == null || suggestedRecordSemanticIdentifier.isEmpty()) - throw new Exception(Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + " cannot be null or emtpy"); - - String query = Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + "\"" + suggestedRecordSemanticIdentifier+ "\""; - List datasets = catalogue.searchForPackageInOrganization(apiKey, query, 0, 10, Constants.GRSF_ADMIN_ORGANIZATION_NAME); - - if(datasets == null || datasets.isEmpty()){ - String message = "Unable to find dataset with such " + Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY; - logger.warn(message); - throw new Exception(message); - } - - logger.info("Result size is " + datasets.size()); - - if(datasets.size() == 1) - return datasets.get(0); - else{ - - // worst situation.. we need to check for the right one - for(CkanDataset dataset: datasets) - for(CkanPair extra : dataset.getExtras()) - 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; - } - - } - - // in the end .... - throw new Exception("Unable to find record with " + Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + " equals to " + suggestedRecordSemanticIdentifier); - - } + // /** + // * Given a semantic identifier, check if a record exists and return it + // * @param suggestedRecordSemanticIdentifier + // * @param catalogue + // * @return CkanDataset + // * @throws Exception in case no record matches the semantic identifier + // */ + // public static CkanDataset getRecordBySemanticIdentifier( + // String suggestedRecordSemanticIdentifier, DataCatalogue catalogue, + // String apiKey) throws Exception { + // + // if(suggestedRecordSemanticIdentifier == null || suggestedRecordSemanticIdentifier.isEmpty()) + // throw new Exception(Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + " cannot be null or emtpy"); + // + // String query = Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + "\"" + suggestedRecordSemanticIdentifier+ "\""; + // List datasets = catalogue.searchForPackageInOrganization(apiKey, query, 0, 10, Constants.GRSF_ADMIN_ORGANIZATION_NAME); + // + // if(datasets == null || datasets.isEmpty()){ + // String message = "Unable to find dataset with such " + Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY; + // logger.warn(message); + // throw new Exception(message); + // } + // + // logger.info("Result size is " + datasets.size()); + // + // if(datasets.size() == 1) + // return datasets.get(0); + // else{ + // + // // worst situation.. we need to check for the right one + // for(CkanDataset dataset: datasets) + // for(CkanPair extra : dataset.getExtras()) + // 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; + // } + // + // } + // + // // in the end .... + // throw new Exception("Unable to find record with " + Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + " equals to " + suggestedRecordSemanticIdentifier); + // + // } /** * Exploits the fact that in GRSF the url of a record contains the name (which is unique) of the record itself @@ -567,6 +562,7 @@ public class Utils { /** * Get Connected bean from record + * @param httpSession * @param json * @param sourceIdentifier * @param sourceDomain @@ -575,26 +571,31 @@ public class Utils { * @throws ParseException */ public static ConnectedBean connectedBeanRecordFromUrl( - String sourceIdentifier, - String sourceDomain, - String sourceUrl, String destUrl, DataCatalogue clg, - String apiKey) throws ParseException { + String apiKey, + HttpSession httpSession + ) throws ParseException { if(destUrl == null) return null; - String connectedBeanUuid = Utils.getDatasetKnowledgeBaseIdFromUrl(destUrl); + String connectedBeanUuid = getDatasetKnowledgeBaseIdFromUrl(destUrl); CkanDataset destDataset = clg.getDataset(connectedBeanUuid, apiKey); + boolean isStock = destDataset.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY).contains(Product_Type.STOCK.getOrigName()); + Map fieldsNamespacesMap = + Utils.getFieldToFieldNameSpaceMapping(httpSession, isStock ? + Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_STOCK : Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_FISHERY); + Map> extrasWithoutNamespaces = Utils.replaceFieldsKey(destDataset.getExtras(), fieldsNamespacesMap); + String semanticId = extrasWithoutNamespaces.get(Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY).get(0); + String destDomain = extrasWithoutNamespaces.get(Constants.DOMAIN_CUSTOM_KEY).get(0); + return new ConnectedBean( - sourceIdentifier, - sourceDomain, - sourceUrl, connectedBeanUuid, destDataset.getTitle(), destUrl, - destDataset.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY) + destDomain, + semanticId ); } 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 ddcd7e2..626855e 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,12 +10,10 @@ import java.io.Serializable; public class ConnectedBean implements Serializable{ private static final long serialVersionUID = -4863776727351488790L; - private String sourceKnowledgeBaseId; - private String sourceDomain; // i.e. Stock or Fishery - private String sourceUrl; private String destKnowledgeBaseId; // the dest identifier of a Fishery or Stock (the link is from a Stock to a Fishery and vice versa) private String destName; private String destUrl; + private String destSemanticIdentifier; private String destDomain; // please note that this MUST be different from sourceDomain private boolean remove; private boolean connect; @@ -34,17 +32,18 @@ public class ConnectedBean implements Serializable{ * @param remove * @param connect */ - public ConnectedBean(String sourceKnowledgeBaseId, String sourceDomain, - String sourceUrl, String destKnowledgeBaseId, String destName, - String destUrl, String destDomain) { + public ConnectedBean( + String destKnowledgeBaseId, + String destName, + String destUrl, + String destDomain, + String destSemanticIdentifier) { super(); - this.sourceKnowledgeBaseId = sourceKnowledgeBaseId; - this.sourceDomain = sourceDomain; - this.sourceUrl = sourceUrl; this.destKnowledgeBaseId = destKnowledgeBaseId; this.destName = destName; this.destUrl = destUrl; this.destDomain = destDomain; + this.destSemanticIdentifier = destSemanticIdentifier; } public boolean isConnect() { @@ -55,14 +54,6 @@ public class ConnectedBean implements Serializable{ this.connect = connect; } - public String getSourceKnowledgeBaseId() { - return sourceKnowledgeBaseId; - } - - public void setSourceKnowledgeBaseId(String sourceKnowledgeBaseId) { - this.sourceKnowledgeBaseId = sourceKnowledgeBaseId; - } - public String getDestKnowledgeBaseId() { return destKnowledgeBaseId; } @@ -71,13 +62,6 @@ public class ConnectedBean implements Serializable{ this.destKnowledgeBaseId = destKnowledgeBaseId; } - public String getSourceDomain() { - return sourceDomain; - } - public void setSourceDomain(String sourceDomain) { - this.sourceDomain = sourceDomain; - } - public boolean isRemove() { return remove; } @@ -86,14 +70,6 @@ public class ConnectedBean implements Serializable{ this.remove = remove; } - public String getSourceUrl() { - return sourceUrl; - } - - public void setSourceUrl(String sourceUrl) { - this.sourceUrl = sourceUrl; - } - public String getDestName() { return destName; } @@ -118,12 +94,19 @@ public class ConnectedBean implements Serializable{ this.destDomain = destDomain; } + public String getDestSemanticIdentifier() { + return destSemanticIdentifier; + } + + public void setDestSemanticIdentifier(String destSemanticIdentifier) { + this.destSemanticIdentifier = destSemanticIdentifier; + } + @Override public String toString() { - return "ConnectedBean [sourceKnowledgeBaseId=" + sourceKnowledgeBaseId - + ", sourceDomain=" + sourceDomain + ", sourceUrl=" + sourceUrl - + ", destKnowledgeBaseId=" + destKnowledgeBaseId + return "ConnectedBean [destKnowledgeBaseId=" + destKnowledgeBaseId + ", destName=" + destName + ", destUrl=" + destUrl + + ", destSemanticIdentifier=" + destSemanticIdentifier + ", destDomain=" + destDomain + ", remove=" + remove + ", connect=" + connect + "]"; }