diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C4A0AB b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C4A0AB deleted file mode 100644 index b0193cf..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C4A0AB and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C686E4 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C686E4 deleted file mode 100644 index 23e187d..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C686E4 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C69932 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C69932 deleted file mode 100644 index 265d267..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C69932 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C7B46A b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C7B46A deleted file mode 100644 index f363796..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C7B46A and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C82F49 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C82F49 deleted file mode 100644 index 64c741b..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C82F49 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C85FFC b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C85FFC deleted file mode 100644 index 3a46b14..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C85FFC and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0CE5C8A b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0CE5C8A deleted file mode 100644 index b623dbf..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0CE5C8A and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D05F50 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D05F50 deleted file mode 100644 index 1f05a4a..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D05F50 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D10D96 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D10D96 deleted file mode 100644 index 23ed0fd..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D10D96 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D15AB2 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D15AB2 deleted file mode 100644 index a73c4f6..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D15AB2 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D20BB3 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D20BB3 deleted file mode 100644 index 1973c79..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D20BB3 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D25FBF b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D25FBF deleted file mode 100644 index 52178d3..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D25FBF and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D531A8 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D531A8 deleted file mode 100644 index 0981a11..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D531A8 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D537D8 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D537D8 deleted file mode 100644 index c6378fe..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D537D8 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D6C73C b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D6C73C deleted file mode 100644 index 25526cf..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D6C73C and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D85E64 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D85E64 deleted file mode 100644 index 25020ba..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D85E64 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D984F4 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D984F4 deleted file mode 100644 index 0416831..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0D984F4 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DA3E1D b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DA3E1D deleted file mode 100644 index e99186b..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DA3E1D and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DA9F5C b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DA9F5C deleted file mode 100644 index d9fabe2..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DA9F5C and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DBB626 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DBB626 deleted file mode 100644 index ea221dd..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DBB626 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DC2131 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DC2131 deleted file mode 100644 index 419b91c..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DC2131 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DEB053 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DEB053 deleted file mode 100644 index 7eccad4..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DEB053 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DEFD00 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DEFD00 deleted file mode 100644 index 3fa814d..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DEFD00 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E3236E b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E3236E deleted file mode 100644 index b4cb400..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E3236E and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E44EB3 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E44EB3 deleted file mode 100644 index 8eb3e54..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E44EB3 and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E4F31C b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E4F31C deleted file mode 100644 index 095f87a..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E4F31C and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E5D5DD b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E5D5DD deleted file mode 100644 index b938fac..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E5D5DD and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E654EA b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E654EA deleted file mode 100644 index c3bc9bf..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E654EA and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E8002C b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E8002C deleted file mode 100644 index 3127be7..0000000 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0E8002C and /dev/null differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C49E69 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD91E26AF similarity index 94% rename from gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C49E69 rename to gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD91E26AF index 277659c..03e8b31 100644 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0C49E69 and b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD91E26AF differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD91E29E0 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD91E29E0 new file mode 100644 index 0000000..2be28ea Binary files /dev/null and b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD91E29E0 differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD922F681 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD922F681 new file mode 100644 index 0000000..8e47290 Binary files /dev/null and b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD922F681 differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD923F173 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD923F173 new file mode 100644 index 0000000..5273f50 Binary files /dev/null and b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD923F173 differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD924CC71 b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD924CC71 new file mode 100644 index 0000000..eb1fd79 Binary files /dev/null and b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD924CC71 differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DEAEFF b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD9271A25 similarity index 98% rename from gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DEAEFF rename to gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD9271A25 index 937cd40..87e5e63 100644 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DEAEFF and b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD9271A25 differ diff --git a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DEB01D b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD9271BA1 similarity index 95% rename from gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DEB01D rename to gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD9271BA1 index da6ac56..50804cf 100644 Binary files a/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FC0DEB01D and b/gwt-unitCache/gwt-unitCache-c2c3dd5baf648a0bb199047a818be5e560f48982-0000015FD9271BA1 differ diff --git a/pom.xml b/pom.xml index 036fb7f..fa146d1 100644 --- a/pom.xml +++ b/pom.xml @@ -112,18 +112,18 @@ org.gcube.core common-scope-maps - provided + compile org.gcube.core common-encryption - provided + compile org.gcube.common authorization-client - provided + compile junit @@ -234,4 +234,5 @@ + war 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 d087a63..c5b112a 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 @@ -14,7 +14,6 @@ public interface GRSFManageWidgetService extends RemoteService { */ boolean isAdminUser(); - /** * Get the product bean from the product identifier * @param identifier @@ -26,6 +25,22 @@ public interface GRSFManageWidgetService extends RemoteService { /** * Notify product update */ - String notifyProductUpdate(ManageProductBean bean); + String notifyProductUpdate(ManageProductBean bean) throws Exception; + + /** + * Check that a record with such semantic identifier exists + * @param semanticIdentifier + * @return true or false + */ + boolean checkSemanticIdentifierExists(String semanticIdentifier) throws Exception; + /** + * Check that a record with such semantic identifier exists in a given domain + * @param semanticIdentifier + * @param domain + * @return + * @throws Exception + */ + boolean checkSemanticIdentifierExistsInDomain(String semanticIdentifier, String domain) throws Exception; + } 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 bd0885b..d0fc774 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 @@ -21,4 +21,10 @@ public interface GRSFManageWidgetServiceAsync { void isAdminUser(AsyncCallback callback); + void checkSemanticIdentifierExists(String semanticIdentifier, + AsyncCallback callback); + + void checkSemanticIdentifierExistsInDomain(String semanticIdentifier, + String domain, AsyncCallback callback); + } 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 be6064a..69691a8 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 @@ -142,7 +142,10 @@ public class ManageProductWidget extends Composite{ // the objects to be managed private ManageProductBean bean; private final static List STATUS = new ArrayList(Arrays.asList(Status.values())); - + + // similar records and to connect widgets + private SimilarGRSFRecordWidget similarRecordPanel; + private ConnectToWidget connectWidget; /** * Build a ManageProduct widget for the product with the specified id. @@ -184,8 +187,6 @@ public class ManageProductWidget extends Composite{ @Override public void onSuccess(Boolean result) { - GWT.log("Get " + result); - if(!result){ showInfo(NO_ADMIN_ROLE, AlertType.ERROR); @@ -205,7 +206,6 @@ public class ManageProductWidget extends Composite{ @Override public void onSuccess(ManageProductBean resBean) { - // GWT.log("Get " + resBean); if(resBean == null){ showInfo(ERROR_ON_RETRIEVING_BEAN, AlertType.ERROR); @@ -230,10 +230,12 @@ public class ManageProductWidget extends Composite{ // manage similar GRSF records, if any List availableGRSFSimilarRecords = bean.getSimilarGrsfRecords(); - panelForSimilarGRSFRecords.add(new SimilarGRSFRecordWidget(availableGRSFSimilarRecords)); + similarRecordPanel = new SimilarGRSFRecordWidget(availableGRSFSimilarRecords, service); + panelForSimilarGRSFRecords.add(similarRecordPanel); // prepare "connect" panel - panelForConnectOtherRecords.add(new ConnectToWidget()); + connectWidget = new ConnectToWidget(bean, service); + panelForConnectOtherRecords.add(connectWidget); // check if we need to show more if(bean.getExtrasIfAvailable() != null && !bean.getExtrasIfAvailable().isEmpty()) @@ -338,6 +340,10 @@ public class ManageProductWidget extends Composite{ cancelButton.setEnabled(false); confirmButton.setEnabled(false); loaderIcon.setVisible(true); + + // update similar records and to connect + bean.setConnectTo(connectWidget.getConnectList()); + bean.setSimilarGrsfRecords(similarRecordPanel.getSimilarRecords()); // set new values bean.setAnnotation(new HTML(annotationArea.getText().trim()).getText()); @@ -378,7 +384,6 @@ public class ManageProductWidget extends Composite{ @UiHandler("cancelButton") void onCancelButton(ClickEvent ce){ - // just hide the panel manageProductModal.hide(); } 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 d32632b..356c7eb 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 @@ -106,7 +106,7 @@ Suggest connections with other records: - + 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 e630a68..ad5e107 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 @@ -1,8 +1,32 @@ package org.gcube.datacatalogue.grsf_manage_widget.client.view.subwidgets; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.gcube.datacatalogue.grsf_manage_widget.client.GRSFManageWidgetServiceAsync; +import org.gcube.datacatalogue.grsf_manage_widget.shared.ConnectBean; +import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean; + +import com.github.gwtbootstrap.client.ui.Button; +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.Unit; +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.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.Composite; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class ConnectToWidget extends Composite{ @@ -13,9 +37,130 @@ public class ConnectToWidget extends Composite{ interface ConnectToWidgetUiBinder extends UiBinder { } - public ConnectToWidget() { + @UiField + VerticalPanel connectPanel; + + @UiField + Button suggestRecord; + + private GRSFManageWidgetServiceAsync service; + private List connectList = new ArrayList(0); + + public ConnectToWidget(final ManageProductBean bean, GRSFManageWidgetServiceAsync service) { initWidget(uiBinder.createAndBindUi(this)); + + this.service = service; + + String acceptedDomain = bean.getGrsfDomain().equalsIgnoreCase("stock") ? "Fishery" : "Stock"; + suggestRecord.setTitle("Connect this " + bean.getGrsfDomain() + " record to a " + acceptedDomain + " record "); + suggestRecord.setIcon(IconType.PLUS_SIGN); + suggestRecord.getElement().getStyle().setFloat(Float.RIGHT); + + // add handler + suggestRecord.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent arg0) { + + ConnectBean cb = new ConnectBean(); + cb.setSourceDomain(bean.getGrsfDomain()); + Widget w = buildWidgetConnect(cb); + connectList.add(new Pair(cb, w)); + connectPanel.add(w); + + } + }); + + } + + /** + * Builds up a widget for connecting records. + * @param w the widget + * @param cb the connectBean. + */ + private Widget buildWidgetConnect(final ConnectBean cb){ + + VerticalPanel main = new VerticalPanel(); + main.setWidth("90%"); + 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("Semantic Identifier:"); + final TextBox box = new TextBox(); + box.addKeyPressHandler(new KeyPressHandler() { + + @Override + public void onKeyPress(KeyPressEvent event) { + + String currentText = box.getText().trim(); + GWT.log("Text changed to " + currentText); + cb.setDestSemanticIdentifier(currentText); + + } + }); + box.addChangeHandler(new ChangeHandler() { + + @Override + public void onChange(ChangeEvent event) { + + String currentText = box.getText().trim(); + GWT.log("Text changed to " + currentText); + cb.setDestSemanticIdentifier(currentText); + + } + }); + box.setWidth("512px"); + box.setPlaceholder("Insert the Semantic Identifier of the record to connect"); + + vpLeft.add(semanticIdentifier); + vpLeft.add(box); + + VerticalPanel vpRight = new VerticalPanel(); + vpRight.setWidth("20%"); + + Button removeExtra = new Button(); + removeExtra.setIcon(IconType.MINUS); + removeExtra.setTitle("Remove this connection"); + removeExtra.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent arg0) { + + // remove this object from the pairs list + Iterator iterator = connectList.iterator(); + while (iterator.hasNext()) { + Pair pair = (Pair) iterator + .next(); + if(pair.getO().equals(cb)){ + pair.getW().removeFromParent(); + iterator.remove(); + } + } + } + }); + vpRight.getElement().getStyle().setFloat(Float.RIGHT); + vpRight.add(removeExtra); + hp.add(vpLeft); + hp.add(vpRight); + HTML separator = new HTML("
"); + connectPanel.add(separator); + main.add(hp); + main.add(separator); + return main; } + public List getConnectList() { + + List toReturn = new ArrayList(0); + + for (Pair p : connectList) { + toReturn.add((ConnectBean) p.getO()); + } + + return toReturn; + } } diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/ConnectToWidget.ui.xml b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/ConnectToWidget.ui.xml index 96a50cd..8cd4bd1 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/ConnectToWidget.ui.xml +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/ConnectToWidget.ui.xml @@ -1,12 +1,9 @@ - - .important { - font-weight: bold; - } - - - + xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:b="urn:import:com.github.gwtbootstrap.client.ui"> + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/Pair.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/Pair.java new file mode 100644 index 0000000..2d5b538 --- /dev/null +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/Pair.java @@ -0,0 +1,25 @@ +package org.gcube.datacatalogue.grsf_manage_widget.client.view.subwidgets; + +import com.google.gwt.user.client.ui.Widget; + + +/** + * A class of pair: a widget and an object + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public class Pair { + private Object o; + private Widget w; + public Pair(Object o, Widget w){ + this.o = o; + this.w = w; + } + public Object getO(){ return o; } + public Widget getW(){ return w; } + public void setO(Object o){ this.o = o; } + public void setW(Widget w){ this.w = w; } + @Override + public String toString() { + return "Pair [o=" + o + ", w=" + w + "]"; + } +} \ No newline at end of file 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 721e3af..b571829 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 @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.gcube.datacatalogue.grsf_manage_widget.client.GRSFManageWidgetServiceAsync; import org.gcube.datacatalogue.grsf_manage_widget.shared.SimilarGRSFRecord; import com.github.gwtbootstrap.client.ui.Button; @@ -15,8 +16,12 @@ 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; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; +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; @@ -44,33 +49,19 @@ public class SimilarGRSFRecordWidget extends Composite { @UiField Button addSimilarRecord; - /** - * Class of Pairs - * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) - */ - class Pair { - private SimilarGRSFRecord s; - private Widget w; - public Pair(SimilarGRSFRecord s, Widget w){ - this.s = s; - this.w = w; - } - public SimilarGRSFRecord getS(){ return s; } - public Widget getW(){ return w; } - public void setS(SimilarGRSFRecord s){ this.s = s; } - public void setW(Widget w){ this.w = w; } - } - - protected List extraSimilarRecordsList = new ArrayList(0); + private List extraSimilarRecordsList = new ArrayList(0); private List availableGRSFSimilarRecords; + private GRSFManageWidgetServiceAsync service; + /** * Get widget for available similar grsf records * @param availableGRSFSimilarRecords + * @param service */ - public SimilarGRSFRecordWidget(List availableGRSFSimilarRecords) { + public SimilarGRSFRecordWidget(List availableGRSFSimilarRecords, GRSFManageWidgetServiceAsync service) { initWidget(uiBinder.createAndBindUi(this)); - + this.service = service; this.availableGRSFSimilarRecords = availableGRSFSimilarRecords; addSimilarRecord.getElement().getStyle().setFloat(Float.RIGHT); @@ -85,7 +76,7 @@ public class SimilarGRSFRecordWidget extends Composite { // manage the "suggest button" addSimilarRecord.setIcon(IconType.PLUS_SIGN); addSimilarRecord.getElement().getStyle().setFloat(Float.RIGHT); - addSimilarRecord.setTitle("Suggest a Similar Record by using its GRSF UUID"); + addSimilarRecord.setTitle("Suggest a Similar Record by using its GRSF Semantic Identifier"); // add handler addSimilarRecord.addClickHandler(new ClickHandler() { @@ -126,7 +117,7 @@ public class SimilarGRSFRecordWidget extends Composite { description.setTitle("Description: " + similarGRSFRecord.getDescription()); leftPanel.add(description); } - Paragraph semanticIdentifier = new Paragraph("Semantic Identifier " + + Paragraph semanticIdentifier = new Paragraph("Semantic Identifier: " + similarGRSFRecord.getSemanticIdentifier()); leftPanel.add(semanticIdentifier); @@ -182,11 +173,32 @@ public class SimilarGRSFRecordWidget extends Composite { vpLeft.getElement().getStyle().setMarginLeft(15, Unit.PX); vpLeft.setWidth("80%"); Paragraph semanticIdentifier = new Paragraph("Semantic Identifier:"); - TextBox box = new TextBox(); - box.setWidth("70%"); + final TextBox box = new TextBox(); + box.addKeyPressHandler(new KeyPressHandler() { + + @Override + public void onKeyPress(KeyPressEvent event) { + + String currentText = box.getText().trim(); + GWT.log("Text changed to " + currentText); + s.setSemanticIdentifier(currentText); + + } + }); + box.addChangeHandler(new ChangeHandler() { + + @Override + public void onChange(ChangeEvent event) { + + String currentText = box.getText().trim(); + GWT.log("Text changed to " + currentText); + s.setSemanticIdentifier(currentText); + + } + }); + box.setWidth("511px"); box.setPlaceholder("Insert the Semantic Identifier of the suggested record"); - // TODO add handler for remote GRSF semantic id check vpLeft.add(semanticIdentifier); vpLeft.add(box); @@ -221,9 +233,9 @@ public class SimilarGRSFRecordWidget extends Composite { // remove this object from the pairs list Iterator iterator = extraSimilarRecordsList.iterator(); while (iterator.hasNext()) { - SimilarGRSFRecordWidget.Pair pair = (SimilarGRSFRecordWidget.Pair) iterator + Pair pair = (Pair) iterator .next(); - if(pair.getS().equals(s)){ + if(pair.getO().equals(s)){ pair.getW().removeFromParent(); iterator.remove(); } @@ -246,19 +258,17 @@ public class SimilarGRSFRecordWidget extends Composite { * Get the whole of similar records * @return */ - public List getSuggestedRecords(){ + public List getSimilarRecords(){ if(availableGRSFSimilarRecords == null) availableGRSFSimilarRecords = new ArrayList(); for (Pair p : extraSimilarRecordsList) { - availableGRSFSimilarRecords.add(p.getS()); + availableGRSFSimilarRecords.add((SimilarGRSFRecord) p.getO()); } return availableGRSFSimilarRecords; } - - } diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SourceWidget.ui.xml b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SourceWidget.ui.xml index 316e4e7..db15194 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SourceWidget.ui.xml +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/client/view/subwidgets/SourceWidget.ui.xml @@ -1,11 +1,6 @@ - - .important { - font-weight: bold; - } - 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 61d703f..b6e6c95 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 @@ -149,9 +149,9 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS similarRecords.add(Utils.similarGRSFRecordFromJson(similarGRSFRecord)); } } - + logger.debug("SimilarGRSFRecords are " + similarRecords); - + // Get sources List resources = record.getResources(); List sources = new ArrayList(3); @@ -221,4 +221,40 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS return false; } + @Override + public boolean checkSemanticIdentifierExists(String semanticIdentifier) + throws Exception { + + return getDataset(semanticIdentifier) != null; + } + + @Override + public boolean checkSemanticIdentifierExistsInDomain(String semanticIdentifier, String domain) + throws Exception { + + + CkanDataset dataset = getDataset(semanticIdentifier); + + // look for the right domain this time + List extrasAsPairs = dataset.getExtras(); + + for (CkanPair ckanPair : extrasAsPairs) { + if(ckanPair.getKey().contains(Constants.DOMAIN_CUSTOM_KEY)){ + return ckanPair.getValue().equalsIgnoreCase(domain); + } + } + + return false; + } + + private CkanDataset getDataset(String semanticIdentifier) throws Exception{ + + String scopePerCurrentUrl = Utils.getScopeFromClientUrl(getThreadLocalRequest()); + DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl); + String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername(); + CkanDataset dataset = Utils.getRecordBySemanticIdentifier(semanticIdentifier, catalogue, catalogue.getApiKeyFromUsername(username)); + return dataset; + + } + } 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 20b8e86..6cb0250 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 @@ -528,6 +528,8 @@ public class Utils { logger.warn(message); throw new Exception(message); } + + logger.info("Result size is " + datasets.size()); if(datasets.size() == 1) return datasets.get(0); @@ -536,8 +538,10 @@ public class Utils { // 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)) + 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; + } } diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/ConnectBean.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/ConnectBean.java new file mode 100644 index 0000000..c6320ca --- /dev/null +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/ConnectBean.java @@ -0,0 +1,55 @@ +package org.gcube.datacatalogue.grsf_manage_widget.shared; + + +/** + * Connect the current record with another record + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public class ConnectBean { + + private String sourceIdentifier; + private String sourceDomain; // i.e. Stock or Fishery + private String destSemanticIdentifier; // the dest semantic indentifier of a Fishery or Stock (the link is from a Stock to a Fishery and viceversa) + + public ConnectBean() { + super(); + } + /** + * @param sourceIdentifier + * @param sourceDomain + * @param destSemanticIdentifier + */ + public ConnectBean(String sourceIdentifier, String sourceDomain, + String destSemanticIdentifier) { + super(); + this.sourceIdentifier = sourceIdentifier; + this.sourceDomain = sourceDomain; + this.destSemanticIdentifier = destSemanticIdentifier; + } + + public String getSourceIdentifier() { + return sourceIdentifier; + } + public void setSourceIdentifier(String sourceIdentifier) { + this.sourceIdentifier = sourceIdentifier; + } + public String getDestSemanticIdentifier() { + return destSemanticIdentifier; + } + public void setDestSemanticIdentifier(String destSemanticIdentifier) { + this.destSemanticIdentifier = destSemanticIdentifier; + } + + public String getSourceDomain() { + return sourceDomain; + } + public void setSourceDomain(String sourceDomain) { + this.sourceDomain = sourceDomain; + } + @Override + public String toString() { + return "ConnectBean [sourceIdentifier=" + sourceIdentifier + + ", sourceDomain=" + sourceDomain + + ", destSemanticIdentifier=" + destSemanticIdentifier + "]"; + } +} diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/ManageProductBean.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/ManageProductBean.java index 4f033fc..c635eb4 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/ManageProductBean.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/shared/ManageProductBean.java @@ -28,6 +28,7 @@ public class ManageProductBean implements Serializable{ private Map extrasIfAvailable; // read from GRSFManageEntries resource private List sources; // sources for this record private List similarGrsfRecords; + private List connectTo; public ManageProductBean() { super(); @@ -180,35 +181,26 @@ public class ManageProductBean implements Serializable{ this.shortNameUpdated = shortNameUpdated; } - @Override - public String toString() { - return "ManageProductBean [" - + (semanticIdentifier != null ? "semanticIdentifier=" - + semanticIdentifier + ", " : "") - + (catalogueIdentifier != null ? "catalogueIdentifier=" - + catalogueIdentifier + ", " : "") - + (knowledgeBaseIdentifier != null ? "knowledgeBaseIdentifier=" - + knowledgeBaseIdentifier + ", " : "") - + (grsfType != null ? "grsfType=" + grsfType + ", " : "") - + (grsfDomain != null ? "grsfDomain=" + grsfDomain + ", " : "") - + (grsfName != null ? "grsfName=" + grsfName + ", " : "") - + (shortName != null ? "shortName=" + shortName + ", " : "") - + (shortNameUpdated != null ? "shortNameUpdated=" - + shortNameUpdated + ", " : "") - + "traceabilityFlag=" - + traceabilityFlag - + ", " - + (currentStatus != null ? "currentStatus=" + currentStatus - + ", " : "") - + (newStatus != null ? "newStatus=" + newStatus + ", " : "") - + (annotation != null ? "annotation=" + annotation + ", " : "") - + (extrasIfAvailable != null ? "extrasIfAvailable=" - + extrasIfAvailable + ", " : "") - + (sources != null ? "sources=" + sources + ", " : "") - + (similarGrsfRecords != null ? "similarGrsfRecords=" - + similarGrsfRecords : "") + "]"; + public List getConnectTo() { + return connectTo; } + public void setConnectTo(List connectTo) { + this.connectTo = connectTo; + } - + @Override + public String toString() { + return "ManageProductBean [semanticIdentifier=" + semanticIdentifier + + ", catalogueIdentifier=" + catalogueIdentifier + + ", knowledgeBaseIdentifier=" + knowledgeBaseIdentifier + + ", grsfType=" + grsfType + ", grsfDomain=" + grsfDomain + + ", grsfName=" + grsfName + ", shortName=" + shortName + + ", shortNameUpdated=" + shortNameUpdated + + ", traceabilityFlag=" + traceabilityFlag + ", currentStatus=" + + currentStatus + ", newStatus=" + newStatus + ", annotation=" + + annotation + ", extrasIfAvailable=" + extrasIfAvailable + + ", sources=" + sources + ", similarGrsfRecords=" + + similarGrsfRecords + ", connectTo=" + connectTo + "]"; + } } diff --git a/src/main/webapp/GRSFManageWidget.css b/src/main/webapp/GRSFManageWidget.css index 7aca7ac..c257dd6 100644 --- a/src/main/webapp/GRSFManageWidget.css +++ b/src/main/webapp/GRSFManageWidget.css @@ -1,34 +1,6 @@ -/** Add css rules here for your application. */ - - -/** Example rules used by the template application (remove for your app) */ -h1 { - font-size: 2em; - font-weight: bold; - color: #777777; - margin: 40px 0px 70px; - text-align: center; -} - -.sendButton { - display: block; - font-size: 16pt; -} - -/** Most GWT widgets already have a style name defined */ -.gwt-DialogBox { - width: 400px; -} - -.dialogVPanel { - margin: 5px; -} - -.serverResponseLabelError { - color: red; -} - -/** Set ids using widget.getElement().setId("idOfElement") */ -#closeButton { - margin: 15px 6px 6px; -} +.error-text-box { + border: 1px solid red; + background: white url("../img/validation_error_icon.gif") + no-repeat left center; + padding-left: 15px !important; +} \ No newline at end of file diff --git a/src/main/webapp/img/validation_error_icon.png b/src/main/webapp/img/validation_error_icon.png new file mode 100644 index 0000000..5232207 Binary files /dev/null and b/src/main/webapp/img/validation_error_icon.png differ