to be finished

git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/widgets/grsf-manage-widget@160149 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Costantino Perciante 2017-12-07 11:37:21 +00:00
parent db0d9b057e
commit bff7a59c55
10 changed files with 170 additions and 105 deletions

View File

@ -26,7 +26,7 @@ public interface GRSFManageWidgetService extends RemoteService {
* Notify product update
*/
String notifyProductUpdate(ManageProductBean bean) throws Exception;
/**
* Check that a record with such semantic identifier exists
* @param semanticIdentifier
@ -42,5 +42,23 @@ public interface GRSFManageWidgetService extends RemoteService {
* @throws Exception
*/
boolean checkSemanticIdentifierExistsInDomain(String semanticIdentifier, String domain) throws Exception;
/**
* Identifier of the record (UUID)
* @param id
* @return
* @throws Exception
*/
boolean checkIdentifierExists(String id) throws Exception;
/**
* Identifier of the record (UUID)
* @param id
* @param domain (stock or fishery)
* @return
* @throws Exception
*/
boolean checkIdentifierExistsInDomain(String id, String domain) throws Exception;
}

View File

@ -27,4 +27,10 @@ public interface GRSFManageWidgetServiceAsync {
void checkSemanticIdentifierExistsInDomain(String semanticIdentifier,
String domain, AsyncCallback<Boolean> callback);
void checkIdentifierExists(String id,
AsyncCallback<Boolean> callback);
void checkIdentifierExistsInDomain(String id,
String domain, AsyncCallback<Boolean> callback);
}

View File

@ -128,12 +128,12 @@ public class ManageProductWidget extends Composite{
public static final String LOADING_IMAGE_URL = GWT.getModuleBaseURL() + "../images/loader.gif";
// messages used here and there
private final static String STATUS_UPDATE_SUCCESS = "The item has been correctly updated. Thanks for your collaboration!";
private final static String STATUS_UPDATE_ERROR = "Sorry, there was a problem while trying to update the status of this item";
private final static String STATUS_UPDATE_SUCCESS = "The record has been correctly updated. Thanks for your collaboration!";
private final static String STATUS_UPDATE_ERROR = "Sorry, there was a problem while trying to update the status of this record";
protected static final String ERROR_ON_RETRIEVING_BEAN = "It seems there was a problem while contacting the service...";
protected static final String NO_GRSF_RECORD_BEAN = "This item is not a GRSF record, thus it cannot be managed";
protected static final String NO_GRSF_RECORD_BEAN = "This record is not a GRSF record, thus it cannot be managed";
protected static final String NO_ADMIN_ROLE = "Sorry but it seems you do not have the rights to manage items."
protected static final String NO_ADMIN_ROLE = "Sorry but it seems you do not have the rights to manage records."
+ " You are suggested to contact the VRE Manager if something is wrong with this";
// event bus shared with the portlet
@ -142,8 +142,8 @@ public class ManageProductWidget extends Composite{
// the objects to be managed
private ManageProductBean bean;
private final static List<Status> STATUS = new ArrayList<Status>(Arrays.asList(Status.values()));
// similar records and to connect widgets
// similar records and to connect widgets references
private SimilarGRSFRecordWidget similarRecordPanel;
private ConnectToWidget connectWidget;
@ -230,11 +230,11 @@ public class ManageProductWidget extends Composite{
// manage similar GRSF records, if any
List<SimilarGRSFRecord> availableGRSFSimilarRecords = bean.getSimilarGrsfRecords();
similarRecordPanel = new SimilarGRSFRecordWidget(availableGRSFSimilarRecords, service);
similarRecordPanel = new SimilarGRSFRecordWidget(availableGRSFSimilarRecords/*, service*/);
panelForSimilarGRSFRecords.add(similarRecordPanel);
// prepare "connect" panel
connectWidget = new ConnectToWidget(bean, service);
connectWidget = new ConnectToWidget(bean /*,service*/);
panelForConnectOtherRecords.add(connectWidget);
// check if we need to show more
@ -340,7 +340,10 @@ public class ManageProductWidget extends Composite{
cancelButton.setEnabled(false);
confirmButton.setEnabled(false);
loaderIcon.setVisible(true);
// get short name
bean.setShortNameUpdated(shortNameTextBox.getText());
// update similar records and to connect
bean.setConnectTo(connectWidget.getConnectList());
bean.setSimilarGrsfRecords(similarRecordPanel.getSimilarRecords());
@ -348,6 +351,9 @@ public class ManageProductWidget extends Composite{
// set new values
bean.setAnnotation(new HTML(annotationArea.getText().trim()).getText());
bean.setNewStatus(Status.fromString(listBoxStatus.getSelectedItemText()));
// traceability flag
bean.setTraceabilityFlag(traceabilityFlag.getValue());
service.notifyProductUpdate(bean, new AsyncCallback<String>() {
@ -371,7 +377,6 @@ public class ManageProductWidget extends Composite{
@Override
public void onFailure(Throwable caught) {
manageProductModal.setCloseVisible(true);
cancelButton.setEnabled(true);
confirmButton.setEnabled(true);

View File

@ -4,7 +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.common.enums.Product_Type;
import org.gcube.datacatalogue.grsf_manage_widget.shared.ConnectBean;
import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean;
@ -43,15 +43,14 @@ public class ConnectToWidget extends Composite{
@UiField
Button suggestRecord;
private GRSFManageWidgetServiceAsync service;
private List<Pair> connectList = new ArrayList<Pair>(0);
//private GRSFManageWidgetServiceAsync service;
private List<Tuple> connectList = new ArrayList<Tuple>(0);
public ConnectToWidget(final ManageProductBean bean, GRSFManageWidgetServiceAsync service) {
public ConnectToWidget(final ManageProductBean bean/*, GRSFManageWidgetServiceAsync service*/) {
initWidget(uiBinder.createAndBindUi(this));
this.service = service;
String acceptedDomain = bean.getGrsfDomain().equalsIgnoreCase("stock") ? "Fishery" : "Stock";
//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 ");
suggestRecord.setIcon(IconType.PLUS_SIGN);
suggestRecord.getElement().getStyle().setFloat(Float.RIGHT);
@ -64,21 +63,21 @@ public class ConnectToWidget extends Composite{
ConnectBean cb = new ConnectBean();
cb.setSourceDomain(bean.getGrsfDomain());
Widget w = buildWidgetConnect(cb);
connectList.add(new Pair(cb, w));
connectPanel.add(w);
Tuple t = buildWidgetConnect(cb);
connectList.add(t);
connectPanel.add(t.getW());
}
});
}
/**
* Builds up a widget for connecting records.
* @param w the widget
* @param cb the connectBean.
*/
private Widget buildWidgetConnect(final ConnectBean cb){
private Tuple buildWidgetConnect(final ConnectBean cb){
VerticalPanel main = new VerticalPanel();
main.setWidth("90%");
@ -88,32 +87,33 @@ public class ConnectToWidget extends Composite{
VerticalPanel vpLeft = new VerticalPanel();
vpLeft.getElement().getStyle().setMarginLeft(15, Unit.PX);
vpLeft.setWidth("80%");
Paragraph semanticIdentifier = new Paragraph("Semantic Identifier:");
Paragraph semanticIdentifier = new Paragraph("Record Identifier (UUID):");
final TextBox box = new TextBox();
box.setId("identifier-text");
box.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
String currentText = box.getText().trim();
GWT.log("Text changed to " + currentText);
cb.setDestSemanticIdentifier(currentText);
cb.setDestIdentifier(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);
cb.setDestIdentifier(currentText);
}
});
box.setWidth("512px");
box.setPlaceholder("Insert the Semantic Identifier of the record to connect");
box.setPlaceholder("Insert the Identifier (UUID) of the record to connect");
vpLeft.add(semanticIdentifier);
vpLeft.add(box);
@ -130,9 +130,9 @@ public class ConnectToWidget extends Composite{
public void onClick(ClickEvent arg0) {
// remove this object from the pairs list
Iterator<Pair> iterator = connectList.iterator();
Iterator<Tuple> iterator = connectList.iterator();
while (iterator.hasNext()) {
Pair pair = (Pair) iterator
Tuple pair = (Tuple) iterator
.next();
if(pair.getO().equals(cb)){
pair.getW().removeFromParent();
@ -149,17 +149,25 @@ public class ConnectToWidget extends Composite{
connectPanel.add(separator);
main.add(hp);
main.add(separator);
return main;
return new Tuple(cb, main, box);
}
/**
* Get the list of records to connect with this one
* @return
*/
public List<ConnectBean> getConnectList() {
List<ConnectBean> toReturn = new ArrayList<ConnectBean>(0);
for (Pair p : connectList) {
toReturn.add((ConnectBean) p.getO());
for (Tuple p : connectList) {
String suggestedIdentifier = ((ConnectBean)p.getO()).getDestIdentifier();
if(suggestedIdentifier == null || suggestedIdentifier.isEmpty())
continue;
else
toReturn.add((ConnectBean) p.getO());
}
return toReturn;
}

View File

@ -4,7 +4,6 @@ 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;
@ -49,19 +48,18 @@ public class SimilarGRSFRecordWidget extends Composite {
@UiField
Button addSimilarRecord;
private List<Pair> extraSimilarRecordsList = new ArrayList<Pair>(0);
private List<Tuple> extraSimilarRecordsList = new ArrayList<Tuple>(0);
private List<SimilarGRSFRecord> availableGRSFSimilarRecords;
private GRSFManageWidgetServiceAsync service;
//private GRSFManageWidgetServiceAsync service;
/**
* Get widget for available similar grsf records
* @param availableGRSFSimilarRecords
* @param service
*/
public SimilarGRSFRecordWidget(List<SimilarGRSFRecord> availableGRSFSimilarRecords, GRSFManageWidgetServiceAsync service) {
public SimilarGRSFRecordWidget(List<SimilarGRSFRecord> availableGRSFSimilarRecords/*, GRSFManageWidgetServiceAsync service*/) {
initWidget(uiBinder.createAndBindUi(this));
this.service = service;
//this.service = service;
this.availableGRSFSimilarRecords = availableGRSFSimilarRecords;
addSimilarRecord.getElement().getStyle().setFloat(Float.RIGHT);
@ -76,7 +74,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 Semantic Identifier");
addSimilarRecord.setTitle("Suggest a Similar Record by using its Identifier (UUID)");
// add handler
addSimilarRecord.addClickHandler(new ClickHandler() {
@ -86,9 +84,9 @@ public class SimilarGRSFRecordWidget extends Composite {
SimilarGRSFRecord s = new SimilarGRSFRecord(true);
Widget w = buildWidgetForExtraSimilarRecord(s);
extraSimilarRecordsList.add(new Pair(s, w));
extraSimilarRecordsList.add(new Tuple(s, w, null));
similarGrsfRecordsSuggestedPanel.add(w);
}
});
@ -117,10 +115,9 @@ public class SimilarGRSFRecordWidget extends Composite {
description.setTitle("Description: " + similarGRSFRecord.getDescription());
leftPanel.add(description);
}
Paragraph semanticIdentifier = new Paragraph("Semantic Identifier: " +
similarGRSFRecord.getSemanticIdentifier());
leftPanel.add(semanticIdentifier);
Paragraph identifier = new Paragraph("Record UUID: " +
similarGRSFRecord.getIdentifier());
leftPanel.add(identifier);
VerticalPanel rightPanel = new VerticalPanel();
rightPanel.setWidth("20%");
@ -172,34 +169,34 @@ public class SimilarGRSFRecordWidget extends Composite {
VerticalPanel vpLeft = new VerticalPanel();
vpLeft.getElement().getStyle().setMarginLeft(15, Unit.PX);
vpLeft.setWidth("80%");
Paragraph semanticIdentifier = new Paragraph("Semantic Identifier:");
Paragraph identifier = new Paragraph("Identifier (UUID):");
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);
s.setIdentifier(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);
s.setIdentifier(currentText);
}
});
box.setWidth("511px");
box.setPlaceholder("Insert the Semantic Identifier of the suggested record");
box.setPlaceholder("Insert the Identifier (UUID) of the suggested record");
vpLeft.add(semanticIdentifier);
vpLeft.add(identifier);
vpLeft.add(box);
// add merge checkbox
@ -231,9 +228,9 @@ public class SimilarGRSFRecordWidget extends Composite {
public void onClick(ClickEvent arg0) {
// remove this object from the pairs list
Iterator<Pair> iterator = extraSimilarRecordsList.iterator();
Iterator<Tuple> iterator = extraSimilarRecordsList.iterator();
while (iterator.hasNext()) {
Pair pair = (Pair) iterator
Tuple pair = (Tuple) iterator
.next();
if(pair.getO().equals(s)){
pair.getW().removeFromParent();
@ -263,8 +260,10 @@ public class SimilarGRSFRecordWidget extends Composite {
if(availableGRSFSimilarRecords == null)
availableGRSFSimilarRecords = new ArrayList<SimilarGRSFRecord>();
for (Pair p : extraSimilarRecordsList) {
for (Tuple p : extraSimilarRecordsList) {
SimilarGRSFRecord similarRecord = ((SimilarGRSFRecord)p.getO());
if(similarRecord.isExtra() && similarRecord.getIdentifier() == null || similarRecord.getIdentifier().isEmpty())
continue;
availableGRSFSimilarRecords.add((SimilarGRSFRecord) p.getO());
}

View File

@ -7,19 +7,27 @@ 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 {
public class Tuple {
private Object o;
private Widget w;
public Pair(Object o, Widget w){
private Widget w2;
public Tuple(Object o, Widget w, Widget w2){
this.o = o;
this.w = w;
this.w2 = w2;
}
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; }
public Widget getW2() {
return w2;
}
public void setW2(Widget w2) {
this.w2 = w2;
}
@Override
public String toString() {
return "Pair [o=" + o + ", w=" + w + "]";
return "Tuple [o=" + o + ", w=" + w + ", w2=" + w2 + "]";
}
}

View File

@ -63,7 +63,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
}
@Override
public String notifyProductUpdate(ManageProductBean bean) {
public String notifyProductUpdate(ManageProductBean bean) throws Exception{
logger.info("Creating notification for the bean " + bean + " to send to the knowledge base");
try{
@ -234,7 +234,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
CkanDataset dataset = getDataset(semanticIdentifier);
// look for the right domain this time
List<CkanPair> extrasAsPairs = dataset.getExtras();
@ -257,4 +257,35 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
}
@Override
public boolean checkIdentifierExists(String id)
throws Exception {
String scopePerCurrentUrl = Utils.getScopeFromClientUrl(getThreadLocalRequest());
DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl);
String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername();
return catalogue.getDataset(id, catalogue.getApiKeyFromUsername(username)) != null;
}
@Override
public boolean checkIdentifierExistsInDomain(String id,
String domain) throws Exception {
String scopePerCurrentUrl = Utils.getScopeFromClientUrl(getThreadLocalRequest());
DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl);
String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername();
CkanDataset dataset = catalogue.getDataset(id, catalogue.getApiKeyFromUsername(username));
if(dataset == null)
return false;
List<CkanPair> extrasAsPairs = dataset.getExtras();
for (CkanPair ckanPair : extrasAsPairs) {
if(ckanPair.getKey().contains(Constants.DOMAIN_CUSTOM_KEY)){
return ckanPair.getValue().equalsIgnoreCase(domain);
}
}
return false;
}
}

View File

@ -9,37 +9,30 @@ 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)
private String destIdentifier; // the dest 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) {
String destIdentifier) {
super();
this.sourceIdentifier = sourceIdentifier;
this.sourceDomain = sourceDomain;
this.destSemanticIdentifier = destSemanticIdentifier;
this.destIdentifier = destIdentifier;
}
public String getSourceIdentifier() {
return sourceIdentifier;
}
public void setSourceIdentifier(String sourceIdentifier) {
this.sourceIdentifier = sourceIdentifier;
}
public String getDestSemanticIdentifier() {
return destSemanticIdentifier;
public String getDestIdentifier() {
return destIdentifier;
}
public void setDestSemanticIdentifier(String destSemanticIdentifier) {
this.destSemanticIdentifier = destSemanticIdentifier;
public void setDestIdentifier(String destIdentifier) {
this.destIdentifier = destIdentifier;
}
public String getSourceDomain() {
return sourceDomain;
}
@ -50,6 +43,6 @@ public class ConnectBean {
public String toString() {
return "ConnectBean [sourceIdentifier=" + sourceIdentifier
+ ", sourceDomain=" + sourceDomain
+ ", destSemanticIdentifier=" + destSemanticIdentifier + "]";
+ ", destIdentifier=" + destIdentifier + "]";
}
}

View File

@ -11,7 +11,7 @@ public class SimilarGRSFRecord implements Serializable{
private static final long serialVersionUID = 6501670015333073045L;
private String description;
private String semanticIdentifier;
private String identifier;
private String shortName;
private String url;
private boolean suggestedMerge;
@ -27,30 +27,27 @@ public class SimilarGRSFRecord implements Serializable{
/**
* @param description
* @param semanticIdentifier
* @param identifier
* @param shortName
* @param url
*/
public SimilarGRSFRecord(String description, String semanticIdentifier,
public SimilarGRSFRecord(String description, String identifier,
String shortName, String url) {
super();
this.description = description;
this.semanticIdentifier = semanticIdentifier;
this.identifier = identifier;
this.shortName = shortName;
this.url = url;
}
public String getIdentifier() {
return description;
return identifier;
}
public void setIdentifier(String description) {
this.description = description;
}
public String getSemanticIdentifier() {
return semanticIdentifier;
}
public void setSemanticIdentifier(String semanticIdentifier) {
this.semanticIdentifier = semanticIdentifier;
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
public String getShortName() {
return shortName;
}
@ -91,7 +88,7 @@ public class SimilarGRSFRecord implements Serializable{
@Override
public String toString() {
return "SimilarGRSFRecord [description=" + description
+ ", semanticIdentifier=" + semanticIdentifier + ", shortName="
+ ", identifier=" + identifier + ", shortName="
+ shortName + ", url=" + url + ", suggestedMerge="
+ suggestedMerge + ", isExtra=" + isExtra + "]";
}