several improvements
git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/widgets/grsf-manage-widget@162878 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
6612e05a54
commit
55a97c4802
|
@ -12,7 +12,7 @@
|
|||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
|
||||
<classpathentry kind="src" output="target/test-classes" path="src/test/resources">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
|
@ -23,14 +23,14 @@
|
|||
<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry excluding="**" kind="src" output="${webappDirectory}/WEB-INF/classes" path="src/main/resources">
|
||||
<classpathentry kind="src" output="${webappDirectory}/WEB-INF/classes" path="src/main/resources">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
<attribute name="owner.project.facets" value="java"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="output" path="${webappDirectory}/WEB-INF/classes"/>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
eclipse.preferences.version=1
|
||||
lastWarOutDir=/Users/costantinoperciante/Documents/workspace/grsf-manage-widget/target
|
||||
warSrcDir=src/main/webapp
|
||||
warSrcDirIsOutput=false
|
||||
|
|
|
@ -4,6 +4,10 @@
|
|||
<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"/>
|
||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/test/resources"/>
|
||||
<dependent-module archiveName="ckan-util-library-2.4.1-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>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<faceted-project>
|
||||
<fixed facet="wst.jsdt.web"/>
|
||||
<installed facet="java" version="1.7"/>
|
||||
<installed facet="jst.web" version="2.3"/>
|
||||
<installed facet="wst.jsdt.web" version="1.0"/>
|
||||
<installed facet="java" version="1.8"/>
|
||||
</faceted-project>
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
package org.gcube.datacatalogue.grsf_manage_widget.client;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean;
|
||||
|
||||
import com.google.gwt.user.client.rpc.RemoteService;
|
||||
|
@ -27,23 +25,7 @@ public interface GRSFManageWidgetService extends RemoteService {
|
|||
/**
|
||||
* Notify product update
|
||||
*/
|
||||
String notifyProductUpdate(ManageProductBean bean, List<String> hashtags) 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;
|
||||
String notifyProductUpdate(ManageProductBean bean) throws Exception;
|
||||
|
||||
/**
|
||||
* Identifier of the record (UUID)
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
*/
|
||||
package org.gcube.datacatalogue.grsf_manage_widget.client;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean;
|
||||
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
|
@ -15,7 +13,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
|
|||
*/
|
||||
public interface GRSFManageWidgetServiceAsync {
|
||||
|
||||
void notifyProductUpdate(ManageProductBean bean, List<String> hashtags,
|
||||
void notifyProductUpdate(ManageProductBean bean,
|
||||
AsyncCallback<String> callback);
|
||||
|
||||
void getProductBeanById(String identifier,
|
||||
|
@ -23,12 +21,6 @@ public interface GRSFManageWidgetServiceAsync {
|
|||
|
||||
void isAdminUser(AsyncCallback<Boolean> callback);
|
||||
|
||||
// void checkSemanticIdentifierExists(String semanticIdentifier,
|
||||
// AsyncCallback<Boolean> callback);
|
||||
//
|
||||
// void checkSemanticIdentifierExistsInDomain(String semanticIdentifier,
|
||||
// String domain, AsyncCallback<Boolean> callback);
|
||||
|
||||
void checkIdentifierExists(String id,
|
||||
AsyncCallback<String> callback);
|
||||
|
||||
|
|
|
@ -2,17 +2,13 @@ package org.gcube.datacatalogue.grsf_manage_widget.client.view;
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.gcube.datacatalogue.common.enums.Status;
|
||||
import org.gcube.datacatalogue.grsf_manage_widget.client.GRSFManageWidgetService;
|
||||
import org.gcube.datacatalogue.grsf_manage_widget.client.GRSFManageWidgetServiceAsync;
|
||||
import org.gcube.datacatalogue.grsf_manage_widget.client.events.HideManagementPanelEvent;
|
||||
import org.gcube.datacatalogue.grsf_manage_widget.client.view.subwidgets.ConnectToWidget;
|
||||
import org.gcube.datacatalogue.grsf_manage_widget.client.view.subwidgets.FormEntryModel;
|
||||
import org.gcube.datacatalogue.grsf_manage_widget.client.view.subwidgets.SimilarGRSFRecordWidget;
|
||||
import org.gcube.datacatalogue.grsf_manage_widget.client.view.subwidgets.SourceWidget;
|
||||
import org.gcube.datacatalogue.grsf_manage_widget.client.view.subwidgets.SuggestMerges;
|
||||
|
@ -33,7 +29,6 @@ import com.github.gwtbootstrap.client.ui.Modal;
|
|||
import com.github.gwtbootstrap.client.ui.TextArea;
|
||||
import com.github.gwtbootstrap.client.ui.TextBox;
|
||||
import com.github.gwtbootstrap.client.ui.constants.AlertType;
|
||||
import com.github.gwtbootstrap.client.ui.constants.ControlGroupType;
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.SelectElement;
|
||||
import com.google.gwt.dom.client.Style.Unit;
|
||||
|
@ -91,6 +86,9 @@ public class ManageProductWidget extends Composite{
|
|||
@UiField
|
||||
VerticalPanel panelForSourceItems;
|
||||
|
||||
@UiField
|
||||
ControlGroup similarGRSFRecordGroup;
|
||||
|
||||
@UiField
|
||||
VerticalPanel panelForSimilarGRSFRecords;
|
||||
|
||||
|
@ -140,9 +138,8 @@ public class ManageProductWidget extends Composite{
|
|||
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 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 records."
|
||||
+ " You are suggested to contact the VRE Manager if something is wrong with this";
|
||||
+ " You are suggested to contact the VRE Manager if something is wrong with this.";
|
||||
|
||||
// event bus shared with the portlet
|
||||
private HandlerManager eventBus = null;
|
||||
|
@ -217,7 +214,6 @@ public class ManageProductWidget extends Composite{
|
|||
@Override
|
||||
public void onSuccess(ManageProductBean resBean) {
|
||||
|
||||
|
||||
if(resBean == null){
|
||||
showInfo(ERROR_ON_RETRIEVING_BEAN, AlertType.ERROR);
|
||||
formUpdate.setVisible(false);
|
||||
|
@ -241,9 +237,12 @@ public class ManageProductWidget extends Composite{
|
|||
panelForSourceItems.add(new SourceWidget(availableSources));
|
||||
|
||||
// manage similar GRSF records, if any
|
||||
List<SimilarGRSFRecord> availableGRSFSimilarRecords = bean.getSimilarGrsfRecords();
|
||||
similarRecordPanel = new SimilarGRSFRecordWidget(availableGRSFSimilarRecords/*, service*/);
|
||||
panelForSimilarGRSFRecords.add(similarRecordPanel);
|
||||
if(bean.getSimilarGrsfRecords() != null && !bean.getSimilarGrsfRecords().isEmpty()){
|
||||
List<SimilarGRSFRecord> availableGRSFSimilarRecords = bean.getSimilarGrsfRecords();
|
||||
similarRecordPanel = new SimilarGRSFRecordWidget(availableGRSFSimilarRecords);
|
||||
panelForSimilarGRSFRecords.add(similarRecordPanel);
|
||||
}else
|
||||
similarGRSFRecordGroup.setVisible(false);
|
||||
|
||||
// further suggested merges
|
||||
suggestedMergesPanel = new SuggestMerges(service);
|
||||
|
@ -253,19 +252,16 @@ public class ManageProductWidget extends Composite{
|
|||
connectWidget = new ConnectToWidget(bean, service);
|
||||
panelForConnectOtherRecords.add(connectWidget);
|
||||
|
||||
// check if we need to show more
|
||||
if(bean.getExtrasIfAvailable() != null && !bean.getExtrasIfAvailable().isEmpty())
|
||||
addExtrasAfter(bean, productGrsfTypeGroup);
|
||||
|
||||
// check for new status box
|
||||
List<Status> statusToShow = new ArrayList<Status>(STATUS);
|
||||
statusToShow.remove(bean.getCurrentStatus());
|
||||
statusToShow.remove(Status.To_be_Merged); // it cannot be set by a user
|
||||
|
||||
// if the record isn't approved, then remove also archived
|
||||
if(!bean.getCurrentStatus().equals(Status.Approved))
|
||||
statusToShow.remove(Status.Archived);
|
||||
|
||||
listBoxStatus.addItem("Select the new status");
|
||||
listBoxStatus.addItem("Select a new status");
|
||||
listBoxStatus.getElement().<SelectElement>cast().getOptions().getItem(0).setDisabled(true);
|
||||
for (Status availableStatus : statusToShow) {
|
||||
listBoxStatus.addItem(availableStatus.toString());
|
||||
|
@ -311,39 +307,15 @@ public class ManageProductWidget extends Composite{
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* Add extras if available after controlGroupBefore
|
||||
* @param bean
|
||||
* @param productTypeGroup
|
||||
*/
|
||||
private void addExtrasAfter(ManageProductBean bean,
|
||||
ControlGroup controlGroupBefore) {
|
||||
|
||||
int index = formUpdate.getWidgetIndex(controlGroupBefore);
|
||||
|
||||
Map<String, String> extras = bean.getExtrasIfAvailable();
|
||||
Iterator<Entry<String, String>> iterator = extras.entrySet().iterator();
|
||||
while (iterator.hasNext()) {
|
||||
Map.Entry<java.lang.String, java.lang.String> entry = (Map.Entry<java.lang.String, java.lang.String>) iterator
|
||||
.next();
|
||||
|
||||
formUpdate.insert(new FormEntryModel(entry.getKey(), entry.getValue()), index);
|
||||
index++;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@UiHandler("confirmButton")
|
||||
void onSaveButton(ClickEvent ce){
|
||||
|
||||
listBoxStatusGroup.setType(ControlGroupType.NONE);
|
||||
|
||||
if(listBoxStatus.getSelectedIndex() <= 0){
|
||||
listBoxStatusGroup.setType(ControlGroupType.ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
// if the status has not be changed ...
|
||||
if(listBoxStatus.getSelectedIndex() <= 0)
|
||||
bean.setNewStatus(bean.getCurrentStatus());
|
||||
else
|
||||
bean.setNewStatus(Status.fromString(listBoxStatus.getSelectedItemText()));
|
||||
|
||||
manageProductModal.setCloseVisible(false);
|
||||
cancelButton.setEnabled(false);
|
||||
confirmButton.setEnabled(false);
|
||||
|
@ -354,19 +326,20 @@ public class ManageProductWidget extends Composite{
|
|||
|
||||
// evaluate the connections and the actions on them
|
||||
bean.setConnections(connectWidget.getConnectList());
|
||||
|
||||
|
||||
// update similar records and to connect
|
||||
bean.setSimilarGrsfRecords(similarRecordPanel.getSimilarRecords());
|
||||
if(similarRecordPanel != null)
|
||||
bean.setSimilarGrsfRecords(similarRecordPanel.getSimilarRecords());
|
||||
|
||||
bean.getSimilarGrsfRecords().addAll(suggestedMergesPanel.getSimilarRecords());
|
||||
|
||||
// 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, null, new AsyncCallback<String>() { // TODO add hashtags here
|
||||
service.notifyProductUpdate(bean, new AsyncCallback<String>() {
|
||||
|
||||
@Override
|
||||
public void onSuccess(String result) {
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
}
|
||||
</ui:style>
|
||||
<g:HTMLPanel>
|
||||
<b:Modal ui:field="manageProductModal" title="Manage item"
|
||||
<b:Modal ui:field="manageProductModal" title="Manage GRSF Record"
|
||||
backdrop="STATIC" keyboard="true" animation="true" closeVisible="true">
|
||||
<g:VerticalPanel width="100%" ui:field="container">
|
||||
|
||||
|
@ -83,7 +83,7 @@
|
|||
|
||||
<b:ControlGroup ui:field="sourcesGroup">
|
||||
<b:ControlLabel title="Sources">
|
||||
<b>Source(s):</b>
|
||||
<b>Source Record(s):</b>
|
||||
</b:ControlLabel>
|
||||
<b:Controls>
|
||||
<g:VerticalPanel ui:field="panelForSourceItems"
|
||||
|
|
|
@ -14,6 +14,7 @@ import com.github.gwtbootstrap.client.ui.CheckBox;
|
|||
import com.github.gwtbootstrap.client.ui.Icon;
|
||||
import com.github.gwtbootstrap.client.ui.Paragraph;
|
||||
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.dom.client.Style.Float;
|
||||
|
@ -57,8 +58,9 @@ public class ConnectToWidget extends Composite{
|
|||
Button suggestRecord;
|
||||
|
||||
private List<Tuple> connectList = new ArrayList<Tuple>(0);
|
||||
private List<ConnectedBean> currentlyConnected = null;
|
||||
private List<ConnectedBean> suggestedByKnowledgeBase;
|
||||
private List<ConnectedBean> currentlyConnected; // they can be "unconnected" or "removed"
|
||||
private List<ConnectedBean> suggestedByKnowledgeBase; // they can be "connected"
|
||||
private List<ConnectedBean> suggestedByUser = new ArrayList<ConnectedBean>(0); // they are "connected" if valid
|
||||
private GRSFManageWidgetServiceAsync service;
|
||||
|
||||
public ConnectToWidget(final ManageProductBean bean, GRSFManageWidgetServiceAsync service) {
|
||||
|
@ -66,18 +68,6 @@ public class ConnectToWidget extends Composite{
|
|||
|
||||
this.service = service;
|
||||
|
||||
// add the one suggested by the knowledge base
|
||||
suggestedByKnowledgeBase = bean.getSuggestedByKnowledgeBase();
|
||||
|
||||
if(suggestedByKnowledgeBase != null){
|
||||
connectPanel.add(new HTML("<hr style=\"width:100%;\"/>"));
|
||||
for (ConnectedBean connected : suggestedByKnowledgeBase) {
|
||||
Widget widget = buildWidgetForConnected(connected, true);
|
||||
connectPanel.add(widget);
|
||||
connectPanel.add(new HTML("<hr style=\"width:100%;\"/>"));
|
||||
}
|
||||
}
|
||||
|
||||
// get already connected beans, and suggested ones
|
||||
currentlyConnected = bean.getCurrentConnections();
|
||||
|
||||
|
@ -90,25 +80,39 @@ public class ConnectToWidget extends Composite{
|
|||
}
|
||||
}
|
||||
|
||||
// manage the button for manual suggestion
|
||||
String acceptedDomain = bean.getGrsfDomain().equalsIgnoreCase(Product_Type.STOCK.getOrigName()) ? Product_Type.FISHERY.getOrigName() : Product_Type.STOCK.getOrigName(); // inverted
|
||||
suggestRecord.setTitle("Connect this " + bean.getGrsfDomain() + " record to a " + acceptedDomain + " record ");
|
||||
suggestRecord.setIcon(IconType.PLUS_SIGN);
|
||||
suggestRecord.getElement().getStyle().setFloat(Float.RIGHT);
|
||||
|
||||
// add handler
|
||||
suggestRecord.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
public void onClick(ClickEvent arg0) {
|
||||
|
||||
ConnectedBean cb = new ConnectedBean();
|
||||
Tuple t = buildWidgetConnect(cb);
|
||||
connectList.add(t);
|
||||
connectPanel.add(t.getW());
|
||||
// add the one suggested by the knowledge base, they can be just "connected"
|
||||
suggestedByKnowledgeBase = bean.getSuggestedByKnowledgeBaseConnections();
|
||||
|
||||
if(suggestedByKnowledgeBase != null){
|
||||
for (ConnectedBean connected : suggestedByKnowledgeBase) {
|
||||
Widget widget = buildWidgetForConnected(connected, true);
|
||||
connectPanel.add(widget);
|
||||
connectPanel.add(new HTML("<hr style=\"width:100%;\"/>"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// manage the button for manual suggestion
|
||||
final String acceptedDomain = bean.getGrsfDomain().equalsIgnoreCase(Product_Type.STOCK.getOrigName()) ?
|
||||
Product_Type.FISHERY.getOrigName() : Product_Type.STOCK.getOrigName();
|
||||
suggestRecord.setTitle("Connect this " + bean.getGrsfDomain() + " record to a " + acceptedDomain + " record ");
|
||||
suggestRecord.setText("Add Connection");
|
||||
suggestRecord.setType(ButtonType.LINK);
|
||||
suggestRecord.getElement().getStyle().setFontWeight(FontWeight.BOLD);
|
||||
suggestRecord.getElement().getStyle().setFloat(Float.RIGHT);
|
||||
|
||||
// add handler
|
||||
suggestRecord.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
public void onClick(ClickEvent arg0) {
|
||||
|
||||
ConnectedBean cb = new ConnectedBean();
|
||||
Tuple t = buildWidgetConnect(cb, acceptedDomain);
|
||||
connectList.add(t);
|
||||
connectPanel.add(t.getW());
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
@ -123,19 +127,19 @@ public class ConnectToWidget extends Composite{
|
|||
VerticalPanel leftPanel = new VerticalPanel();
|
||||
leftPanel.setWidth("80%");
|
||||
leftPanel.getElement().getStyle().setMarginLeft(20, Unit.PX);
|
||||
Paragraph name = new Paragraph("Record name: " + (connected.getDestName() != null? connected.getDestName() : "Unavailable"));
|
||||
Paragraph name = new Paragraph("Record Name: " + (connected.getTitle() != null? connected.getTitle() : "Unavailable"));
|
||||
leftPanel.add(name);
|
||||
|
||||
Paragraph semanticIdentifier = new Paragraph("Semantic Identifier: " +
|
||||
connected.getDestSemanticIdentifier());
|
||||
connected.getSemanticIdentifier());
|
||||
leftPanel.add(semanticIdentifier);
|
||||
|
||||
Paragraph identifier = new Paragraph("Record UUID: " +
|
||||
connected.getDestKnowledgeBaseId());
|
||||
connected.getKnowledgeBaseId());
|
||||
leftPanel.add(identifier);
|
||||
|
||||
Anchor view = new Anchor();
|
||||
view.setHref(connected.getDestUrl());
|
||||
view.setHref(connected.getUrl());
|
||||
view.setText("View");
|
||||
view.setTitle("Click to view the similar record");
|
||||
view.setTarget("_blank");
|
||||
|
@ -145,10 +149,10 @@ public class ConnectToWidget extends Composite{
|
|||
VerticalPanel rightPanel = new VerticalPanel();
|
||||
rightPanel.setWidth("20%");
|
||||
rightPanel.getElement().getStyle().setFloat(Float.RIGHT);
|
||||
|
||||
|
||||
if(!suggestedByKb){
|
||||
final CheckBox removeExtra = new CheckBox("Remove");
|
||||
removeExtra.setTitle("Remove this connections");
|
||||
removeExtra.setTitle("Remove this connection");
|
||||
removeExtra.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
|
@ -158,9 +162,9 @@ public class ConnectToWidget extends Composite{
|
|||
});
|
||||
rightPanel.add(removeExtra);
|
||||
}
|
||||
|
||||
|
||||
final CheckBox connect = new CheckBox("Connect");
|
||||
connect.setValue(suggestedByKb); // automatically check the value
|
||||
connect.setValue(!suggestedByKb); // automatically check/uncheck the value it based on the suggestion
|
||||
connect.setTitle("Connect this record");
|
||||
connect.addClickHandler(new ClickHandler() {
|
||||
|
||||
|
@ -170,7 +174,6 @@ public class ConnectToWidget extends Composite{
|
|||
}
|
||||
});
|
||||
rightPanel.add(connect);
|
||||
|
||||
hp.add(leftPanel);
|
||||
hp.add(rightPanel);
|
||||
hp.getElement().getStyle().setPadding(10, Unit.PX);
|
||||
|
@ -182,8 +185,9 @@ public class ConnectToWidget extends Composite{
|
|||
* Builds up a widget for connecting records.
|
||||
* @param w the widget
|
||||
* @param cb the connectBean.
|
||||
* @param acceptedDomain
|
||||
*/
|
||||
private Tuple buildWidgetConnect(final ConnectedBean cb){
|
||||
private Tuple buildWidgetConnect(final ConnectedBean cb, final String acceptedDomain){
|
||||
|
||||
VerticalPanel main = new VerticalPanel();
|
||||
main.setWidth("100%");
|
||||
|
@ -193,7 +197,7 @@ public class ConnectToWidget extends Composite{
|
|||
VerticalPanel vpLeft = new VerticalPanel();
|
||||
vpLeft.getElement().getStyle().setMarginLeft(15, Unit.PX);
|
||||
vpLeft.setWidth("80%");
|
||||
Paragraph semanticIdentifier = new Paragraph("Identifier (UUID):");
|
||||
Paragraph semanticIdentifier = new Paragraph("UUID:");
|
||||
final TextBox box = new TextBox();
|
||||
final Icon icon = new Icon(IconType.OK_SIGN);
|
||||
final Anchor view = new Anchor();
|
||||
|
@ -209,7 +213,7 @@ public class ConnectToWidget extends Composite{
|
|||
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);
|
||||
validateUUID(box, cb, icon, view, acceptedDomain);
|
||||
}
|
||||
});
|
||||
box.addChangeHandler(new ChangeHandler() {
|
||||
|
@ -217,7 +221,7 @@ public class ConnectToWidget extends Composite{
|
|||
@Override
|
||||
public void onChange(ChangeEvent event) {
|
||||
GWT.log("onChange");
|
||||
validateUUID(box, cb, icon, view);
|
||||
validateUUID(box, cb, icon, view, acceptedDomain);
|
||||
}
|
||||
});
|
||||
box.setWidth("512px");
|
||||
|
@ -230,8 +234,10 @@ public class ConnectToWidget extends Composite{
|
|||
vpRight.setWidth("20%");
|
||||
|
||||
Button removeExtra = new Button();
|
||||
removeExtra.setIcon(IconType.MINUS);
|
||||
removeExtra.setTitle("Remove this connection");
|
||||
removeExtra.setText("Remove");
|
||||
removeExtra.setType(ButtonType.LINK);
|
||||
removeExtra.getElement().getStyle().setFontWeight(FontWeight.BOLD);
|
||||
removeExtra.setTitle("Remove this Connection");
|
||||
removeExtra.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
|
@ -249,7 +255,6 @@ public class ConnectToWidget extends Composite{
|
|||
}
|
||||
}
|
||||
});
|
||||
vpRight.getElement().getStyle().setFloat(Float.RIGHT);
|
||||
vpRight.add(removeExtra);
|
||||
hp.add(vpLeft);
|
||||
hp.add(vpRight);
|
||||
|
@ -260,7 +265,7 @@ public class ConnectToWidget extends Composite{
|
|||
return new Tuple(cb, main, box);
|
||||
}
|
||||
|
||||
protected void validateUUID(final TextBox box, final ConnectedBean c, final Icon icon, final Anchor view) {
|
||||
protected void validateUUID(final TextBox box, final ConnectedBean c, final Icon icon, final Anchor view, final String acceptedDomain) {
|
||||
|
||||
final String currentText = box.getText().trim();
|
||||
|
||||
|
@ -284,13 +289,13 @@ public class ConnectToWidget extends Composite{
|
|||
icon.setIcon(IconType.ROTATE_RIGHT);
|
||||
icon.setSpin(true);
|
||||
|
||||
service.checkIdentifierExists(currentText, new AsyncCallback<String>() {
|
||||
service.checkIdentifierExistsInDomain(currentText, acceptedDomain, new AsyncCallback<String>() {
|
||||
|
||||
@Override
|
||||
public void onSuccess(String result) {
|
||||
|
||||
if(result != null){
|
||||
c.setDestKnowledgeBaseId(currentText);
|
||||
c.setKnowledgeBaseId(currentText);
|
||||
icon.setType(IconType.OK_CIRCLE);
|
||||
icon.setSpin(false);
|
||||
icon.setTitle("");
|
||||
|
@ -324,25 +329,26 @@ public class ConnectToWidget extends Composite{
|
|||
* @return
|
||||
*/
|
||||
public List<ConnectedBean> getConnectList() {
|
||||
|
||||
TODO
|
||||
// List<ConnectedBean> toReturn = new ArrayList<>();
|
||||
//
|
||||
// if(currentlyConnected != null)
|
||||
// currentlyConnected = new ArrayList<ConnectedBean>(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;
|
||||
|
||||
//TODO
|
||||
// List<ConnectedBean> toReturn = new ArrayList<>();
|
||||
//
|
||||
// if(currentlyConnected != null)
|
||||
// currentlyConnected = new ArrayList<ConnectedBean>(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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -25,11 +25,7 @@ import com.google.gwt.user.client.ui.VerticalPanel;
|
|||
import com.google.gwt.user.client.ui.Widget;
|
||||
|
||||
public class SimilarGRSFRecordWidget extends Composite {
|
||||
|
||||
private static final int THRESHOLD_SET_HIDDEN = 5;
|
||||
|
||||
private static final String SEE_MORE = "See More";
|
||||
private static final String SEE_LESS = "See Less";
|
||||
|
||||
private static SimilarGRSFRecordWidgetUiBinder uiBinder = GWT
|
||||
.create(SimilarGRSFRecordWidgetUiBinder.class);
|
||||
|
||||
|
@ -40,25 +36,21 @@ public class SimilarGRSFRecordWidget extends Composite {
|
|||
@UiField
|
||||
VerticalPanel similarGrsfRecordsPanel;
|
||||
|
||||
// @UiField
|
||||
// VerticalPanel similarGrsfRecordsSuggestedPanel;
|
||||
//
|
||||
// @UiField
|
||||
// Button addSimilarRecord;
|
||||
@UiField
|
||||
Button viewMore;
|
||||
|
||||
// private List<Tuple> extraSimilarRecordsList = new ArrayList<Tuple>(0);
|
||||
private List<SimilarGRSFRecord> availableGRSFSimilarRecords;
|
||||
private List<Widget> toHide = new ArrayList<Widget>();
|
||||
//private GRSFManageWidgetServiceAsync service;
|
||||
private static final int THRESHOLD_SET_HIDDEN = 5;
|
||||
private static final String SEE_MORE = "See More";
|
||||
private static final String SEE_LESS = "See Less";
|
||||
|
||||
/**
|
||||
* Get widget for available similar grsf records
|
||||
* @param availableGRSFSimilarRecords
|
||||
* @param service
|
||||
*/
|
||||
public SimilarGRSFRecordWidget(List<SimilarGRSFRecord> availableGRSFSimilarRecords/*, GRSFManageWidgetServiceAsync service*/) {
|
||||
public SimilarGRSFRecordWidget(List<SimilarGRSFRecord> availableGRSFSimilarRecords) {
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
|
||||
//this.service = service;
|
||||
|
@ -133,7 +125,7 @@ public class SimilarGRSFRecordWidget extends Composite {
|
|||
VerticalPanel leftPanel = new VerticalPanel();
|
||||
leftPanel.setWidth("80%");
|
||||
leftPanel.getElement().getStyle().setMarginLeft(20, Unit.PX);
|
||||
Paragraph name = new Paragraph("Record name: " + (similarGRSFRecord.getShortName() != null? similarGRSFRecord.getShortName() : "Unavailable"));
|
||||
Paragraph name = new Paragraph("Record Name: " + (similarGRSFRecord.getTitle() != null? similarGRSFRecord.getTitle() : "Unavailable"));
|
||||
leftPanel.add(name);
|
||||
if(similarGRSFRecord.getDescription() != null){
|
||||
String shortDescrption = similarGRSFRecord.getDescription().length() > 45 ?
|
||||
|
@ -144,7 +136,7 @@ public class SimilarGRSFRecordWidget extends Composite {
|
|||
description.setTitle("Description: " + similarGRSFRecord.getDescription());
|
||||
leftPanel.add(description);
|
||||
}
|
||||
Paragraph identifier = new Paragraph("Record UUID: " +
|
||||
Paragraph identifier = new Paragraph("UUID: " +
|
||||
similarGRSFRecord.getKnowledgeBaseId());
|
||||
leftPanel.add(identifier);
|
||||
|
||||
|
@ -162,33 +154,18 @@ public class SimilarGRSFRecordWidget extends Composite {
|
|||
// 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.setValue(false);
|
||||
|
||||
mergeSuggested.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
public void onClick(ClickEvent arg0) {
|
||||
|
||||
similarGRSFRecord.setSuggestedMerge(mergeSuggested.getValue());
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
// final CheckBox removeExtra = new CheckBox("Remove");
|
||||
// removeExtra.getElement().getStyle().setPaddingTop(3, Unit.PC);
|
||||
// removeExtra.setTitle("Remove this record among the similar ones");
|
||||
// removeExtra.addClickHandler(new ClickHandler() {
|
||||
//
|
||||
// @Override
|
||||
// public void onClick(ClickEvent arg0) {
|
||||
// similarGRSFRecord.setToBeKept(!removeExtra.getValue());
|
||||
// }
|
||||
// });
|
||||
|
||||
rightPanel.getElement().getStyle().setFloat(Float.RIGHT);
|
||||
rightPanel.add(mergeSuggested);
|
||||
// rightPanel.add(removeExtra);
|
||||
hp.add(leftPanel);
|
||||
hp.add(rightPanel);
|
||||
hp.getElement().getStyle().setPadding(10, Unit.PX);
|
||||
|
@ -202,16 +179,6 @@ public class SimilarGRSFRecordWidget extends Composite {
|
|||
*/
|
||||
public List<SimilarGRSFRecord> getSimilarRecords(){
|
||||
|
||||
if(availableGRSFSimilarRecords == null)
|
||||
availableGRSFSimilarRecords = new ArrayList<SimilarGRSFRecord>();
|
||||
|
||||
// for (Tuple p : extraSimilarRecordsList) {
|
||||
// SimilarGRSFRecord similarRecord = ((SimilarGRSFRecord)p.getO());
|
||||
// if(similarRecord.getKnowledgeBaseId() == null || similarRecord.getKnowledgeBaseId().isEmpty())
|
||||
// continue;
|
||||
// availableGRSFSimilarRecords.add((SimilarGRSFRecord) p.getO());
|
||||
// }
|
||||
|
||||
return availableGRSFSimilarRecords;
|
||||
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import com.github.gwtbootstrap.client.ui.Button;
|
|||
import com.github.gwtbootstrap.client.ui.Icon;
|
||||
import com.github.gwtbootstrap.client.ui.Paragraph;
|
||||
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.dom.client.Style.Float;
|
||||
|
@ -56,31 +57,28 @@ public class SuggestMerges extends Composite {
|
|||
public SuggestMerges(GRSFManageWidgetServiceAsync service) {
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
this.service = service;
|
||||
|
||||
// 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.setText("Add Merge");
|
||||
addSimilarRecord.getElement().getStyle().setFontWeight(FontWeight.BOLD);
|
||||
addSimilarRecord.setType(ButtonType.LINK);
|
||||
addSimilarRecord.getElement().getStyle().setFloat(Float.RIGHT);
|
||||
addSimilarRecord.setTitle("Suggest a Similar Record to merge by using its Identifier (UUID)");
|
||||
|
||||
// add handler
|
||||
addSimilarRecord.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
public void onClick(ClickEvent arg0) {
|
||||
|
||||
SimilarGRSFRecord s = new SimilarGRSFRecord();
|
||||
// s.setExtra(true);
|
||||
Widget w = buildWidgetForExtraSimilarRecord(s);
|
||||
extraSimilarRecordsList.add(new Tuple(s, w, null));
|
||||
similarGrsfRecordsSuggestedPanel.add(w);
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds up a widget for suggested similar grsf records. Changes are performed in place with respect to w and s.
|
||||
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
|
||||
* @param w the widget
|
||||
* @param s the similar record.
|
||||
*/
|
||||
|
@ -98,7 +96,7 @@ public class SuggestMerges extends Composite {
|
|||
|
||||
HorizontalPanel textBoxIconContainer = new HorizontalPanel();
|
||||
textBoxIconContainer.setWidth("100%");
|
||||
Paragraph identifier = new Paragraph("Identifier (UUID):");
|
||||
Paragraph identifier = new Paragraph("UUID:");
|
||||
final TextBox box = new TextBox();
|
||||
final Icon icon = new Icon(IconType.OK_SIGN);
|
||||
final Anchor view = new Anchor();
|
||||
|
@ -114,7 +112,7 @@ public class SuggestMerges extends Composite {
|
|||
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);
|
||||
validateUUID(box, s, icon, view, s.getDomain());
|
||||
}
|
||||
});
|
||||
box.addChangeHandler(new ChangeHandler() {
|
||||
|
@ -122,38 +120,26 @@ public class SuggestMerges extends Composite {
|
|||
@Override
|
||||
public void onChange(ChangeEvent event) {
|
||||
GWT.log("onChange");
|
||||
validateUUID(box, s, icon, view);
|
||||
validateUUID(box, s, icon, view, s.getDomain());
|
||||
}
|
||||
});
|
||||
box.setWidth("511px");
|
||||
box.setPlaceholder("Insert the Identifier (UUID) of the suggested record");
|
||||
box.setPlaceholder("Insert the Identifier (UUID) of the record to be merged");
|
||||
vpLeft.add(identifier);
|
||||
textBoxIconContainer.add(box);
|
||||
textBoxIconContainer.add(icon);
|
||||
vpLeft.add(textBoxIconContainer);
|
||||
vpLeft.add(view);
|
||||
|
||||
// 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.setValue(false);
|
||||
|
||||
// the right side
|
||||
VerticalPanel vpRight = new VerticalPanel();
|
||||
vpRight.setWidth("20%");
|
||||
// mergeSuggested.addClickHandler(new ClickHandler() {
|
||||
//
|
||||
// @Override
|
||||
// public void onClick(ClickEvent arg0) {
|
||||
// s.setSuggestedMerge(mergeSuggested.getValue());
|
||||
// }
|
||||
// });
|
||||
//
|
||||
// vpRight.add(mergeSuggested);
|
||||
|
||||
Button removeExtra = new Button();
|
||||
removeExtra.setIcon(IconType.MINUS);
|
||||
removeExtra.setText("Remove");
|
||||
removeExtra.setTitle("Remove this suggested merge");
|
||||
removeExtra.getElement().getStyle().setFontWeight(FontWeight.BOLD);
|
||||
removeExtra.setType(ButtonType.LINK);
|
||||
removeExtra.getElement().getStyle().setFloat(Float.RIGHT);
|
||||
removeExtra.addClickHandler(new ClickHandler() {
|
||||
|
||||
|
@ -174,7 +160,6 @@ public class SuggestMerges extends Composite {
|
|||
});
|
||||
vpRight.getElement().getStyle().setFloat(Float.RIGHT);
|
||||
vpRight.add(removeExtra);
|
||||
// vpRight.add(mergeSuggested);
|
||||
hp.add(vpLeft);
|
||||
hp.add(vpRight);
|
||||
HTML separator = new HTML("<hr style=\"width:100%;\"/>");
|
||||
|
@ -184,7 +169,15 @@ public class SuggestMerges extends Composite {
|
|||
return main;
|
||||
}
|
||||
|
||||
protected void validateUUID(final TextBox box, final SimilarGRSFRecord s, final Icon icon, final Anchor view) {
|
||||
/**
|
||||
* Validate a UUID (ask at server side if it is ok)
|
||||
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
|
||||
* @param box
|
||||
* @param s
|
||||
* @param icon
|
||||
* @param view
|
||||
*/
|
||||
protected void validateUUID(final TextBox box, final SimilarGRSFRecord s, final Icon icon, final Anchor view, String domain) {
|
||||
|
||||
final String currentText = box.getText().trim();
|
||||
|
||||
|
@ -210,7 +203,7 @@ public class SuggestMerges extends Composite {
|
|||
icon.setIcon(IconType.ROTATE_RIGHT);
|
||||
icon.setSpin(true);
|
||||
|
||||
service.checkIdentifierExists(currentText, new AsyncCallback<String>() {
|
||||
service.checkIdentifierExistsInDomain(currentText, domain, new AsyncCallback<String>() {
|
||||
|
||||
@Override
|
||||
public void onSuccess(String result) {
|
||||
|
@ -248,7 +241,7 @@ public class SuggestMerges extends Composite {
|
|||
}
|
||||
|
||||
/**
|
||||
* Get the whole of similar records
|
||||
* Get the whole list of similar records
|
||||
* @return
|
||||
*/
|
||||
public List<SimilarGRSFRecord> getSimilarRecords(){
|
||||
|
|
|
@ -4,7 +4,7 @@ import com.google.gwt.user.client.ui.Widget;
|
|||
|
||||
|
||||
/**
|
||||
* A class of pair: a widget and an object
|
||||
* A class of elements: two widgets and an object
|
||||
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
|
||||
*/
|
||||
public class Tuple {
|
||||
|
@ -16,10 +16,18 @@ public class Tuple {
|
|||
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 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;
|
||||
}
|
||||
|
|
|
@ -28,10 +28,10 @@ import org.gcube.vomanagement.usermanagement.RoleManager;
|
|||
import org.gcube.vomanagement.usermanagement.impl.LiferayRoleManager;
|
||||
import org.gcube.vomanagement.usermanagement.model.GCubeTeam;
|
||||
import org.gcube.vomanagement.usermanagement.model.GCubeUser;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
|
||||
import com.liferay.portal.kernel.log.Log;
|
||||
import com.liferay.portal.kernel.log.LogFactoryUtil;
|
||||
|
||||
import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.CloseableHttpClient;
|
||||
import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.HttpClientBuilder;
|
||||
|
@ -46,8 +46,8 @@ import eu.trentorise.opendata.jackan.model.CkanResource;
|
|||
public class GRSFNotificationService extends RemoteServiceServlet implements GRSFManageWidgetService{
|
||||
|
||||
private static final long serialVersionUID = -4534905087994875893L;
|
||||
//private static final Log logger = LogFactoryUtil.getLog(GRSFNotificationService.class);
|
||||
private static final Logger logger = LoggerFactory.getLogger(GRSFNotificationService.class);
|
||||
private static final Log logger = LogFactoryUtil.getLog(GRSFNotificationService.class);
|
||||
//private static final Logger logger = LoggerFactory.getLogger(GRSFNotificationService.class);
|
||||
|
||||
/**
|
||||
* Instanciate the ckan util library.
|
||||
|
@ -64,7 +64,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
logger.debug("Discovering ckan utils library into scope " + scopeInWhichDiscover);
|
||||
instance = DataCatalogueFactory.getFactory().getUtilsPerScope(scopeInWhichDiscover);
|
||||
}catch(Exception e){
|
||||
logger.error("Unable to retrieve ckan utils. Error was " + e.toString());
|
||||
logger.error("Unable to retrieve ckan utils. Error was ", e);
|
||||
throw e;
|
||||
}
|
||||
return instance;
|
||||
|
@ -75,7 +75,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
|
||||
ManageProductBean toReturn = null;
|
||||
|
||||
// check into session first
|
||||
// check into user's session first
|
||||
HttpSession httpSession = getThreadLocalRequest().getSession();
|
||||
String sessionProductKey = ScopeProvider.instance.get() + productIdentifier;
|
||||
if(httpSession.getAttribute(sessionProductKey) != null)
|
||||
|
@ -86,15 +86,30 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
toReturn = new ManageProductBean();
|
||||
toReturn.setCatalogueIdentifier(UUID.randomUUID().toString());
|
||||
List<ConnectedBean> connectTo = new ArrayList<>();
|
||||
|
||||
// these are the records alread connected
|
||||
connectTo.add(new ConnectedBean(
|
||||
"89f1e413-dc9f-3b4e-b1c5-0e8560177254",
|
||||
"Random title",
|
||||
"http://data.d4science.org/ctlg/GRSF_Admin/89f1e413-dc9f-3b4e-b1c5-0e8560177254",
|
||||
"Fishery",
|
||||
"ajklsdkad:akljdnajdna"
|
||||
"uuid-of-a-connected-bean",
|
||||
"Random description",
|
||||
"Random shortName",
|
||||
"Random Title",
|
||||
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-of-a-connected-bean",
|
||||
"semantic identifier of the record",
|
||||
"Fishery"
|
||||
));
|
||||
toReturn.setCurrentConnections(connectTo);
|
||||
|
||||
// these are the "suggested connections"
|
||||
List<ConnectedBean> suggestionsForConnections = new ArrayList<>();
|
||||
suggestionsForConnections.add(new ConnectedBean(
|
||||
"uuid-of-a-connected-bean-suggested",
|
||||
"Random description",
|
||||
"Random shortName",
|
||||
"Random Title",
|
||||
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-of-a-connected-bean-suggested",
|
||||
"semantic identifier of the record suggested for connection",
|
||||
"Fishery"
|
||||
));
|
||||
toReturn.setSuggestedByKnowledgeBaseConnections(suggestionsForConnections);
|
||||
toReturn.setGrsfDomain("Stock");
|
||||
toReturn.setGrsfType("Assessment Unit");
|
||||
toReturn.setKnowledgeBaseIdentifier("91f1e413-dc9f-3b4e-b1c5-0e8560177253");
|
||||
|
@ -110,16 +125,60 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
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",
|
||||
Utils.getDatasetKnowledgeBaseIdFromUrl("http://data.d4science.org/ctlg/GRSF_Admin/1a03d6d8-002d-39b9-9255-a954c8ee2bf0")
|
||||
,"unknown:ONCORHYNCHUS GORBUSCHA+unknown:USA-AKSTATE-KELPB",
|
||||
"Pink Salmon Kelp By (District112)",
|
||||
"http://data.d4science.org/ctlg/GRSF_Admin/1a03d6d8-002d-39b9-9255-a954c8ee2bf0"));
|
||||
similarGrsfRecords.add(new SimilarGRSFRecord("same species overlapping water areas 2",
|
||||
Utils.getDatasetKnowledgeBaseIdFromUrl("http://data.d4science.org/ctlg/GRSF_Admin/1a03d6d8-002d-39b9-9255-a954c8ee2bf0"),
|
||||
"unknown:ONCORHYNCHUS GORBUSCHA+unknown:USA-AKSTATE-KELPB",
|
||||
"Pink Salmon Kelp By (District112) 2",
|
||||
"http://data.d4science.org/ctlg/GRSF_Admin/1a03d6d8-002d-39b9-9255-a954c8ee2bf0"));
|
||||
similarGrsfRecords.add(new SimilarGRSFRecord(
|
||||
"uuid-similar-record-1",
|
||||
"description similar record",
|
||||
"short name similar record 1",
|
||||
"title similar record 1",
|
||||
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-1",
|
||||
"semantic identifier record 1",
|
||||
"Stock 1"
|
||||
));
|
||||
similarGrsfRecords.add(new SimilarGRSFRecord(
|
||||
"uuid-similar-record-2",
|
||||
"description similar record",
|
||||
"short name similar record 2",
|
||||
"title similar record 2",
|
||||
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-2",
|
||||
"semantic identifier record 2",
|
||||
"Stock 2"
|
||||
));
|
||||
similarGrsfRecords.add(new SimilarGRSFRecord(
|
||||
"uuid-similar-record-3",
|
||||
"description similar record",
|
||||
"short name similar record 3",
|
||||
"title similar record 3",
|
||||
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-3",
|
||||
"semantic identifier record 3",
|
||||
"Stock 3"
|
||||
));
|
||||
similarGrsfRecords.add(new SimilarGRSFRecord(
|
||||
"uuid-similar-record-4",
|
||||
"description similar record",
|
||||
"short name similar record 4",
|
||||
"title similar record 4",
|
||||
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-4",
|
||||
"semantic identifier record 4",
|
||||
"Stock 4"
|
||||
));
|
||||
similarGrsfRecords.add(new SimilarGRSFRecord(
|
||||
"uuid-similar-record-5",
|
||||
"description similar record",
|
||||
"short name similar record 5",
|
||||
"title similar record 5",
|
||||
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-5",
|
||||
"semantic identifier record 5",
|
||||
"Stock 5"
|
||||
));
|
||||
similarGrsfRecords.add(new SimilarGRSFRecord(
|
||||
"uuid-similar-record-6",
|
||||
"description similar record",
|
||||
"short name similar record 6",
|
||||
"title similar record 6",
|
||||
"http://data.d4science.org/ctlg/GRSF_Admin/uuid-similar-record-6",
|
||||
"semantic identifier record 6",
|
||||
"Stock 6"
|
||||
));
|
||||
toReturn.setSimilarGrsfRecords(similarGrsfRecords);
|
||||
|
||||
}else{
|
||||
|
@ -140,12 +199,9 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
// check it is a grsf record (Source records have a different System Type)
|
||||
Map<String, String> extrasAsMap = record.getExtrasAsHashMap();
|
||||
|
||||
// get extras as hashmap and pairs
|
||||
List<CkanPair> extrasAsPairs = record.getExtras();
|
||||
|
||||
String systemType = extrasAsMap.get(Constants.SYSTEM_TYPE_CUSTOM_KEY);
|
||||
if(systemType == null || systemType.isEmpty() || systemType.equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE))
|
||||
throw new NoGRSFRecordException("This is not a GRSF Record");
|
||||
throw new NoGRSFRecordException("This is not a GRSF Record");
|
||||
|
||||
boolean isStock = record.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY).contains(Product_Type.STOCK.getOrigName());
|
||||
|
||||
|
@ -154,22 +210,14 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
Utils.getFieldToFieldNameSpaceMapping(httpSession, isStock ?
|
||||
Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_STOCK : Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_FISHERY);
|
||||
|
||||
// get extras as pairs
|
||||
List<CkanPair> extrasAsPairs = record.getExtras();
|
||||
|
||||
Map<String, List<String>> extrasWithoutNamespaces = Utils.replaceFieldsKey(extrasAsPairs, fieldsNamespacesMap);
|
||||
// get extras fields (wrt the mandatory ones) to show in the management panel TODO
|
||||
// Utils.getExtrasToShow();
|
||||
String catalogueIdentifier = record.getId();
|
||||
Status status = Status.fromString(extrasWithoutNamespaces.get(Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY).get(0));
|
||||
String uuidKB = extrasWithoutNamespaces.get(Constants.UUID_KB_CUSTOM_KEY).get(0);
|
||||
String grsfDomain = extrasWithoutNamespaces.get(Constants.DOMAIN_CUSTOM_KEY).get(0);
|
||||
|
||||
|
||||
if(status == null || uuidKB == null)
|
||||
throw new Exception("Some information is missing in this record: Status = " + status + ", knowledge base uuid = " + uuidKB +
|
||||
", and grsf domain is = " + grsfDomain);
|
||||
|
||||
if(status.equals(Status.To_be_Merged) || status.equals(Status.Rejected))
|
||||
throw new Exception("Records under merging activity or rejected cannot be updated");
|
||||
|
||||
String semanticId = extrasWithoutNamespaces.get(Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY).get(0);
|
||||
String shortName = extrasWithoutNamespaces.get(Constants.SHORT_NAME_CUSTOM_KEY).get(0);
|
||||
String grsfType = extrasWithoutNamespaces.get(Constants.GRSF_TYPE_CUSTOM_KEY).get(0);
|
||||
|
@ -179,18 +227,21 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
try{
|
||||
traceabilityFlag = extrasWithoutNamespaces.get(Constants.TRACEABILITY_FLAG_CUSTOM_KEY).get(0).equalsIgnoreCase("true");
|
||||
}catch(Exception e){
|
||||
logger.warn("Unable to fetch traceability flag", e);
|
||||
logger.warn("Unable to fetch traceability flag. Setting it to false", e);
|
||||
}
|
||||
|
||||
if(status.equals(Status.To_be_Merged) || status.equals(Status.Rejected))
|
||||
throw new Exception("Records under merging activity or rejected cannot be managed!");
|
||||
|
||||
// Get similar GRSF records, if any (each of which should have name, description, url and id(i.e semantic identifier))
|
||||
List<String> similarGrsfRecordsAsStrings = extrasWithoutNamespaces.containsKey(Constants.SIMILAR_GRSF_RECORDS_CUSTOM_KEY) ? extrasWithoutNamespaces.get(Constants.SIMILAR_GRSF_RECORDS_CUSTOM_KEY): null;
|
||||
|
||||
List<SimilarGRSFRecord> similarRecords = new ArrayList<SimilarGRSFRecord>(0);
|
||||
if(similarGrsfRecordsAsStrings != null){
|
||||
for (String similarGRSFRecord : similarGrsfRecordsAsStrings) {
|
||||
if(similarGRSFRecord.equals(Constants.NO_SIMILAR_GRSF_RECORDS)) // stop here if there is a single element with this information
|
||||
break;
|
||||
similarRecords.add(Utils.similarGRSFRecordFromJson(similarGRSFRecord));
|
||||
if(similarGrsfRecordsAsStrings != null && !similarGrsfRecordsAsStrings.isEmpty()){
|
||||
if(!similarGrsfRecordsAsStrings.get(0).equals(Constants.NO_SIMILAR_GRSF_RECORDS)){
|
||||
for (String similarGRSFRecord : similarGrsfRecordsAsStrings) {
|
||||
similarRecords.add(Utils.similarGRSFRecordFromJson(similarGRSFRecord, catalogue, apiKey));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -201,13 +252,13 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
extrasWithoutNamespaces.containsKey(Constants.CONNECTED_CUSTOM_KEY) ? extrasWithoutNamespaces.get(Constants.CONNECTED_CUSTOM_KEY): null;
|
||||
|
||||
List<ConnectedBean> connectedBeans = new ArrayList<ConnectedBean>(0);
|
||||
if(connectedBeanUrls != null){
|
||||
for (String connectedBean : connectedBeanUrls) {
|
||||
if(connectedBean.equals(Constants.NO_CONNECTED_RECORDS)) // stop here if there is a single element with this information
|
||||
break;
|
||||
ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(connectedBean, catalogue, apiKey, httpSession);
|
||||
if(builtBean != null)
|
||||
connectedBeans.add(builtBean);
|
||||
if(connectedBeanUrls != null && !connectedBeanUrls.isEmpty()){
|
||||
if(!connectedBeanUrls.get(0).equals(Constants.NO_CONNECTED_RECORDS)){
|
||||
for (String connectedBean : connectedBeanUrls) {
|
||||
ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(connectedBean, catalogue, apiKey, httpSession);
|
||||
if(builtBean != null)
|
||||
connectedBeans.add(builtBean);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -218,7 +269,8 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
List<String> exploitedResourcesUrls = isStock ?
|
||||
(extrasWithoutNamespaces.containsKey(Constants.EXPLOITING_FISHERY_JSON_KEY) ?
|
||||
extrasWithoutNamespaces.get(Constants.EXPLOITING_FISHERY_JSON_KEY) : null):
|
||||
(extrasWithoutNamespaces.containsKey(Constants.RESOURCES_EXPLOITED_JSON_KEY) ? extrasWithoutNamespaces.get(Constants.RESOURCES_EXPLOITED_JSON_KEY) : null);
|
||||
(extrasWithoutNamespaces.containsKey(Constants.RESOURCES_EXPLOITED_JSON_KEY) ?
|
||||
extrasWithoutNamespaces.get(Constants.RESOURCES_EXPLOITED_JSON_KEY) : null);
|
||||
|
||||
if(exploitedResourcesUrls != null && !exploitedResourcesUrls.isEmpty()){
|
||||
for (String exploited : exploitedResourcesUrls) {
|
||||
|
@ -239,15 +291,20 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
}
|
||||
|
||||
// set the values
|
||||
toReturn = new ManageProductBean(semanticId, catalogueIdentifier, uuidKB, grsfType,
|
||||
grsfDomain, grsfName, shortName, traceabilityFlag, status, recordUrl,
|
||||
null, sources, similarRecords, connectedBeans, suggestedConnectionsByKnowledgeBase);
|
||||
toReturn = new ManageProductBean(
|
||||
semanticId, catalogueIdentifier, uuidKB, grsfType,
|
||||
grsfDomain, grsfName, shortName, traceabilityFlag,
|
||||
status, recordUrl, sources, similarRecords,
|
||||
connectedBeans, suggestedConnectionsByKnowledgeBase);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("Returning item bean " + toReturn);
|
||||
httpSession.setAttribute(sessionProductKey, toReturn);
|
||||
// save it into session
|
||||
if(toReturn != null)
|
||||
httpSession.setAttribute(sessionProductKey, toReturn);
|
||||
|
||||
logger.debug("Returning item bean " + toReturn);
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
|
@ -268,8 +325,8 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
String username = pContext.getCurrentUser(getThreadLocalRequest()).getUsername();
|
||||
long userId = pContext.getCurrentUser(getThreadLocalRequest()).getUserId();
|
||||
long groupId = pContext.getCurrentGroupId(getThreadLocalRequest());
|
||||
List<GCubeTeam> teamRoles = roleManager.listTeamsByUserAndGroup(userId, groupId);
|
||||
toSetInSession = isEditor(username, teamRoles) | isReviewer(username, teamRoles);
|
||||
List<GCubeTeam> teamRolesByUser = roleManager.listTeamsByUserAndGroup(userId, groupId);
|
||||
toSetInSession = isEditor(username, teamRolesByUser) | isReviewer(username, teamRolesByUser);
|
||||
}
|
||||
getThreadLocalRequest().getSession().setAttribute(Constants.GRSF_ADMIN_SESSION_KEY, toSetInSession);
|
||||
return toSetInSession;
|
||||
|
@ -281,7 +338,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
}
|
||||
|
||||
@Override
|
||||
public String notifyProductUpdate(ManageProductBean bean, List<String> hashtags) throws Exception{
|
||||
public String notifyProductUpdate(ManageProductBean bean) throws Exception{
|
||||
|
||||
logger.info("Creating notification for the bean " + bean + " to send to the knowledge base");
|
||||
try{
|
||||
|
@ -291,6 +348,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
DataCatalogue catalogue = getCatalogue(context);
|
||||
String administratorFullName = Utils.getCurrentUser(getThreadLocalRequest()).getFullname();
|
||||
String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername();
|
||||
|
||||
// check if the base url of the service is in session
|
||||
String keyPerContext = UtilMethods.concatenateSessionKeyScope(Constants.GRSF_UPDATER_SERVICE, context);
|
||||
HttpServletRequest threadRequest = getThreadLocalRequest();
|
||||
|
@ -305,7 +363,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
threadRequest.getSession().removeAttribute(sessionProductKey);
|
||||
|
||||
return Utils.updateRecord(baseUrl, bean, catalogue, username, administratorFullName, threadRequest,
|
||||
PortalContext.getConfiguration().getCurrentGroupId(threadRequest), context, token, hashtags);
|
||||
PortalContext.getConfiguration().getCurrentGroupId(threadRequest), context, token, bean.getReport());
|
||||
|
||||
}catch(Exception e){
|
||||
logger.error("Unable to update the product", e);
|
||||
|
@ -324,10 +382,10 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
String fullName = user.getFullname();
|
||||
long userId = pContext.getCurrentUser(getThreadLocalRequest()).getUserId();
|
||||
long groupId = pContext.getCurrentGroupId(getThreadLocalRequest());
|
||||
List<GCubeTeam> teamRoles = roleManager.listTeamsByUserAndGroup(userId, groupId);
|
||||
List<GCubeTeam> teamRolesByUser = roleManager.listTeamsByUserAndGroup(userId, groupId);
|
||||
|
||||
boolean isEditor = isEditor(username, teamRoles);
|
||||
boolean isReviewer = isReviewer(username, teamRoles);
|
||||
boolean isEditor = isEditor(username, teamRolesByUser);
|
||||
boolean isReviewer = isReviewer(username, teamRolesByUser);
|
||||
|
||||
if(!(isEditor | isReviewer))
|
||||
throw new Exception("You are not allowed to perform this operation!");
|
||||
|
@ -337,7 +395,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
String adminInUrl = decryptedUrl.getAdmin();
|
||||
String uuid = decryptedUrl.getUuid();
|
||||
|
||||
logger.info("User " + username + " has requested to invert an operation on record with id " + uuid + " and admin in url was " + adminInUrl);
|
||||
logger.info("User " + username + " has requested to invert an operation on record with id " + uuid + " and admin in url is " + adminInUrl);
|
||||
|
||||
// we need to check the timestamp (it has 24h validity)
|
||||
boolean isValidTimestamp = decryptedUrl.isTimestampValid();
|
||||
|
@ -379,9 +437,9 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
* @param teamRoles
|
||||
* @return true if he/she is an editor, false otherwise
|
||||
*/
|
||||
private boolean isEditor(String username, List<GCubeTeam> teamRoles){
|
||||
private boolean isEditor(String username, List<GCubeTeam> teamRolesByUser){
|
||||
|
||||
for (GCubeTeam team : teamRoles) {
|
||||
for (GCubeTeam team : teamRolesByUser) {
|
||||
if(team.getTeamName().equals(Constants.GRSF_CATALOGUE_EDITOR_ROLE)){
|
||||
logger.info("User " + username + " is allowed to modify GRSF records as editor");
|
||||
return true;
|
||||
|
@ -396,9 +454,9 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
* @param teamRoles
|
||||
* @return true if he/she is an reviewer, false otherwise
|
||||
*/
|
||||
private boolean isReviewer(String username, List<GCubeTeam> teamRoles){
|
||||
private boolean isReviewer(String username, List<GCubeTeam> teamRolesByUser){
|
||||
|
||||
for (GCubeTeam team : teamRoles) {
|
||||
for (GCubeTeam team : teamRolesByUser) {
|
||||
if(team.getTeamName().equals(team.getTeamName().equals(Constants.GRSF_CATALOGUE_REVIEWER_ROLE))){
|
||||
logger.info("User " + username + " is allowed to modify GRSF records as reviewer");
|
||||
return true;
|
||||
|
@ -415,7 +473,11 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername();
|
||||
CkanDataset dataset = catalogue.getDataset(id, catalogue.getApiKeyFromUsername(username));
|
||||
if(dataset == null)
|
||||
throw new Exception("A record with id " + id + " doesn't exist");
|
||||
throw new Exception("A GRSF record with id " + id + " doesn't exist");
|
||||
|
||||
if(!dataset.getOrganization().getName().equals(Constants.GRSF_ADMIN_ORGANIZATION_NAME))
|
||||
throw new Exception("The suggested record is not a GRSF record");
|
||||
|
||||
return dataset.getExtrasAsHashMap().get(Constants.ITEM_URL_FIELD);
|
||||
}
|
||||
|
||||
|
@ -426,9 +488,13 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl);
|
||||
String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername();
|
||||
CkanDataset dataset = catalogue.getDataset(id, catalogue.getApiKeyFromUsername(username));
|
||||
|
||||
if(dataset == null)
|
||||
throw new Exception("A record with id " + id + " doesn't exist");
|
||||
|
||||
if(!dataset.getOrganization().getName().equals(Constants.GRSF_ADMIN_ORGANIZATION_NAME))
|
||||
throw new Exception("The suggested record is not a GRSF record");
|
||||
|
||||
List<CkanPair> extrasAsPairs = dataset.getExtras();
|
||||
|
||||
for (CkanPair ckanPair : extrasAsPairs) {
|
||||
|
@ -438,39 +504,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
|
|||
}
|
||||
}
|
||||
|
||||
throw new Exception("A record with id " + id + " doesn't exist in domain " + domain);
|
||||
throw new Exception("A GRSF record with id " + id + " doesn't exist in domain " + domain);
|
||||
}
|
||||
|
||||
// @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<CkanPair> 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;
|
||||
// }
|
||||
|
||||
}
|
||||
|
|
|
@ -123,7 +123,7 @@ public class GRSFUpdaterServiceClient {
|
|||
JSONObject cc = new JSONObject();
|
||||
if(c.isRemove() || (c.isConnect() && !c.isRemove())){ // do not send it if it needs to be unconnected but not removed
|
||||
cc.put(Constants.SOURCE_KNOWLEDGE_BASE_ID, bean.getKnowledgeBaseIdentifier());
|
||||
cc.put(Constants.DEST_KNOWLEDGE_BASE_ID, c.getDestKnowledgeBaseId());
|
||||
cc.put(Constants.DEST_KNOWLEDGE_BASE_ID, c.getKnowledgeBaseId());
|
||||
cc.put(Constants.SOURCE_DOMAIN, bean.getGrsfDomain());
|
||||
cc.put(Constants.CONNECTION_TO_REMOVE, c.isRemove());
|
||||
}
|
||||
|
|
|
@ -130,7 +130,7 @@ public class SocialCommunications {
|
|||
* @param enablePostNotification
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static void writeProductPost(ManageProductBean bean, String username, String fullName, List<String> hashtags, boolean enablePostNotification){
|
||||
public static void writeProductPost(ManageProductBean bean, String username, String fullName, String report, boolean enablePostNotification){
|
||||
|
||||
// discover service endpoint for the social networking library
|
||||
String currentScope = ScopeProvider.instance.get();
|
||||
|
@ -177,13 +177,14 @@ public class SocialCommunications {
|
|||
// replace
|
||||
String message = POST_MESSAGE.replace("PRODUCT_TITLE", bean.getGrsfName()).replace("PRODUCT_URL", bean.getRecordUrl()).replace("USER_FULLNAME", fullName);
|
||||
|
||||
if(hashtags != null && !hashtags.isEmpty())
|
||||
for (String hashtag : hashtags) {
|
||||
String modifiedHashtag = hashtag.replaceAll(" ", "_").replace("_+", "_"); // no empty spaces allowed
|
||||
if(modifiedHashtag.endsWith("_"))
|
||||
modifiedHashtag = modifiedHashtag.substring(0, modifiedHashtag.length() - 1);
|
||||
message += " #" + modifiedHashtag;
|
||||
}
|
||||
// evaluate hashtags from the report ... TODO
|
||||
// if(hashtags != null && !hashtags.isEmpty())
|
||||
// for (String hashtag : hashtags) {
|
||||
// String modifiedHashtag = hashtag.replaceAll(" ", "_").replace("_+", "_"); // no empty spaces allowed
|
||||
// if(modifiedHashtag.endsWith("_"))
|
||||
// modifiedHashtag = modifiedHashtag.substring(0, modifiedHashtag.length() - 1);
|
||||
// message += " #" + modifiedHashtag;
|
||||
// }
|
||||
|
||||
logger.info("The post that is going to be written is -> " + message);
|
||||
postRequest = new HttpPost(basePath + SOCIAL_SERVICE_WRITE_APPLICATION_POST + "?gcube-token=" + applicationToken);
|
||||
|
|
|
@ -6,10 +6,8 @@ import java.io.StringReader;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
|
@ -25,7 +23,6 @@ import org.gcube.common.scope.api.ScopeProvider;
|
|||
import org.gcube.datacatalogue.ckanutillibrary.server.ApplicationProfileScopePerUrlReader;
|
||||
import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogue;
|
||||
import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogueRunningCluster;
|
||||
import org.gcube.datacatalogue.ckanutillibrary.shared.ex.ApplicationProfileNotFoundException;
|
||||
import org.gcube.datacatalogue.common.Constants;
|
||||
import org.gcube.datacatalogue.common.enums.Product_Type;
|
||||
import org.gcube.datacatalogue.common.enums.Status;
|
||||
|
@ -58,62 +55,9 @@ import eu.trentorise.opendata.jackan.model.CkanPair;
|
|||
*/
|
||||
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 String REGEX_UUID = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
|
||||
|
||||
/**
|
||||
* Look up from the IS other information that can be potentially displayed in read only mode in the management panel.
|
||||
* @return a list of extra keys to show.
|
||||
*/
|
||||
public static Set<String> getLookedUpExtrasKeys() {
|
||||
Set<String> lookedUpExtrasKeys = new HashSet<String>();
|
||||
String scope = ScopeProvider.instance.get();
|
||||
logger.debug("Trying to fetch applicationProfile profile from the infrastructure for " + GENERIC_RESOURCE_NAME + " scope: " + scope);
|
||||
|
||||
try {
|
||||
Query q = new QueryBox("for $profile in collection('/db/Profiles/GenericResource')//Resource " +
|
||||
"where $profile/Profile/SecondaryType/string() eq '"+ GENERIC_RESOURCE_SECONDARY_TYPE + "' and $profile/Profile/Name/string() " +
|
||||
" eq '" + GENERIC_RESOURCE_NAME + "'" +
|
||||
"return $profile");
|
||||
|
||||
DiscoveryClient<String> client = client();
|
||||
List<String> appProfile = client.submit(q);
|
||||
|
||||
if (appProfile == null || appProfile.size() == 0)
|
||||
throw new ApplicationProfileNotFoundException("Your applicationProfile is not registered in the infrastructure");
|
||||
else {
|
||||
|
||||
String elem = appProfile.get(0);
|
||||
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
|
||||
Node node = docBuilder.parse(new InputSource(new StringReader(elem))).getDocumentElement();
|
||||
XPathHelper helper = new XPathHelper(node);
|
||||
|
||||
List<String> currValue = null;
|
||||
currValue = helper.evaluate("/Resource/Profile/Body/text()");
|
||||
|
||||
if (currValue != null && currValue.size() > 0) {
|
||||
String body = currValue.get(0);
|
||||
String[] splittedSet = body.split(",");
|
||||
if(splittedSet != null && splittedSet.length > 0)
|
||||
for (String entry : splittedSet) {
|
||||
String trimmed = entry.trim();
|
||||
if(trimmed.isEmpty())
|
||||
continue;
|
||||
lookedUpExtrasKeys.add(trimmed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("Extras entries are " + lookedUpExtrasKeys);
|
||||
return lookedUpExtrasKeys;
|
||||
} catch (Exception e) {
|
||||
logger.error("Error while trying to fetch applicationProfile profile from the infrastructure", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a map for converting a key to a namespace:key format by reading a generic resource.
|
||||
* @param httpSession
|
||||
|
@ -243,7 +187,7 @@ public class Utils {
|
|||
long groupId,
|
||||
String context,
|
||||
String token,
|
||||
List<String> hashtags) throws Exception{
|
||||
String report) throws Exception{
|
||||
|
||||
if(serviceUrl == null)
|
||||
throw new IllegalArgumentException("GRSF Updater service url cannot be null");
|
||||
|
@ -260,7 +204,7 @@ public class Utils {
|
|||
// send update to the knowledge base
|
||||
GRSFUpdaterServiceClient.updateKB(httpClient, serviceUrl, bean, catalogue, username, fullName);
|
||||
|
||||
// manage interactions through a separated thread but set there security token and context
|
||||
// manage interactions through a separated thread but set there security token and context (and then reset them)
|
||||
new Thread(()->{
|
||||
|
||||
ScopeProvider.instance.set(context);
|
||||
|
@ -271,10 +215,13 @@ public class Utils {
|
|||
SocialCommunications.sendEmailAdministrators(bean, catalogue, username, fullName, groupId, httpServletRequest, bean.isMergesInvolved());
|
||||
|
||||
// create a post about the operation
|
||||
SocialCommunications.writeProductPost(bean, username, fullName, hashtags, true);
|
||||
SocialCommunications.writeProductPost(bean, username, fullName, report, true);
|
||||
|
||||
}catch(Exception e){
|
||||
logger.error("Something failed while alerting editors/reviewers", e);
|
||||
}finally{
|
||||
ScopeProvider.instance.reset();
|
||||
SecurityTokenProvider.instance.reset();
|
||||
}
|
||||
|
||||
}).start();
|
||||
|
@ -396,50 +343,6 @@ public class Utils {
|
|||
return user;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Given a semantic identifier, check if a record exists and return it
|
||||
// * @param suggestedRecordSemanticIdentifier
|
||||
// * @param catalogue
|
||||
// * @return CkanDataset
|
||||
// * @throws Exception in case no record matches the semantic identifier
|
||||
// */
|
||||
// public static CkanDataset getRecordBySemanticIdentifier(
|
||||
// String suggestedRecordSemanticIdentifier, DataCatalogue catalogue,
|
||||
// String apiKey) throws Exception {
|
||||
//
|
||||
// if(suggestedRecordSemanticIdentifier == null || suggestedRecordSemanticIdentifier.isEmpty())
|
||||
// throw new Exception(Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + " cannot be null or emtpy");
|
||||
//
|
||||
// String query = Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + "\"" + suggestedRecordSemanticIdentifier+ "\"";
|
||||
// List<CkanDataset> datasets = catalogue.searchForPackageInOrganization(apiKey, query, 0, 10, Constants.GRSF_ADMIN_ORGANIZATION_NAME);
|
||||
//
|
||||
// if(datasets == null || datasets.isEmpty()){
|
||||
// String message = "Unable to find dataset with such " + Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY;
|
||||
// logger.warn(message);
|
||||
// throw new Exception(message);
|
||||
// }
|
||||
//
|
||||
// logger.info("Result size is " + datasets.size());
|
||||
//
|
||||
// if(datasets.size() == 1)
|
||||
// return datasets.get(0);
|
||||
// else{
|
||||
//
|
||||
// // worst situation.. we need to check for the right one
|
||||
// for(CkanDataset dataset: datasets)
|
||||
// for(CkanPair extra : dataset.getExtras())
|
||||
// if(extra.getKey().contains(Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY) && extra.getValue().equals(suggestedRecordSemanticIdentifier)){
|
||||
// logger.info("Matching dataset has id " + dataset.getId() + " with value " + Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY);
|
||||
// return dataset;
|
||||
// }
|
||||
//
|
||||
// }
|
||||
//
|
||||
// // in the end ....
|
||||
// throw new Exception("Unable to find record with " + Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + " equals to " + suggestedRecordSemanticIdentifier);
|
||||
//
|
||||
// }
|
||||
|
||||
/**
|
||||
* Exploits the fact that in GRSF the url of a record contains the name (which is unique) of the record itself
|
||||
* @param url
|
||||
|
@ -527,20 +430,25 @@ public class Utils {
|
|||
* @return {@link SimilarGRSFRecord}
|
||||
* @throws ParseException
|
||||
*/
|
||||
public static SimilarGRSFRecord similarGRSFRecordFromJson(String json) throws ParseException{
|
||||
public static SimilarGRSFRecord similarGRSFRecordFromJson(String json, DataCatalogue ctl, String apiKey) throws ParseException{
|
||||
|
||||
if(json == null)
|
||||
return null;
|
||||
|
||||
JSONParser parser = new JSONParser();
|
||||
JSONObject object = (JSONObject)parser.parse(json);
|
||||
|
||||
|
||||
String uuid = getDatasetKnowledgeBaseIdFromUrl((String)object.get(Constants.SIMILAR_RECORDS_BEAN_FIELD_URL));
|
||||
CkanDataset dataset = ctl.getDataset(uuid, apiKey);
|
||||
|
||||
return new SimilarGRSFRecord(
|
||||
uuid,
|
||||
(String)object.get(Constants.SIMILAR_RECORDS_BEAN_FIELD_DESCRIPTION),
|
||||
getDatasetKnowledgeBaseIdFromUrl((String)object.get(Constants.SIMILAR_RECORDS_BEAN_FIELD_URL)),
|
||||
(String)object.get(Constants.SIMILAR_RECORDS_BEAN_FIELD_IDENTIFIER),
|
||||
(String)object.get(Constants.SIMILAR_RECORDS_BEAN_FIELD_NAME),
|
||||
(String)object.get(Constants.SIMILAR_RECORDS_BEAN_FIELD_URL)
|
||||
dataset.getTitle(), // no title
|
||||
(String)object.get(Constants.SIMILAR_RECORDS_BEAN_FIELD_URL),
|
||||
(String)object.get(Constants.SIMILAR_RECORDS_BEAN_FIELD_IDENTIFIER),
|
||||
dataset.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY)
|
||||
);
|
||||
|
||||
}
|
||||
|
@ -589,19 +497,23 @@ public class Utils {
|
|||
Map<String, List<String>> extrasWithoutNamespaces = Utils.replaceFieldsKey(destDataset.getExtras(), fieldsNamespacesMap);
|
||||
String semanticId = extrasWithoutNamespaces.get(Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY).get(0);
|
||||
String destDomain = extrasWithoutNamespaces.get(Constants.DOMAIN_CUSTOM_KEY).get(0);
|
||||
|
||||
String shortName = extrasWithoutNamespaces.get(Constants.SHORT_NAME_CUSTOM_KEY).get(0);
|
||||
String description = destDataset.getNotes();
|
||||
|
||||
return new ConnectedBean(
|
||||
connectedBeanUuid,
|
||||
description,
|
||||
shortName,
|
||||
destDataset.getTitle(),
|
||||
destUrl,
|
||||
destDomain,
|
||||
semanticId
|
||||
semanticId,
|
||||
destDomain
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the sysadmin key from the IS
|
||||
* Fetch the sysadmin key from the IS for this catalogue
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
|
|
|
@ -1,20 +1,12 @@
|
|||
package org.gcube.datacatalogue.grsf_manage_widget.shared;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
/**
|
||||
* Connect the current record with another record
|
||||
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
|
||||
*/
|
||||
public class ConnectedBean implements Serializable{
|
||||
public class ConnectedBean extends GenericRecord{
|
||||
|
||||
private static final long serialVersionUID = -4863776727351488790L;
|
||||
private String destKnowledgeBaseId; // the dest identifier of a Fishery or Stock (the link is from a Stock to a Fishery and vice versa)
|
||||
private String destName;
|
||||
private String destUrl;
|
||||
private String destSemanticIdentifier;
|
||||
private String destDomain; // please note that this MUST be different from sourceDomain
|
||||
private boolean remove;
|
||||
private boolean connect;
|
||||
|
||||
|
@ -22,28 +14,11 @@ public class ConnectedBean implements Serializable{
|
|||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param sourceKnowledgeBaseId
|
||||
* @param sourceDomain
|
||||
* @param sourceUrl
|
||||
* @param destKnowledgeBaseId
|
||||
* @param destTitle
|
||||
* @param destUrl
|
||||
* @param remove
|
||||
* @param connect
|
||||
*/
|
||||
public ConnectedBean(
|
||||
String destKnowledgeBaseId,
|
||||
String destName,
|
||||
String destUrl,
|
||||
String destDomain,
|
||||
String destSemanticIdentifier) {
|
||||
super();
|
||||
this.destKnowledgeBaseId = destKnowledgeBaseId;
|
||||
this.destName = destName;
|
||||
this.destUrl = destUrl;
|
||||
this.destDomain = destDomain;
|
||||
this.destSemanticIdentifier = destSemanticIdentifier;
|
||||
public ConnectedBean(String knowledgeBaseId, String description,
|
||||
String shortName, String title, String url,
|
||||
String semanticIdentifier, String domain) {
|
||||
super(knowledgeBaseId, description, shortName, title, url, semanticIdentifier,
|
||||
domain);
|
||||
}
|
||||
|
||||
public boolean isConnect() {
|
||||
|
@ -54,14 +29,6 @@ public class ConnectedBean implements Serializable{
|
|||
this.connect = connect;
|
||||
}
|
||||
|
||||
public String getDestKnowledgeBaseId() {
|
||||
return destKnowledgeBaseId;
|
||||
}
|
||||
|
||||
public void setDestKnowledgeBaseId(String destKnowledgeBaseId) {
|
||||
this.destKnowledgeBaseId = destKnowledgeBaseId;
|
||||
}
|
||||
|
||||
public boolean isRemove() {
|
||||
return remove;
|
||||
}
|
||||
|
@ -70,45 +37,9 @@ public class ConnectedBean implements Serializable{
|
|||
this.remove = remove;
|
||||
}
|
||||
|
||||
public String getDestName() {
|
||||
return destName;
|
||||
}
|
||||
|
||||
public void setDestName(String destName) {
|
||||
this.destName = destName;
|
||||
}
|
||||
|
||||
public String getDestUrl() {
|
||||
return destUrl;
|
||||
}
|
||||
|
||||
public void setDestUrl(String destUrl) {
|
||||
this.destUrl = destUrl;
|
||||
}
|
||||
|
||||
public String getDestDomain() {
|
||||
return destDomain;
|
||||
}
|
||||
|
||||
public void setDestDomain(String destDomain) {
|
||||
this.destDomain = destDomain;
|
||||
}
|
||||
|
||||
public String getDestSemanticIdentifier() {
|
||||
return destSemanticIdentifier;
|
||||
}
|
||||
|
||||
public void setDestSemanticIdentifier(String destSemanticIdentifier) {
|
||||
this.destSemanticIdentifier = destSemanticIdentifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ConnectedBean [destKnowledgeBaseId=" + destKnowledgeBaseId
|
||||
+ ", destName=" + destName + ", destUrl=" + destUrl
|
||||
+ ", destSemanticIdentifier=" + destSemanticIdentifier
|
||||
+ ", destDomain=" + destDomain + ", remove=" + remove
|
||||
+ ", connect=" + connect + "]";
|
||||
return "ConnectedBean [record=" + super.toString() + ", remove=" + remove + ", connect=" + connect + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
package org.gcube.datacatalogue.grsf_manage_widget.shared;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
/**
|
||||
* A generic record object.
|
||||
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
|
||||
*/
|
||||
public class GenericRecord implements Serializable{
|
||||
|
||||
private static final long serialVersionUID = -7103588381218132232L;
|
||||
private String knowledgeBaseId;
|
||||
private String description;
|
||||
private String shortName;
|
||||
private String title;
|
||||
private String url;
|
||||
private String semanticIdentifier;
|
||||
private String domain;
|
||||
|
||||
public GenericRecord() {
|
||||
super();
|
||||
}
|
||||
|
||||
public GenericRecord(String knowledgeBaseId, String description,
|
||||
String shortName, String title, String url,
|
||||
String semanticIdentifier, String domain) {
|
||||
super();
|
||||
this.knowledgeBaseId = knowledgeBaseId;
|
||||
this.description = description;
|
||||
this.shortName = shortName;
|
||||
this.title = title;
|
||||
this.url = url;
|
||||
this.semanticIdentifier = semanticIdentifier;
|
||||
this.domain = domain;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public String getKnowledgeBaseId() {
|
||||
return knowledgeBaseId;
|
||||
}
|
||||
|
||||
public void setKnowledgeBaseId(String knowledgeBaseId) {
|
||||
this.knowledgeBaseId = knowledgeBaseId;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public String getShortName() {
|
||||
return shortName;
|
||||
}
|
||||
|
||||
public void setShortName(String shortName) {
|
||||
this.shortName = shortName;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public void setUrl(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
public String getSemanticIdentifier() {
|
||||
return semanticIdentifier;
|
||||
}
|
||||
|
||||
public void setSemanticIdentifier(String semanticIdentifier) {
|
||||
this.semanticIdentifier = semanticIdentifier;
|
||||
}
|
||||
|
||||
public String getDomain() {
|
||||
return domain;
|
||||
}
|
||||
|
||||
public void setDomain(String domain) {
|
||||
this.domain = domain;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "GenericRecord [knowledgeBaseId=" + knowledgeBaseId
|
||||
+ ", description=" + description + ", shortName=" + shortName
|
||||
+ ", title=" + title + ", url=" + url + ", semanticIdentifier="
|
||||
+ semanticIdentifier + ", domain=" + domain + "]";
|
||||
}
|
||||
|
||||
}
|
|
@ -3,12 +3,11 @@ package org.gcube.datacatalogue.grsf_manage_widget.shared;
|
|||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.gcube.datacatalogue.common.enums.Status;
|
||||
|
||||
/**
|
||||
* The bean to be managed by some people (e.g., GRSF).
|
||||
* The bean to be managed by GRSF Editors and Reviewers.
|
||||
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
|
||||
*/
|
||||
public class ManageProductBean implements Serializable{
|
||||
|
@ -26,15 +25,15 @@ public class ManageProductBean implements Serializable{
|
|||
private Status currentStatus;
|
||||
private Status newStatus;
|
||||
private String annotation; // added by the administrator
|
||||
private Map<String, String> extrasIfAvailable; // read from GRSFManageEntries resource
|
||||
private List<SourceRecord> sources; // sources for this record
|
||||
private List<SimilarGRSFRecord> similarGrsfRecords;
|
||||
private List<ConnectedBean> suggestedByKnowledgeBase;
|
||||
private List<ConnectedBean> suggestdByAdministrator = new ArrayList<ConnectedBean>(0);
|
||||
private List<ConnectedBean> suggestedByKnowledgeBaseConnections;
|
||||
private List<ConnectedBean> suggestdByAdministratorConnections = new ArrayList<ConnectedBean>(0);
|
||||
private List<ConnectedBean> currentConnections;
|
||||
private List<ConnectedBean> connections; // the one to used eventually
|
||||
private boolean mergesInvolved; // important: in this case an email must be sent to the editors/reviewers
|
||||
private String recordUrl; // this record url
|
||||
private String report; // the report that keeps track of the changes
|
||||
|
||||
public ManageProductBean() {
|
||||
super();
|
||||
|
@ -50,12 +49,11 @@ public class ManageProductBean implements Serializable{
|
|||
String shortName,
|
||||
boolean traceabilityFlag,
|
||||
Status currentStatus,
|
||||
String recordUrl,
|
||||
Map<String, String> extrasIfAvailable,
|
||||
String recordUrl,
|
||||
List<SourceRecord> sources,
|
||||
List<SimilarGRSFRecord> similarGrsfRecords,
|
||||
List<ConnectedBean> currentConnections,
|
||||
List<ConnectedBean> suggestedByKnowledgeBase
|
||||
List<ConnectedBean> suggestedByKnowledgeBaseConnections
|
||||
) {
|
||||
super();
|
||||
this.semanticIdentifier = semanticIdentifier;
|
||||
|
@ -68,11 +66,10 @@ public class ManageProductBean implements Serializable{
|
|||
this.shortNameUpdated = shortName;
|
||||
this.traceabilityFlag = traceabilityFlag;
|
||||
this.currentStatus = currentStatus;
|
||||
this.extrasIfAvailable = extrasIfAvailable;
|
||||
this.sources = sources;
|
||||
this.similarGrsfRecords = similarGrsfRecords;
|
||||
this.currentConnections = currentConnections;
|
||||
this.suggestedByKnowledgeBase = suggestedByKnowledgeBase;
|
||||
this.suggestedByKnowledgeBaseConnections = suggestedByKnowledgeBaseConnections;
|
||||
this.recordUrl = recordUrl;
|
||||
}
|
||||
|
||||
|
@ -100,8 +97,6 @@ public class ManageProductBean implements Serializable{
|
|||
this.similarGrsfRecords = similarGrsfRecords;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public String getCatalogueIdentifier() {
|
||||
return catalogueIdentifier;
|
||||
}
|
||||
|
@ -142,14 +137,6 @@ public class ManageProductBean implements Serializable{
|
|||
this.grsfName = grsfName;
|
||||
}
|
||||
|
||||
public Map<String, String> getExtrasIfAvailable() {
|
||||
return extrasIfAvailable;
|
||||
}
|
||||
|
||||
public void setExtrasIfAvailable(Map<String, String> extrasIfAvailable) {
|
||||
this.extrasIfAvailable = extrasIfAvailable;
|
||||
}
|
||||
|
||||
public Status getCurrentStatus() {
|
||||
return currentStatus;
|
||||
}
|
||||
|
@ -198,22 +185,22 @@ public class ManageProductBean implements Serializable{
|
|||
this.shortNameUpdated = shortNameUpdated;
|
||||
}
|
||||
|
||||
public List<ConnectedBean> getSuggestedByKnowledgeBase() {
|
||||
return suggestedByKnowledgeBase;
|
||||
public List<ConnectedBean> getSuggestedByKnowledgeBaseConnections() {
|
||||
return suggestedByKnowledgeBaseConnections;
|
||||
}
|
||||
|
||||
public void setSuggestedByKnowledgeBase(
|
||||
List<ConnectedBean> suggestedByKnowledgeBase) {
|
||||
this.suggestedByKnowledgeBase = suggestedByKnowledgeBase;
|
||||
public void setSuggestedByKnowledgeBaseConnections(
|
||||
List<ConnectedBean> suggestedByKnowledgeBaseConnections) {
|
||||
this.suggestedByKnowledgeBaseConnections = suggestedByKnowledgeBaseConnections;
|
||||
}
|
||||
|
||||
public List<ConnectedBean> getSuggestdByAdministrator() {
|
||||
return suggestdByAdministrator;
|
||||
public List<ConnectedBean> getSuggestdByAdministratorConnections() {
|
||||
return suggestdByAdministratorConnections;
|
||||
}
|
||||
|
||||
public void setSuggestdByAdministrator(
|
||||
List<ConnectedBean> suggestdByAdministrator) {
|
||||
this.suggestdByAdministrator = suggestdByAdministrator;
|
||||
public void setSuggestdByAdministratorConnections(
|
||||
List<ConnectedBean> suggestdByAdministratorConnections) {
|
||||
this.suggestdByAdministratorConnections = suggestdByAdministratorConnections;
|
||||
}
|
||||
|
||||
public List<ConnectedBean> getCurrentConnections() {
|
||||
|
@ -248,6 +235,14 @@ public class ManageProductBean implements Serializable{
|
|||
this.connections = connections;
|
||||
}
|
||||
|
||||
public String getReport() {
|
||||
return report;
|
||||
}
|
||||
|
||||
public void setReport(String report) {
|
||||
this.report = report;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ManageProductBean [semanticIdentifier=" + semanticIdentifier
|
||||
|
@ -258,14 +253,13 @@ public class ManageProductBean implements Serializable{
|
|||
+ ", shortNameUpdated=" + shortNameUpdated
|
||||
+ ", traceabilityFlag=" + traceabilityFlag + ", currentStatus="
|
||||
+ currentStatus + ", newStatus=" + newStatus + ", annotation="
|
||||
+ annotation + ", extrasIfAvailable=" + extrasIfAvailable
|
||||
+ ", sources=" + sources + ", similarGrsfRecords="
|
||||
+ similarGrsfRecords + ", suggestedByKnowledgeBase="
|
||||
+ suggestedByKnowledgeBase + ", suggestdByAdministrator="
|
||||
+ suggestdByAdministrator + ", currentConnections="
|
||||
+ annotation + ", sources=" + sources + ", similarGrsfRecords="
|
||||
+ similarGrsfRecords + ", suggestedByKnowledgeBaseConnections="
|
||||
+ suggestedByKnowledgeBaseConnections + ", suggestdByAdministratorConnections="
|
||||
+ suggestdByAdministratorConnections + ", currentConnections="
|
||||
+ currentConnections + ", connections=" + connections
|
||||
+ ", mergesInvolved=" + mergesInvolved + ", recordUrl="
|
||||
+ recordUrl + "]";
|
||||
+ recordUrl + ", report=" + report + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,92 +1,23 @@
|
|||
package org.gcube.datacatalogue.grsf_manage_widget.shared;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
/**
|
||||
* A similar grsf record.
|
||||
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
|
||||
*/
|
||||
public class SimilarGRSFRecord implements Serializable{
|
||||
public class SimilarGRSFRecord extends GenericRecord{
|
||||
|
||||
private static final long serialVersionUID = 6501670015333073045L;
|
||||
private String description;
|
||||
private String knowledgeBaseId;
|
||||
private String semanticIdentifier;
|
||||
private String shortName;
|
||||
private String url;
|
||||
private boolean suggestedMerge;
|
||||
|
||||
public SimilarGRSFRecord() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param description
|
||||
* @param knowledgeBaseId
|
||||
* @param semanticIdentifier
|
||||
* @param shortName
|
||||
* @param url
|
||||
* @param suggestedMerge
|
||||
* @param isExtra
|
||||
* @param toBeKept
|
||||
*/
|
||||
public SimilarGRSFRecord(String description, String knowledgeBaseId,
|
||||
String semanticIdentifier, String shortName, String url) {
|
||||
super();
|
||||
this.description = description;
|
||||
this.knowledgeBaseId = knowledgeBaseId;
|
||||
this.semanticIdentifier = semanticIdentifier;
|
||||
this.shortName = shortName;
|
||||
this.url = url;
|
||||
}
|
||||
public String getKnowledgeBaseId() {
|
||||
return knowledgeBaseId;
|
||||
}
|
||||
|
||||
|
||||
public void setKnowledgeBaseId(String knowledgeBaseId) {
|
||||
this.knowledgeBaseId = knowledgeBaseId;
|
||||
}
|
||||
|
||||
|
||||
public String getSemanticIdentifier() {
|
||||
return semanticIdentifier;
|
||||
}
|
||||
|
||||
|
||||
public void setSemanticIdentifier(String semanticIdentifier) {
|
||||
this.semanticIdentifier = semanticIdentifier;
|
||||
}
|
||||
|
||||
|
||||
// public void setToBeKept(boolean toBeKept) {
|
||||
// this.toBeKept = toBeKept;
|
||||
// }
|
||||
//
|
||||
// public boolean isToBeKept() {
|
||||
// return toBeKept;
|
||||
// }
|
||||
|
||||
public String getShortName() {
|
||||
return shortName;
|
||||
}
|
||||
public void setShortName(String shortName) {
|
||||
this.shortName = shortName;
|
||||
}
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
public void setUrl(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
public SimilarGRSFRecord(String knowledgeBaseId, String description,
|
||||
String shortName, String title, String url,
|
||||
String semanticIdentifier, String domain) {
|
||||
super(knowledgeBaseId, description, shortName, title, url, semanticIdentifier,
|
||||
domain);
|
||||
}
|
||||
|
||||
public boolean isSuggestedMerge() {
|
||||
|
@ -99,11 +30,6 @@ public class SimilarGRSFRecord implements Serializable{
|
|||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "SimilarGRSFRecord [description=" + description
|
||||
+ ", knowledgeBaseId=" + knowledgeBaseId
|
||||
+ ", semanticIdentifier=" + semanticIdentifier + ", shortName="
|
||||
+ shortName + ", url=" + url + ", suggestedMerge="
|
||||
+ suggestedMerge + "]";
|
||||
return "SimilarGRSFRecord [record=" + super.toString() + ", suggestedMerge=" + suggestedMerge + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,18 +1,14 @@
|
|||
package org.gcube.datacatalogue.grsf_manage_widget.shared;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
/**
|
||||
* A source record for this grsf record: source type (i.e. fishsource, ram, firms), name and identifier
|
||||
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
|
||||
*/
|
||||
public class SourceRecord implements Serializable{
|
||||
public class SourceRecord extends GenericRecord{
|
||||
|
||||
private static final long serialVersionUID = -5144710283443577518L;
|
||||
private String name;
|
||||
private String url; // within the catalogue
|
||||
|
||||
|
||||
public SourceRecord() {
|
||||
super();
|
||||
}
|
||||
|
@ -24,7 +20,7 @@ public class SourceRecord implements Serializable{
|
|||
public SourceRecord(String name, String url) {
|
||||
super();
|
||||
this.name = name;
|
||||
this.url = url;
|
||||
setUrl(url);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
|
@ -35,16 +31,9 @@ public class SourceRecord implements Serializable{
|
|||
this.name = name;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public void setUrl(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "SourceRecord [name=" + name + ", url=" + url + "]";
|
||||
return "SourceRecord [name=" + name + "]";
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue