almost finished

git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/widgets/grsf-manage-widget@160475 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Costantino Perciante 2017-12-13 17:34:45 +00:00
parent aa5e3387ec
commit 4e168d2c6f
9 changed files with 225 additions and 193 deletions

View File

@ -4,6 +4,12 @@
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
<dependent-module archiveName="grsf-common-library-1.0.0-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/grsf-common-library/grsf-common-library">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="ckan-util-library-2.4.0-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/ckan-util-library/ckan-util-library">
<dependency-type>uses</dependency-type>
</dependent-module>
<property name="context-root" value="grsf-manage-widget"/>
<property name="java-output-path" value="/grsf-manage-widget/target/grsf-manage-widget-1.0.0-SNAPSHOT/WEB-INF/classes"/>
</wb-module>

View File

@ -381,7 +381,7 @@ public class ManageProductWidget extends Composite{
cancelButton.setEnabled(true);
confirmButton.setEnabled(true);
loaderIcon.setVisible(false);
showInfo(STATUS_UPDATE_ERROR, AlertType.ERROR);
showInfo(STATUS_UPDATE_ERROR + ": " + caught.getMessage(), AlertType.ERROR);
}
});

View File

@ -9,11 +9,13 @@ import org.gcube.datacatalogue.grsf_manage_widget.shared.ConnectedBean;
import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.CheckBox;
import com.github.gwtbootstrap.client.ui.Paragraph;
import com.github.gwtbootstrap.client.ui.TextBox;
import com.github.gwtbootstrap.client.ui.constants.IconType;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Float;
import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
@ -23,6 +25,7 @@ import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
@ -46,9 +49,23 @@ public class ConnectToWidget extends Composite{
//private GRSFManageWidgetServiceAsync service;
private List<Tuple> connectList = new ArrayList<Tuple>(0);
private List<ConnectedBean> connectedRecords = null;
public ConnectToWidget(final ManageProductBean bean/*, GRSFManageWidgetServiceAsync service*/) {
initWidget(uiBinder.createAndBindUi(this));
// get already connected beans, if any
connectedRecords = bean.getConnectTo();
if(connectedRecords != null){
connectPanel.add(new HTML("<hr style=\"width:100%;\"/>"));
for (ConnectedBean connected : connectedRecords) {
Widget widget = buildWidgetForConnectedRecords(connected);
connectPanel.add(widget);
connectPanel.add(new HTML("<hr style=\"width:100%;\"/>"));
}
}
//this.service = service;
String acceptedDomain = bean.getGrsfDomain().equalsIgnoreCase(Product_Type.STOCK.getOrigName()) ? Product_Type.FISHERY.getOrigName() : Product_Type.STOCK.getOrigName(); // inverted
suggestRecord.setTitle("Connect this " + bean.getGrsfDomain() + " record to a " + acceptedDomain + " record ");
@ -62,6 +79,7 @@ public class ConnectToWidget extends Composite{
public void onClick(ClickEvent arg0) {
ConnectedBean cb = new ConnectedBean();
cb.setExtra(true);
cb.setSourceDomain(bean.getGrsfDomain());
Tuple t = buildWidgetConnect(cb);
connectList.add(t);
@ -72,6 +90,57 @@ public class ConnectToWidget extends Composite{
}
/**
*
* @param similarGRSFRecord
* @return
*/
public static Widget buildWidgetForConnectedRecords(final ConnectedBean connected){
HorizontalPanel hp = new HorizontalPanel();
hp.setWidth("95%");
VerticalPanel leftPanel = new VerticalPanel();
leftPanel.setWidth("80%");
leftPanel.getElement().getStyle().setMarginLeft(20, Unit.PX);
Paragraph name = new Paragraph("Record name: " + (connected.getDestShortName() != null? connected.getDestShortName() : "Unavailable"));
leftPanel.add(name);
Paragraph semanticIdentifier = new Paragraph("Semantic Identifier: " +
connected.getDestSemanticIdentifier());
leftPanel.add(semanticIdentifier);
Paragraph identifier = new Paragraph("Record UUID: " +
connected.getDestKnowledgeBaseId());
leftPanel.add(identifier);
Anchor view = new Anchor();
view.setHref(connected.getUrl());
view.setText("View");
view.setTitle("Click to view the similar record");
view.setTarget("_blank");
view.getElement().getStyle().setFontWeight(FontWeight.BOLD);
leftPanel.add(view);
VerticalPanel rightPanel = new VerticalPanel();
rightPanel.setWidth("20%");
final CheckBox removeExtra = new CheckBox("Remove");
removeExtra.setTitle("Remove this record among the similar ones");
removeExtra.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
connected.setToBeKept(!removeExtra.getValue());
}
});
rightPanel.getElement().getStyle().setFloat(Float.RIGHT);
rightPanel.add(removeExtra);
hp.add(leftPanel);
hp.add(rightPanel);
hp.getElement().getStyle().setPadding(10, Unit.PX);
hp.getElement().getStyle().setMarginBottom(10, Unit.PX);
return hp;
}
/**
* Builds up a widget for connecting records.
* @param w the widget
@ -80,14 +149,14 @@ public class ConnectToWidget extends Composite{
private Tuple buildWidgetConnect(final ConnectedBean cb){
VerticalPanel main = new VerticalPanel();
main.setWidth("90%");
main.setWidth("95%");
HorizontalPanel hp = new HorizontalPanel();
hp.setWidth("100%");
VerticalPanel vpLeft = new VerticalPanel();
vpLeft.getElement().getStyle().setMarginLeft(15, Unit.PX);
vpLeft.setWidth("80%");
Paragraph semanticIdentifier = new Paragraph("Record Identifier (UUID):");
Paragraph semanticIdentifier = new Paragraph("Identifier (UUID):");
final TextBox box = new TextBox();
box.setId("identifier-text");
box.addKeyPressHandler(new KeyPressHandler() {
@ -97,7 +166,7 @@ public class ConnectToWidget extends Composite{
String currentText = box.getText().trim();
GWT.log("Text changed to " + currentText);
cb.setDestIdentifier(currentText);
cb.setDestKnowledgeBaseId(currentText);
}
});
@ -108,7 +177,7 @@ public class ConnectToWidget extends Composite{
String currentText = box.getText().trim();
GWT.log("Text changed to " + currentText);
cb.setDestIdentifier(currentText);
cb.setDestKnowledgeBaseId(currentText);
}
});
@ -158,17 +227,18 @@ public class ConnectToWidget extends Composite{
*/
public List<ConnectedBean> getConnectList() {
List<ConnectedBean> toReturn = new ArrayList<ConnectedBean>(0);
if(connectedRecords == null)
connectedRecords = new ArrayList<ConnectedBean>(0);
for (Tuple p : connectList) {
String suggestedIdentifier = ((ConnectedBean)p.getO()).getDestIdentifier();
String suggestedIdentifier = ((ConnectedBean)p.getO()).getDestKnowledgeBaseId();
if(suggestedIdentifier == null || suggestedIdentifier.isEmpty())
continue;
else
toReturn.add((ConnectedBean) p.getO());
connectedRecords.add((ConnectedBean) p.getO());
}
return toReturn;
return connectedRecords;
}
}

View File

@ -59,22 +59,27 @@ public class SimilarGRSFRecordWidget extends Composite {
*/
public SimilarGRSFRecordWidget(List<SimilarGRSFRecord> availableGRSFSimilarRecords/*, GRSFManageWidgetServiceAsync service*/) {
initWidget(uiBinder.createAndBindUi(this));
//this.service = service;
this.availableGRSFSimilarRecords = availableGRSFSimilarRecords;
addSimilarRecord.getElement().getStyle().setFloat(Float.RIGHT);
// add the existing ones, if any
for (final SimilarGRSFRecord similarGRSFRecord : availableGRSFSimilarRecords) {
Widget widget = buildWidgetForSimilarRecord(similarGRSFRecord);
similarGrsfRecordsPanel.add(widget);
HTML separator = new HTML("<hr style=\"width:100%;\"/>");
similarGrsfRecordsPanel.add(separator);
if(availableGRSFSimilarRecords != null){
similarGrsfRecordsPanel.add(new HTML("<hr style=\"width:100%;\"/>"));
// add the existing ones, if any
for (final SimilarGRSFRecord similarGRSFRecord : availableGRSFSimilarRecords) {
Widget widget = buildWidgetForSimilarRecord(similarGRSFRecord);
similarGrsfRecordsPanel.add(widget);
similarGrsfRecordsPanel.add(new HTML("<hr style=\"width:100%;\"/>"));
}
}
// manage the "suggest button"
addSimilarRecord.setIcon(IconType.PLUS_SIGN);
addSimilarRecord.getElement().getStyle().setFloat(Float.RIGHT);
addSimilarRecord.setTitle("Suggest a Similar Record by using its Identifier (UUID)");
addSimilarRecord.getElement().getStyle().setFloat(Float.RIGHT);
// add handler
addSimilarRecord.addClickHandler(new ClickHandler() {
@ -101,10 +106,10 @@ public class SimilarGRSFRecordWidget extends Composite {
public static Widget buildWidgetForSimilarRecord(final SimilarGRSFRecord similarGRSFRecord){
HorizontalPanel hp = new HorizontalPanel();
hp.setWidth("90%");
hp.setWidth("95%");
VerticalPanel leftPanel = new VerticalPanel();
leftPanel.setWidth("80%");
leftPanel.getElement().getStyle().setMarginLeft(15, Unit.PX);
leftPanel.getElement().getStyle().setMarginLeft(20, Unit.PX);
Paragraph name = new Paragraph("Record name: " + (similarGRSFRecord.getShortName() != null? similarGRSFRecord.getShortName() : "Unavailable"));
leftPanel.add(name);
if(similarGRSFRecord.getDescription() != null){
@ -117,23 +122,24 @@ public class SimilarGRSFRecordWidget extends Composite {
leftPanel.add(description);
}
Paragraph identifier = new Paragraph("Record UUID: " +
similarGRSFRecord.getIdentifier());
similarGRSFRecord.getKnowledgeBaseId());
leftPanel.add(identifier);
VerticalPanel rightPanel = new VerticalPanel();
rightPanel.setWidth("20%");
Anchor view = new Anchor();
view.setHref(similarGRSFRecord.getUrl());
view.setText("View");
view.setTitle("Click to view the similar record");
view.setTarget("_blank");
view.getElement().getStyle().setFontWeight(FontWeight.BOLD);
rightPanel.add(view);
leftPanel.add(view);
VerticalPanel rightPanel = new VerticalPanel();
rightPanel.setWidth("20%");
// add merge checkbox
final CheckBox mergeSuggested = new CheckBox("Merge");
mergeSuggested.setTitle("Suggest to merge the current record with this similar record");
mergeSuggested.getElement().getStyle().setPaddingTop(3, Unit.PC);
//mergeSuggested.getElement().getStyle().setPaddingTop(3, Unit.PC);
mergeSuggested.setValue(false);
mergeSuggested.addClickHandler(new ClickHandler() {
@ -153,7 +159,7 @@ public class SimilarGRSFRecordWidget extends Composite {
@Override
public void onClick(ClickEvent arg0) {
similarGRSFRecord.setTobeKept(!removeExtra.getValue());
similarGRSFRecord.setToBeKept(!removeExtra.getValue());
}
});
@ -176,7 +182,7 @@ public class SimilarGRSFRecordWidget extends Composite {
private Widget buildWidgetForExtraSimilarRecord(final SimilarGRSFRecord s){
VerticalPanel main = new VerticalPanel();
main.setWidth("90%");
main.setWidth("95%");
HorizontalPanel hp = new HorizontalPanel();
hp.setWidth("100%");
@ -192,7 +198,7 @@ public class SimilarGRSFRecordWidget extends Composite {
String currentText = box.getText().trim();
GWT.log("Text changed to " + currentText);
s.setIdentifier(currentText);
s.setKnowledgeBaseId(currentText);
}
});
@ -203,7 +209,7 @@ public class SimilarGRSFRecordWidget extends Composite {
String currentText = box.getText().trim();
GWT.log("Text changed to " + currentText);
s.setIdentifier(currentText);
s.setKnowledgeBaseId(currentText);
}
});
@ -274,7 +280,7 @@ public class SimilarGRSFRecordWidget extends Composite {
for (Tuple p : extraSimilarRecordsList) {
SimilarGRSFRecord similarRecord = ((SimilarGRSFRecord)p.getO());
if(similarRecord.isExtra() && similarRecord.getIdentifier() == null || similarRecord.getIdentifier().isEmpty())
if(similarRecord.isExtra() && similarRecord.getKnowledgeBaseId() == null || similarRecord.getKnowledgeBaseId().isEmpty())
continue;
availableGRSFSimilarRecords.add((SimilarGRSFRecord) p.getO());
}

View File

@ -11,6 +11,7 @@ import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
@ -29,8 +30,9 @@ public class SourceWidget extends Composite {
initWidget(uiBinder.createAndBindUi(this));
sourcesInnerPanel.getElement().getStyle().setMarginLeft(15, Unit.PX);
for (SourceRecord sourceRecord : availableSources) {
VerticalPanel subPanel = new VerticalPanel();
subPanel.setWidth("90%");
String name = sourceRecord.getName();
@ -41,10 +43,11 @@ public class SourceWidget extends Composite {
url.setText(name);
url.setTitle("Click to view the source record");
url.setTarget("_blank");
subPanel.getElement().getStyle().setMarginTop(10, Unit.PX);
subPanel.add(url);
subPanel.getElement().getStyle().setMarginBottom(15, Unit.PX);
sourcesInnerPanel.add(subPanel);
}
}

View File

@ -69,13 +69,14 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
ManageProductBean toReturn = null;
if(!Utils.isIntoPortal()){
toReturn = new ManageProductBean();
toReturn.setCatalogueIdentifier(UUID.randomUUID().toString());
List<ConnectedBean> connectTo = new ArrayList<>();
connectTo.add(new ConnectedBean("asfis:WRO+fao:67;FAO", "Stock", "aksldsam asd", "asdasjnk:fas", UUID.randomUUID().toString()));
connectTo.add(new ConnectedBean("91f1e413-dc9f-3b4e-b1c5-0e8560177253","Stock",
"aksldsam asd", "asdasjnk:fas", UUID.randomUUID().toString(), "http://data.d4science.org/ctlg/GRSF_Admin/91f1e413-dc9f-3b4e-b1c5-0e8560177253"));
toReturn.setConnectTo(connectTo);
toReturn.setGrsfDomain("Stock");
toReturn.setGrsfType("Assessment Unit");
@ -88,6 +89,8 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
toReturn.setSemanticIdentifier("asfis:WRO+fao:67;FAO");
ArrayList<SourceRecord> sources = new ArrayList<SourceRecord>();
sources.add(new SourceRecord("RAM", "http://www.google.it"));
sources.add(new SourceRecord("FIRMS", "http://www.google.it"));
sources.add(new SourceRecord("FishSource", "http://www.google.it"));
toReturn.setSources(sources);
List<SimilarGRSFRecord> similarGrsfRecords = new ArrayList<SimilarGRSFRecord>();
similarGrsfRecords.add(new SimilarGRSFRecord("same species overlapping water areas",
@ -169,7 +172,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
List<ConnectedBean> connectedBeans = new ArrayList<ConnectedBean>(0);
if(connectedBeansAsStrings != null){
for (String connectedBean : connectedBeansAsStrings) {
connectedBeans.add(Utils.connectedBeanRecordFromJson(connectedBean, uuidKB, grsfDomain));
connectedBeans.add(Utils.connectedBeanRecordFromJson(connectedBean, uuidKB, grsfDomain, catalogue));
}
}
@ -329,7 +332,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
baseUrl = Utils.discoverEndPoint(context);
getThreadLocalRequest().getSession().setAttribute(keyPerContext, baseUrl);
}
return Utils.updateCatalogueRecord(baseUrl, bean, catalogue, Utils.getCurrentUser(getThreadLocalRequest()).getUsername());
return Utils.updateRecord(baseUrl, bean, catalogue, Utils.getCurrentUser(getThreadLocalRequest()).getUsername());
}catch(Exception e){
logger.error("Unable to update the product.." + e.getMessage());

View File

@ -5,9 +5,7 @@ import static org.gcube.resources.discovery.icclient.ICFactory.clientFor;
import static org.gcube.resources.discovery.icclient.ICFactory.queryFor;
import java.io.StringReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@ -38,7 +36,6 @@ import org.gcube.resources.discovery.client.api.DiscoveryClient;
import org.gcube.resources.discovery.client.queries.api.Query;
import org.gcube.resources.discovery.client.queries.api.SimpleQuery;
import org.gcube.resources.discovery.client.queries.impl.QueryBox;
import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager;
import org.gcube.vomanagement.usermanagement.model.GCubeUser;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
@ -59,9 +56,7 @@ import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.Closea
import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.HttpClientBuilder;
import eu.trentorise.opendata.jackan.internal.org.apache.http.util.EntityUtils;
import eu.trentorise.opendata.jackan.model.CkanDataset;
import eu.trentorise.opendata.jackan.model.CkanGroup;
import eu.trentorise.opendata.jackan.model.CkanPair;
import eu.trentorise.opendata.jackan.model.CkanTag;
/**
* Utility methods for GRSF Management panel widget.
@ -72,9 +67,7 @@ public class Utils {
private static final String GENERIC_RESOURCE_NAME = "GRSFManageEntries";
private static final String GENERIC_RESOURCE_SECONDARY_TYPE = "ApplicationProfile";
private static final Logger logger = LoggerFactory.getLogger(Utils.class);
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static final String REGEX_UUID = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
private static final int MAX_TRIAL = 5;
/**
* Look up from the IS other information that can be potentially displayed in read only mode in the management panel.
@ -265,7 +258,7 @@ public class Utils {
* @return true on success, false otherwise
*/
@SuppressWarnings("unchecked")
public static String updateCatalogueRecord(String serviceUrl, ManageProductBean bean, DataCatalogue catalogue, String username){
public static String updateRecord(String serviceUrl, ManageProductBean bean, DataCatalogue catalogue, String username) throws Exception{
if(serviceUrl == null)
throw new IllegalArgumentException("GRSF Updater service url cannot be null");
@ -278,13 +271,50 @@ public class Utils {
JSONObject obj = new JSONObject();
obj.put(Constants.CATALOGUE_ID, bean.getCatalogueIdentifier());
obj.put(Constants.KB_ID, bean.getKnowledgeBaseIdentifier());
obj.put(Constants.PRODUCT_TYPE, bean.getGrsfDomain().toLowerCase());
obj.put(Constants.STATUS, bean.getNewStatus().toString().toLowerCase());
obj.put(Constants.NEW_STATUS, bean.getNewStatus().toString().toLowerCase());
obj.put(Constants.OLD_STATUS, bean.getCurrentStatus().toString().toLowerCase());
obj.put(Constants.TRACEABILITY_FLAG, bean.isTraceabilityFlag());
String annotation = bean.getAnnotation();
if(annotation != null)
obj.put(Constants.ANNOTATION, annotation.replaceAll("\"", ""));
obj.put(Constants.SHORT_NAME_OLD, bean.getShortName());
if(bean.getShortNameUpdated() == null || bean.getShortNameUpdated().isEmpty())
bean.setShortNameUpdated(bean.getShortName());
obj.put(Constants.SHORT_NAME_NEW, bean.getShortNameUpdated());
obj.put(Constants.OLD_STATUS, bean.getCurrentStatus().toString().toLowerCase());
// prepare connections
List<ConnectedBean> connections = bean.getConnectTo();
JSONArray connectionsJson = new JSONArray();
for(ConnectedBean c: connections){
JSONObject cc = new JSONObject();
cc.put(Constants.SOURCE_KNOWLEDGE_BASE_ID, c.getSourceKnowledgeBaseId());
cc.put(Constants.DEST_KNOWLEDGE_BASE_ID, c.getDestKnowledgeBaseId());
cc.put(Constants.SOURCE_DOMAIN, c.getSourceDomain());
cc.put(Constants.SUGGESTED, c.isExtra());
cc.put(Constants.TO_BE_KEPT, c.isToBeKept());
connectionsJson.add(cc);
}
obj.put(Constants.CONNECTIONS, connectionsJson);
// prepare similar grsf records
List<SimilarGRSFRecord> similarRecords = bean.getSimilarGrsfRecords();
JSONArray similarRecordsJson = new JSONArray();
for(SimilarGRSFRecord s: similarRecords){
JSONObject ss = new JSONObject();
ss.put(Constants.KB_ID, s.getKnowledgeBaseId());
ss.put(Constants.SUGGESTED, s.isExtra());
ss.put(Constants.TO_BE_KEPT, s.isToBeKept());
ss.put(Constants.MERGE, s.isSuggestedMerge());
similarRecordsJson.add(ss);
}
obj.put(Constants.SIMILAR_GRSF_RECORDS, similarRecordsJson);
logger.debug("Update request looks like " + obj.toJSONString());
HttpPost request = new HttpPost(serviceUrl + Constants.SERVICE_POST_METHOD);
@ -300,130 +330,22 @@ public class Utils {
JSONParser parser = new JSONParser();
JSONObject parsedJSON = (JSONObject)parser.parse(result);
if(response.getStatusLine().getStatusCode() != Constants.STATUS_SUCCESS)
if(response.getStatusLine().getStatusCode() != Constants.STATUS_SUCCESS){
throw new Exception("Update failed at knowledge base side!");
}else if(!(boolean) parsedJSON.get(Constants.UPDATE_RESULT))
throw new IllegalArgumentException(
"Error while performing the update request: " + response.getStatusLine().getReasonPhrase() +
"and error in the result bean is " + parsedJSON.get(Constants.ERROR));
"Update failed for the following reason " + parsedJSON.get(Constants.ERROR_MESSAGE));
// patch the catalogue product
return patchProduct(catalogue, bean, username);
// patch the catalogue product (no longer needed)
// return patchProduct(catalogue, bean, username);
}catch(Exception e){
logger.error("Unable to update this Item " + e.getMessage());
return e.getMessage();
throw e;
}
}
return null;
/**
* Patch the product
* @param catalogue
* @param bean
* @param username
*/
@SuppressWarnings("unchecked")
private static String patchProduct(DataCatalogue catalogue,
ManageProductBean bean, String username) {
logger.info("Going to patch record in the catalogue with identifier " + bean.getCatalogueIdentifier() +
" from user " + username);
String apiKey = catalogue.getApiKeyFromUsername(username);
CkanDataset dataset = catalogue.getDataset(bean.getCatalogueIdentifier(), apiKey);
String errorMessage = null;
for (int i = 0; i < MAX_TRIAL; i++) {
try(CloseableHttpClient httpClient = HttpClientBuilder.create().build();){
JSONObject jsonRequest = new JSONObject();
JSONArray tagsAsJson = new JSONArray();
JSONArray groupsAsJson = new JSONArray();
JSONArray customFieldsAsJson = new JSONArray();
// manage the custom fields
List<CkanPair> extras = dataset.getExtras();
for (CkanPair ckanPair : extras) {
if(ckanPair.getKey().equals(Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY) && ckanPair.getValue().equals(bean.getCurrentStatus().toString()))
continue;
JSONObject obj = new JSONObject();
obj.put("key", ckanPair.getKey());
obj.put("value", ckanPair.getValue());
customFieldsAsJson.add(obj);
}
// add the new one and the annotation message
JSONObject newStatus = new JSONObject();
newStatus.put("key", Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY);
newStatus.put("value", bean.getNewStatus().toString());
customFieldsAsJson.add(newStatus);
JSONObject newAnnotation = new JSONObject();
newAnnotation.put("key", Constants.ANNOTATION_CUSTOM_KEY);
newAnnotation.put("value", "date: " + DATE_FORMAT.format(new Date())
+ ", admin: " + new LiferayUserManager().getUserByUsername(username).getFullname()
+ ", message: " + (bean.getAnnotation() != null ? bean.getAnnotation().replaceAll("\"", "") : "none")
+ ", old status: " + bean.getCurrentStatus().toString()
+ ", new status: " + bean.getNewStatus().toString()
);
customFieldsAsJson.add(newAnnotation);
// manage the tags
List<CkanTag> tags = dataset.getTags();
for(CkanTag ckanTag : tags){
if(!ckanTag.getName().equals(bean.getCurrentStatus().toString())){
JSONObject obj = new JSONObject();
obj.put("vocabulary_id", ckanTag.getVocabularyId());
obj.put("state", ckanTag.getState().toString());
obj.put("display_name", ckanTag.getDisplayName());
obj.put("id", ckanTag.getId());
obj.put("name", ckanTag.getName());
tagsAsJson.add(obj);
}
}
// add the new one
JSONObject newTag = new JSONObject();
newTag.put("name", bean.getNewStatus().toString());
newTag.put("display_name", bean.getNewStatus().toString());
tagsAsJson.add(newTag);
// manage the groups
List<CkanGroup> groups = dataset.getGroups();
for (CkanGroup ckanGroup : groups) {
if(!ckanGroup.getName().equals("grsf" + "-" + bean.getCurrentStatus().toString().toLowerCase())){
JSONObject obj = new JSONObject();
obj.put("name", ckanGroup.getName());
groupsAsJson.add(obj);
}
}
JSONObject newGroup = new JSONObject();
newGroup.put("name", "grsf" + "-" + bean.getNewStatus().toString().toLowerCase());
groupsAsJson.add(newGroup);
// perform the request
jsonRequest.put("id", bean.getCatalogueIdentifier());
jsonRequest.put("tags", tagsAsJson);
jsonRequest.put("extras", customFieldsAsJson);
jsonRequest.put("groups", groupsAsJson);
logger.debug("Request param is going to be " + jsonRequest);
if((errorMessage = catalogue.patchProductWithJSON(bean.getCatalogueIdentifier(), jsonRequest, apiKey)) == null){
logger.info("Record patched ...");
break;
}else
continue; // retry
}catch(Exception e){
logger.error("Error while trying to patch grsf record (iteration " + i + " of " + MAX_TRIAL + ")" + e.getMessage());
errorMessage = e.getMessage();
}
}
return errorMessage;
}
/**
@ -529,7 +451,7 @@ public class Utils {
logger.warn(message);
throw new Exception(message);
}
logger.info("Result size is " + datasets.size());
if(datasets.size() == 1)
@ -542,7 +464,7 @@ public class Utils {
if(extra.getKey().contains(Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY) && extra.getValue().equals(suggestedRecordSemanticIdentifier)){
logger.info("Matching dataset has id " + dataset.getId() + " with value " + Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY);
return dataset;
}
}
}
@ -576,7 +498,7 @@ public class Utils {
return null;
}
/**
* Exploits the fact that in GRSF the url of a record contains the name (which is unique) of the record itself
* @param url
@ -630,7 +552,7 @@ public class Utils {
// }
//
// }
/**
* Get a {@link SimilarGRSFRecord} from a json string
* @param json
@ -654,7 +576,7 @@ public class Utils {
);
}
/**
* Checks if is into portal.
*
@ -678,21 +600,26 @@ public class Utils {
* @return
* @throws ParseException
*/
public static ConnectedBean connectedBeanRecordFromJson(String json, String sourceIdentifier, String sourceDomain) throws ParseException {
public static ConnectedBean connectedBeanRecordFromJson(String json, String sourceIdentifier, String sourceDomain,
DataCatalogue clg) throws ParseException {
if(json == null)
return null;
JSONParser parser = new JSONParser();
JSONObject object = (JSONObject)parser.parse(json);
String uuidDest = (String)object.get(Constants.CONNECTED_RECORD_KNOWLEDGE_BASE_ID_JSON_KEY);
String url = clg.getUrlFromDatasetIdOrName(uuidDest);
return new ConnectedBean(
sourceIdentifier,
sourceDomain,
(String)object.get(Constants.CONNECTED_RECORD_SHORT_NAME_JSON_KEY),
(String)object.get(Constants.CONNECTED_RECORD_SEMANTIC_IDENTIFIER_JSON_KEY),
(String)object.get(Constants.CONNECTED_RECORD_KNOWLEDGE_BASE_ID_JSON_KEY)
uuidDest,
url
);
}
}

View File

@ -10,11 +10,12 @@ import java.io.Serializable;
public class ConnectedBean implements Serializable{
private static final long serialVersionUID = -4863776727351488790L;
private String sourceIdentifier;
private String sourceKnowledgeBaseId;
private String sourceDomain; // i.e. Stock or Fishery
private String destShortName;
private String destSemanticIdentifier;
private String destIdentifier; // the dest indentifier of a Fishery or Stock (the link is from a Stock to a Fishery and viceversa)
private String destKnowledgeBaseId; // the dest indentifier of a Fishery or Stock (the link is from a Stock to a Fishery and viceversa)
private String url;
private boolean isExtra;
private boolean toBeKept = true;
@ -23,22 +24,25 @@ public class ConnectedBean implements Serializable{
}
/**
* @param sourceIdentifier
*
* @param sourceKnowledgeBaseId
* @param sourceDomain
* @param destShortName
* @param destSemanticIdentifier
* @param destIdentifier
* @param toBeKept
* @param destKnowledgeBaseId
* @param url
*/
public ConnectedBean(String sourceIdentifier, String sourceDomain,
public ConnectedBean(String sourceKnowledgeBaseId, String sourceDomain,
String destShortName, String destSemanticIdentifier,
String destIdentifier) {
String destKnowledgeBaseId, String url) {
super();
this.sourceIdentifier = sourceIdentifier;
this.sourceKnowledgeBaseId = sourceKnowledgeBaseId;
this.sourceDomain = sourceDomain;
this.destShortName = destShortName;
this.destSemanticIdentifier = destSemanticIdentifier;
this.destIdentifier = destIdentifier;
this.destKnowledgeBaseId = destKnowledgeBaseId;
this.url = url;
}
public String getDestShortName() {
@ -56,19 +60,22 @@ public class ConnectedBean implements Serializable{
public void setDestSemanticIdentifier(String destSemanticIdentifier) {
this.destSemanticIdentifier = destSemanticIdentifier;
}
public String getSourceKnowledgeBaseId() {
return sourceKnowledgeBaseId;
}
public String getSourceIdentifier() {
return sourceIdentifier;
public void setSourceKnowledgeBaseId(String sourceKnowledgeBaseId) {
this.sourceKnowledgeBaseId = sourceKnowledgeBaseId;
}
public void setSourceIdentifier(String sourceIdentifier) {
this.sourceIdentifier = sourceIdentifier;
public String getDestKnowledgeBaseId() {
return destKnowledgeBaseId;
}
public String getDestIdentifier() {
return destIdentifier;
}
public void setDestIdentifier(String destIdentifier) {
this.destIdentifier = destIdentifier;
public void setDestKnowledgeBaseId(String destKnowledgeBaseId) {
this.destKnowledgeBaseId = destKnowledgeBaseId;
}
public String getSourceDomain() {
return sourceDomain;
}
@ -91,14 +98,20 @@ public class ConnectedBean implements Serializable{
public void setExtra(boolean isExtra) {
this.isExtra = isExtra;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String toString() {
return "ConnectedBean [sourceIdentifier=" + sourceIdentifier
return "ConnectedBean [sourceKnowledgeBaseId=" + sourceKnowledgeBaseId
+ ", sourceDomain=" + sourceDomain + ", destShortName="
+ destShortName + ", destSemanticIdentifier="
+ destSemanticIdentifier + ", destIdentifier=" + destIdentifier
+ ", isExtra=" + isExtra + ", toBeKept=" + toBeKept + "]";
+ destSemanticIdentifier + ", destKnowledgeBaseId="
+ destKnowledgeBaseId + ", url=" + url + ", isExtra=" + isExtra
+ ", toBeKept=" + toBeKept + "]";
}
}

View File

@ -66,6 +66,10 @@ public class SimilarGRSFRecord implements Serializable{
this.toBeKept = toBeKept;
}
public boolean isToBeKept() {
return toBeKept;
}
public String getShortName() {
return shortName;
}