diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 443e085..6249222 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,7 +1,11 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 497363c..53299b0 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -4,6 +4,9 @@ + + uses + diff --git a/pom.xml b/pom.xml index 23e30ad..3f7d500 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ cersion --> provided online - + 1.7 1.7 ${project.build.directory}/${project.build.finalName} @@ -170,9 +170,9 @@ ${setScope} - org.gcube.portlets.user - workspace-tree-widget - ${setScope} + org.gcube.portlets.widgets + fileupload-progress-bar + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) org.gcube.portlets.user diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/Presenter.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/Presenter.java index dcbe604..83447d8 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/Presenter.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/Presenter.java @@ -50,10 +50,10 @@ import org.gcube.portlets.user.reportgenerator.client.targets.GenericTable; import org.gcube.portlets.user.reportgenerator.client.targets.GroupingDelimiterArea; import org.gcube.portlets.user.reportgenerator.client.targets.HeadingTextArea; import org.gcube.portlets.user.reportgenerator.client.targets.ReportTextArea; -import org.gcube.portlets.user.reportgenerator.client.targets.TSArea; import org.gcube.portlets.user.reportgenerator.client.targets.TextTableImage; import org.gcube.portlets.user.reportgenerator.client.toolbar.RichTextToolbar; import org.gcube.portlets.user.reportgenerator.client.uibinder.ExportOptions; +import org.gcube.portlets.user.reportgenerator.shared.ReportImage; import org.gcube.portlets.user.reportgenerator.shared.SessionInfo; import org.gcube.portlets.user.reportgenerator.shared.UserBean; import org.gcube.portlets.user.reportgenerator.shared.VMETypeIdentifier; @@ -65,6 +65,9 @@ import org.gcube.portlets.widgets.exporter.client.event.ExportingCompletedEventH import org.gcube.portlets.widgets.exporter.client.event.ReportExporterEvent; import org.gcube.portlets.widgets.exporter.client.event.ReportExporterEventHandler; import org.gcube.portlets.widgets.exporter.shared.TypeExporter; +import org.gcube.portlets.widgets.fileupload.client.events.FileUploadCompleteEvent; +import org.gcube.portlets.widgets.fileupload.client.events.FileUploadCompleteEventHandler; +import org.gcube.portlets.widgets.fileupload.client.view.UploadProgressDialog; import com.extjs.gxt.ui.client.widget.MessageBox; import com.google.gwt.core.client.GWT; @@ -105,8 +108,15 @@ public class Presenter { private final WaitingOperationDialog dlg = new WaitingOperationDialog(); + private UploadProgressDialog uploadDlg; + private UserBean currentUser; private String currentScope; + + private ClientImage selectedImage; + + + /** * Model */ @@ -141,15 +151,42 @@ public class Presenter { /** * eventbus events handler */ - HandlerManager eventBus = new HandlerManager(null); + static HandlerManager eventBus = new HandlerManager(null); - public HandlerManager getEventBus() { + public static HandlerManager getEventBus() { return eventBus; } private void handleEvents() { + /** + * get the uploaded file result + */ + eventBus.addHandler(FileUploadCompleteEvent.TYPE, new FileUploadCompleteEventHandler() { + + @Override + public void onUploadComplete(FileUploadCompleteEvent event) { + + //the filename and its path on server are returned to the client + String fileName = event.getUploadedFileInfo().getFilename(); + String absolutePathOnServer = event.getUploadedFileInfo().getAbsolutePath(); + GWT.log(fileName + " uploaded on Server here: " + absolutePathOnServer); + + reportService.getUploadedImageUrlById(fileName, absolutePathOnServer, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + Window.alert("An error occurred in the server: " + caught.getMessage()); + } + @Override + public void onSuccess(ReportImage result) { + uploadDlg.showRegisteringResult(true); //or false if an error occurred + selectedImage.dropImage(result.getUrl(), result.getId(), result.getWidth(), result.getHeight()); + } + }); + } + }); + eventBus.addHandler(SelectedReportEvent.TYPE, new SelectedReportEventHandler() { @Override public void onReportSelected(SelectedReportEvent event) { @@ -954,9 +991,6 @@ public class Presenter { setCurrCursorPos(uiY); break; case TIME_SERIES: - TSArea dp5 = (TSArea) component.getContent(); - wp.addComponentToLayout(dp5, component.isDoubleColLayout()); - setCurrCursorPos(uiY); break; case FLEX_TABLE: GenericTable gt = (GenericTable) component.getContent(); @@ -1118,8 +1152,11 @@ public class Presenter { /** * show the upload file popup */ - public void showUploadFilePopup() { - toolBoxPanel.showUploadFile(); + public void showUploadFilePopup(ClientImage selectedImage) { + uploadDlg = new UploadProgressDialog("Upload Image", eventBus); + uploadDlg.center(); + uploadDlg.show(); + this.selectedImage = selectedImage; } /** * diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportGenerator.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportGenerator.java index 7341db3..264dcde 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportGenerator.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportGenerator.java @@ -1,8 +1,6 @@ package org.gcube.portlets.user.reportgenerator.client; import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; -import org.gcube.portlets.user.workspace.client.AppControllerExplorer; -import org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceServiceAsync; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.event.logical.shared.ResizeEvent; @@ -82,8 +80,6 @@ public class ReportGenerator implements EntryPoint { private ScrollPanel bottomScrollerPanel = new ScrollPanel(); - private AppControllerExplorer treeController; - private HTML divHidden = new HTML(); /** * This is the entry point method. @@ -91,14 +87,13 @@ public class ReportGenerator implements EntryPoint { public void onModuleLoad() { singleton = this; presenter = new Presenter(); - treeController = new AppControllerExplorer(); mainLayout.setWidth("100%"); mainLayout.setHeight("100%"); // workSpacePanel = new WorkspacePanel(presenter); titlebar = new TitleBar(presenter); header = new Headerbar(presenter); - toolBoxPanel = new ToolboxPanel(treeController); + toolBoxPanel = new ToolboxPanel(); presenter.setHeader(header); presenter.setTitleBar(titlebar); @@ -197,12 +192,6 @@ public class ReportGenerator implements EntryPoint { public ToolboxPanel getToolBoxPanel() { return toolBoxPanel; } - - public GWTWorkspaceServiceAsync getWSTreeService() { - return treeController.getRpcWorkspaceService(); - } - - /** * * @return . diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java index b314a9a..b5b3b45 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import org.gcube.portlets.d4sreporting.common.shared.Model; import org.gcube.portlets.d4sreporting.common.shared.RepTimeSeries; import org.gcube.portlets.d4sreporting.common.shared.Table; +import org.gcube.portlets.user.reportgenerator.shared.ReportImage; import org.gcube.portlets.user.reportgenerator.shared.SessionInfo; import org.gcube.portlets.user.reportgenerator.shared.VMEReportBean; import org.gcube.portlets.user.reportgenerator.shared.VMETypeIdentifier; @@ -22,6 +23,8 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; @RemoteServiceRelativePath("ReportServiceImpl") public interface ReportService extends RemoteService{ + ReportImage getUploadedImageUrlById(String fileName, String absolutePath); + ArrayList listVMEReports(); ArrayList listVMEReportRefByType(VMETypeIdentifier refType); @@ -35,6 +38,8 @@ public interface ReportService extends RemoteService{ String save(String filePath, String workspaceFolderId, String ItemName, TypeExporter type, boolean overwrite) throws SaveReportFileException, SaveReportFileExistException; + + ReportImage getImageUrlById(String identifier); /** * return the first ten records of the timeseries having id as param * @param sTS . diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java index 718234b..84c2e45 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import org.gcube.portlets.d4sreporting.common.shared.Model; import org.gcube.portlets.d4sreporting.common.shared.RepTimeSeries; import org.gcube.portlets.d4sreporting.common.shared.Table; +import org.gcube.portlets.user.reportgenerator.shared.ReportImage; import org.gcube.portlets.user.reportgenerator.shared.SessionInfo; import org.gcube.portlets.user.reportgenerator.shared.VMEReportBean; import org.gcube.portlets.user.reportgenerator.shared.VMETypeIdentifier; @@ -91,4 +92,7 @@ public interface ReportServiceAsync { AsyncCallback callback); void deleteReportFromRSG(VMETypeIdentifier refType, String idToDelete, AsyncCallback callback); + void getImageUrlById(String identifier, AsyncCallback callback); + void getUploadedImageUrlById(String fileName, String absolutePath, + AsyncCallback callback); } diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ToolboxPanel.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ToolboxPanel.java index aec73f5..3027525 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ToolboxPanel.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ToolboxPanel.java @@ -1,14 +1,9 @@ package org.gcube.portlets.user.reportgenerator.client; -import org.gcube.portlets.user.workspace.client.AppControllerExplorer; -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.FileUploadEvent.UploadType; -import org.gcube.portlets.user.workspace.client.view.tree.AsyncTreePanel; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.widgets.fileupload.client.view.UploadProgressDialog; import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.VerticalPanel; /** @@ -17,8 +12,6 @@ import com.google.gwt.user.client.ui.VerticalPanel; */ public class ToolboxPanel extends VerticalPanel { - private AppControllerExplorer appController; - private AsyncTreePanel tp; /** * */ @@ -28,12 +21,7 @@ public class ToolboxPanel extends VerticalPanel { */ public static final int TOOLBOX_HEIGHT= 800; - public ToolboxPanel(AppControllerExplorer appController) { - this.appController = appController; -// AsyncTreePanel tp = appController.getTree(TOOLBOX_WIDTH, TOOLBOX_HEIGHT); -// this.tp = tp; -// add(tp); -// this.appController.hideSharingFacilities(); //sharing disabled we have problems from Reports + public ToolboxPanel() { } public void showStructure(ReportStructurePanel panel) { @@ -50,7 +38,7 @@ public class ToolboxPanel extends VerticalPanel { public void showExportedVersion(String id, String fileName) { GWT.log("showExportedVersion"); - AppControllerExplorer.getEventBus().fireEvent(new FileDownloadEvent(id, fileName, DownloadType.SHOW)); + //AppControllerExplorer.getEventBus().fireEvent(new FileDownloadEvent(id, fileName, DownloadType.SHOW)); } /** * refresh the root @@ -58,12 +46,6 @@ public class ToolboxPanel extends VerticalPanel { public void refreshRoot() { //appController.refreshRoot(); } - /** - * show upload file popup - */ - public void showUploadFile() { - AppControllerExplorer.getEventBus().fireEvent(new FileUploadEvent(tp.getRootItem(), UploadType.FILE)); - } /** * lalala * @return the toolbox height diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TSHeader.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TSHeader.java deleted file mode 100644 index da8da4f..0000000 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TSHeader.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.gcube.portlets.user.reportgenerator.client.dialog; - -import com.google.gwt.user.client.ui.CheckBox; -import com.google.gwt.user.client.ui.ClickListener; -import com.google.gwt.user.client.ui.FlexTable; -import com.google.gwt.user.client.ui.HTML; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Widget; - - -/** - * - * @author massi - * - */ -public class TSHeader extends HorizontalPanel { - - private CheckBox myCB; - private HTML myHeader; - private int myColNo; - private FlexTable myTable; - TimeSeriesFilterDialog caller; - TSHeader myinstance; - - /** - * @param tsf - - * @param myTable . - * @param cb . - * @param myColNo . - * @param myHeader . - */ - public TSHeader(TimeSeriesFilterDialog tsf, FlexTable myTable, CheckBox cb, int myColNo, HTML myHeader) { - super(); - myinstance = this; - caller = tsf; - this.myTable = myTable; - this.myCB = cb; - - this.myColNo = myColNo; - this.myHeader = myHeader; - setVerticalAlignment(ALIGN_MIDDLE); - myHeader.setStyleName("timeSeries_header_font"); - add(myHeader); - add(myCB); - - myCB.addClickListener(cbListener); - } - - private void removeEmptyHeaders( FlexTable myTable) { - - for (int i = 0; i < myTable.getCellCount(0); i++) { - if (myTable.getWidget(0, i) == null) { - myTable.removeCell(0, i); - myTable.removeCell(1, i); - } - } - - } - - ClickListener cbListener = new ClickListener() { - public void onClick(Widget sender) { - caller.removeHeader(myinstance); - myTable.remove(sender.getParent()); - removeEmptyHeaders(myTable); - } - }; - /** - * - * @return . - */ - public CheckBox getMyCB() { - return myCB; - } - /** - * - * @param myCB . - */ - public void setMyCB(CheckBox myCB) { - this.myCB = myCB; - } - /** - * - * @return . - * */ - public HTML getMyHeader() { - return myHeader; - } - /** - * - * @param myHeader . - */ - public void setMyHeader(HTML myHeader) { - this.myHeader = myHeader; - } - /** - * - * @return . - */ - public int getMyColNo() { - return myColNo; - } - - /** - * - * @param myColNo . - */ - public void setMyColNo(int myColNo) { - this.myColNo = myColNo; - } - - -} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TimeSeriesFilterDialog.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TimeSeriesFilterDialog.java deleted file mode 100644 index a91435c..0000000 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TimeSeriesFilterDialog.java +++ /dev/null @@ -1,212 +0,0 @@ -package org.gcube.portlets.user.reportgenerator.client.dialog; - -import java.util.LinkedList; -import java.util.List; - -import org.gcube.portlets.d4sreporting.common.client.CommonConstants; -import org.gcube.portlets.d4sreporting.common.shared.TimeSeriesFilter; -import org.gcube.portlets.d4sreporting.common.shared.TimeSeriesinfo; -import org.gcube.portlets.d4sreporting.common.shared.RepTimeSeries; -import org.gcube.portlets.user.reportgenerator.client.targets.TSArea; - -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.ChangeListener; -import com.google.gwt.user.client.ui.CheckBox; -import com.google.gwt.user.client.ui.ClickListener; -import com.google.gwt.user.client.ui.DialogBox; -import com.google.gwt.user.client.ui.FlexTable; -import com.google.gwt.user.client.ui.Grid; -import com.google.gwt.user.client.ui.HTML; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.ScrollPanel; -import com.google.gwt.user.client.ui.TextBox; -import com.google.gwt.user.client.ui.VerticalPanel; -import com.google.gwt.user.client.ui.Widget; - -/** - * - * @author massi - * - */ -public class TimeSeriesFilterDialog extends DialogBox { - ScrollPanel scroller = new ScrollPanel(); - TextBox from = new TextBox(); - TextBox to = new TextBox(); - FlexTable flexTable = new FlexTable(); - - List compoundHeaders = new LinkedList(); - /** - * - * @param sts a ts - * @param caller . - */ - public TimeSeriesFilterDialog(final TSArea caller, final RepTimeSeries sts) { - - final TimeSeriesinfo droppedTS = sts.getTsMetadata(); - - setText(droppedTS.getTitle() + " Filter"); - String name = droppedTS.getTitle(); - long rowsNo = droppedTS.getDimension(); - - - Grid metadata = new Grid(2, 2); - metadata.setWidget(0, 0, new HTML("Name:", true)); - metadata.setWidget(0, 1, new HTML(name)); - metadata.setWidget(1, 0, new HTML("Total rows : ", true)); - metadata.setWidget(1, 1, new HTML(""+rowsNo)); - - - final VerticalPanel main_panel = new VerticalPanel(); - main_panel.addStyleName("bgBlank p8 font_family font_12"); - - main_panel.add(metadata); - - List headersString = droppedTS.getHeaderLabels(); - - /** - */ - for (int i = 0; i < headersString.size(); i++) { - CheckBox toAdd = new CheckBox(); - toAdd.setChecked(true); - compoundHeaders.add(new TSHeader(this, flexTable, toAdd, i, new HTML(headersString.get(i) ))); - } - - - main_panel.add(new HTML("Selected fields: (click to remove)")); - - flexTable = getTableHeader(compoundHeaders); - main_panel.add(flexTable); - - main_panel.add(new HTML("Select rows interval:")); - - from.setText("1"); - to.setText("10"); - to.setMaxLength(6); - from.setMaxLength(6); - from.addChangeListener(textBoxListener); - to.addChangeListener(textBoxListener); - - - Grid rowsInterval = new Grid(1, 4); - rowsInterval.setWidget(0, 0, new HTML("From row:")); - rowsInterval.setWidget(0, 1, from); - rowsInterval.setWidget(0, 2, new HTML("  To row:")); - rowsInterval.setWidget(0, 3, to); - - main_panel.add(rowsInterval); - - main_panel.add(new HTML("
")); - HorizontalPanel buttonspanel = new HorizontalPanel(); - buttonspanel.setHeight("50"); - buttonspanel.setSpacing(3); - - - - - // PopupPanel is a SimplePanel, so you have to set it's widget property to - // whatever you want its contents to be. - Button close = new Button("Close"); - close.addClickHandler(new ClickHandler() { - public void onClick(ClickEvent event) { - hide(); - } - }); - - Button apply = new Button("Apply"); - apply.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - List selectedCols = compoundHeaders; - - List colsToShow = new LinkedList(); - - for (TSHeader head : selectedCols) { - colsToShow.add(new Integer(head.getMyColNo())); - } - int fromInt = Integer.parseInt(from.getText()); - int toInt = Integer.parseInt(to.getText()); - - TimeSeriesFilter toSet = new TimeSeriesFilter(colsToShow, null, null, fromInt, toInt); - caller.setNewFilter(toSet); - caller.refreshHeaders(); - hide(); - - } - }); - - buttonspanel.add(close); - buttonspanel.add(apply); - main_panel.add(buttonspanel); - - scroller.setPixelSize(550, 280); - main_panel.setPixelSize(550, 260); - - scroller.add(main_panel); - setWidget(scroller); - } - - - /** - * - * @param toRemove . - * @return . - */ - public boolean removeHeader(TSHeader toRemove) { - return compoundHeaders.remove(toRemove); - } - - - /** - * display the header of the ts - * @param droppedTS - * @return - */ - private FlexTable getTableHeader(List headers) { - flexTable.clear(); - int n = headers.size(); - - for (int i = 0; i < n ; i++) { - flexTable.getCellFormatter().setStyleName(0, i, "timeSeries_header"); - flexTable.setWidget(0, i, headers.get(i)); - flexTable.getCellFormatter().setStyleName(1, i, "timeSeries_td"); - flexTable.setWidget(1, i, new HTML("...")); - } - - return flexTable; - } - - ChangeListener textBoxListener = new ChangeListener() { - - public void onChange(Widget sender) { - TextBox tb = (TextBox) sender; - String text = tb.getText(); - String checkedText = text; - text = text.replaceAll(CommonConstants.ACCEPTED_CHARS_JUST_NUM, ""); - if (! text.equals(checkedText) ) { - Window.alert("Only numbers are accepted"); - tb.setText(text); - } - int start = Integer.parseInt(from.getText()); - int end = Integer.parseInt(to.getText()); - - if (start >= end) { - Window.alert("From must be greater than to"); - to.setText(""+(start+10)); - } - - } - - - }; - /** - * - */ - public void show() { - super.show(); - center(); - } - -} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateComponent.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateComponent.java index 231cf55..be101b6 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateComponent.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateComponent.java @@ -23,14 +23,12 @@ import org.gcube.portlets.user.reportgenerator.client.targets.ClientRepeatableSe import org.gcube.portlets.user.reportgenerator.client.targets.ClientReportReference; import org.gcube.portlets.user.reportgenerator.client.targets.ClientSequence; import org.gcube.portlets.user.reportgenerator.client.targets.D4sRichTextarea; -import org.gcube.portlets.user.reportgenerator.client.targets.DropTSListener; import org.gcube.portlets.user.reportgenerator.client.targets.ExtHidden; import org.gcube.portlets.user.reportgenerator.client.targets.GenericTable; import org.gcube.portlets.user.reportgenerator.client.targets.GroupingDelimiterArea; import org.gcube.portlets.user.reportgenerator.client.targets.GroupingInnerArea; import org.gcube.portlets.user.reportgenerator.client.targets.HeadingTextArea; import org.gcube.portlets.user.reportgenerator.client.targets.ReportTextArea; -import org.gcube.portlets.user.reportgenerator.client.targets.TSArea; import org.gcube.portlets.user.reportgenerator.client.targets.TextTableImage; import com.google.gwt.core.client.GWT; @@ -338,24 +336,6 @@ public class TemplateComponent { this.content = hiddenField; break; case TIME_SERIES: - TSArea tsa; - RepTimeSeries sts = null; - try { - sts = ((RepTimeSeries) sc.getPossibleContent()); - } catch (ClassCastException e) { - - } - //need to reset the filter when loading a TS - sts.setFilter(null); - tsa = new TSArea(presenter, width, 155, sts); - - tsa.setPixelSize(width, 155); - - - @SuppressWarnings("unused") - DropTSListener dropTSListener = new DropTSListener(tsa); - - this.content = tsa; break; case REPEAT_SEQUENCE_DELIMITER: GroupingDelimiterArea gp = new GroupingDelimiterArea(width, height); @@ -490,9 +470,7 @@ public class TemplateComponent { } break; case TIME_SERIES: - GWT.log("Found Time Series", null); - TSArea tsa = (TSArea) this.content; - content = tsa.getSts(); + GWT.log("Found Time Series, not supported anymore", null); break; case FLEX_TABLE: GenericTable gt = (GenericTable) this.content; diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientImage.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientImage.java index 6f6f823..a64a4ea 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientImage.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientImage.java @@ -5,13 +5,12 @@ import java.util.List; import org.gcube.portlets.d4sreporting.common.shared.BasicComponent; import org.gcube.portlets.d4sreporting.common.shared.Metadata; -import org.gcube.portlets.user.reportgenerator.client.ReportGenerator; +import org.gcube.portlets.user.reportgenerator.client.ReportService; +import org.gcube.portlets.user.reportgenerator.client.ReportServiceAsync; import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; import org.gcube.portlets.user.reportgenerator.client.model.TemplateComponent; import org.gcube.portlets.user.reportgenerator.client.model.TemplateModel; -import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem; -import org.gcube.portlets.user.workspace.client.workspace.folder.item.GWTExternalImage; -import org.gcube.portlets.user.workspace.client.workspace.folder.item.gcube.GWTImageDocument; +import org.gcube.portlets.user.reportgenerator.shared.ReportImage; import org.gcube.portlets.widgets.lighttree.client.ItemType; import org.gcube.portlets.widgets.lighttree.client.event.PopupEvent; import org.gcube.portlets.widgets.lighttree.client.event.PopupHandler; @@ -43,13 +42,13 @@ import com.google.gwt.user.client.ui.Widget; * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it */ public class ClientImage extends Composite { - + private ReportServiceAsync reportService = (ReportServiceAsync) GWT.create(ReportService.class); private String expectedContent = ""; private final String METADATA_TITLE_KEY = "title"; private final String METADATA_DESC_KEY = "description"; private final String METADATA_SOURCE_KEY = "source"; - + private int imageWidth; private int imageHeight; @@ -70,12 +69,13 @@ public class ClientImage extends Composite { private TextBox titleTB = new TextBox(); private TextBox descTB = new TextBox(); private TextBox sourceTB = new TextBox(); - + private Button resetB = new Button("Clear"); - private Button addImageB = new Button("Select Image"); + private Button addImageB = new Button("Select from Workspace"); private Button uploadImageB = new Button("Upload Image"); private Button removeB = new Button("Remove Image"); private BasicComponent basicComponent; + /** * * @param presenter @@ -103,7 +103,7 @@ public class ClientImage extends Composite { attributesPanel.setStyleName("tableAttributesPanel"); String imageURL = (String) co.getPossibleContent(); - + if (imageURL == null || imageURL.trim().compareTo("") == 0 || imageURL.endsWith(TemplateComponent.DEFAULT_IMAGE_NAME)) { GWT.log("Empty ImageUrl="+imageURL); imagePanel.addStyleName("imageEmptyPanel"); @@ -112,7 +112,7 @@ public class ClientImage extends Composite { GWT.log("Found ImageUrl="+imageURL); showImage(new Image(imageURL), width, height); } - + //set style for buttons for (int i = 0; i < controlPanel.getWidgetCount(); i++) { if (controlPanel.getWidget(i) instanceof Button) { @@ -144,7 +144,7 @@ public class ClientImage extends Composite { showImage(new Image(TemplateComponent.DEFAULT_IMAGE_NAME), DEFAULT_WIDTH, DEFAULT_HEIGHT); imagePanel.addStyleName("imageEmptyPanel"); } - + private HorizontalPanel getControlPanel(boolean isRemovable, final TextTableImage owner) { final HorizontalPanel toReturn = new HorizontalPanel(); @@ -152,11 +152,11 @@ public class ClientImage extends Composite { @Override public void onClick(ClickEvent event) { if (owner != null) { - remove(owner); + remove(owner); } } }); - + resetB.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { @@ -170,11 +170,11 @@ public class ClientImage extends Composite { openFileExplorer(addImageB.getAbsoluteLeft(), addImageB.getAbsoluteTop()); } }); - + uploadImageB.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - presenter.showUploadFilePopup(); + showUploadPopup(); } }); @@ -184,13 +184,17 @@ public class ClientImage extends Composite { toReturn.add(resetB); toReturn.add(uploadImageB); toReturn.add(addImageB); - + return toReturn; } + private void showUploadPopup() { + presenter.showUploadFilePopup(this); + } + private VerticalPanel getAttributesPanel(BasicComponent co) { VerticalPanel toReturn = new VerticalPanel(); - + for (Metadata md : co.getMetadata()) { if (md.getAttribute().compareTo(METADATA_TITLE_KEY) == 0) titleTB.setText(md.getValue()); @@ -205,22 +209,22 @@ public class ClientImage extends Composite { hp1.add(title); hp1.add(titleTB); titleTB.setWidth("135px"); - + HTML desc = new HTML(" Description: ", true); - + HTML source = new HTML("Source: ", true); - + hp1.add(desc); hp1.add(descTB); - descTB.setWidth("435px"); + descTB.setWidth("400px"); toReturn.add(hp1); - + toReturn.add(source); toReturn.add(sourceTB); sourceTB.setWidth("693px"); - + return toReturn; } @@ -251,7 +255,7 @@ public class ClientImage extends Composite { imageHeight = checkedHeight; saveStatus(); } - + /** * called by the constructor * @param toShow the image to show @@ -270,7 +274,7 @@ public class ClientImage extends Composite { basicComponent.setMetadata(mds); GWT.log("Saved in Session"); } - + public List getMetadata() { return basicComponent.getMetadata(); } @@ -286,25 +290,24 @@ public class ClientImage extends Composite { } public void fetchImage(String identifier, final boolean isInteralImage, boolean fullDetails) { - ReportGenerator.get().getWSTreeService().getImageById(identifier, isInteralImage, fullDetails, new AsyncCallback() { + GWT.log("fetchImage:" + identifier); + reportService.getImageUrlById(identifier, new AsyncCallback() { + + @Override + public void onSuccess(ReportImage image) { + int width = image.getWidth(); + int height = image.getHeight(); + GWT.log("image.getUrl():" + image.getUrl()); + dropImage(image.getUrl(), image.getId(), width, height); - public void onSuccess(GWTWorkspaceItem result) { - if (isInteralImage) { - GWTImageDocument image = (GWTImageDocument) result; - int width = image.getWidth(); - int height = image.getHeight(); - dropImage(image.getImageUrl(), image.getId(), width, height); - } else { - GWTExternalImage image = (GWTExternalImage) result; - int width = image.getWidth(); - int height = image.getHeight(); - dropImage(image.getImageUrl(), image.getId(), width, height); - } } + + @Override public void onFailure(Throwable caught) { Window.alert("Could not fetch image from infrastructure " + caught.getCause()); + } - }); + }); } /** @@ -316,36 +319,6 @@ public class ClientImage extends Composite { return new Image(); return currImage; } -// -// /** -// * return a URL which is lookable for on the web -// * @param imageName . -// * @param templateName . -// * @return . -// */ -// public String getImageURL(String imageName, String templateName) { -// currentUser = presenter.getCurrentUser().getUsername(); -// currentScope = presenter.getCurrentScope(); -// /** -// * Images will be stored under webapps/usersArea... -// * GWT.getModuleBaseURL() returns * e.g. http://dlib28.isti.cnr.it/templatecreator/html/ -// * need to get just http://dlib28.isti.cnr.it/ -// */ -// //remove "/html/" and get e.g. http://dlib28.isti.cnr.it/templatecreator -// String host = GWT.getModuleBaseURL().substring(0, GWT.getModuleBaseURL().length()-6); -// -// //loog for last slash -// int lastSlash = host.lastIndexOf("/"); -// -// //get what i need : e.g. http://dlib28.isti.cnr.it/ or host = "http://localhost:8080/"; -// host = host.substring(0, lastSlash +1 ); -// //host = "http://localhost:8080/"; -// -// String imgURL = host + "usersArea/" + currentScope + "/templates/" -// + currentUser + "/CURRENT_OPEN/images/" + imageName; -// -// return imgURL; -// } /** * @@ -376,7 +349,7 @@ public class ClientImage extends Composite { return expectedContent; } - + public BasicComponent getBasicComponent() { return basicComponent; } diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DropTSListener.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DropTSListener.java deleted file mode 100644 index 90ffd44..0000000 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DropTSListener.java +++ /dev/null @@ -1,115 +0,0 @@ -/** - * - */ -package org.gcube.portlets.user.reportgenerator.client.targets; - - - - -import java.util.List; - -import org.gcube.portlets.user.workspace.client.interfaces.GXTFolderItemTypeEnum; -import org.gcube.portlets.user.workspace.client.model.FileModel; - -import com.extjs.gxt.ui.client.dnd.DND.Operation; -import com.extjs.gxt.ui.client.dnd.DropTarget; -import com.extjs.gxt.ui.client.dnd.Insert; -import com.extjs.gxt.ui.client.event.DNDEvent; -import com.extjs.gxt.ui.client.store.TreeStoreModel; -import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; -import com.google.gwt.core.client.GWT; - -/** - * @author Federico De Faveri defaveri@isti.cnr.it - * - */ -public class DropTSListener extends DropTarget { - /** - * - */ - public static final String NO_DROP = "x-dd-drop-nodrop"; - /** - * - */ - public static final String OK_DROP = "x-dd-drop-ok"; - /** - * - */ - public static final String OK_DROP_ADD = "x-dd-drop-ok-add"; - - protected TSArea panel; - - /** - * - * @param panel . - * @param config . - */ - public DropTSListener(TSArea panel) { - super(panel); - this.panel = panel; - //IMPORTANT - setOperation(Operation.COPY); - } - - @Override - protected void showFeedback(DNDEvent event) { - if (!isValidDropTarget(event)) { - Insert.get().hide(); - event.getStatus().setStatus(false); - return; - } - super.showFeedback(event); - } - - - @SuppressWarnings("unchecked") - private boolean isValidDropTarget(DNDEvent event) { - GWT.log("isValidDropTarget"); - TreePanel source = (TreePanel) event.getDragSource().getComponent(); - List selection = source.getSelectionModel().getSelection(); - - for (FileModel model : selection) { - GWT.log("selection: " + model.getGXTFolderItemType()); - if(model.getGXTFolderItemType()!=null){ - if (model.getGXTFolderItemType().equals(GXTFolderItemTypeEnum.TIME_SERIES)) - return true; - } - } - return false; - } - - /** - * @param source . - * @param e . - * @param data . - * @return . - */ - protected void onDragDrop(DNDEvent event) { - - super.onDragDrop(event); - - if(event.getData() != null){ - List listItemsSource = event.getData(); - GWT.log("Number of move " + listItemsSource.size()); - - FileModel sourceFileModel = null; //for print - - for(TreeStoreModel itemSource : listItemsSource){ - - sourceFileModel = (FileModel) itemSource.getModel(); - - if(sourceFileModel.getParentFileModel()!=null) - GWT.log("Source Name " + sourceFileModel.getName() + " id " + sourceFileModel.getIdentifier() + " end drag " + " Parent Name: " + sourceFileModel.getParentFileModel().getName() + "id " + sourceFileModel.getParentFileModel().getIdentifier()); - else - GWT.log("Source Name " + sourceFileModel.getName() + " id " + sourceFileModel.getIdentifier() + " end drag "); - - GWT.log("Child count: " + itemSource.getChildCount()); - - panel.fetchTS(sourceFileModel.getIdentifier(), false , true); - - } - } - - } - -} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/TSArea.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/TSArea.java deleted file mode 100644 index f39d433..0000000 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/TSArea.java +++ /dev/null @@ -1,312 +0,0 @@ -package org.gcube.portlets.user.reportgenerator.client.targets; - -import java.util.LinkedList; -import java.util.List; - -import org.gcube.portlets.d4sreporting.common.shared.TimeSeriesFilter; -import org.gcube.portlets.d4sreporting.common.shared.TimeSeriesinfo; -import org.gcube.portlets.d4sreporting.common.shared.Table; -import org.gcube.portlets.d4sreporting.common.shared.RepTimeSeries; -import org.gcube.portlets.user.reportgenerator.client.ReportGenerator; -import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; -import org.gcube.portlets.user.reportgenerator.client.dialog.TimeSeriesDialog; -import org.gcube.portlets.user.reportgenerator.client.dialog.TimeSeriesFilterDialog; -import org.gcube.portlets.user.reportgenerator.client.dialog.TimeSeriesSampleDialog; -import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem; -import org.gcube.portlets.user.workspace.client.workspace.folder.item.GWTTimeSeries; - -import com.extjs.gxt.ui.client.widget.Composite; -import com.extjs.gxt.ui.client.widget.VerticalPanel; -import com.google.gwt.core.client.GWT; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.FlexTable; -import com.google.gwt.user.client.ui.Grid; -import com.google.gwt.user.client.ui.HTML; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Label; - - - -/** - * TSArea class is a Widget you can drop a Workspace Time Series on - * - * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it - * @version July 2011 (3.0) - */ -public class TSArea extends Composite { - - private VerticalPanel mainPanel; - private RepTimeSeries sts = new RepTimeSeries(); - private String idInBasket; - private Presenter presenter; - private FlexTable flexTable; - private TSArea singleton; - - VerticalPanel tableContainer = new VerticalPanel(); - Grid metadata = new Grid(3, 2); - - Label label; - /** - * @param presenter . - * @param width . - * @param height . - * @param sts the time series - */ - public TSArea(Presenter presenter, int width, int height, RepTimeSeries sts) { - singleton = this; - this.presenter = presenter; - mainPanel = new VerticalPanel(); - //setElement(mainPanel.getElement()); - - mainPanel.setStyleName("timeseriesArea"); - mainPanel.addStyleName("timeseriesArea_bg"); - mainPanel.setWidth(width); - mainPanel.setHeight(height); - - mainPanel.add(new HTML(" ", true)); - this.sts = sts; - if (sts != null) { - if (sts.getTsMetadata() != null) { - showTS(sts.getTsMetadata()); - } - } - initComponent(mainPanel); - mainPanel.layout(true); - } - - - /** - * called when dropped a TS on the area - * @param toShow the TS to show - */ - public void showTS(TimeSeriesinfo toShow) { - mainPanel.removeAll(); - mainPanel.removeStyleName("timeseriesArea_bg"); - tableContainer.removeAll(); - - metadata.setWidget(0, 0, new HTML("TS name:", true)); - metadata.setWidget(0, 1, new HTML(toShow.getTitle())); - metadata.setWidget(1, 0, new HTML("Creation Date: ", true)); - metadata.setWidget(1, 1, new HTML(toShow.getTimeSeriesCreationDate())); - metadata.setWidget(2, 0, new HTML("Total rows:", true)); - metadata.setWidget(2, 1, new HTML(""+toShow.getDimension())); - - - List headers = toShow.getHeaderLabels(); - flexTable = new FlexTable(); - - int n = (headers.size() > 10) ? 10 : headers.size(); - - for (int i = 0; i < n ; i++) { - flexTable.getCellFormatter().setStyleName(0, i, "timeSeries_header"); - flexTable.setWidget(0, i, new HTML(headers.get(i))); - flexTable.setWidget(1, i, new HTML("..")); - flexTable.getCellFormatter().setStyleName(1, i, "timeSeries_td"); - } - if (headers.size() > 10) { - flexTable.setWidget(0, 11, new HTML(" more ..")); - flexTable.setWidget(1, 11, new HTML("..")); - flexTable.getCellFormatter().setStyleName(0, 11, "timeSeries_header"); - flexTable.getCellFormatter().setStyleName(1, 11, "timeSeries_td"); - } - - tableContainer.add(flexTable); - - mainPanel.add(metadata); - mainPanel.add(tableContainer); - - Button moreDetails = new Button("View Timeseries Metadata"); - Button filter = new Button("Filter Table"); - Button showSample = new Button("Show Sample"); - - HorizontalPanel buttonsPanel = new HorizontalPanel(); - buttonsPanel.setSpacing(5); - buttonsPanel.add(moreDetails); - buttonsPanel.add(filter); - buttonsPanel.add(showSample); - - mainPanel.add(buttonsPanel); - - moreDetails.addClickHandler(viewMetadataTS); - showSample.addClickHandler(showTSSample); - filter.addClickHandler(applyFilterTs); - - mainPanel.layout(true); - } - - ClickHandler viewMetadataTS = new ClickHandler() { - public void onClick(ClickEvent event) { - TimeSeriesDialog dlg = new TimeSeriesDialog(sts.getTsMetadata()); - dlg.setAnimationEnabled(true); - dlg.show(); - } - - }; - - ClickHandler applyFilterTs = new ClickHandler() { - - public void onClick(ClickEvent event) { - TimeSeriesFilterDialog dlg = new TimeSeriesFilterDialog(singleton, sts); - //dlg.setPopupPosition(sender.getAbsoluteLeft(), sender.getAbsoluteTop()); - dlg.setAnimationEnabled(true); - dlg.show(); - } - - }; - - ClickHandler showTSSample = new ClickHandler() { - public void onClick(ClickEvent event) { - presenter.getModel().getModelService().getSampleTimeSeries(sts, new AsyncCallback() { - public void onFailure(Throwable caught) { Window.alert("There were Problem contacting Server, please try later");} - - public void onSuccess(Table result) { - Table toPass = result; - TimeSeriesSampleDialog dlg = new TimeSeriesSampleDialog(toPass); - dlg.setAnimationEnabled(true); - dlg.show(); - } - }); - } - }; - /** - * - * @param droppedTS the dropped timeseries - */ - public void dropTS(GWTTimeSeries droppedTS) { - idInBasket = droppedTS.getId(); - TimeSeriesinfo tsMetadata = convertWSTS2SerialazableTS(droppedTS); - sts = new RepTimeSeries(null, tsMetadata); - GWT.log("showTS TS"); - showTS(tsMetadata); - } - - public void fetchTS(String identifier, boolean isInteralImage, boolean fullDetails) { - GWT.log("FETCH TS"); - this.mask("fetching TimeSeries, pleas wait", "loading-indicator"); - - ReportGenerator.get().getWSTreeService().getTimeSeriesById(identifier, new AsyncCallback() { - public void onSuccess(GWTWorkspaceItem result) { - unmask(); - GWTTimeSeries ts = (GWTTimeSeries) result; - dropTS(ts); - } - public void onFailure(Throwable caught) { - unmask(); - Window.alert("Could not fetch Time Series from infrastructure " + caught.getCause()); - } - }); - } - - /** - * converts the WorkSpace TS Object into a Report TS Object - * @param md the TS metadata to convert - * @return - */ - private TimeSeriesinfo convertWSTS2SerialazableTS(GWTTimeSeries md) { - TimeSeriesinfo tsMetadata = new TimeSeriesinfo(md.getId(), md.getName(), md.getDescription(), md.getOwner(), - md.getCreationTime(), md.getLastModificationTime(), md.getTimeSeriesId(), md.getTitle(), md.getCreator(), - md.getTimeSeriesDescription(), md.getTimeSeriesCreationDate(), - md.getPublisher(), md.getSourceId(), md.getSourceName(), md.getRights(), md.getDimension(), md.getHeaderLabels()); - - return tsMetadata; - } - - /** - * refresh the headers once the TS has been filtered - */ - public void refreshHeaders() { - tableContainer.removeAll(); - flexTable = new FlexTable(); - - List filteredHeaders = new LinkedList(); - TimeSeriesFilter tf = sts.getFilter(); - - for (Integer colNo : tf.getColsNumberToShow()) { - String toAdd = sts.getTsMetadata().getHeaderLabels().get(colNo); - filteredHeaders.add(toAdd); - } - - - int n = (filteredHeaders.size() > 10) ? 10 : filteredHeaders.size(); - - for (int i = 0; i < n ; i++) { - flexTable.getCellFormatter().setStyleName(0, i, "timeSeries_header"); - flexTable.setWidget(0, i, new HTML(filteredHeaders.get(i))); - flexTable.setWidget(1, i, new HTML("..")); - flexTable.getCellFormatter().setStyleName(1, i, "timeSeries_td"); - } - if (filteredHeaders.size() > 10) { - flexTable.setWidget(0, 11, new HTML(" more ..")); - flexTable.setWidget(1, 11, new HTML("..")); - flexTable.getCellFormatter().setStyleName(0, 11, "timeSeries_header"); - flexTable.getCellFormatter().setStyleName(1, 11, "timeSeries_td"); - } - - tableContainer.add(flexTable); - Grid newGrid = new Grid(1, 2); - newGrid.setWidget(0, 0, new HTML("Selected Interval: ", true)); - newGrid.setWidget(0, 1, new HTML(tf.getFrom() + " - " + tf.getTo() )); - tableContainer.add(newGrid); - - } - /** - * - * @return the possible content - */ - public Label getLabel() { - return label; - } - - /** - * - * @param label set the label - */ - public void setLabel(Label label) { - this.label = label; - } - - - /** - * - * @return . - */ - public String getIdInBasket() { - return idInBasket; - } - - /** - * - * @param idInBasket . - */ - public void setIdInBasket(String idInBasket) { - this.idInBasket = idInBasket; - } - - /** - * - * @return . - */ - public RepTimeSeries getSts() { - return sts; - } - - /** - * - * @param sts . - */ - public void setSts(RepTimeSeries sts) { - this.sts = sts; - } - - /** - * - * @param tsf the new ts filter - */ - public void setNewFilter(TimeSeriesFilter tsf) { - this.sts.setFilter(tsf); - } -} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/OpenOptions.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/OpenOptions.java index 9c5fda8..92bf4de 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/OpenOptions.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/OpenOptions.java @@ -67,7 +67,7 @@ public class OpenOptions extends Composite { cmd.openTemplate.execute(); break; case UPLOAD: - p.showUploadFilePopup(); + p.showUploadFilePopup(null); //TODO: fix this break; default: break; diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/DownloadImageServlet.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/DownloadImageServlet.java new file mode 100644 index 0000000..1cfc3bd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/DownloadImageServlet.java @@ -0,0 +1,120 @@ +package org.gcube.portlets.user.reportgenerator.server.servlet; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.StringReader; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.commons.io.IOUtils; +import org.apache.log4j.Logger; +import org.gcube.application.framework.core.session.SessionManager; +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.workspace.Workspace; +import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; +import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException; +import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalImage; +import org.gcube.common.homelibrary.util.MimeTypeUtil; +import org.gcube.common.portal.PortalContext; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; + +/** + * Servlet implementation class DownloadImageServlet + */ +public class DownloadImageServlet extends HttpServlet { + protected static Logger _log = Logger.getLogger(DownloadImageServlet.class); + private static final long serialVersionUID = 1L; + + /** + * @see HttpServlet#HttpServlet() + */ + public DownloadImageServlet() { + super(); + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) + */ + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String itemId = req.getParameter("id"); + if(itemId==null || itemId.isEmpty()){ + sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Item id is null"); + return; + } + Workspace wa; + WorkspaceItem item; + try{ + wa = getWorkspaceArea(req.getSession()); + item = wa.getItem(itemId); + ExternalImage externalImage = (ExternalImage) item; + + String mimeType = externalImage.getMimeType(); + String itemName = MimeTypeUtil.getNameWithExtension(item.getName(), mimeType); + + resp.setHeader( "Content-Disposition", "inline; filename=\"" + itemName + "\"" ); + resp.setContentType(externalImage.getMimeType()); + + resp.setContentLength((int) externalImage.getLength()); + + OutputStream out = resp.getOutputStream(); + InputStream is = externalImage.getData(); + + IOUtils.copy(is, out); + is.close(); + + out.close(); + return; + } catch (Exception e) { + _log.error("Error during item retrieving "+itemId,e); + sendError(resp,HttpServletResponse.SC_INTERNAL_SERVER_ERROR +": Error during image retrieving: "+e.getMessage()); + return; + } + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } + + /** + * + * @return + * @throws WorkspaceFolderNotFoundException + * @throws InternalErrorException + * @throws HomeNotFoundException + */ + protected Workspace getWorkspaceArea(HttpSession session) throws WorkspaceFolderNotFoundException, InternalErrorException, HomeNotFoundException { + String user = (String) session.getAttribute(ScopeHelper.USERNAME_ATTRIBUTE); + String currScope = ScopeProvider.instance.get(); + if (currScope == null) { + String scope2Set = "/"+PortalContext.getConfiguration().getInfrastructureName(); + ScopeProvider.instance.set(scope2Set); + _log.warn("Found scope null, setting infrastructure scope="+scope2Set); + } + if (user == null) { + user = ReportServiceImpl.getDevUser(); + ScopeProvider.instance.set(ReportServiceImpl.TEST_SCOPE); + _log.warn("User is null in session, setting dev user = " + user); + } + Workspace toReturn = HomeLibrary.getUserWorkspace(user); + + return toReturn; + } + + + protected void sendError(HttpServletResponse response, String resultMessage) throws IOException { + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + _log.trace("error message: "+resultMessage); + _log.trace("writing response..."); + StringReader sr = new StringReader(resultMessage); + IOUtils.copy(sr, response.getOutputStream()); + _log.trace("response wrote"); + response.flushBuffer(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ReportServiceImpl.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ReportServiceImpl.java index abb425c..08b35b0 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ReportServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ReportServiceImpl.java @@ -30,6 +30,11 @@ import net.sf.csv4j.ParseException; import net.sf.csv4j.ProcessingException; import org.apache.commons.io.IOUtils; +import org.apache.tika.config.TikaConfig; +import org.apache.tika.detect.Detector; +import org.apache.tika.io.TikaInputStream; +import org.apache.tika.metadata.Metadata; +import org.apache.tika.mime.MediaType; import org.gcube.application.framework.accesslogger.library.impl.AccessLogger; import org.gcube.application.framework.core.session.ASLSession; import org.gcube.application.framework.core.session.SessionManager; @@ -85,6 +90,7 @@ import org.gcube.portlets.user.reportgenerator.server.servlet.loggers.CreateRepo import org.gcube.portlets.user.reportgenerator.server.servlet.loggers.OpenReportLogEntry; import org.gcube.portlets.user.reportgenerator.server.servlet.loggers.OpenWorkflowLogEntry; import org.gcube.portlets.user.reportgenerator.server.servlet.loggers.SaveWorkflowLogEntry; +import org.gcube.portlets.user.reportgenerator.shared.ReportImage; import org.gcube.portlets.user.reportgenerator.shared.SessionInfo; import org.gcube.portlets.user.reportgenerator.shared.UserBean; import org.gcube.portlets.user.reportgenerator.shared.VMEReportBean; @@ -107,6 +113,7 @@ import com.liferay.portlet.documentlibrary.model.DLFileEntry; + /** * * class implementing services @@ -122,9 +129,9 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe private boolean withinPortal = true; //private static final String TEST_SCOPE = "/gcube/devsec/devVRE"; - private static final String TEST_SCOPE = "/gcube/devNext/NextNext"; - + public static final String TEST_SCOPE = "/gcube/devNext/NextNext"; + protected static final String IMAGE_SERVICE_URL = "reports/DownloadService"; /** * */ @@ -141,6 +148,8 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe * */ public static final String RSG_WS_ADDRESS = "RSG_WS_ADDRESS"; + + private static final String REPORT_IMAGES_FOLDER = "Report Images"; /** @@ -169,7 +178,7 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe String user = (String) this.getThreadLocalRequest().getSession().getAttribute(ScopeHelper.USERNAME_ATTRIBUTE); if (user == null) { - user = "massimiliano.assante"; + user = getDevUser(); this.getThreadLocalRequest().getSession().setAttribute(ScopeHelper.USERNAME_ATTRIBUTE, user); SessionManager.getInstance().getASLSession(sessionID, user).setScope(TEST_SCOPE); String email = user+"@isti.cnr.it"; @@ -187,6 +196,9 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe return SessionManager.getInstance().getASLSession(sessionID, user); } + public static String getDevUser() { + return "massimiliano.assante"; + } /** * Retrieve the user saved template names * @@ -380,12 +392,16 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe AccessLogger log = AccessLogger.getAccessLogger(); OpenReportLogEntry logEntry = new OpenReportLogEntry(toReturn.getTemplateName(), templateObjectID); log.logEntry(getASLSession().getUsername(), getASLSession().getScopeName(), logEntry); - + if (! isTemplate) { - ModelReader reader = new ModelReader(toReturn); - System.out.println(reader); + try { + ModelReader reader = new ModelReader(toReturn); + System.out.println(reader); + } catch (Exception e) { + _log.warn("ModelReader fails to read this report, continue..."); + } } - + return toReturn; } } @@ -396,8 +412,96 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe return new Model(); } + + + /** + * used when an image is uploaded + */ + @Override + public ReportImage getUploadedImageUrlById(String fileName, String absolutePathOnServer) { + if (absolutePathOnServer == null) + return null; + try { + _log.trace("trying read: "+absolutePathOnServer); + WorkspaceFolder imagesFolder = getImagesFolder(); + // Read from an input stream + InputStream imageData = new BufferedInputStream(new FileInputStream(absolutePathOnServer)); + ExternalImage image = imagesFolder.createExternalImageItem(fileName, "automatically uploaded by Reports Manager", getMimeType(imageData, fileName), imageData); + _log.trace("Created external image with name " + image.getName()); + return new ReportImage(image.getId(), buildImageServiceUrl(image.getId()), image.getWidth(), image.getHeight()); + } catch (Exception e) { + _log.error("Error in server get image by id", e); + e.printStackTrace(); + } + return null; + } + private WorkspaceFolder getImagesFolder() { + Workspace ws = null; + WorkspaceFolder reportFolder = null; + try { + ws = getWorkspaceArea(); + if (! ws.getRoot().exists(REPORT_IMAGES_FOLDER)) { + reportFolder = ws.getRoot().createFolder(REPORT_IMAGES_FOLDER, "This folder hosts the images uploaded by the Reports Manager"); + } else { + reportFolder = (WorkspaceFolder) ws.getRoot().find(REPORT_IMAGES_FOLDER); + } + + } catch (Exception e) { + e.printStackTrace(); + } + return reportFolder; + } + /** + * + * @param is + * @return + * @throws IOException + * @throws MagicParseException + * @throws MagicMatchNotFoundException + * @throws MagicException + */ + protected static String getMimeType(InputStream is, String filenameWithExtension) throws IOException { + TikaConfig config = TikaConfig.getDefaultConfig(); + Detector detector = config.getDetector(); + TikaInputStream stream = TikaInputStream.get(is); + Metadata metadata = new Metadata(); + metadata.add(Metadata.RESOURCE_NAME_KEY, filenameWithExtension); + MediaType mediaType = detector.detect(stream, metadata); + return mediaType.getBaseType().toString(); + } + /** + * used to actually display images in reports (when reading reports) + */ + @Override + public ReportImage getImageUrlById(String identifier) { + if (identifier == null) + return null; + try { + Workspace workspace = getWorkspaceArea(); + _log.trace("get image URL by id: "+identifier); + + WorkspaceItem item = workspace.getItem(identifier); //get item from workspace + + //ACCOUNTING READ + item.markAsRead(true); + + _log.trace("item name " + item.getName()); + ExternalImage image = (ExternalImage) item; //Cast External Document + return new ReportImage(image.getId(), buildImageServiceUrl(image.getId()), image.getWidth(), image.getHeight()); + + } catch (Exception e) { + _log.error("Error in server get image by id", e); + e.printStackTrace(); + } + return null; + } + protected String buildImageServiceUrl(String id) { + StringBuilder sb = new StringBuilder(); + sb.append(IMAGE_SERVICE_URL).append("?id=").append(id).append("&type=IMAGE"); + return sb.toString(); + } /** @@ -836,9 +940,14 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe ServiceUtil myUtil = new ServiceUtil(getASLSession()); boolean result = myUtil.writeModel(model, "CURRENT_OPEN", getVreName(), getUsername()); - ModelReader reader = new ModelReader(model); - System.out.println(reader); + try { + ModelReader reader = new ModelReader(model); + System.out.println(reader); + } catch (Exception e) { + _log.warn("ModelReader fails to read this report, continue..."); + } + if (!result) { _log.debug("Could not save report, serializing failed"); } @@ -1652,11 +1761,11 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe return new VmeExportResponse(new VmeResponseEntry("RUNTIME_EXCEPTION", "Sorry, there was an error on the Server, please try again in few minutes or report an Issue.")); } } - + @Override public VmeExportResponse deleteReportFromRSG(VMETypeIdentifier refType, String idToDelete) { RsgService rsgClient = new RsgClient(getRSGWSAddress()); - + try { Response res = null; if (refType == VMETypeIdentifier.Vme) { @@ -1673,7 +1782,7 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe return new VmeExportResponse(new VmeResponseEntry("RUNTIME_EXCEPTION", "Sorry, there was an error on the Server, we could not delete. Please try again in few minutes or report an Issue.")); } } - + /** * this method look for a ReportsStoreGateway WS available in the infrastructure * @return true if an instance of the ReportsStoreGateway is available in the infrastructure @@ -1717,7 +1826,7 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe return toReturn; } - + } diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/shared/ReportImage.java b/src/main/java/org/gcube/portlets/user/reportgenerator/shared/ReportImage.java new file mode 100644 index 0000000..43cc0a8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/shared/ReportImage.java @@ -0,0 +1,46 @@ +package org.gcube.portlets.user.reportgenerator.shared; + +import java.io.Serializable; + +@SuppressWarnings("serial") +public class ReportImage implements Serializable { + private String id; + private String url; + private int width; + private int height; + public ReportImage() { + super(); + } + public ReportImage(String id, String url, int width, int height) { + super(); + this.id = id; + this.url = url; + this.width = width; + this.height = height; + } + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getUrl() { + return url; + } + public void setUrl(String url) { + this.url = url; + } + public int getWidth() { + return width; + } + public void setWidth(int width) { + this.width = width; + } + public int getHeight() { + return height; + } + public void setHeight(int height) { + this.height = height; + } + +} diff --git a/src/main/resources/org/gcube/portlets/user/reportgenerator/ReportGenerator.gwt.xml b/src/main/resources/org/gcube/portlets/user/reportgenerator/ReportGenerator.gwt.xml index 723f96b..68e5e93 100644 --- a/src/main/resources/org/gcube/portlets/user/reportgenerator/ReportGenerator.gwt.xml +++ b/src/main/resources/org/gcube/portlets/user/reportgenerator/ReportGenerator.gwt.xml @@ -4,14 +4,14 @@ - - + + - + - + ReportGenerator-portlet @@ -36,6 +33,39 @@ + + uploadprogress + org.gcube.portlets.widgets.fileupload.server.UploadProgressServlet + + + + uploadprogress + /reports/uploadprogress + + + + DownloadService + org.gcube.portlets.user.reportgenerator.server.servlet.DownloadImageServlet + + + + DownloadService + /reports/DownloadService + + + + + upload + org.gcube.portlets.widgets.fileupload.server.UploadServlet + + + + upload + /FileUpload/upload + + + + remoteLoggerServiceImpl @@ -47,55 +77,6 @@ /reports/gwt-log - - - WorkspaceService - org.gcube.portlets.user.workspace.server.GWTWorkspaceServiceImpl - - - - WorkspaceService - /reports/WorkspaceService - - - - UploadService - org.gcube.portlets.user.workspace.server.UploadServlet - - - - UploadService - /reports/UploadService - - - - localUploadServlet - org.gcube.portlets.user.workspace.server.LocalUploadServlet - - - localUploadServlet - /reports/LocalUploadService - - - - DownloadService - org.gcube.portlets.user.workspace.server.DownloadServlet - - - - DownloadService - /reports/DownloadService - - - - ImageService - org.gcube.portlets.user.workspace.server.ImageServlet - - - - ImageService - /reports/ImageService - @@ -127,23 +108,7 @@ /reports/downloadEncryptedReport - - DownloadService - /org.gcube.portlets.user.reportgenerator.ReportGeneratorJUnit/DownloadService - - - WorkspaceService - /org.gcube.portlets.user.reportgenerator.ReportGeneratorJUnit/WorkspaceService - - - ImageService - /org.gcube.portlets.user.reportgenerator.ReportGeneratorJUnit/ImageService - - - UploadService - /org.gcube.portlets.user.reportgenerator.ReportGeneratorJUnit/UploadService - ReportGenerator.html