");
- sb.appendHtmlConstant(HTML_FILE);
+ file.setWidth("15px");
+ file.setHeight("15px");
+
+ sb.appendHtmlConstant("
");
sb.appendHtmlConstant("");
+ sb.appendHtmlConstant(file.toString());
+ sb.appendHtmlConstant("");
+ sb.appendHtmlConstant("");
sb.appendHtmlConstant("");
sb.appendEscaped(value.getFullPath());
sb.appendHtmlConstant("");
sb.appendHtmlConstant("");
sb.appendHtmlConstant("
");
}
-
}
diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.java
index e97fec9..184c03d 100644
--- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.java
+++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.java
@@ -1,5 +1,6 @@
package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.TwinColumnSelection;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@@ -7,7 +8,10 @@ import java.util.Set;
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.ResourceElementBean;
+import com.github.gwtbootstrap.client.ui.Breadcrumbs;
import com.github.gwtbootstrap.client.ui.Button;
+import com.github.gwtbootstrap.client.ui.FluidContainer;
+import com.github.gwtbootstrap.client.ui.NavLink;
import com.github.gwtbootstrap.client.ui.Popover;
import com.github.gwtbootstrap.client.ui.constants.Placement;
import com.google.gwt.core.client.GWT;
@@ -49,15 +53,32 @@ public class TwinColumnSelectionMainPanel extends Composite{
@UiField
Button allToLeftButton;
@UiField
- Button goRootButton;
- @UiField
- Button goUpButton;
- @UiField
Popover popoverResourceSelection;
@UiField
Button resourceInfoButton;
+ @UiField
+ Breadcrumbs breadcrumbs;
+ @UiField
+ FluidContainer mainContainerResourcesSelection;
+ // @UiField
+ // Button getResources;
- private static final String PANEL_BORDER_COLOR = "#08c";
+ /**
+ * The breadcrumb subpath with the linked folder
+ * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
+ */
+ private class PathBean{
+ NavLink link;
+ ResourceElementBean resourceFolder;
+
+ PathBean(NavLink link, ResourceElementBean resourceFolder){
+ this.link = link;
+ this.resourceFolder = resourceFolder;
+ }
+ }
+
+ private List
pathListBeans = new ArrayList();
+ // private static final String PANEL_BORDER_COLOR = "#08c";
private static final String PANEL_HEIGHT = "400px";
private ShowMorePagerPanel showMorePanelLeft = new ShowMorePagerPanel();
private ShowMorePagerPanel showMorePanelRight = new ShowMorePagerPanel();
@@ -67,10 +88,12 @@ public class TwinColumnSelectionMainPanel extends Composite{
private ListDataProvider dataProviderRight = new ListDataProvider();
private MultiSelectionModel selectionModelRight;
private MultiSelectionModel selectionModelLeft;
- private final List initialElements;
+ private final ResourceElementBean initialBean;
private final static HTML aboutHeader = new HTML("Resource Manager");
- private final static HTML aboutBody = new HTML("Move the files you want to attach to the product on the right panel below."
- + " Please consider that any complex hierarchy structure you may have will be flatten.");
+ private final static HTML aboutBody = new HTML("Move the files you want to attach to the product on the right panel below."
+ + " Please consider that any complex hierarchy structure you may have will be flatten.
");
+
+ // private static final int PATH_THRESHOLD = 1; // TODO
private static TwinColumnSelectionMainPanelUiBinder uiBinder = GWT
.create(TwinColumnSelectionMainPanelUiBinder.class);
@@ -79,39 +102,42 @@ public class TwinColumnSelectionMainPanel extends Composite{
UiBinder {
}
- public TwinColumnSelectionMainPanel(List elements) {
+ public TwinColumnSelectionMainPanel(ResourceElementBean initialBean) {
initWidget(uiBinder.createAndBindUi(this));
- this.initialElements = elements;
- this.buttonsPanel.getElement().getStyle().setMarginTop(50, Unit.PCT);
+ this.initialBean = initialBean;
- goRootButton.getElement().getStyle().setPaddingLeft(0, Unit.PX);
+ this.buttonsPanel.getElement().getStyle().setMarginTop(50, Unit.PCT);
allToRightButton.getElement().getStyle().setMarginBottom(4, Unit.PX);
toRightButton.getElement().getStyle().setMarginBottom(4, Unit.PX);
toLeftButton.getElement().getStyle().setMarginBottom(4, Unit.PX);
allToLeftButton.getElement().getStyle().setMarginBottom(4, Unit.PX);
+
buttonsPanel.getElement().setAttribute("align", "center");
+
popoverResourceSelection.setPlacement(Placement.LEFT);
popoverResourceSelection.setHeading(aboutHeader.getHTML());
popoverResourceSelection.setText(aboutBody.getHTML());
resourceInfoButton.getElement().getStyle().setFloat(Float.RIGHT);
- prepareHandlers();
- initLeftSidePanel(elements);
- initRightSidePanel();
+ resourceInfoButton.getElement().getStyle().setPaddingRight(0, Unit.PX);
+ mainContainerResourcesSelection.getElement().getStyle().setPadding(20, Unit.PX);
+ prepareHandlers();
+ initLeftSidePanel(initialBean);
+ initRightSidePanel();
}
/**
* Initialize the left side panel
*/
- private void initLeftSidePanel(List elements) {
+ private void initLeftSidePanel(final ResourceElementBean initialBean) {
// initialize the left side list
ResourceCellLeft cell = new ResourceCellLeft();
// Set a key provider that provides a unique key for each object.
cellListLeft = new CellList(cell, ResourceElementBean.KEY_PROVIDER);
- cellListLeft.setPageSize(elements.size());
+ cellListLeft.setPageSize(initialBean.getChildren().size());
cellListLeft.setKeyboardPagingPolicy(KeyboardPagingPolicy.INCREASE_RANGE);
// Add a selection model so we can select cells.
@@ -122,14 +148,40 @@ public class TwinColumnSelectionMainPanel extends Composite{
selectionModelLeft.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
public void onSelectionChange(SelectionChangeEvent event) {
Iterator selectedObjectsIterator = selectionModelLeft.getSelectedSet().iterator();
+
while (selectedObjectsIterator.hasNext()) {
ResourceElementBean selectedBean = (ResourceElementBean) selectedObjectsIterator.next();
if(selectedBean.isFolder()){
+
+ // a single folder selected
if(selectionModelLeft.getSelectedSet().size() == 1){
+
+ // update path
+ final NavLink navElem = new NavLink(selectedBean.getName());
+ final PathBean pathBean = new PathBean(navElem, selectedBean);
+
+ navElem.addClickHandler(new ClickHandler() {
+
+ @Override
+ public void onClick(ClickEvent event) {
+
+ removeStartingFromBreadcrumbs(navElem, pathBean);
+ // breadcrumbsUpdater();
+ ResourceElementBean folder = pathBean.resourceFolder;
+ Collections.sort(folder.getChildren());
+ dataProviderLeft.setList(folder.getChildren());
+ dataProviderLeft.refresh();
+
+ }
+ });
+
+ pathListBeans.add(pathBean);
+ breadcrumbs.add(navElem);
+ // breadcrumbsUpdater();
+
Collections.sort(selectedBean.getChildren());
dataProviderLeft.setList(selectedBean.getChildren());
dataProviderLeft.refresh();
- dataProviderLeft.flush();
}
selectionModelLeft.setSelected(selectedBean, false);
}
@@ -140,8 +192,28 @@ public class TwinColumnSelectionMainPanel extends Composite{
});
// set the list into the provider
- Collections.sort(elements);
- dataProviderLeft.setList(elements);
+ Collections.sort(this.initialBean.getChildren());
+ dataProviderLeft.setList(this.initialBean.getChildren());
+
+ // add root to breadcrumb
+ final NavLink root = new NavLink(initialBean.getName());
+ final PathBean pathBean = new PathBean(root, initialBean);
+ pathListBeans.add(pathBean);
+ breadcrumbs.add(root);
+
+ root.addClickHandler(new ClickHandler() {
+
+ @Override
+ public void onClick(ClickEvent event) {
+
+ removeStartingFromBreadcrumbs(root, pathBean);
+ // breadcrumbsUpdater();
+
+ // set back the root content list
+ dataProviderLeft.setList(initialBean.getChildren());
+ dataProviderLeft.refresh();
+ }
+ });
// set the cell list into the provider
dataProviderLeft.addDataDisplay(cellListLeft);
@@ -150,12 +222,48 @@ public class TwinColumnSelectionMainPanel extends Composite{
showMorePanelLeft.setDisplay(cellListLeft);
showMorePanelLeft.setHeight(PANEL_HEIGHT);
showMorePanelLeft.getElement().getStyle().setBorderStyle(BorderStyle.SOLID);
- showMorePanelLeft.getElement().getStyle().setBorderColor(PANEL_BORDER_COLOR);
+ showMorePanelLeft.getElement().getStyle().setBorderWidth(1, Unit.PX);
+ // showMorePanelLeft.getElement().getStyle().setBorderColor(PANEL_BORDER_COLOR);
// add the list to the leftContainerPanel
leftContainer.add(showMorePanelLeft);
}
+ /**
+ * Update the path
+ * @param navElem
+ * @param pathBean
+ */
+ public void removeStartingFromBreadcrumbs(NavLink navElem, PathBean pathBean){
+
+ // remove data after
+ Iterator iteratorBreadcrumb = breadcrumbs.iterator();
+ Iterator iteratorListPath = pathListBeans.iterator();
+
+ boolean delete = false;
+ while(iteratorBreadcrumb.hasNext()){
+ Widget current = iteratorBreadcrumb.next();
+
+ if(delete)
+ iteratorBreadcrumb.remove();
+
+ if(!delete && navElem.equals(current))
+ delete = true;
+ }
+
+ delete = false;
+ while(iteratorListPath.hasNext()){
+ PathBean current = iteratorListPath.next();
+
+ if(delete)
+ iteratorListPath.remove();
+
+ if(!delete && pathBean.equals(current))
+ delete = true;
+ }
+
+ }
+
/**
* Initialize the left side panel
*/
@@ -186,7 +294,8 @@ public class TwinColumnSelectionMainPanel extends Composite{
showMorePanelRight.setDisplay(cellListRight);
showMorePanelRight.setHeight(PANEL_HEIGHT);
showMorePanelRight.getElement().getStyle().setBorderStyle(BorderStyle.SOLID);
- showMorePanelRight.getElement().getStyle().setBorderColor(PANEL_BORDER_COLOR);
+ showMorePanelRight.getElement().getStyle().setBorderWidth(1, Unit.PX);
+ // showMorePanelRight.getElement().getStyle().setBorderColor(PANEL_BORDER_COLOR);
// add the list to the leftContainerPanel
rightContainer.add(showMorePanelRight);
@@ -238,77 +347,31 @@ public class TwinColumnSelectionMainPanel extends Composite{
*/
private void prepareHandlers() {
- goRootButton.addClickHandler(new ClickHandler() {
-
- @Override
- public void onClick(ClickEvent event) {
-
- dataProviderLeft.setList(initialElements);
- dataProviderLeft.flush();
-
- }
- });
-
- goUpButton.addClickHandler(new ClickHandler() {
-
- @Override
- public void onClick(ClickEvent event) {
-
- ResourceElementBean firstElemCurrList = dataProviderLeft.getList().get(0);
- if(firstElemCurrList.getParent() == null){
- GWT.log("It is the root ...");
- return;
- }else{
- // get the children of the parent and show them
- GWT.log("Called " + firstElemCurrList.getParent());
- if(firstElemCurrList.getParent().getParent() == null){
- // still the root
- dataProviderLeft.setList(initialElements);
- }else{
- dataProviderLeft.setList(firstElemCurrList.getParent().getParent().getChildren());
- }
- dataProviderLeft.flush();
- }
- }
- });
-
allToRightButton.addClickHandler(new ClickHandler() {
-
@Override
public void onClick(ClickEvent event) {
-
moveToRight(selectionModelLeft.getSelectedSet());
-
}
});
toRightButton.addClickHandler(new ClickHandler() {
-
@Override
public void onClick(ClickEvent event) {
-
moveToRight(selectionModelLeft.getSelectedSet());
-
}
});
allToLeftButton.addClickHandler(new ClickHandler() {
-
@Override
public void onClick(ClickEvent event) {
-
moveToLeft(selectionModelRight.getSelectedSet());
-
}
});
toLeftButton.addClickHandler(new ClickHandler() {
-
@Override
public void onClick(ClickEvent event) {
-
moveToLeft(selectionModelRight.getSelectedSet());
-
}
});
}
@@ -366,19 +429,77 @@ public class TwinColumnSelectionMainPanel extends Composite{
* Freeze the panel
*/
public void freeze() {
-
+
+ Iterator iteratorOverPath = breadcrumbs.iterator();
+ while (iteratorOverPath.hasNext()) {
+ Widget widget = (Widget) iteratorOverPath.next();
+ if(widget instanceof NavLink)
+ ((NavLink)widget).setActive(false);
+ }
allToRightButton.setEnabled(false);
toRightButton.setEnabled(false);
allToLeftButton.setEnabled(false);
toLeftButton.setEnabled(false);
}
-
+
/**
* Returns the list of files to save
* @return the resources to save
*/
public List getResourcesToPublish(){
- return dataProviderRight.getList();
+ List current = dataProviderRight.getList();
+
+ List toReturn = new ArrayList();
+
+ for (ResourceElementBean resourceElementBean : current) {
+ resourceElementBean.setName(resourceElementBean.getFullPath());
+ ResourceElementBean beanWithoutChildren = new ResourceElementBean(resourceElementBean);
+ toReturn.add(beanWithoutChildren);
+ }
+
+ GWT.log("List " + toReturn);
+ return toReturn;
}
-}
+ // @UiHandler("getResources")
+ // void getResources(ClickEvent ce){
+ // getResourcesToPublish();
+ // }
+
+ // /**
+ // * Short the current path if needed TODO
+ // */
+ // private void breadcrumbsUpdater(){
+ //
+ // // ignore first and last elem
+ // boolean reduce = (pathListBeans.size() - 2) > PATH_THRESHOLD;
+ //
+ // GWT.log("List is " + pathListBeans.toString());
+ //
+ // if(!reduce){
+ // GWT.log("Restore");
+ // for(int i = 1; i < pathListBeans.size(); i++){
+ // PathBean bean = pathListBeans.get(i);
+ // bean.link.setText(bean.resourceFolder.getName());
+ // bean.link.setVisible(true);
+ // }
+ // }else{
+ // for(int i = 1; i < pathListBeans.size(); i++){
+ // PathBean bean = pathListBeans.get(i);
+ //
+ // if(i == (pathListBeans.size() - 1)){
+ // bean.link.setText(bean.resourceFolder.getName());
+ // bean.link.setVisible(true);
+ // }else if(i == (pathListBeans.size() - 2)){
+ // GWT.log("The last to modify ****");
+ // bean.link.setText("...");
+ // bean.link.setVisible(true);
+ // }else{
+ // bean.link.setText(bean.resourceFolder.getName());
+ // bean.link.setVisible(false);
+ // }
+ // }
+ // }
+ // GWT.log("Updated list is " + pathListBeans.toString());
+ // }
+}
\ No newline at end of file
diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.ui.xml b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.ui.xml
index 0c4cd11..31b92b3 100644
--- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.ui.xml
+++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/TwinColumnSelection/TwinColumnSelectionMainPanel.ui.xml
@@ -2,42 +2,49 @@
- .right-vertical-panel {
- margin-top: 30px;
- margin-left: 0px;
- }
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- Root level
- Go up
+
+
+ enabled="false" title="Add selected files" text=">>" />
+ enabled="false" title="Add selected file" text=">" />
+ title="Remove selected file" text="<" />
+ enabled="false" title="Remove selected files" text="<<" />
-
+
+
\ No newline at end of file
diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/icons/Images.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/icons/Images.java
new file mode 100644
index 0000000..0b0bdc7
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/icons/Images.java
@@ -0,0 +1,13 @@
+package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.icons;
+
+import com.google.gwt.resources.client.ClientBundle;
+import com.google.gwt.resources.client.ImageResource;
+
+public interface Images extends ClientBundle {
+
+ @Source("file.png")
+ ImageResource fileIcon();
+
+ @Source("folder.png")
+ ImageResource folderIcon();
+}
diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/icons/file.png b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/icons/file.png
new file mode 100644
index 0000000..b0e0695
Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/icons/file.png differ
diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/icons/folder.png b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/icons/folder.png
new file mode 100644
index 0000000..6d493f1
Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/icons/folder.png differ
diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/utils/GcubeDialogExtended.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/utils/GcubeDialogExtended.java
index e810f75..5876113 100644
--- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/utils/GcubeDialogExtended.java
+++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/utils/GcubeDialogExtended.java
@@ -32,10 +32,8 @@ public class GcubeDialogExtended extends GCubeDialog {
FlexTable captionLayoutTable = new FlexTable();
captionLayoutTable.setText(0, 0, captionText);
captionLayoutTable.setWidget(0, 3, closeAnchor);
- captionLayoutTable.getCellFormatter().setHorizontalAlignment(0, 3,
- HasHorizontalAlignment.ALIGN_RIGHT);
+ captionLayoutTable.getCellFormatter().setHorizontalAlignment(0, 3, HasHorizontalAlignment.ALIGN_RIGHT);
captionLayoutTable.setWidth("100%");
-
HTML caption = (HTML) getCaption();
caption.getElement().getStyle().setCursor(Cursor.MOVE);
caption.getElement().appendChild(captionLayoutTable.getElement());
@@ -56,13 +54,9 @@ public class GcubeDialogExtended extends GCubeDialog {
@Override
public void onClick(ClickEvent event) {
-
hide();
-
}
});
-
- // set the text
add(new Paragraph(text));
}
}
diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/utils/InfoIconsLabels.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/utils/InfoIconsLabels.java
index 2d88403..c2ae00a 100644
--- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/utils/InfoIconsLabels.java
+++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/utils/InfoIconsLabels.java
@@ -68,7 +68,7 @@ public class InfoIconsLabels {
// RESOURCES
public static final String RESOURCES_INFO_ID_POPUP = "resouces-popup-panel-info";
public static final String RESOURCES_INFO_CAPTION = "Product Resources";
- public static final String RESOURCES_INFO_TEXT = "Folder content will be added as resources of the product";
+ public static final String RESOURCES_INFO_TEXT = "Manage the resources you want to associate to the product.";
// CUSTOM FIELDS
public static final String CUSTOM_FIELDS_INFO_ID_POPUP = "custom-fields-popup-panel-info";
diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java
index dc95623..f439dfd 100644
--- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java
+++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/CKANPublisherServicesImpl.java
@@ -66,7 +66,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
logger.debug("Discovering ckan instance into scope " + scopeInWhichDiscover);
instance = DataCatalogueFactory.getFactory().getUtilsPerScope(scopeInWhichDiscover);
}catch(Exception e){
- logger.error("Unable to retrieve ckan utils in scope " + scopeInWhichDiscover, e);
+ logger.warn("Unable to retrieve ckan utils in scope " + scopeInWhichDiscover + ". Error is " + e.toString());
}
return instance;
}
@@ -366,7 +366,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
// we need to copy such resource in the .catalogue area of the user's ws
if(resourcesToAdd != null && !resourcesToAdd.isEmpty()){
- resources = WorkspaceUtils.copyResourcesToUserCatalogueArea(resourcesToAdd, toCreate.getId(), userName, toCreate);
+ resources = WorkspaceUtils.copyResourcesToUserCatalogueArea(toCreate.getId(), userName, toCreate);
}
logger.debug("The user wants to publish in organization with name " + organizationNameOrId);
@@ -580,7 +580,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
return toReturn;
}
-
+ //
// @Override
// public ResourceElementBean getTreeFolder(String folderId) {
//
@@ -598,7 +598,6 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
// return toReturn;
// }else{
// if(session.getUsername().equals(TEST_USER)){
- // logger.warn("SESSION EXPIRED!");
// return null;
// }else{
// // TODO
@@ -610,7 +609,7 @@ public class CKANPublisherServicesImpl extends RemoteServiceServlet implements C
// }
// return null;
// }
-
+ //
// /**
// * Retrieve the workspace for the development user
// * @return
diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/Utils.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/Utils.java
index ec43d3f..e2be3d4 100644
--- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/Utils.java
+++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/Utils.java
@@ -64,7 +64,7 @@ public class Utils {
// Logger
private static final org.slf4j.Logger logger = LoggerFactory.getLogger(Utils.class);
private static final String APPLICATION_ID_CATALOGUE_MANAGER = "org.gcube.datacatalogue.ProductCatalogue";
- private static final String NOTIFICATION_MESSAGE = "Dear members,
The product PRODUCT_TITLE has been just published by USER_FULLNAME.
You can find it here: PRODUCT_URL
";
+ private static final String NOTIFICATION_MESSAGE = "Dear members,
The product PRODUCT_TITLE has been just published by USER_FULLNAME.
You can find it here: PRODUCT_URL
";
private static final String SOCIAL_SERVICE_APPLICATION_TOKEN = "2/tokens/generate-application-token/";
private static final String SOCIAL_SERVICE_WRITE_APPLICATION_POST = "2/posts/write-post-app/";
private static final String MEDIATYPE_JSON = "application/json";
diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/WorkspaceUtils.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/WorkspaceUtils.java
index b221882..b21bf5c 100644
--- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/WorkspaceUtils.java
+++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/WorkspaceUtils.java
@@ -1,6 +1,7 @@
package org.gcube.portlets.widgets.ckandatapublisherwidget.server.utils;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -18,25 +19,24 @@ import org.slf4j.LoggerFactory;
public class WorkspaceUtils {
- /**
- * logger
- */
+
private static final org.slf4j.Logger logger = LoggerFactory.getLogger(WorkspaceUtils.class);
+ private static final String RESOURCES_NAME_SEPARATOR = "_";
/**
* Copy into the .catalogue area folder the checked resources
- * @param resourcesToAdd
* @param folderId
* @param userName
* @param bean
* @return
*/
- public static List copyResourcesToUserCatalogueArea(List resourcesToAdd, String folderId, String userName, DatasetMetadataBean bean) throws Exception{
+ public static List copyResourcesToUserCatalogueArea(String folderId, String userName, DatasetMetadataBean bean) throws Exception{
logger.debug("Request to copy onto catalogue area....");
List resources = new ArrayList();
WorkspaceItem copiedFolder = null;
WorkspaceCatalogue userCatalogue = null;
+ List resourcesToAdd = bean.getResources();
// in to the .catalogue area of the user's workspace
Workspace ws = HomeLibrary
@@ -58,19 +58,19 @@ public class WorkspaceUtils {
((WorkspaceFolder)copiedFolder).rename(org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods.fromProductTitleToName(bean.getTitle()) + "_" + System.currentTimeMillis());
// copy only the selected ones
- for(ResourceElementBean resourceBeanWrapper : resourcesToAdd){
+ for(ResourceElementBean resource : resourcesToAdd){
- if (resourceBeanWrapper.isToBeAdded()) {
+ if (resource.isToBeAdded()) {
// ok it is a file, so copy it into the copiedFolder
- WorkspaceItem copiedFile = userCatalogue.addWorkspaceItem(resourceBeanWrapper.getOriginalIdInWorkspace(), copiedFolder.getId());
+ WorkspaceItem copiedFile = userCatalogue.addWorkspaceItem(resource.getOriginalIdInWorkspace(), copiedFolder.getId());
// name and description could have been edited
- copiedFile.setDescription(resourceBeanWrapper.getDescription());
+ copiedFile.setDescription(resource.getDescription());
resources.add(new ResourceBean(
copiedFile.getPublicLink(true),
- resourceBeanWrapper.getName(),
+ resource.getName(),
copiedFile.getDescription(),
copiedFile.getId(),
userName,
@@ -78,7 +78,7 @@ public class WorkspaceUtils {
((FolderItem)copiedFile).getMimeType()));
// postpone rename operation
- copiedFile.rename(resourceBeanWrapper.getName() + "_" + System.currentTimeMillis());
+ copiedFile.rename(resource.getName() + "_" + System.currentTimeMillis());
}
}
@@ -116,7 +116,7 @@ public class WorkspaceUtils {
bean.setCustomFields(folderItems);
// set them into the bean
- bean.setResources(WorkspaceUtils.getTreeFromFolder(folderId, ws).getChildren());
+ bean.setResources(Arrays.asList(WorkspaceUtils.getTreeFromFolder(folderId, ws)));
}
@@ -131,24 +131,41 @@ public class WorkspaceUtils {
// start tree construction
ResourceElementBean rootElem = new ResourceElementBean();
+ String pathSeparator = ws.getPathSeparator();
try{
WorkspaceItem initialItemWS = ws.getItem(workspaceFolderId);
String fullPathBase = initialItemWS.getPath();
- // rootElem.setFolder(initialItemWS.isFolder());
- // rootElem.setFullPath(initialItemWS.getPath().replace(fullPathBase, ""));
- // rootElem.setParent(null);
- // rootElem.setName(initialItemWS.getName());
- // rootElem.setOriginalIdInWorkspace(initialItemWS.getId());
- // rootElem.setToBeAdded(false);
- // rootElem.setMimeType(((FolderItem)initialItemWS).getMimeType());
- // rootElem.setDescription(initialItemWS.getDescription());
+ fullPathBase = fullPathBase.endsWith(ws.getPathSeparator()) ? fullPathBase : fullPathBase + ws.getPathSeparator();
+ rootElem.setFolder(initialItemWS.isFolder());
+ rootElem.setFullPath(initialItemWS.getPath().replace(fullPathBase, ""));
+ rootElem.setParent(null);
+ rootElem.setName(initialItemWS.getName());
+ rootElem.setOriginalIdInWorkspace(initialItemWS.getId());
+ replaceFullPath(rootElem, pathSeparator);
// start visiting
- visit(rootElem, initialItemWS, fullPathBase);
- return rootElem;
+ visit(rootElem, initialItemWS, fullPathBase, pathSeparator);
}catch(Exception e){
logger.error("Failed to build the resource tree", e);
return null;
}
+ return rootElem;
+ }
+
+ /**
+ * Replaces the "/" char with a custom one
+ * @param rootElem
+ * @param pathSeparatorInWs
+ */
+ private static void replaceFullPath(ResourceElementBean rootElem, String pathSeparatorInWs) {
+
+ if(rootElem == null)
+ return;
+
+ String elemName = rootElem.getName();
+ int lastIndex = rootElem.getFullPath().lastIndexOf(elemName);
+ String fullPath = rootElem.getFullPath().substring(0, lastIndex);
+ fullPath = fullPath.replaceAll(pathSeparatorInWs, RESOURCES_NAME_SEPARATOR) + elemName;
+ rootElem.setFullPath(fullPath);
}
/**
@@ -157,18 +174,19 @@ public class WorkspaceUtils {
* @param initialItemWS
* @throws InternalErrorException
*/
- private static void visit(ResourceElementBean rootElem, WorkspaceItem initialItemWS, String fullPathBase) throws InternalErrorException {
+ private static void visit(ResourceElementBean rootElem, WorkspaceItem initialItemWS, String fullPathBase, String pathSeparator) throws InternalErrorException {
List extends WorkspaceItem> children = initialItemWS.getChildren();
ArrayList childrenInTree = new ArrayList(children.size());
for (WorkspaceItem workspaceItem : children) {
ResourceElementBean elem = new ResourceElementBean();
elem.setFolder(workspaceItem.isFolder());
elem.setOriginalIdInWorkspace(workspaceItem.getId());
- elem.setFullPath(workspaceItem.getPath().replace(fullPathBase, "")); // remove this path
+ elem.setFullPath(workspaceItem.getPath().replace(fullPathBase, ""));
elem.setParent(rootElem);
elem.setName(workspaceItem.getName());
+ replaceFullPath(elem, pathSeparator);
childrenInTree.add(elem);
- visit(elem, workspaceItem, fullPathBase);
+ visit(elem, workspaceItem, fullPathBase, pathSeparator);
}
rootElem.setChildren(childrenInTree);
}
diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/ResourceElementBean.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/ResourceElementBean.java
index 0dd4800..f13c257 100644
--- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/ResourceElementBean.java
+++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/ResourceElementBean.java
@@ -38,6 +38,19 @@ public class ResourceElementBean implements Comparable, Ser
return item == null ? null : item.identifierGWT;
}
};
+
+ /**
+ * Copy constructor
+ * @param another
+ */
+ public ResourceElementBean(ResourceElementBean another) {
+ this.name = another.name;
+ this.originalIdInWorkspace = another.originalIdInWorkspace;
+ this.mimeType = another.mimeType;
+ this.url = another.url;
+ this.description = another.description;
+ this.organizationNameDatasetParent = another.organizationNameDatasetParent;
+ }
/**
* Default constructor
@@ -193,14 +206,6 @@ public class ResourceElementBean implements Comparable, Ser
this.originalIdInWorkspace = originalIdInWorkspace;
}
- // @Override
- // public String toString() {
- // return "ResourceElementBean [identifier=" + identifier + ", name="
- // + name + ", movedToRight=" + movedToRight + ", isFolder="
- // + isFolder + ", fullPath=" + fullPath + "]";
- // }
-
-
@Override
public boolean equals(Object o) {
boolean toReturn = false;
@@ -213,9 +218,9 @@ public class ResourceElementBean implements Comparable, Ser
@Override
public String toString() {
- return "ResourceElementBean [identifierGWT=" + identifierGWT + ", name="
- + name + ", toBeAdded=" + toBeAdded + ", isFolder=" + isFolder
- + ", parent=" + parent + ", childrenSize=" + children.size()
+ return "ResourceElementBean [identifierGWT=" + identifierGWT
+ + ", name=" + name + ", toBeAdded=" + toBeAdded + ", isFolder="
+ + isFolder + ", parent=" + parent + ", children number=" + (children == null ? 0 : children.size())
+ ", fullPath=" + fullPath + ", originalIdInWorkspace="
+ originalIdInWorkspace + ", mimeType=" + mimeType + ", url="
+ url + ", description=" + description
diff --git a/src/test/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/TestClass.java b/src/test/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/TestClass.java
index 90cde7a..86b4b81 100644
--- a/src/test/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/TestClass.java
+++ b/src/test/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/TestClass.java
@@ -1,249 +1,17 @@
package org.gcube.portlets.widgets.ckandatapublisherwidget.client;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
-import org.gcube.common.homelibrary.home.HomeLibrary;
-import org.gcube.common.homelibrary.home.exceptions.HomeNotFoundException;
-import org.gcube.common.homelibrary.home.exceptions.InternalErrorException;
-import org.gcube.common.homelibrary.home.exceptions.UserNotFoundException;
-import org.gcube.common.homelibrary.home.workspace.Workspace;
-import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder;
-import org.gcube.common.homelibrary.home.workspace.WorkspaceItem;
-import org.gcube.common.homelibrary.home.workspace.catalogue.WorkspaceCatalogue;
-import org.gcube.common.homelibrary.home.workspace.exceptions.ItemNotFoundException;
-import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException;
-import org.gcube.common.scope.api.ScopeProvider;
-import org.gcube.datacatalogue.metadatadiscovery.DataCalogueMetadataFormatReader;
-import org.gcube.datacatalogue.metadatadiscovery.bean.MetadataType;
-import org.gcube.datacatalogue.metadatadiscovery.bean.jaxb.MetadataField;
-import org.gcube.datacatalogue.metadatadiscovery.bean.jaxb.MetadataFormat;
-import org.gcube.datacatalogue.metadatadiscovery.bean.jaxb.MetadataValidator;
-import org.gcube.datacatalogue.metadatadiscovery.bean.jaxb.MetadataVocabulary;
import org.gcube.portlets.widgets.ckandatapublisherwidget.server.CKANPublisherServicesImpl;
-import org.gcube.portlets.widgets.ckandatapublisherwidget.server.utils.Utils;
-import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.DataType;
-import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.MetaDataTypeWrapper;
-import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.MetadataFieldWrapper;
-import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.ResourceElementBean;
import org.junit.Test;
-import org.slf4j.LoggerFactory;
-
+/**
+ * Junit tests class
+ * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
+ */
public class TestClass {
- private static final org.slf4j.Logger logger = LoggerFactory.getLogger(TestClass.class);
-
@Test
public void testUser() {
-
assert(new CKANPublisherServicesImpl().getDevelopmentUser().equals(CKANPublisherServicesImpl.TEST_USER));
-
}
- //@Test
- @SuppressWarnings("deprecation")
- public void testCopyResources() throws WorkspaceFolderNotFoundException, InternalErrorException, HomeNotFoundException, UserNotFoundException, ItemNotFoundException{
-
- ScopeProvider.instance.set("/gcube/devNext/NextNext");
-
- Workspace ws = HomeLibrary
- .getHomeManagerFactory()
- .getHomeManager()
- .getHome("costantino.perciante").getWorkspace();
-
- WorkspaceItem originalFolder = ws.getItem("d3a37eb9-1589-4c95-a9d0-c473a02d4f0f");
-
- List extends WorkspaceItem> children = originalFolder.getChildren();
- // System.out.println("Folder is " + originalFolder.getName());
- // for (WorkspaceItem workspaceItem : children) {
- // System.out.println("Child is " + workspaceItem.getName());
- // }
-
- // copy to catalogue
- WorkspaceCatalogue userCatalogue = ws.getCatalogue();
-
- WorkspaceItem copiedFolder = userCatalogue.addWorkspaceItem(originalFolder.getId(), userCatalogue.getId());
- System.out.println(copiedFolder.isHidden());
- // for (WorkspaceItem workspaceItem : children) {
- // WorkspaceItem copiedChildren = userCatalogue.addWorkspaceItem(workspaceItem.getId(), copiedFolder.getId());
- // System.out.println("****************************** Copied file has path " + copiedChildren.getPath());
- // }
-
- // look at catalogue structure
- List catalogueChildrens = ((WorkspaceFolder)userCatalogue).getChildren(true);
- if(catalogueChildrens.isEmpty())
- System.out.println("****************************** Catalogue Child list is empty");
- else for (WorkspaceItem catalogueItem : catalogueChildrens) {
- System.out.println("****************************** Catalogue Child is " + catalogueItem.getName());
- if(catalogueItem.isFolder()){
- WorkspaceFolder catalogueFolder = (WorkspaceFolder) catalogueItem;
- System.out.println("**************************" + catalogueFolder.getName() + " it is a folder, printing children");
- List extends WorkspaceItem> copiedFolderChildren = catalogueFolder.getChildren(true);
- for (WorkspaceItem copiedFolderChildrenItem : copiedFolderChildren) {
- System.out.println("****************************** Child is " + copiedFolderChildrenItem.getName());
- copiedFolderChildrenItem.getPublicLink(true);
- }
- }
- }
- }
-
- //@Test
- public void testTitle(){
-
- // String regexTitleSubWord = "[^a-zA-Z0-9_.-]";
- // String title = "this is a test title .";
- // String[] splittedTitle = title.split(" ");
- //
- // for (String word : splittedTitle) {
- // System.out.println("Word is " + word);
- // String replaced = word.replaceAll(regexTitleSubWord, "");
- // System.out.println("Replaced Word is " + replaced);
- // if(!replaced.equals(word)){
- // System.out.println("Please note that only alphanumeric characters are allowed for the title");
- // }
- // }
-
- System.out.println("Notification_portlet".replaceAll("[^A-Za-z0-9.-_]", " "));
- }
-
- //@Test
- public void retrieveMetadata(){
-
- try {
-
- ScopeProvider.instance.set("/gcube/devNext/NextNext");
-
- DataCalogueMetadataFormatReader reader = new DataCalogueMetadataFormatReader();
-
- for (MetadataType mt : reader.getListOfMetadataTypes()) {
-
- System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + mt.getName());
- MetadataFormat metadata = reader.getMetadataFormatForMetadataType(mt);
-
- // we need to wrap the list of metadata
- List wrapperList = new ArrayList();
- List toWrap = metadata.getMetadataFields();
-
- for(MetadataField metadataField: toWrap){
-
-
-
- MetadataFieldWrapper wrapperObj = new MetadataFieldWrapper();
- wrapperObj.setDefaultValue(metadataField.getDefaultValue());
- wrapperObj.setFieldName(metadataField.getFieldName());
- wrapperObj.setType(DataType.valueOf(metadataField.getDataType().toString()));
- wrapperObj.setMandatory(metadataField.getMandatory());
- wrapperObj.setNote(metadataField.getNote());
-
- MetadataValidator validator = metadataField.getValidator();
- if(validator != null)
- wrapperObj.setValidator(validator.getRegularExpression());
-
- MetadataVocabulary vocabulary = metadataField.getVocabulary();
-
- if(vocabulary != null){
- wrapperObj.setVocabulary(vocabulary.getVocabularyFields());
- wrapperObj.setMultiSelection(vocabulary.isMultiSelection());
- }
-
- // add to the list
- wrapperList.add(wrapperObj);
-
- }
-
- // wrap the mt as well
- MetaDataTypeWrapper typeWrapper = new MetaDataTypeWrapper();
- typeWrapper.setDescription(mt.getDescription());
- typeWrapper.setId(mt.getId());
- typeWrapper.setName(mt.getName());
-
- }
-
- System.out.println("List of profiles has been saved into session");
-
- } catch (Exception e) {
- System.out.println("Error while retrieving metadata beans " + e);
- }
-
- }
-
- //@Test
- public void testDataCatalogueManagerApplication(){
-
- String token = "";
- String scope = "/gcube/devNext/NextNext";
-
- ScopeProvider.instance.set(scope);
- SecurityTokenProvider.instance.set(token);
-
- Utils.writeProductPost("a great test product",
- "https://next.d4science.org/group/nextnext/data-catalogue?path=/dataset/test_for_visibility",
- "Costantino Perciante", Arrays.asList("tag1", "tag2", "tag33"), false);
-
- }
-
- //@Test
- public void treeVisitorTest() throws Exception{
-
- ScopeProvider.instance.set("/gcube/devNext/NextNext");
- String itemName = "CkanTest1137";
- String itemId = null;
-
- Workspace ws = HomeLibrary
- .getHomeManagerFactory()
- .getHomeManager()
- .getHome("costantino.perciante").getWorkspace();
-
- List wsChildren = ws.getRoot().getChildren();
-
- for (WorkspaceItem workspaceItem : wsChildren) {
- if(workspaceItem.getName().equals(itemName)){
- itemId = workspaceItem.getId();
- logger.debug("Id is " + itemId); //e87bfc7d-4fb0-4795-9c79-0c495500ca9c
- break;
- }
- }
-
- // start tree construction
- WorkspaceItem initialItemWS = ws.getItem(itemId);
- ResourceElementBean rootElem = new ResourceElementBean();
- rootElem.setFolder(initialItemWS.isFolder());
- rootElem.setFullPath(initialItemWS.getPath());
- rootElem.setParent(null);
- rootElem.setName(initialItemWS.getName());
- rootElem.setOriginalIdInWorkspace(initialItemWS.getId());
-
- // start visiting
- visit(rootElem, initialItemWS);
-
- // print final tree
- logger.debug("Final tree looks like " + rootElem);
-
-
- }
-
- /**
- * Recursive visit of a workspace item
- * @param rootElem
- * @param initialItemWS
- * @throws InternalErrorException
- */
- private void visit(ResourceElementBean rootElem, WorkspaceItem initialItemWS) throws InternalErrorException {
- List extends WorkspaceItem> children = initialItemWS.getChildren();
- ArrayList childrenInTree = new ArrayList(children.size());
- for (WorkspaceItem workspaceItem : children) {
- ResourceElementBean elem = new ResourceElementBean();
- elem.setFolder(workspaceItem.isFolder());
- elem.setOriginalIdInWorkspace(workspaceItem.getId());
- elem.setFullPath(workspaceItem.getPath());
- elem.setParent(rootElem);
- elem.setName(workspaceItem.getName());
- childrenInTree.add(elem);
- visit(elem, workspaceItem);
- }
- rootElem.setChildren(childrenInTree);
- }
}