diff --git a/pom.xml b/pom.xml index ccbfb25..a254e04 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.gcube.portlets.user workspace-tree-widget - 6.13.2-SNAPSHOT + 6.14.0-SNAPSHOT gCube Workspace Tree Widget gCube Workspace Tree Widget is a widget to navigate and interact with gCube Workspace @@ -147,11 +147,25 @@ org.gcube.common home-library-model + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) provided + + org.gcube.common + home-library-jcr + [2.5.0-SNAPSHOT,3.5.0-SNAPSHOT) + provided + + + asm-debug-all + org.ow2.asm + + + org.gcube.common home-library + [2.5.0-SNAPSHOT,3.0.0-SNAPSHOT) provided @@ -160,12 +174,7 @@ - - org.gcube.common - home-library-jcr - provided - - + commons-httpclient commons-httpclient diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java b/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java index 063d578..3eff327 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java @@ -42,6 +42,8 @@ import org.gcube.portlets.user.workspace.client.event.FileUploadEvent; import org.gcube.portlets.user.workspace.client.event.FileUploadEventHandler; import org.gcube.portlets.user.workspace.client.event.FilterScopeEvent; import org.gcube.portlets.user.workspace.client.event.FilterScopeEventHandler; +import org.gcube.portlets.user.workspace.client.event.GetFolderLinkEvent; +import org.gcube.portlets.user.workspace.client.event.GetFolderLinkEventHandler; import org.gcube.portlets.user.workspace.client.event.GetInfoEvent; import org.gcube.portlets.user.workspace.client.event.GetInfoEventHandler; import org.gcube.portlets.user.workspace.client.event.GetPublicLinkEvent; @@ -116,7 +118,8 @@ import org.gcube.portlets.user.workspace.client.view.windows.DialogAddFolderAndS import org.gcube.portlets.user.workspace.client.view.windows.DialogAddFolderAndSmart.AddType; import org.gcube.portlets.user.workspace.client.view.windows.DialogAddUrl; import org.gcube.portlets.user.workspace.client.view.windows.DialogGetInfo; -import org.gcube.portlets.user.workspace.client.view.windows.DialogPublicLink; +import org.gcube.portlets.user.workspace.client.view.windows.DialogGetLink; +import org.gcube.portlets.user.workspace.client.view.windows.DialogGetLink.Link_Type; import org.gcube.portlets.user.workspace.client.view.windows.DialogShareLink; import org.gcube.portlets.user.workspace.client.view.windows.DialogText; import org.gcube.portlets.user.workspace.client.view.windows.DialogWebDavUrl; @@ -296,6 +299,20 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt } }); + eventBus.addHandler(GetFolderLinkEvent.TYPE, new GetFolderLinkEventHandler() { + + @Override + public void onGetFolderLink(GetFolderLinkEvent getFolderLinkEvent) { + GWT.log("getFolderLinkEvent.getSourceFile() "+getFolderLinkEvent.getSourceFile()); + // TODO Auto-generated method stub + if(getFolderLinkEvent.getSourceFile()!=null){ + GWT.log("getFolderLinkEvent.getSourceFile() "+getFolderLinkEvent.getSourceFile()); + DialogGetLink dialog = new DialogGetLink("Copy to clipboard Folder Link: Ctrl+C", getFolderLinkEvent.getSourceFile().getIdentifier(), Link_Type.FOLDER_LINK); + dialog.show(); + } + } + }); + eventBus.addHandler(SendMessageEvent.TYPE, new SendMessageEventHandler() { @@ -677,7 +694,7 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt public void onGetPublicLink(GetPublicLinkEvent getPublicLinkEvent) { // TODO Auto-generated method stub if(getPublicLinkEvent.getSourceFile()!=null){ - DialogPublicLink dialog = new DialogPublicLink("Copy to clipboard Public Link: Ctrl+C", getPublicLinkEvent.getSourceFile().getIdentifier()); + DialogGetLink dialog = new DialogGetLink("Copy to clipboard Public Link: Ctrl+C", getPublicLinkEvent.getSourceFile().getIdentifier(), Link_Type.PUBLIC_LINK); dialog.show(); } } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsExplorer.java b/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsExplorer.java index 8ae734f..db615f4 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsExplorer.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsExplorer.java @@ -69,6 +69,7 @@ public class ConstantsExplorer { public static final String MESSAGE_REFRESH_FOLDER = "Refresh Folder"; public static final String MESSAGE_GET_INFO = "Get Info"; public static final String MESSAGE_PUBLIC_LINK = "Get Public Link"; + public static final String MESSAGE_FOLDER_LINK = "Get Folder Link"; public static final String LISTATTACHMENTSNAMES = "Attachments Names"; public static final String LISTCONTACTSTOSTRING = "ListContactToString"; public static final String STATUS = "Status"; @@ -81,6 +82,7 @@ public class ConstantsExplorer { public static final String REGEX_FOLDER_NAME = "Field name must not begin with one of the following characters"; public static final String MESSAGE_SEARCH_FORCE_APHANUMERIC = "Field search must be alphanumeric and not contain special chars!"; public static final String MESSAGE_CREATE_NEW_MESSAGE = "Create New Message"; + public static final String FORWARDTO = "Forward to"; public static final String MESSAGETYPE = "Message Type"; public static final String WEBDAVURLLINKREADMORE = "https://gcube.wiki.gcube-system.org/gcube/index.php/Acces_workspace_from_Desktop_(via_WebDAV)"; @@ -229,6 +231,7 @@ public class ConstantsExplorer { public static final int HEIGHT_DIALOG_SHARE_FOLDER = 445; + public static native void log(String txt) /*-{ console.log(txt) }-*/; diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/constant/WorkspaceOperation.java b/src/main/java/org/gcube/portlets/user/workspace/client/constant/WorkspaceOperation.java index 8bb3dc8..f19e274 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/constant/WorkspaceOperation.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/constant/WorkspaceOperation.java @@ -4,17 +4,17 @@ public enum WorkspaceOperation { INSERT_FOLDER("INS", "INS"), // Insert Folder ADD_ITEM("ADD", "ADD"), // Add Folder - REMOVE("REM", "REM"), - UPLOAD_FILE("UPL", "UPL"), - DOWNLOAD("DWL", "DWL"), - PREVIEW("PRW", "PRW"), - RENAME("RNM", "RNM"), + REMOVE("REM", "REM"), + UPLOAD_FILE("UPL", "UPL"), + DOWNLOAD("DWL", "DWL"), + PREVIEW("PRW", "PRW"), + RENAME("RNM", "RNM"), INSERT_SHARED_FOLDER("ISHF", "ASHF"), // Insert shared Folder PUBLISH_ON_DATA_CATALOGUE("PODC", "PODC"), SHARE("SHR", "SHR"), // SHARE UNSHARE("USHR", "USHR"), // UNSHARE UPLOAD_ARCHIVE("UPA", "UPA"), // Upload Archive - LINK("LNK", "LNK"), + LINK("LNK", "LNK"), SHOW("SHW", "SHW"), // SHOW ADD_URL("CLK", "CLK"), // Add Url OPEN_REPORT_TEMPLATE("ORT", "ORT"), // Open report template @@ -36,10 +36,11 @@ public enum WorkspaceOperation { SHARE_LINK("SLK", "SLK"), //SHARE URL LINK PUBLIC_LINK("PLK", "PLK"), //PUBLIC LINK // ADD_ADMINISTRATOR("AAD", "AAD"), // ADD_ADMINISTRATOR - VRE_CHANGE_PERIMISSIONS("CHP", "CHP"), - EDIT_PERMISSIONS("EDP", "EDP"); //EDIT PERMISSIONS + VRE_CHANGE_PERIMISSIONS("CHP", "CHP"), + EDIT_PERMISSIONS("EDP", "EDP"), //EDIT PERMISSIONS + FOLDER_LINK("FRL", "FRL"); //FOLDER LINK + - private String id; // ID CONTEXT MENU private String name; diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/event/GetFolderLinkEvent.java b/src/main/java/org/gcube/portlets/user/workspace/client/event/GetFolderLinkEvent.java new file mode 100644 index 0000000..01f9d39 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/client/event/GetFolderLinkEvent.java @@ -0,0 +1,53 @@ +package org.gcube.portlets.user.workspace.client.event; + +import org.gcube.portlets.user.workspace.client.model.FileModel; + +import com.google.gwt.event.shared.GwtEvent; + + +/** + * The Class GetFolderLinkEvent. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Sep 13, 2016 + */ +public class GetFolderLinkEvent extends GwtEvent { + public static Type TYPE = new Type(); + + private FileModel targetFile = null; + + /** + * Instantiates a new gets the folder link event. + * + * @param target the target + */ + public GetFolderLinkEvent(FileModel target) { + this.targetFile = target; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /* (non-Javadoc) + * @see com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared.EventHandler) + */ + @Override + protected void dispatch(GetFolderLinkEventHandler handler) { + handler.onGetFolderLink(this); + + } + + /** + * Gets the source file. + * + * @return the source file + */ + public FileModel getSourceFile() { + return targetFile; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/event/GetFolderLinkEventHandler.java b/src/main/java/org/gcube/portlets/user/workspace/client/event/GetFolderLinkEventHandler.java new file mode 100644 index 0000000..7dfc2cb --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/client/event/GetFolderLinkEventHandler.java @@ -0,0 +1,20 @@ +package org.gcube.portlets.user.workspace.client.event; + +import com.google.gwt.event.shared.EventHandler; + + +/** + * The Interface GetFolderLinkEventHandler. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Sep 13, 2016 + */ +public interface GetFolderLinkEventHandler extends EventHandler { + + /** + * On get folder link. + * + * @param getFolderLinkEvent the get folder link event + */ + void onGetFolderLink(GetFolderLinkEvent getFolderLinkEvent); +} diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java index 4bb2970..c2198a5 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java @@ -711,4 +711,6 @@ public interface GWTWorkspaceService extends RemoteService{ * @return */ String getMyFirstName(); + + PublicLink getFolderLinkForFolderItemId(String itemId, boolean b) throws SessionExpiredException, Exception; } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java index eb8a9c1..2192992 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java @@ -698,4 +698,12 @@ public interface GWTWorkspaceServiceAsync { void getMyFirstName(AsyncCallback callback); + /** + * @param itemId + * @param b + * @param asyncCallback + */ + void getFolderLinkForFolderItemId( + String itemId, boolean b, AsyncCallback asyncCallback); + } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/ContextMenuTree.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/ContextMenuTree.java index a4f164f..fbe542c 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/ContextMenuTree.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/tree/ContextMenuTree.java @@ -19,6 +19,7 @@ import org.gcube.portlets.user.workspace.client.event.EditUserPermissionEvent; import org.gcube.portlets.user.workspace.client.event.FileDownloadEvent; import org.gcube.portlets.user.workspace.client.event.FileDownloadEvent.DownloadType; import org.gcube.portlets.user.workspace.client.event.FileUploadEvent; +import org.gcube.portlets.user.workspace.client.event.GetFolderLinkEvent; import org.gcube.portlets.user.workspace.client.event.GetInfoEvent; import org.gcube.portlets.user.workspace.client.event.GetPublicLinkEvent; import org.gcube.portlets.user.workspace.client.event.GetShareLinkEvent; @@ -217,6 +218,25 @@ public class ContextMenuTree { contextMenu.add(mnPublicLink); + + //FOLDER LINK + MenuItem mnFolderLink = new MenuItem(); + mnFolderLink.setId(WorkspaceOperation.FOLDER_LINK.getId()); + mnFolderLink.setText(ConstantsExplorer.MESSAGE_FOLDER_LINK); + mnFolderLink.setIcon(Resources.getIconFolderLink()); + + mnFolderLink.addSelectionListener(new SelectionListener() { + public void componentSelected(MenuEvent ce) { + + for (FileModel sel : listSelectedItems) { + if(sel.isDirectory()) + eventBus.fireEvent(new GetFolderLinkEvent(sel)); + } + } + }); + + contextMenu.add(mnFolderLink); + contextMenu.add(new SeparatorMenuItem()); MenuItem mnHistory = new MenuItem(); @@ -787,6 +807,7 @@ public class ContextMenuTree { contextMenu.getItemByItemId(WorkspaceOperation.PASTE.getId()).setEnabled(false); //paste contextMenu.getItemByItemId(WorkspaceOperation.REFRESH_FOLDER.getId()).setVisible(false); //refresh contextMenu.getItemByItemId(WorkspaceOperation.PUBLIC_LINK.getId()).setVisible(false); //public link + contextMenu.getItemByItemId(WorkspaceOperation.FOLDER_LINK.getId()).setVisible(false); //folder link // contextMenu.getItemByItemId(WorkspaceOperation.ADD_ADMINISTRATOR.getId()).setVisible(false); //public link contextMenu.getItemByItemId(WorkspaceOperation.EDIT_PERMISSIONS.getId()).setVisible(false); contextMenu.getItemByItemId(WorkspaceOperation.SHARE.getId()).setVisible(false); //SHARE @@ -843,6 +864,7 @@ public class ContextMenuTree { contextMenu.getItemByItemId(WorkspaceOperation.SHOW.getId()).setVisible(false); //show contextMenu.getItemByItemId(WorkspaceOperation.REFRESH_FOLDER.getId()).setVisible(true); //refresh contextMenu.getItemByItemId(WorkspaceOperation.SENDTO.getId()).setVisible(false); //send to + contextMenu.getItemByItemId(WorkspaceOperation.FOLDER_LINK.getId()).setVisible(true); //folder link if(selectedItem.isShared()){//IS SHARED // contextMenu.getItemByItemId(WorkspaceOperation.ADD_ADMINISTRATOR.getId()).setVisible(true); //add administrator diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetLink.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetLink.java new file mode 100644 index 0000000..ee6d299 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetLink.java @@ -0,0 +1,232 @@ +package org.gcube.portlets.user.workspace.client.view.windows; + +import org.gcube.portlets.user.workspace.client.AppControllerExplorer; +import org.gcube.portlets.user.workspace.client.event.SessionExpiredEvent; +import org.gcube.portlets.user.workspace.client.model.InfoContactModel; +import org.gcube.portlets.user.workspace.client.resources.Resources; +import org.gcube.portlets.user.workspace.shared.PublicLink; +import org.gcube.portlets.user.workspace.shared.SessionExpiredException; + +import com.extjs.gxt.ui.client.Style.HorizontalAlignment; +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.Style.VerticalAlignment; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.Label; +import com.extjs.gxt.ui.client.widget.VerticalPanel; +import com.extjs.gxt.ui.client.widget.form.TextField; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.user.client.rpc.AsyncCallback; + + +/** + * The Class DialogGetLink. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Sep 13, 2016 + */ +public class DialogGetLink extends Dialog { + + private TextField txtCompleteURL; + private TextField txtShortURL; + private int widht = 450; + private int height = 210; + private VerticalPanel vp = new VerticalPanel(); + + /** + * The Enum Link_Type. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Sep 13, 2016 + */ + public enum Link_Type {PUBLIC_LINK, FOLDER_LINK}; + + /** + * Instantiates a new dialog get link. + * + * @param headingTxt the heading txt + * @param itemId the item id + * @param type the type + */ + public DialogGetLink(String headingTxt, final String itemId, Link_Type type) { + setButtonAlign(HorizontalAlignment.CENTER); + setIcon(Resources.getIconPublicLink()); + vp.setHorizontalAlign(HorizontalAlignment.CENTER); + vp.setVerticalAlign(VerticalAlignment.MIDDLE); + vp.getElement().getStyle().setPadding(1, Unit.PX); + setHeading(headingTxt); + setModal(true); + setBodyStyle("padding: 3px; background: none"); + setWidth(widht); + setHeight(height); + setResizable(false); + setButtons(Dialog.CLOSE); + setScrollMode(Scroll.AUTOY); + +// label.setText(msgTitle); +// label.setStyleName("myWebDavStyle"); + VerticalPanel vp1 = new VerticalPanel(); + vp1.setStyleAttribute("margin-top", "8px"); + txtCompleteURL = new TextField(); + txtCompleteURL.setStyleAttribute("margin-top", "1px"); + txtCompleteURL.setWidth(widht-20); + txtCompleteURL.setReadOnly(true); +// txtCompleteURL.mask("Getting Link..."); + vp1.add(new Label("Link")); + vp1.add(txtCompleteURL); + + VerticalPanel vp2 = new VerticalPanel(); + vp2.setStyleAttribute("margin-top", "8px"); + txtShortURL = new TextField(); + txtShortURL.setStyleAttribute("margin-top", "1px"); + txtShortURL.setWidth(widht-20); +// txtShortURL.mask("Getting Link..."); + vp2.add(new Label("Short Link")); + vp2.add(txtShortURL); + + + switch (type) { + case PUBLIC_LINK: + + vp.mask("Getting Public Link..."); + + if(itemId!=null && !itemId.isEmpty()){ + AppControllerExplorer.rpcWorkspaceService.getPublicLinkForFolderItemId(itemId, true, new AsyncCallback() { + + @Override + public void onSuccess(PublicLink publicLink) { + vp.unmask(); + txtCompleteURL.setValue(publicLink.getCompleteURL()); + txtShortURL.setValue(publicLink.getShortURL()); + selectTxt(); + } + + @Override + public void onFailure(Throwable caught) { + vp.unmask(); + if(caught instanceof SessionExpiredException){ + GWT.log("Session expired"); + AppControllerExplorer.getEventBus().fireEvent(new SessionExpiredEvent()); + return; + } + new MessageBoxAlert("Error", caught.getMessage(), null); + } + }); + + }else{ + txtCompleteURL.unmask(); + new MessageBoxAlert("Error", "The item identifier is null", null); + } + + break; + + case FOLDER_LINK: + + vp.mask("Getting Folder Link... checking permissions"); + if(itemId!=null && !itemId.isEmpty()){ + AppControllerExplorer.rpcWorkspaceService.getOwnerByItemId(itemId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + vp.unmask(); + if(caught instanceof SessionExpiredException){ + GWT.log("Session expired"); + AppControllerExplorer.getEventBus().fireEvent(new SessionExpiredEvent()); + return; + } + new MessageBoxAlert("Error", caught.getMessage(), null); + + } + + @Override + public void onSuccess(InfoContactModel result) { + + if(result.getLogin().compareToIgnoreCase(AppControllerExplorer.myLogin)==0){ + vp.mask("Getting Folder Link... permissions granted"); + allowAccessToFolderLink(itemId); + }else + new MessageBoxAlert("Permission Denied", "You have not permission to get Folder Link, you must be owner or administrator to the folder", null); + + } + }); + } + + break; + default: + break; + } + + this.getButtonById(Dialog.CLOSE).addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + hide(); + } + + }); + + +// vp.add(label); + vp.add(vp1); + vp.add(vp2); + + setFocusWidget(txtCompleteURL); + + add(vp); + } + + + + /** + * Allow access to folder link. + * + * @param folderId the folder id + */ + private void allowAccessToFolderLink(String folderId){ + + AppControllerExplorer.rpcWorkspaceService.getFolderLinkForFolderItemId(folderId, true, new AsyncCallback() { + + @Override + public void onSuccess(PublicLink publicLink) { + vp.unmask(); + txtCompleteURL.setValue(publicLink.getCompleteURL()); + txtShortURL.setValue(publicLink.getShortURL()); + selectTxt(); + } + + @Override + public void onFailure(Throwable caught) { + vp.unmask(); + if(caught instanceof SessionExpiredException){ + GWT.log("Session expired"); + AppControllerExplorer.getEventBus().fireEvent(new SessionExpiredEvent()); + return; + } + new MessageBoxAlert("Error", caught.getMessage(), null); + } + }); + + + } + + /** + * Gets the txt value. + * + * @return the txt value + */ + public String getTxtValue() { + + return txtCompleteURL.getValue(); + } + + /** + * Select txt. + */ + public void selectTxt(){ + + if(txtCompleteURL.getValue()!=null) + txtCompleteURL.select(0, txtCompleteURL.getValue().length()); + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogPublicLink.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogPublicLink.java deleted file mode 100644 index bce416a..0000000 --- a/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogPublicLink.java +++ /dev/null @@ -1,122 +0,0 @@ -package org.gcube.portlets.user.workspace.client.view.windows; - -import org.gcube.portlets.user.workspace.client.AppControllerExplorer; -import org.gcube.portlets.user.workspace.client.resources.Resources; -import org.gcube.portlets.user.workspace.shared.PublicLink; - -import com.extjs.gxt.ui.client.Style.HorizontalAlignment; -import com.extjs.gxt.ui.client.Style.Scroll; -import com.extjs.gxt.ui.client.Style.VerticalAlignment; -import com.extjs.gxt.ui.client.event.ButtonEvent; -import com.extjs.gxt.ui.client.event.SelectionListener; -import com.extjs.gxt.ui.client.widget.Dialog; -import com.extjs.gxt.ui.client.widget.Label; -import com.extjs.gxt.ui.client.widget.VerticalPanel; -import com.extjs.gxt.ui.client.widget.form.TextField; -import com.google.gwt.dom.client.Style.Unit; -import com.google.gwt.user.client.rpc.AsyncCallback; - -/** - * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it - * - */ -public class DialogPublicLink extends Dialog { - - private TextField txtCompleteURL; - private TextField txtShortURL; - private int widht = 450; - private int height = 210; - private VerticalPanel vp = new VerticalPanel(); -// private Label label = new Label(); - - public DialogPublicLink(String headingTxt, final String itemId) { - setButtonAlign(HorizontalAlignment.CENTER); - setIcon(Resources.getIconPublicLink()); - vp.setHorizontalAlign(HorizontalAlignment.CENTER); - vp.setVerticalAlign(VerticalAlignment.MIDDLE); - vp.getElement().getStyle().setPadding(1, Unit.PX); - setHeading(headingTxt); - setModal(true); - setBodyStyle("padding: 3px; background: none"); - setWidth(widht); - setHeight(height); - setResizable(false); - setButtons(Dialog.CLOSE); - setScrollMode(Scroll.AUTOY); - -// label.setText(msgTitle); -// label.setStyleName("myWebDavStyle"); - VerticalPanel vp1 = new VerticalPanel(); - vp1.setStyleAttribute("margin-top", "8px"); - txtCompleteURL = new TextField(); - txtCompleteURL.setStyleAttribute("margin-top", "1px"); - txtCompleteURL.setWidth(widht-20); - txtCompleteURL.setReadOnly(true); -// txtCompleteURL.mask("Getting Link..."); - vp1.add(new Label("Link")); - vp1.add(txtCompleteURL); - - VerticalPanel vp2 = new VerticalPanel(); - vp2.setStyleAttribute("margin-top", "8px"); - txtShortURL = new TextField(); - txtShortURL.setStyleAttribute("margin-top", "1px"); - txtShortURL.setWidth(widht-20); -// txtShortURL.mask("Getting Link..."); - vp2.add(new Label("Short Link")); - vp2.add(txtShortURL); - - vp.mask("Getting Link..."); - - if(itemId!=null && !itemId.isEmpty()){ - AppControllerExplorer.rpcWorkspaceService.getPublicLinkForFolderItemId(itemId, true, new AsyncCallback() { - - @Override - public void onSuccess(PublicLink publicLink) { - vp.unmask(); - txtCompleteURL.setValue(publicLink.getCompleteURL()); - txtShortURL.setValue(publicLink.getShortURL()); - selectTxt(); - } - - @Override - public void onFailure(Throwable caught) { - vp.unmask(); - new MessageBoxAlert("Error", caught.getMessage(), null); - } - }); - - }else{ - txtCompleteURL.unmask(); - new MessageBoxAlert("Error", "The item identifier is null", null); - } - - this.getButtonById(Dialog.CLOSE).addSelectionListener(new SelectionListener() { - - @Override - public void componentSelected(ButtonEvent ce) { - hide(); - } - - }); - - -// vp.add(label); - vp.add(vp1); - vp.add(vp2); - - setFocusWidget(txtCompleteURL); - - add(vp); - } - - public String getTxtValue() { - - return txtCompleteURL.getValue(); - } - - public void selectTxt(){ - - if(txtCompleteURL.getValue()!=null) - txtCompleteURL.select(0, txtCompleteURL.getValue().length()); - } -} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java index 2edbd12..e0b1777 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java @@ -59,6 +59,8 @@ import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem; import org.gcube.portlets.user.workspace.client.workspace.folder.item.gcube.WorkspaceHandledException; import org.gcube.portlets.user.workspace.server.notifications.NotificationsProducer; import org.gcube.portlets.user.workspace.server.notifications.NotificationsUtil; +import org.gcube.portlets.user.workspace.server.reader.ApplicationProfile; +import org.gcube.portlets.user.workspace.server.reader.ApplicationProfileReader; import org.gcube.portlets.user.workspace.server.resolver.UriResolverReaderParameterForResolverIndex; import org.gcube.portlets.user.workspace.server.shortener.UrlShortener; import org.gcube.portlets.user.workspace.server.util.AclTypeComparator; @@ -1937,6 +1939,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT workspaceLogger.debug("get List Parents By Item Identifier "+ itemIdentifier +", include Item As (Last) Parent: "+includeItemAsParent); + if(isSessionExpired()) + throw new SessionExpiredException(); + if(itemIdentifier==null) return new ArrayList(); //empty list @@ -3523,4 +3528,37 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT public static String concatenateSessionKeyScope(String key, String scope){ return key.concat(scope); } + + /* (non-Javadoc) + * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#getFolderLinkForFolderItemId(java.lang.String, boolean) + */ + @Override + public PublicLink getFolderLinkForFolderItemId(String itemId, boolean b) throws SessionExpiredException, Exception { + + if(isSessionExpired()) + throw new SessionExpiredException(); + + try { + Workspace workspace = getWorkspace(); + WorkspaceItem item = workspace.getItem(itemId); + if(item instanceof WorkspaceFolder){ + WorkspaceFolder folder = (WorkspaceFolder) item; + String folderId = folder.getPublicLink(false); + workspaceLogger.info("HL returning folder link id: "+folderId); + ApplicationProfileReader apReader = new ApplicationProfileReader("Workspace-Explorer-App", "org.gcube.portlets.user.workspaceexplorerapp.server.WorkspaceExplorerAppServiceImpl"); + ApplicationProfile ap = apReader.readProfileFromInfrastrucure(); + workspaceLogger.info("Application profile returning url: "+ap.getUrl()); + return new PublicLink(ap.getUrl()+"?folderId="+folderId, "not available"); + }else + throw new NoGcubeItemTypeException("The item is not a Gcube Item"); + + } catch (NoGcubeItemTypeException e){ + workspaceLogger.error("Error in server FormattedGcubeItemProperties: ", e); + throw new Exception(e.getMessage()); + } catch (Exception e) { + workspaceLogger.error("Error in server FormattedGcubeItemProperties: ", e); + String error = ConstantsExplorer.SERVER_ERROR +" reading Folder Link for id: "+itemId; + throw new Exception(error); + } + } } diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/reader/ApplicationProfile.java b/src/main/java/org/gcube/portlets/user/workspace/server/reader/ApplicationProfile.java new file mode 100644 index 0000000..3a01ee4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/server/reader/ApplicationProfile.java @@ -0,0 +1,169 @@ +package org.gcube.portlets.user.workspace.server.reader; + +import java.io.Serializable; + +/** + * The Class ApplicationProfile. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jan 14, 2016 + */ +public class ApplicationProfile implements Serializable { + + + /** + * + */ + private static final long serialVersionUID = -8627579981996968828L; + private String key; + private String name; + private String description; + private String imageUrl; + private String scope; + private String url; + + /** + * Instantiates a new application profile. + */ + public ApplicationProfile() { + super(); + } + + /** + * Instantiates a new application profile. + * + * @param key the key + * @param name the name + * @param description the description + * @param imageUrl the image url + * @param scope the scope + * @param url the url + */ + public ApplicationProfile(String key, String name, String description, String imageUrl, String scope, String url) { + super(); + this.key = key; + this.name = name; + this.description = description; + this.imageUrl = imageUrl; + this.scope = scope; + this.url = url; + } + + /** + * Gets the key. + * + * @return the key + */ + public String getKey() { + return key; + } + + /** + * Sets the key. + * + * @param key the new key + */ + public void setKey(String key) { + this.key = key; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * + * @param name the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Sets the description. + * + * @param description the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Gets the image url. + * + * @return the image url + */ + public String getImageUrl() { + return imageUrl; + } + + /** + * Sets the image url. + * + * @param imageUrl the new image url + */ + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + /** + * Gets the scope. + * + * @return the scope + */ + public String getScope() { + return scope; + } + + /** + * Sets the scope. + * + * @param scope the new scope + */ + public void setScope(String scope) { + this.scope = scope; + } + + /** + * Gets the url. + * + * @return the url + */ + public String getUrl() { + return url; + } + + /** + * Sets the url. + * + * @param url the new url + */ + public void setUrl(String url) { + this.url = url; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "ApplicationProfile [key=" + key + ", name=" + name + ", description=" + + description + ", imageUrl=" + imageUrl + ", scope=" + scope + + ", url=" + url + "]"; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/reader/ApplicationProfileNotFoundException.java b/src/main/java/org/gcube/portlets/user/workspace/server/reader/ApplicationProfileNotFoundException.java new file mode 100644 index 0000000..a2e4b02 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/server/reader/ApplicationProfileNotFoundException.java @@ -0,0 +1,20 @@ +package org.gcube.portlets.user.workspace.server.reader; + +/** + * The Class ApplicationProfileException. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Sep 6, 2016 + */ +@SuppressWarnings("serial") +public class ApplicationProfileNotFoundException extends Exception { + + /** + * Instantiates a new application profile exception. + * + * @param message the message + */ + public ApplicationProfileNotFoundException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/reader/ApplicationProfileReader.java b/src/main/java/org/gcube/portlets/user/workspace/server/reader/ApplicationProfileReader.java new file mode 100644 index 0000000..f18773b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/server/reader/ApplicationProfileReader.java @@ -0,0 +1,268 @@ +package org.gcube.portlets.user.workspace.server.reader; + +import static org.gcube.resources.discovery.icclient.ICFactory.client; + +import java.io.StringReader; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.commons.lang.StringUtils; +import org.gcube.common.resources.gcore.utils.XPathHelper; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.resources.discovery.client.api.DiscoveryClient; +import org.gcube.resources.discovery.client.queries.api.Query; +import org.gcube.resources.discovery.client.queries.impl.QueryBox; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Node; +import org.xml.sax.InputSource; + + +/** + * The Class UriResolverMapReader. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * May 4, 2015 + */ +public class ApplicationProfileReader { + + /** + * + */ + public static final String SECONDARY_TYPE = "ApplicationProfile"; + public static final String WORKSPACE_EXPLORER_APP_NAME = "Workspace-Explorer-App"; + + protected static final String RESOURCE_PROFILE_BODY_END_POINT_URL_TEXT = "/Resource/Profile/Body/EndPoint/URL/text()"; + protected static final String RESOURCE_PROFILE_BODY_END_POINT_SCOPE_TEXT = "/Resource/Profile/Body/EndPoint/Scope/text()"; + protected static final String RESOURCE_PROFILE_BODY_TEXT = "/Resource/Profile/Body/text()"; + protected static final String RESOURCE_PROFILE_BODY_THUMBNAIL_URL_TEXT = "/Resource/Profile/Body/ThumbnailURL/text()"; + protected static final String RESOURCE_PROFILE_BODY_APP_ID_TEXT = "/Resource/Profile/Body/AppId/text()"; + protected static final String RESOURCE_PROFILE_DESCRIPTION_TEXT = "/Resource/Profile/Description/text()"; + protected static final String RESOURCE_PROFILE_NAME_TEXT = "/Resource/Profile/Name/text()"; + +// private Logger logger = LoggerFactory.getLogger(UriResolverMapReader.class); + //TODO TEMP SOLUTION IN ORDER TO PRINT USING ALSO LOG4J INTO GEOEXPLORER PORTLET + private Logger logger = LoggerFactory.getLogger(ApplicationProfileReader.class); + private String secondaryType; + private String scope; + private String resourceName; + private String appID; + + + /** + * Instantiates a new application profile reader. + * + * @param resourceName the resource name + * @param appID the app id + * @throws Exception the exception + */ + public ApplicationProfileReader(String resourceName, String appID) throws Exception { + + this.resourceName = resourceName; + this.appID = appID; + this.secondaryType = SECONDARY_TYPE; + this.scope = ScopeProvider.instance.get(); + } + + + /** + * this method looks up the generic resource among the ones available in the infrastructure using scope provider {@link ScopeProvider.instance.get()} + * resource name {@value #WORKSPACE_EXPLORER_APP_NAME} and secondaryType {@value #SECONDARY_TYPE} + * + * @return the applicationProfile profile + * @throws Exception the exception + */ + /** + * this method looks up the applicationProfile profile among the ones available in the infrastructure. + * + * @return the applicationProfile profile + */ + public ApplicationProfile readProfileFromInfrastrucure() { + + ApplicationProfile appProf = new ApplicationProfile(); + String queryString = getGcubeGenericQueryString(secondaryType, appID); + String originalScope = null; + + try { + + if(scope==null) + throw new Exception("Scope is null, set scope into ScopeProvider"); + + logger.info("Trying to fetch ApplicationProfile in the scope: "+scope+", SecondaryType: " + secondaryType + ", AppId: " + appID); + Query q = new QueryBox(queryString); + DiscoveryClient client = client(); + List appProfile = client.submit(q); + + if (appProfile == null || appProfile.size() == 0) + throw new ApplicationProfileNotFoundException("ApplicationProfile with SecondaryType: " + secondaryType + ", AppId: " + appID +" is not registered in the scope: "+scope); + 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 currValue = null; + currValue = helper.evaluate(RESOURCE_PROFILE_NAME_TEXT); + if (currValue != null && currValue.size() > 0) { + appProf.setName(currValue.get(0)); + } + else throw new ApplicationProfileNotFoundException("Your applicationProfile NAME was not found in the profile"); + + currValue = helper.evaluate(RESOURCE_PROFILE_DESCRIPTION_TEXT); + if (currValue != null && currValue.size() > 0) { + appProf.setDescription(currValue.get(0)); + } + else logger.warn("No Description exists for " + appProf.getName()); + + currValue = helper.evaluate(RESOURCE_PROFILE_BODY_APP_ID_TEXT); + if (currValue != null && currValue.size() > 0) { + appProf.setKey(currValue.get(0)); + } + else throw new ApplicationProfileNotFoundException("Your applicationProfile ID n was not found in the profile, consider adding element in "); + + currValue = helper.evaluate(RESOURCE_PROFILE_BODY_THUMBNAIL_URL_TEXT); + if (currValue != null && currValue.size() > 0) { + appProf.setImageUrl(currValue.get(0)); + } + else{ + logger.warn("Null or empty element in " + appProf.getName()); + } + + currValue = helper.evaluate("/Resource/Profile/Body/EndPoint[Scope='"+scope.toString()+"']/Scope/text()"); + + if (currValue != null && currValue.size() > 0) { + List scopes = currValue; + String currentScope = scopes.get(0); + + int slashCount = StringUtils.countMatches(currentScope, "/"); + + if(slashCount < 3){//CASE not VRE - set session scope + logger.info("Scope "+ scope.toString() + " is not a VRE"); + + List listSessionScope = helper.evaluate("/Resource/Profile/Body/EndPoint[Scope='"+scope.toString()+"']/Sessionscope/text()"); //get session scope of i+1-mo scope + + if(listSessionScope!=null && listSessionScope.size()>0){ //If sessions scope exists + + logger.trace("setting session scope "+ listSessionScope.get(0)); + appProf.setScope(listSessionScope.get(0)); + } + else{ + logger.trace("session scope not exists setting scope "+ scope.toString()); + appProf.setScope(scope.toString()); + } + } + else{ //CASE IS A VRE + logger.info("Scope "+ scope.toString() + " is a VRE"); + appProf.setScope(scope.toString()); + + } + + //RETRIEVE URL + currValue = helper.evaluate("/Resource/Profile/Body/EndPoint[Scope='"+scope.toString()+"']/URL/text()"); + + if (currValue != null && currValue.size() > 0) { + String url = currValue.get(0); + // System.out.println("URL "+url); + if(url!=null) + appProf.setUrl(url); + else + throw new ApplicationProfileNotFoundException("Your applicationProfile URL was not found in the profile for Scope: " + scope.toString()); + } + else throw new ApplicationProfileNotFoundException("Your applicationProfile URL was not found in the profile for Scope: " + scope.toString()); + + } + else throw new ApplicationProfileNotFoundException("Your applicationProfile with scope "+scope.toString()+" was not found in the profile, consider adding element in "); + + return appProf; + } + + } catch (Exception e) { + logger.error("Error while trying to fetch applicationProfile profile from the infrastructure", e); + return null; + }finally{ + if(originalScope!=null && !originalScope.isEmpty()){ + ScopeProvider.instance.set(originalScope); + logger.info("scope provider setted to orginal scope: "+originalScope); + }else{ + ScopeProvider.instance.reset(); + logger.info("scope provider reset"); + } + } + + } + + public static String getGcubeGenericQueryString(String secondaryType, String appId){ + + return "for $profile in collection('/db/Profiles/GenericResource')//Resource " + + "where $profile/Profile/SecondaryType/string() eq '"+secondaryType+"' and $profile/Profile/Body/AppId/string() " + + " eq '" + appId + "'" + + "return $profile"; + } + + /** + * Gets the secondary type. + * + * @return the secondary type + */ + public String getSecondaryType() { + return secondaryType; + } + + + /** + * Gets the scope. + * + * @return the scope + */ + public String getScope() { + return scope; + } + + /** + * Gets the resource name. + * + * @return the resource name + */ + public String getResourceName() { + return resourceName; + } + + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + + StringBuilder builder = new StringBuilder(); + builder.append("ApplicationProfileReader [secondaryType="); + builder.append(secondaryType); + builder.append(", scope="); + builder.append(scope); + builder.append(", resourceName="); + builder.append(resourceName); + builder.append(", appID="); + builder.append(appID); + builder.append("]"); + return builder.toString(); + } + + +// public static void main(String[] args) { +// +// try { +// ScopeProvider.instance.set("/gcube"); +// ApplicationProfileReader ap = new ApplicationProfileReader("Workspace-Explorer-App", "org.gcube.portlets.user.workspaceexplorerapp.server.WorkspaceExplorerAppServiceImpl"); +// System.out.println(ap.readProfileFromInfrastrucure()); +// } +// catch (Exception e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } +// +// +// } + +} diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/util/WsUtil.java b/src/main/java/org/gcube/portlets/user/workspace/server/util/WsUtil.java index bb492be..89d92ed 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/util/WsUtil.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/util/WsUtil.java @@ -55,7 +55,7 @@ public class WsUtil { public static final String PROPERTY_SPECIAL_FOLDER = "PROPERTY_SPECIAL_FOLDER"; public static final String NOTIFICATION_PORTLET_CLASS_ID = "org.gcube.portlets.user.workspace.server.GWTWorkspaceServiceImpl"; //IN DEV - public static final String TEST_SCOPE = "/gcube/devsec"; + public static final String TEST_SCOPE = "/gcube"; // public static final String TEST_USER = "pasquale.pagano"; // public static final String TEST_USER = "federico.defaveri"; diff --git a/src/main/java/org/gcube/portlets/user/workspace/shared/PublicLink.java b/src/main/java/org/gcube/portlets/user/workspace/shared/PublicLink.java index 7c0b20a..6e286c4 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/shared/PublicLink.java +++ b/src/main/java/org/gcube/portlets/user/workspace/shared/PublicLink.java @@ -1,31 +1,39 @@ /** - * + * */ package org.gcube.portlets.user.workspace.shared; import java.io.Serializable; + /** - * - * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Jul 3, 2015 + * The Class PublicLink. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Sep 13, 2016 */ public class PublicLink implements Serializable { /** - * + * */ private static final long serialVersionUID = -8157172818802297440L; private String completeURL; private String shortURL; + /** + * Instantiates a new public link. + */ public PublicLink() { } /** - * @param completeURL - * @param shortURL + * Instantiates a new public link. + * + * @param completeURL the complete url + * @param shortURL the short url */ public PublicLink(String completeURL, String shortURL) { super(); @@ -34,6 +42,8 @@ public class PublicLink implements Serializable { } /** + * Gets the complete url. + * * @return the completeURL */ public String getCompleteURL() { @@ -41,6 +51,8 @@ public class PublicLink implements Serializable { } /** + * Gets the short url. + * * @return the shortURL */ public String getShortURL() { @@ -48,16 +60,18 @@ public class PublicLink implements Serializable { } /** - * @param completeURL - * the completeURL to set + * Sets the complete url. + * + * @param completeURL the completeURL to set */ public void setCompleteURL(String completeURL) { this.completeURL = completeURL; } /** - * @param shortURL - * the shortURL to set + * Sets the short url. + * + * @param shortURL the shortURL to set */ public void setShortURL(String shortURL) { this.shortURL = shortURL; @@ -65,7 +79,7 @@ public class PublicLink implements Serializable { /* * (non-Javadoc) - * + * * @see java.lang.Object#toString() */ @Override