From 049520f40213ad7cf275ec88d95b30189edd2821 Mon Sep 17 00:00:00 2001 From: Costantino Perciante Date: Wed, 7 Dec 2016 17:40:27 +0000 Subject: [PATCH] improved manage product facility (added enum for status, thread for patching the resource in the catalogue once it has been changed into the knowledge base) git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/gcube-ckan-datacatalog@139808 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../client/ui/ManageProductWidget.java | 20 +-- .../GcubeCkanDataCatalogServiceImpl.java | 22 ++-- .../server/PatchProductThread.java | 11 -- .../{ => manage}/GRSFNotificationService.java | 114 ++++++++++-------- .../server/manage/PatchProductThread.java | 67 ++++++++++ .../shared/GRSFStatus.java | 36 ++++++ .../shared/ManageProductBean.java | 14 +-- .../shared/ex/NoGRSFRecordException.java | 28 +++++ 8 files changed, 228 insertions(+), 84 deletions(-) delete mode 100644 src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/PatchProductThread.java rename src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/{ => manage}/GRSFNotificationService.java (58%) create mode 100644 src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/manage/PatchProductThread.java create mode 100644 src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/shared/GRSFStatus.java create mode 100644 src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/shared/ex/NoGRSFRecordException.java diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/ui/ManageProductWidget.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/ui/ManageProductWidget.java index f087b5f..edf0ee4 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/ui/ManageProductWidget.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/ui/ManageProductWidget.java @@ -6,7 +6,9 @@ import java.util.List; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.GcubeCkanDataCatalogService; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.GcubeCkanDataCatalogServiceAsync; +import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.GRSFStatus; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.ManageProductBean; +import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.ex.NoGRSFRecordException; import com.github.gwtbootstrap.client.ui.AlertBlock; import com.github.gwtbootstrap.client.ui.Button; @@ -82,10 +84,11 @@ public class ManageProductWidget extends Composite{ Image loadingImage; public static final String LOADING_IMAGE_URL = GWT.getModuleBaseURL() + "../images/loader.gif"; - private final static List STATUS = Arrays.asList("Confirmed", "Rejected", "Pending"); + private final static List STATUS = new ArrayList(Arrays.asList(GRSFStatus.values())); private final static String STATUS_UPDATE_SUCCESS = "The product was correctly updated. Thanks for your collaboration!"; private final static String STATUS_UPDATE_ERROR = "Sorry, there was a problem while trying to update the status of this product"; 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. It cannot be managed"; private ManageProductBean bean; public ManageProductWidget(String productIdentifier) { @@ -119,14 +122,14 @@ public class ManageProductWidget extends Composite{ annotationArea.setText(""); infoBlock.setVisible(false); nameTextBox.setText(bean.getProductName()); - currentStatus.setText(bean.getCurrentStatus()); + currentStatus.setText(bean.getCurrentStatus().toString()); productType.setText(bean.getProductType()); - List statusToShow = new ArrayList(STATUS); + List statusToShow = new ArrayList(STATUS); statusToShow.remove(bean.getCurrentStatus()); listBoxStatus.addItem("Select the new status"); listBoxStatus.getElement().cast().getOptions().getItem(0).setDisabled(true); - for (String availableStatus : statusToShow) { - listBoxStatus.addItem(availableStatus); + for (GRSFStatus availableStatus : statusToShow) { + listBoxStatus.addItem(availableStatus.toString()); } listBoxStatus.setSelectedIndex(0); } @@ -140,7 +143,10 @@ public class ManageProductWidget extends Composite{ @Override public void onFailure(Throwable caught) { - showInfo(ERROR_ON_RETRIEVING_BEAN, AlertType.ERROR); + if(caught instanceof NoGRSFRecordException) + showInfo(NO_GRSF_RECORD_BEAN, AlertType.WARNING); + else + showInfo(caught.getMessage(), AlertType.ERROR); loadingImage.setVisible(false); } }); @@ -172,7 +178,7 @@ public class ManageProductWidget extends Composite{ // set new values bean.setAnnotation(new HTML(annotationArea.getText().trim()).getText()); - bean.setNewStatus(listBoxStatus.getSelectedItemText()); + bean.setNewStatus(GRSFStatus.fromString(listBoxStatus.getSelectedItemText())); service.notifyProductUpdate(bean, new AsyncCallback() { diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java index 70ad856..317645d 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java @@ -16,10 +16,13 @@ import org.gcube.datacatalogue.ckanutillibrary.DataCatalogueFactory; import org.gcube.datacatalogue.ckanutillibrary.utils.SessionCatalogueAttributes; import org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.GcubeCkanDataCatalogService; +import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.server.manage.GRSFNotificationService; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.BeanUserInOrgGroupRole; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.CkanConnectorAccessPoint; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.CkanRole; +import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.GRSFStatus; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.ManageProductBean; +import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.ex.NoGRSFRecordException; import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.GroupBean; import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.OrganizationBean; import org.gcube.vomanagement.usermanagement.GroupManager; @@ -541,7 +544,7 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem } @Override - public ManageProductBean getProductBeanById(String identifier) throws Exception { + public ManageProductBean getProductBeanById(String productIdentifier) throws Exception { ManageProductBean toReturn = null; @@ -550,22 +553,27 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem String scopePerCurrentUrl = SessionUtil.getScopeFromClientUrl(getThreadLocalRequest()); DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl); String username = SessionUtil.getCurrentUser(getThreadLocalRequest()).getUsername(); - CkanDataset product = catalogue.getDataset(identifier, catalogue.getApiKeyFromUsername(username)); + CkanDataset product = catalogue.getDataset(productIdentifier, catalogue.getApiKeyFromUsername(username)); // get extras Map extras = product.getExtrasAsHashMap(); String status = extras.get("Status"); String uuidKB = extras.get("UUID Knowledge Base"); String productType = extras.get("Product type"); + String recordType = extras.get("Record type"); String title = product.getTitle(); + + // it cannot be enabled in this case ... + if(recordType == null || recordType.equals("Source")) + throw new NoGRSFRecordException(); if(status == null || uuidKB == null || productType == null) - throw new Exception("Some information is missing: status = " + status + ", uuid_kb = " + uuidKB + + throw new Exception("Some information is missing in this record: Status = " + status + ", knowledge_base_uuid = " + uuidKB + ", and product type is = " + productType); toReturn = new ManageProductBean(); - toReturn.setCatalogueIdentifier(identifier); - toReturn.setCurrentStatus(status); + toReturn.setCatalogueIdentifier(productIdentifier); + toReturn.setCurrentStatus(GRSFStatus.fromString(status)); toReturn.setKnowledgeBaseIdentifier(uuidKB); toReturn.setProductName(title); toReturn.setProductType(productType); @@ -573,8 +581,8 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem logger.info("Returning product bean " + toReturn); }catch(Exception e){ - logger.error("Failed to retrieve the information for the product with identifier " + identifier, e); - throw new Exception("Failed to retrieve the information for the product with identifier " + identifier + ". " + e.getMessage()); + logger.error("Failed to retrieve the information for the product with identifier " + productIdentifier, e); + throw new Exception("Failed to retrieve the information for the product with identifier " + productIdentifier + ". " + e.getMessage()); } return toReturn; diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/PatchProductThread.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/PatchProductThread.java deleted file mode 100644 index 43e45e8..0000000 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/PatchProductThread.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.server; - -/** - * Thread used to patch a ckan product. - * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) - */ -public class PatchProductThread extends Thread{ - - // TODO - -} diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GRSFNotificationService.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/manage/GRSFNotificationService.java similarity index 58% rename from src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GRSFNotificationService.java rename to src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/manage/GRSFNotificationService.java index 44f1248..ca4bb07 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GRSFNotificationService.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/manage/GRSFNotificationService.java @@ -1,16 +1,18 @@ -package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.server; +package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.server.manage; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.Arrays; -import java.util.HashMap; +import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; +import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; + +import java.util.Iterator; import java.util.List; -import java.util.Map; +import org.gcube.common.resources.gcore.ServiceEndpoint; +import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; +import org.gcube.common.scope.api.ScopeProvider; import org.gcube.datacatalogue.ckanutillibrary.DataCatalogue; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.ManageProductBean; +import org.gcube.resources.discovery.client.api.DiscoveryClient; +import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.slf4j.Logger; @@ -21,6 +23,7 @@ import eu.trentorise.opendata.jackan.internal.org.apache.http.client.methods.Htt import eu.trentorise.opendata.jackan.internal.org.apache.http.entity.StringEntity; import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.CloseableHttpClient; import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.HttpClientBuilder; +import eu.trentorise.opendata.jackan.internal.org.apache.http.util.EntityUtils; /** * Endpoint for sending update records information to GRSF KB @@ -29,7 +32,7 @@ import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.HttpCl public class GRSFNotificationService { private static Logger logger = LoggerFactory.getLogger(GRSFNotificationService.class); - private static final String SERVICE_POST_METHOD= "/service/updater/post"; + private static final String SERVICE_POST_METHOD = "/service/updater/post"; // request post fields private static final String CATALOGUE_ID = "catalog_id"; @@ -38,16 +41,58 @@ public class GRSFNotificationService { private static final String STATUS = "status"; private static final String ANNOTATION = "annotation_msg"; private static final String ERROR = "error"; + + // the error of the update on success private static final int STATUS_SUCCESS = 200; - + + // GRSF update service information + private static final String SERVICE_NAME = "GRSF Updater"; + private static final String SERVICE_CATEGORY = "Service"; + /** * Discover the service endpoint and return its url * @param context - * @return + * @return the url of the service on success, null otherwise */ public static String discoverEndPoint(String context){ - // TODO discover the instance in this scope - return "http://62.217.127.124:8080/grsf-services-updater"; + + String oldContext = ScopeProvider.instance.get(); + ScopeProvider.instance.set(context); + String toReturn = null; + try{ + SimpleQuery query = queryFor(ServiceEndpoint.class); + query.addCondition("$resource/Profile/Name/text() eq '"+ SERVICE_NAME +"'"); + query.addCondition("$resource/Profile/Category/text() eq '"+ SERVICE_CATEGORY +"'"); + DiscoveryClient client = clientFor(ServiceEndpoint.class); + List resources = client.submit(query); + + if (resources.size() == 0){ + logger.error("There is no Runtime Resource having name " + SERVICE_NAME +" and Category " + SERVICE_CATEGORY + " in this scope."); + throw new Exception("There is no Runtime Resource having name " + SERVICE_NAME +" and Category " + SERVICE_CATEGORY + " in this scope."); + } + else { + + for (ServiceEndpoint res : resources) { + + Iterator accessPointIterator = res.profile().accessPoints().iterator(); + + while (accessPointIterator.hasNext()) { + ServiceEndpoint.AccessPoint accessPoint = (ServiceEndpoint.AccessPoint) accessPointIterator + .next(); + + // return the path + toReturn = accessPoint.address(); + } + } + } + }catch(Exception e){ + logger.error("Unable to retrieve such service endpoint information!", e); + }finally{ + if(oldContext != null && !oldContext.equals(context)) + ScopeProvider.instance.set(oldContext); + } + + return toReturn; } /** @@ -73,7 +118,7 @@ public class GRSFNotificationService { obj.put(CATALOGUE_ID, bean.getCatalogueIdentifier()); obj.put(KB_ID, bean.getKnowledgeBaseIdentifier()); obj.put(PRODUCT_TYPE, bean.getProductType().toLowerCase()); - obj.put(STATUS, bean.getNewStatus().toLowerCase()); + obj.put(STATUS, bean.getNewStatus().toString().toLowerCase()); String annotation = bean.getAnnotation(); if(annotation != null) @@ -90,24 +135,17 @@ public class GRSFNotificationService { logger.debug("Response code is " + response.getStatusLine().getStatusCode() + " and response message is " + response.getStatusLine().getReasonPhrase()); - String result = convertStreamToString(response.getEntity().getContent()); + String result = EntityUtils.toString(response.getEntity()); JSONParser parser = new JSONParser(); JSONObject parsedJSON = (JSONObject)parser.parse(result); - if(response.getStatusLine().getStatusCode() > STATUS_SUCCESS) + if(response.getStatusLine().getStatusCode() != STATUS_SUCCESS) throw new IllegalArgumentException( "Error while performing the update request: " + response.getStatusLine().getReasonPhrase() + "and error in the result bean is " + parsedJSON.get(ERROR)); // patch the catalogue product - String apiKey = catalogue.getApiKeyFromUsername(username); - Map> statusMap = new HashMap>(); - statusMap.put("Status", Arrays.asList(bean.getNewStatus())); - catalogue.patchProductCustomFields(bean.getCatalogueIdentifier(), apiKey, statusMap); - catalogue.removeTag(bean.getCatalogueIdentifier(), apiKey, bean.getCurrentStatus()); - catalogue.addTag(bean.getCatalogueIdentifier(), apiKey, bean.getNewStatus()); - catalogue.removeDatasetFromGroup(bean.getCurrentStatus().toLowerCase(), bean.getCatalogueIdentifier(), apiKey); - catalogue.assignDatasetToGroup(bean.getCurrentStatus().toLowerCase(), bean.getCatalogueIdentifier(), apiKey); + new PatchProductThread(catalogue, bean, username).start(); }catch(Exception e){ logger.error("Unable to update this record", e); @@ -116,32 +154,4 @@ public class GRSFNotificationService { return null; } - - /** - * Convert an input stream to a string - * @param is - * @return the json string inside - */ - private static String convertStreamToString(InputStream is) { - - BufferedReader reader = new BufferedReader(new InputStreamReader(is)); - StringBuilder sb = new StringBuilder(); - - String line = null; - try { - while ((line = reader.readLine()) != null) { - sb.append(line + "\n"); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - is.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return sb.toString(); - } - } diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/manage/PatchProductThread.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/manage/PatchProductThread.java new file mode 100644 index 0000000..746ee5a --- /dev/null +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/manage/PatchProductThread.java @@ -0,0 +1,67 @@ +package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.server.manage; + +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.datacatalogue.ckanutillibrary.DataCatalogue; +import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.ManageProductBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Thread used to patch a ckan product. + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public class PatchProductThread extends Thread{ + + private static Logger logger = LoggerFactory.getLogger(PatchProductThread.class); + private DataCatalogue catalogue; + private ManageProductBean bean; + private String username; + private static final String ANNOTATION_KEY = "Annotation on Status update"; + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + private static final String STATUS_CUSTOM_FIELD_KEY = "Status"; + + /** + * @param catalogue + * @param bean + */ + public PatchProductThread(DataCatalogue catalogue, ManageProductBean bean, String username) { + super(); + this.catalogue = catalogue; + this.bean = bean; + this.username = username; + } + + @Override + public void run() { + + logger.info("Going to patch record in the catalogue with identifier " + bean.getCatalogueIdentifier() + + " from user " + username); + + String apiKey = catalogue.getApiKeyFromUsername(username); + + // remove the "Status" field + catalogue.removeCustomField(bean.getCatalogueIdentifier(), STATUS_CUSTOM_FIELD_KEY, bean.getCurrentStatus().toString(), apiKey); + catalogue.removeTag(bean.getCatalogueIdentifier(), apiKey, bean.getCurrentStatus().toString()); + catalogue.removeDatasetFromGroup(bean.getCurrentStatus().toString().toLowerCase(), bean.getCatalogueIdentifier(), apiKey); + + Map> statusMap = new HashMap>(); + statusMap.put(STATUS_CUSTOM_FIELD_KEY, Arrays.asList(bean.getNewStatus().toString())); + statusMap.put(ANNOTATION_KEY, Arrays.asList("date = " + DATE_FORMAT.format(new Date()) + + ", admin = " + username + + ", annotation = " + (bean.getAnnotation() != null ? bean.getAnnotation() : "none") + + ", new status = " + bean.getNewStatus().toString() + + ", old status = " + bean.getCurrentStatus().toString() + )); + catalogue.patchProductCustomFields(bean.getCatalogueIdentifier(), apiKey, statusMap); + catalogue.addTag(bean.getCatalogueIdentifier(), apiKey, bean.getNewStatus().toString()); + catalogue.assignDatasetToGroup(bean.getCurrentStatus().toString().toLowerCase(), bean.getCatalogueIdentifier(), apiKey); + logger.info("Record patched ..."); + } + +} diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/shared/GRSFStatus.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/shared/GRSFStatus.java new file mode 100644 index 0000000..08e4083 --- /dev/null +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/shared/GRSFStatus.java @@ -0,0 +1,36 @@ +package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared; + +/** + * Status of a grsf record. + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public enum GRSFStatus { + + APPROVED("Approved"), + REJECTED("Rejected"), + PENDING("Pending"), + ARCHIVED("Archived"), + HIDDEN("Hidden"); + + private String asString; + + private GRSFStatus(String asString) { + this.asString = asString; + } + + @Override + public String toString() { + return asString; + } + + public static GRSFStatus fromString(String string){ + if(string == null || string.isEmpty()) + return null; + + for(GRSFStatus value: GRSFStatus.values()) + if(value.toString().equalsIgnoreCase(string)) + return value; + + return null; + } +} diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/shared/ManageProductBean.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/shared/ManageProductBean.java index c940d04..ad36b3d 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/shared/ManageProductBean.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/shared/ManageProductBean.java @@ -12,8 +12,8 @@ public class ManageProductBean implements Serializable{ private String productName; private String catalogueIdentifier; private String knowledgeBaseIdentifier; - private String currentStatus; - private String newStatus; + private GRSFStatus currentStatus; + private GRSFStatus newStatus; private String annotation; private String productType; // fishery/stock @@ -30,7 +30,7 @@ public class ManageProductBean implements Serializable{ * @param annotation */ public ManageProductBean(String productName, String catalogueIdentifier, - String knowledgeBaseIdentifier, String currentStatus, String newStatus, + String knowledgeBaseIdentifier, GRSFStatus currentStatus, GRSFStatus newStatus, String annotation, String productType) { super(); this.productName = productName; @@ -58,19 +58,19 @@ public class ManageProductBean implements Serializable{ this.knowledgeBaseIdentifier = knowledgeBaseIdentifier; } - public String getCurrentStatus() { + public GRSFStatus getCurrentStatus() { return currentStatus; } - public void setCurrentStatus(String currentStatus) { + public void setCurrentStatus(GRSFStatus currentStatus) { this.currentStatus = currentStatus; } - public String getNewStatus() { + public GRSFStatus getNewStatus() { return newStatus; } - public void setNewStatus(String newStatus) { + public void setNewStatus(GRSFStatus newStatus) { this.newStatus = newStatus; } diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/shared/ex/NoGRSFRecordException.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/shared/ex/NoGRSFRecordException.java new file mode 100644 index 0000000..f11d80e --- /dev/null +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/shared/ex/NoGRSFRecordException.java @@ -0,0 +1,28 @@ +package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.ex; + + +/** + * This is thrown when the Manage product is pushed on a product that has + * a Record Type field of Source. + * @author Costantino Perciante at ISTI-CNR + * (costantino.perciante@isti.cnr.it) + */ +public class NoGRSFRecordException extends Exception { + + private static final long serialVersionUID = 721315478405659218L; + private String errorMessage; + + public NoGRSFRecordException() { + super(); + } + + public NoGRSFRecordException(String errorMessage) { + super(); + this.errorMessage = errorMessage; + } + + public String getErrorMessage() { + return errorMessage; + } + +}