From 97806357e6e16a2b26d9347b8d4f66eaa5dfcf52 Mon Sep 17 00:00:00 2001 From: Costantino Perciante Date: Sat, 3 Feb 2018 19:44:21 +0000 Subject: [PATCH] almost finished. Minor issues left git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/widgets/grsf-manage-widget@162879 82a268e6-3cf1-43bd-a215-b396298e98cf --- pom.xml | 6 +- .../client/GRSFManageWidget.java | 8 +- .../client/view/ManageProductWidget.java | 7 +- .../view/subwidgets/ConnectToWidget.java | 83 +++++++++++-------- .../subwidgets/SimilarGRSFRecordWidget.java | 1 - .../client/view/subwidgets/SuggestMerges.java | 61 ++++++++------ .../manage/GRSFNotificationService.java | 15 ++++ 7 files changed, 109 insertions(+), 72 deletions(-) diff --git a/pom.xml b/pom.xml index 59b8415..a2b7261 100644 --- a/pom.xml +++ b/pom.xml @@ -121,18 +121,18 @@ org.gcube.core common-scope-maps - compile + provided org.gcube.core common-encryption - compile + provided org.gcube.common authorization-client - compile + provided junit diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/GRSFManageWidget.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/GRSFManageWidget.java index 2d1728f..c9c6d1d 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/GRSFManageWidget.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/GRSFManageWidget.java @@ -1,10 +1,6 @@ package org.gcube.datacatalogue.grsf_manage_widget.client; -import org.gcube.datacatalogue.grsf_manage_widget.client.view.ManageProductWidget; - import com.google.gwt.core.client.EntryPoint; -import com.google.gwt.event.shared.HandlerManager; -import com.google.gwt.user.client.ui.RootPanel; /** * Entry point classes define onModuleLoad(). @@ -15,7 +11,7 @@ public class GRSFManageWidget implements EntryPoint { * This is the entry point method. */ public void onModuleLoad(){ - HandlerManager eventBus = new HandlerManager(null); - RootPanel.get("manageDiv").add(new ManageProductWidget("fffb6167-b570-42a8-92b9-5be28549c3b8", eventBus)); + // HandlerManager eventBus = new HandlerManager(null); + // RootPanel.get("manageDiv").add(new ManageProductWidget("fffb6167-b570-42a8-92b9-5be28549c3b8", eventBus)); } } 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 5bab448..c0c0e8c 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 @@ -174,7 +174,7 @@ public class ManageProductWidget extends Composite{ // show modal manageProductModal.addStyleName("management-metadata-modal-style"); - manageProductModal.getElement().getStyle().setWidth(60, Unit.PCT); + // manageProductModal.getElement().getStyle().setWidth(60, Unit.PCT); manageProductModal.show(); // async request to fetch the product @@ -315,7 +315,7 @@ public class ManageProductWidget extends Composite{ bean.setNewStatus(bean.getCurrentStatus()); else bean.setNewStatus(Status.fromString(listBoxStatus.getSelectedItemText())); - + manageProductModal.setCloseVisible(false); cancelButton.setEnabled(false); confirmButton.setEnabled(false); @@ -330,7 +330,10 @@ public class ManageProductWidget extends Composite{ // update similar records and to connect if(similarRecordPanel != null) bean.setSimilarGrsfRecords(similarRecordPanel.getSimilarRecords()); + else + bean.setSimilarGrsfRecords(new ArrayList(0)); + // add the suggested ones, if any bean.getSimilarGrsfRecords().addAll(suggestedMergesPanel.getSimilarRecords()); // set new values 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 a61526d..bf12942 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 @@ -17,6 +17,8 @@ import com.github.gwtbootstrap.client.ui.TextBox; import com.github.gwtbootstrap.client.ui.constants.ButtonType; import com.github.gwtbootstrap.client.ui.constants.IconType; import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.Style.Float; import com.google.gwt.dom.client.Style.FontWeight; import com.google.gwt.dom.client.Style.Unit; @@ -24,7 +26,6 @@ import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.event.dom.client.KeyPressHandler; import com.google.gwt.uibinder.client.UiBinder; @@ -57,10 +58,9 @@ public class ConnectToWidget extends Composite{ @UiField Button suggestRecord; - private List connectList = new ArrayList(0); + private List connectList = new ArrayList(0); // for the suggested ones private List currentlyConnected; // they can be "unconnected" or "removed" private List suggestedByKnowledgeBase; // they can be "connected" - private List suggestedByUser = new ArrayList(0); // they are "connected" if valid private GRSFManageWidgetServiceAsync service; public ConnectToWidget(final ManageProductBean bean, GRSFManageWidgetServiceAsync service) { @@ -170,7 +170,7 @@ public class ConnectToWidget extends Composite{ @Override public void onClick(ClickEvent arg0) { - connected.setRemove(connect.getValue()); + connected.setConnect(connect.getValue()); } }); rightPanel.add(connect); @@ -200,20 +200,29 @@ public class ConnectToWidget extends Composite{ Paragraph semanticIdentifier = new Paragraph("UUID:"); final TextBox box = new TextBox(); final Icon icon = new Icon(IconType.OK_SIGN); + icon.setVisible(false); + icon.getElement().getStyle().setMarginLeft(10, Unit.PX); + icon.getElement().getStyle().setMarginTop(5, Unit.PX); final Anchor view = new Anchor(); view.setText("View"); view.setTitle("Click to inspect the record"); view.setTarget("_blank"); view.getElement().getStyle().setFontWeight(FontWeight.BOLD); view.setVisible(false); - icon.setVisible(false); + + // add a couple of handlers box.addKeyPressHandler(new KeyPressHandler() { @Override public void onKeyPress(KeyPressEvent event) { GWT.log("onKeyPress " + event.getNativeEvent().getKeyCode()); - if(!(event.getNativeEvent().getKeyCode() == KeyCodes.KEY_BACKSPACE || event.getNativeEvent().getKeyCode() == KeyCodes.KEY_DELETE)) - validateUUID(box, cb, icon, view, acceptedDomain); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + @Override + public void execute() { + box.setFocus(false); + } + }); } }); box.addChangeHandler(new ChangeHandler() { @@ -268,12 +277,14 @@ public class ConnectToWidget extends Composite{ protected void validateUUID(final TextBox box, final ConnectedBean c, final Icon icon, final Anchor view, final String acceptedDomain) { final String currentText = box.getText().trim(); + c.setKnowledgeBaseId(null); + c.setConnect(false); + icon.setVisible(false); + view.setVisible(false); + icon.setSpin(false); - if(currentText == null || currentText.isEmpty()){ - icon.setVisible(false); - view.setVisible(false); + if(currentText == null || currentText.isEmpty()) return; - } if(!currentText.matches(REGEX_UUID)){ icon.setType(IconType.BAN_CIRCLE); @@ -294,23 +305,23 @@ public class ConnectToWidget extends Composite{ @Override public void onSuccess(String result) { + icon.setSpin(false); + if(result != null){ c.setKnowledgeBaseId(currentText); + c.setConnect(true); icon.setType(IconType.OK_CIRCLE); - icon.setSpin(false); - icon.setTitle(""); - icon.setVisible(true); + icon.setTitle("Accepted"); view.setHref(result); view.setVisible(true); } else{ icon.setType(IconType.BAN_CIRCLE); icon.setTitle("Not a valid UUID"); - icon.setSpin(false); - icon.setVisible(true); view.setVisible(false); } + icon.setVisible(true); box.setEnabled(true); } @@ -319,6 +330,8 @@ public class ConnectToWidget extends Composite{ box.setEnabled(true); icon.setSpin(false); view.setVisible(false); + icon.setType(IconType.BAN_CIRCLE); + icon.setTitle(caught.getMessage()); } }); @@ -330,25 +343,25 @@ public class ConnectToWidget extends Composite{ */ public List getConnectList() { - //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; - return null; + List toReturn = new ArrayList<>(); + + if(currentlyConnected != null) + toReturn.addAll(currentlyConnected); + + if(suggestedByKnowledgeBase != null) + toReturn.addAll(suggestedByKnowledgeBase); + + for (Tuple p : connectList) { + ConnectedBean potentialConnection = (ConnectedBean) p.getO(); + String suggestedIdentifier = potentialConnection.getKnowledgeBaseId(); + if(suggestedIdentifier == null || suggestedIdentifier.isEmpty()) + continue; + else + toReturn.add(potentialConnection); + } + + return toReturn; + } } 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 25487c7..764da26 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 @@ -91,7 +91,6 @@ public class SimilarGRSFRecordWidget extends Composite { }); } - // add the existing ones, if any int index = 0; for (final SimilarGRSFRecord similarGRSFRecord : availableGRSFSimilarRecords) { Widget widget = buildWidgetForSimilarRecord(similarGRSFRecord); diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SuggestMerges.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SuggestMerges.java index 4c64674..fa8696f 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SuggestMerges.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SuggestMerges.java @@ -14,6 +14,8 @@ import com.github.gwtbootstrap.client.ui.TextBox; import com.github.gwtbootstrap.client.ui.constants.ButtonType; import com.github.gwtbootstrap.client.ui.constants.IconType; import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.Style.Float; import com.google.gwt.dom.client.Style.FontWeight; import com.google.gwt.dom.client.Style.Unit; @@ -21,7 +23,6 @@ import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.event.dom.client.KeyPressHandler; import com.google.gwt.uibinder.client.UiBinder; @@ -57,7 +58,7 @@ public class SuggestMerges extends Composite { public SuggestMerges(GRSFManageWidgetServiceAsync service) { initWidget(uiBinder.createAndBindUi(this)); this.service = service; - + // manage the "suggest button" addSimilarRecord.setText("Add Merge"); addSimilarRecord.getElement().getStyle().setFontWeight(FontWeight.BOLD); @@ -99,20 +100,29 @@ public class SuggestMerges extends Composite { Paragraph identifier = new Paragraph("UUID:"); final TextBox box = new TextBox(); final Icon icon = new Icon(IconType.OK_SIGN); + icon.setVisible(false); + icon.getElement().getStyle().setMarginLeft(10, Unit.PX); + icon.getElement().getStyle().setMarginTop(5, Unit.PX); final Anchor view = new Anchor(); view.setText("View"); view.setTitle("Click to inspect the record"); view.setTarget("_blank"); view.getElement().getStyle().setFontWeight(FontWeight.BOLD); view.setVisible(false); - icon.setVisible(false); + + // add a couple of handlers box.addKeyPressHandler(new KeyPressHandler() { @Override public void onKeyPress(KeyPressEvent event) { GWT.log("onKeyPress " + event.getNativeEvent().getKeyCode()); - if(!(event.getNativeEvent().getKeyCode() == KeyCodes.KEY_BACKSPACE || event.getNativeEvent().getKeyCode() == KeyCodes.KEY_DELETE)) - validateUUID(box, s, icon, view, s.getDomain()); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + @Override + public void execute() { + box.setFocus(false); + } + }); } }); box.addChangeHandler(new ChangeHandler() { @@ -120,7 +130,7 @@ public class SuggestMerges extends Composite { @Override public void onChange(ChangeEvent event) { GWT.log("onChange"); - validateUUID(box, s, icon, view, s.getDomain()); + validateUUID(box, s, icon, view); } }); box.setWidth("511px"); @@ -154,6 +164,7 @@ public class SuggestMerges extends Composite { if(pair.getO().equals(s)){ pair.getW().removeFromParent(); iterator.remove(); + break; } } } @@ -177,64 +188,64 @@ public class SuggestMerges extends Composite { * @param icon * @param view */ - protected void validateUUID(final TextBox box, final SimilarGRSFRecord s, final Icon icon, final Anchor view, String domain) { + protected void validateUUID(final TextBox box, final SimilarGRSFRecord s, final Icon icon, final Anchor view) { final String currentText = box.getText().trim(); + s.setKnowledgeBaseId(null); + s.setSuggestedMerge(false); + icon.setVisible(false); + view.setVisible(false); + icon.setSpin(false); - if(currentText == null || currentText.isEmpty()){ - s.setKnowledgeBaseId(null); - icon.setVisible(false); - view.setVisible(false); + if(currentText == null || currentText.isEmpty()) return; - } - + if(!currentText.matches(REGEX_UUID)){ - s.setKnowledgeBaseId(null); icon.setType(IconType.BAN_CIRCLE); icon.setTitle("Not a valid UUID"); icon.setVisible(true); - view.setVisible(false); return; } // else check at server side if it exists GWT.log("Text changed to " + currentText); box.setEnabled(false); + icon.setVisible(true); icon.setIcon(IconType.ROTATE_RIGHT); + icon.setTitle("Checking..."); icon.setSpin(true); - service.checkIdentifierExistsInDomain(currentText, domain, new AsyncCallback() { + service.checkIdentifierExistsInDomain(currentText, s.getDomain(), new AsyncCallback() { @Override public void onSuccess(String result) { - + icon.setSpin(false); + if(result != null){ s.setKnowledgeBaseId(currentText); + s.setSuggestedMerge(true); icon.setType(IconType.OK_CIRCLE); - icon.setSpin(false); - icon.setTitle(""); - icon.setVisible(true); + icon.setTitle("Accepted"); view.setHref(result); view.setVisible(true); } else{ - s.setKnowledgeBaseId(null); icon.setType(IconType.BAN_CIRCLE); icon.setTitle("Not a valid UUID"); - icon.setSpin(false); - icon.setVisible(true); view.setVisible(false); } - + icon.setVisible(true); box.setEnabled(true); } @Override public void onFailure(Throwable caught) { - s.setKnowledgeBaseId(null); box.setEnabled(true); icon.setSpin(false); + icon.setType(IconType.BAN_CIRCLE); + icon.setVisible(true); view.setVisible(false); + icon.setTitle(caught.getMessage()); } }); 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 e1d9dd5..795f4a1 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 @@ -484,6 +484,21 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS @Override public String checkIdentifierExistsInDomain(String id, String domain) throws Exception { + + if(!Utils.isIntoPortal()){ + + boolean throwException = Math.random() > 0.5; + + // simulate some delay... + Thread.sleep(2500); + + if(throwException) + throw new Exception("The suggested record is not a GRSF record"); + + return "http://data.d4science.org/catalogue/grsf_admin/" + id; + + } + String scopePerCurrentUrl = Utils.getScopeFromClientUrl(getThreadLocalRequest()); DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl); String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername();