From beffd6707601d2d43ec2ef50f564fa8fd27b1ad5 Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Mon, 6 May 2013 15:38:24 +0000 Subject: [PATCH] added saving with loading git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/reports@74581 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../client/Presenter/Presenter.java | 136 ++++++++++++------ .../reportgenerator/client/ReportService.java | 6 +- .../client/ReportServiceAsync.java | 16 +-- .../client/dialog/SavingDialog.java | 13 ++ .../client/model/TemplateComponent.java | 5 +- .../client/model/TemplateModel.java | 88 +++--------- .../client/uibinder/ShowSaving.java | 27 ++++ .../client/uibinder/ShowSaving.ui.xml | 13 ++ .../server/servlet/ReportServiceImpl.java | 108 ++------------ src/main/webapp/images/reports-saving.gif | Bin 0 -> 17090 bytes 10 files changed, 190 insertions(+), 222 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/SavingDialog.java create mode 100644 src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/ShowSaving.java create mode 100644 src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/ShowSaving.ui.xml create mode 100644 src/main/webapp/images/reports-saving.gif 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 7720fff..9d62a0a 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 @@ -23,6 +23,7 @@ import org.gcube.portlets.user.reportgenerator.client.WorkspacePanel; import org.gcube.portlets.user.reportgenerator.client.dialog.AddBiblioEntryDialog; import org.gcube.portlets.user.reportgenerator.client.dialog.DeleteCitationsDialog; import org.gcube.portlets.user.reportgenerator.client.dialog.ReportStructureDialog; +import org.gcube.portlets.user.reportgenerator.client.dialog.SavingDialog; import org.gcube.portlets.user.reportgenerator.client.events.AddBiblioEvent; import org.gcube.portlets.user.reportgenerator.client.events.AddBiblioEventHandler; import org.gcube.portlets.user.reportgenerator.client.events.AddCommentEvent; @@ -89,9 +90,11 @@ public class Presenter { private ToolboxPanel toolBoxPanel; private TitleBar titleBar; - + private HorizontalPanel exportsPanel; + private final SavingDialog dlg = new SavingDialog(); + private UserBean currentUser; private String currentScope; /** @@ -99,6 +102,8 @@ public class Presenter { */ private TemplateModel model; + private String location; + private int currFocus; RichTextToolbar currentSelectedToolbar; @@ -122,14 +127,14 @@ public class Presenter { private void handleEvents() { - + eventBus.addHandler(ExportingCompletedEvent.TYPE, new ExportingCompletedEventHandler() { @Override public void onExportFinished(ExportingCompletedEvent event) { showExportSaveOptions(event.getFilePath(), event.getItemName(), event.getType()); } }); - + eventBus.addHandler(AddBiblioEvent.TYPE, new AddBiblioEventHandler() { public void onAddCitation(AddBiblioEvent event) { addCitation(event.getCitekey(), event.getCitetext()); @@ -148,10 +153,10 @@ public class Presenter { }); eventBus.addHandler(ReportExporterEvent.TYPE, new ReportExporterEventHandler() { - + @Override public void onCompletedExport(ReportExporterEvent event) { - + switch (event.getOperationResult()) { case SAVED: refreshWorkspace(); @@ -163,7 +168,7 @@ public class Presenter { default: break; } - + } }); @@ -179,14 +184,14 @@ public class Presenter { } }); -// eventBus.addHandler(ImportFinishedEvent.TYPE, new ImportFinishedEventHandler(){ -// public void onFinishedImport(ImportFinishedEvent event) { -// importDlg.hide(); -// openImportedFimesXML(event.getPathFile()); -// } -// -// }); - + // eventBus.addHandler(ImportFinishedEvent.TYPE, new ImportFinishedEventHandler(){ + // public void onFinishedImport(ImportFinishedEvent event) { + // importDlg.hide(); + // openImportedFimesXML(event.getPathFile()); + // } + // + // }); + eventBus.addHandler(ItemSelectionEvent.TYPE, new ItemSelectionEventHandler() { @SuppressWarnings("unchecked") public void onItemSelected(ItemSelectionEvent event) { @@ -204,7 +209,7 @@ public class Presenter { ReportGenerator.get().getScrollerPanel().setVerticalScrollPosition(top); } } - + } }); } @@ -256,15 +261,15 @@ public class Presenter { commonCommands = new CommonCommands(this); //importDlg = new FimesFileUploadWindow(eventBus); } - + public void showOpenOptions() { wp.showOpenOptions(); } - + public void showLoading() { wp.showLoading(); } - + /** * load the template to edit in the MODEL and in the VIEW * @param templateToOpen the name of the template to open without extension nor path @@ -322,7 +327,7 @@ public class Presenter { } return toReturn; } - + /** * look if a section with a specific metadata (that indicate sit is a biblio section) * exists in the current report model: @@ -470,7 +475,7 @@ public class Presenter { wp.getMainLayout().clear(); ReportGenerator.get().getScrollerPanel().setScrollPosition(0); } - + /** * Save the current report @@ -478,8 +483,21 @@ public class Presenter { * */ public void saveReport(String folderid, String name) { - model.storeInSession(); - model.saveReport(folderid, name); + dlg.center(); + dlg.show(); + Model toSave = model.getSerializableModel(); + reportService.saveReport(toSave, folderid, name, new AsyncCallback() { + public void onFailure(Throwable caught) { + dlg.hide(); + MessageBox.alert("Warning","Report Not Saved: " + caught.getMessage(), null); + } + public void onSuccess(Void result) { + dlg.hide(); + MessageBox.info("Saving Operation","Report Saved Successfully", null); + refreshWorkspace(); + } + }); + } @@ -488,8 +506,20 @@ public class Presenter { * */ public void saveReport() { - model.storeInSession(); - model.saveReport(); + dlg.center(); + dlg.show(); + Model toSave = model.getSerializableModel(); + reportService.saveReport(toSave, new AsyncCallback() { + public void onFailure(Throwable caught) { + dlg.hide(); + MessageBox.alert("Warning","Report Not Saved: " + caught.getMessage(), null); + } + public void onSuccess(Void result) { + dlg.hide(); + MessageBox.info("Saving Operation","Report Saved Successfully", null); + refreshWorkspace(); + } + }); } /** @@ -497,8 +527,20 @@ public class Presenter { * */ public void updateWorkflowDocument(boolean update) { - model.storeInSession(); - model.updateWorkflowDocument(update); + dlg.center(); + dlg.show(); + Model toSave = model.getSerializableModel(); + reportService.updateWorkflowDocument(toSave, update, new AsyncCallback() { + + public void onFailure(Throwable caught) { + dlg.hide(); + Window.alert("failed to update workflow document"); + } + public void onSuccess(Void result) { + dlg.hide(); + loadWorkflowLibraryApp(); + } + }); } /** @@ -510,7 +552,21 @@ public class Presenter { titleBar.setTemplateName(templateName); } - + /** + * Redirect to VRE Deployer Portlet + */ + private void loadWorkflowLibraryApp(){ + getUrl(); + location += "/../my-workflow-documents"; + Window.open(location, "_self", ""); + } + /** + * Get URL from browser + */ + public native void getUrl()/*-{ + this.@org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter::location = $wnd.location.href; + }-*/; + /** * @@ -643,7 +699,7 @@ public class Presenter { */ public void generateManifestation(final TemplateModel model, final ExportManifestationType type) { GWT.runAsync(ReportExporterPopup.class, new RunAsyncCallback() { - + @Override public void onSuccess() { ReportExporterPopup popup = new ReportExporterPopup(eventBus); @@ -663,15 +719,15 @@ public class Presenter { break; } } - + @Override public void onFailure(Throwable reason) { } }); - + } - - + + public void openAddCitationDialog() { AddBiblioEntryDialog dlg = new AddBiblioEntryDialog(eventBus); @@ -741,7 +797,7 @@ public class Presenter { titleBar.showPrevButton(); } - + /** * load the template to edit in the MODEL and in the VIEW * @param serializedpath the temp file to open @@ -789,7 +845,7 @@ public class Presenter { if (currPage > 1) titleBar.showPrevButton(); } - + /** * just clean the page */ @@ -848,7 +904,7 @@ public class Presenter { List pageElems = model.getSectionComponent(section); for (TemplateComponent component : pageElems) { - GWT.log("Reading component.. " + component.getType(), null); + //GWT.log("Reading component.. " + component.getType(), null); int uiX = component.getX(); int uiY= component.getY(); @@ -1125,7 +1181,7 @@ public class Presenter { public void onFailure(Throwable reason) { } }); - + } public HorizontalPanel getExportsPanel() { @@ -1136,7 +1192,7 @@ public class Presenter { public void setExportsPanel(HorizontalPanel exportsPanel) { this.exportsPanel = exportsPanel; } - + /** * when export is done this method is called * @param filePath @@ -1162,9 +1218,9 @@ public class Presenter { Window.alert("Error while trying exporting this report: " + caught.getMessage()); } }); - + } - + public void showExportPanel(final String filePath, final String itemName, final TypeExporter type, String tempFileId) { final ExportOptions exo = new ExportOptions(this, toolBoxPanel, filePath, itemName, type, reportService, tempFileId); exportsPanel.add(exo); @@ -1177,7 +1233,7 @@ public class Presenter { }; t.schedule(10); } - + public void clearExportPanel() { exportsPanel.clear(); } 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 af67937..264039b 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 @@ -63,16 +63,16 @@ public interface ReportService extends RemoteService{ * the report model is taken from the session * @param folderid the basket id where to save the report */ - void saveReport(String folderid, String newname); + void saveReport(Model toSave, String folderid, String newname); /** * the report model is taken from the session, the id also */ - void saveReport(); + void saveReport(Model toSave); Model getWorkflowDocumentFromDocumentLibrary(); - void updateWorkflowDocument(boolean update); + void updateWorkflowDocument(Model toSave, boolean update); void renewLock(); /** 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 45fa4ab..482a3e7 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 @@ -49,17 +49,10 @@ public interface ReportServiceAsync { */ void readTemplateFromSession( AsyncCallback callback); - /** - * @param callback . - * @param folderid . - */ - void saveReport(String folderid, String newname, AsyncCallback callback); + void saveReport(Model toSave, String folderid, String newname, + AsyncCallback callback); - /** - * - * @param callback . - */ - void saveReport(AsyncCallback callback); + void saveReport(Model toSave, AsyncCallback callback); /** * * @param currentHost @@ -68,7 +61,8 @@ public interface ReportServiceAsync { void getSessionInfo(String currentHost, AsyncCallback callback); void getWorkflowDocumentFromDocumentLibrary( AsyncCallback callback); - void updateWorkflowDocument(boolean update, AsyncCallback callback); + void updateWorkflowDocument(Model toSave, boolean update, + AsyncCallback callback); void renewLock(AsyncCallback callback); void readImportedModel(String tempPath, diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/SavingDialog.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/SavingDialog.java new file mode 100644 index 0000000..618ca0e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/SavingDialog.java @@ -0,0 +1,13 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + +import org.gcube.portlets.user.gcubewidgets.client.popup.GCubeDialog; +import org.gcube.portlets.user.reportgenerator.client.uibinder.ShowSaving; + +public class SavingDialog extends GCubeDialog { + + public SavingDialog() { + super(false, true); + setText("Updating report, please wait ..."); + setWidget(new ShowSaving()); + } +} 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 fa4afb3..946799e 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 @@ -332,10 +332,10 @@ public class TemplateComponent { this.content = spacer; break; case REPEAT_SEQUENCE: - GWT.log("FOUND SEQUENCE trying getGroup"); + //GWT.log("FOUND SEQUENCE trying getGroup"); RepeatableSequence repeatableSequence = (RepeatableSequence) sc.getPossibleContent(); - GWT.log("getGroup: " + repeatableSequence.toString()); + //GWT.log("getGroup: " + repeatableSequence.toString()); ClientRepeatableSequence rps = new ClientRepeatableSequence(presenter, repeatableSequence); this.content = rps; @@ -386,7 +386,6 @@ public class TemplateComponent { case DYNA_IMAGE: ClientImage da = (ClientImage) this.content; content = da.getDroppedImage().getElement().getAttribute("src"); - GWT.log("Poss Content=" + content); id = da.getIdInBasket(); idInBasket = id; if (((String) content).compareTo("") == 0) diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateModel.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateModel.java index b46776d..1b0532d 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateModel.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateModel.java @@ -354,11 +354,11 @@ public class TemplateModel { else { int insertIn = (isAdded) ? (i-1): i; newSections.put(""+i, sections.get(""+insertIn)); - GWT.log("Inserting " + insertIn + " into section " + i + " isAdded =" + (isAdded) , null); + //GWT.log("Inserting " + insertIn + " into section " + i + " isAdded =" + (isAdded) , null); } } this.sections = newSections; - GWT.log("NEW SECTION SIZE"+sections.size(), null); + //GWT.log("NEW SECTION SIZE"+sections.size(), null); } totalPages++; @@ -415,42 +415,21 @@ public class TemplateModel { return toReturn; } - - - - /** * * @param folderid . * @param name . */ - public void saveReport (String folderid, String name) { - modelService.saveReport(folderid, name, new AsyncCallback() { - public void onFailure(Throwable caught) { - MessageBox.alert("Warning","Report Not Saved: " + caught.getMessage(), null); - } - public void onSuccess(Void result) { - MessageBox.info("Saving Operation","Report Saved Successfully", null); - presenter.refreshWorkspace(); - } - }); - + public void saveReport (Model toSave, String folderid, String name) { + } /** * * */ - public void saveReport () { - modelService.saveReport(new AsyncCallback() { - public void onFailure(Throwable caught) { - MessageBox.alert("Warning","Report Not Saved: " + caught.getMessage(), null); - } - public void onSuccess(Void result) { - MessageBox.info("Saving Operation","Report Saved Successfully", null); - presenter.refreshWorkspace(); - } - }); + public void saveReport (Model toSave) { + } @@ -461,7 +440,7 @@ public class TemplateModel { * @param newHeight . */ public void resizeModelComponent(Widget toResize, int newWidth, int newHeight) { - GWT.log("LOOKING CORRESPONDANCE", null); + //GWT.log("LOOKING CORRESPONDANCE", null); String tcPage = ""+currentPage; TemplateSection singleSection = sections.get(tcPage); @@ -506,19 +485,21 @@ public class TemplateModel { } /** - * stores the current model in the session + * stores the current model in the session, not to be used anymore as images could have high payload */ + @Deprecated public void storeInSession() { - AsyncCallback callback = new AsyncCallback() { - public void onFailure(Throwable caught) { } - public void onSuccess(Object result) { } - }; - - Model modelToSend = getSerializableModel(); - - GWT.log("Storing in session: currpage = " + modelToSend.getCurrPage(), null); - - modelService.storeTemplateInSession(modelToSend, callback); +// Model modelToSend = getSerializableModel(); +// +// GWT.log("Storing in session: currpage = " + modelToSend.getCurrPage(), null); +// +// modelService.storeTemplateInSession(modelToSend, new AsyncCallback() { +// @Override +// public void onFailure(Throwable caught) { } +// @Override +// public void onSuccess(Void result) { +// } +// }); } //****** GETTERS n SETTERS @@ -675,34 +656,11 @@ public class TemplateModel { return false; } - public void updateWorkflowDocument(boolean update) { - modelService.updateWorkflowDocument(update, new AsyncCallback() { - - public void onFailure(Throwable caught) { - Window.alert("failed to update workflow document"); - - } - public void onSuccess(Void result) { - loadWorkflowLibraryApp(); - } - }); + public void updateWorkflowDocument(Model toSave, boolean update) { + } - private String location; - /** - * Redirect to VRE Deployer Portlet - */ - private void loadWorkflowLibraryApp(){ - getUrl(); - location += "/../my-workflow-documents"; - Window.open(location, "_self", ""); - } - /** - * Get URL from browser - */ - public native void getUrl()/*-{ - this.@org.gcube.portlets.user.reportgenerator.client.model.TemplateModel::location = $wnd.location.href; - }-*/; + } diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/ShowSaving.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/ShowSaving.java new file mode 100644 index 0000000..ff80ea9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/ShowSaving.java @@ -0,0 +1,27 @@ +package org.gcube.portlets.user.reportgenerator.client.uibinder; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.Widget; + +public class ShowSaving extends Composite { + public static final String LOADING = GWT.getModuleBaseURL() + "../images/reports-saving.gif"; + + private static ShowoadingUiBinder uiBinder = GWT + .create(ShowoadingUiBinder.class); + + interface ShowoadingUiBinder extends UiBinder { + } + + @UiField Image loadingReport; + + public ShowSaving() { + initWidget(uiBinder.createAndBindUi(this)); + loadingReport.setUrl(LOADING); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/ShowSaving.ui.xml b/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/ShowSaving.ui.xml new file mode 100644 index 0000000..de5360a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/ShowSaving.ui.xml @@ -0,0 +1,13 @@ + + + + + + + +
+ +
+
+
\ No newline at end of file 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 22da619..dc12c85 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 @@ -704,6 +704,7 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe public void storeTemplateInSession(Model model) { ASLSession d4Session = getASLSession(); d4Session.setAttribute(CURRENT_REPORT_INSTANCE, model); + _log.trace("Saved in Session"); } @@ -785,98 +786,6 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe } } - /** - * - * @param imageName the generated image name - * @param templateName the curr template name - * @return the url to the image - */ - private String getImageURL(String imageName, String templateName) { - StringBuilder sb = new StringBuilder("/usersArea/") - .append( getVreName()) - .append("/templates/") - .append(getUsername()) - .append("/CURRENT_OPEN/images/") - .append(imageName); - _log.info("getImageURL" + sb.toString()); - return sb.toString(); - - } - /** - * - * @param imageIDinBasket . - * @param pathToFile the directory where to save the file - * @param filename the filename to give to the newly created file - * @return the file imagename with its extension - */ - private String copyImageFromBasket(String imageIDinBasket, String pathToFile, String filename) { - - Workspace root = null; - try { - root = getWorkspaceArea(); - } catch (WorkspaceFolderNotFoundException e) {e.printStackTrace(); - } catch (InternalErrorException e) { e.printStackTrace(); - } catch (HomeNotFoundException e) { e.printStackTrace(); - } - - WorkspaceItem item = null; - try { - item = root.getItem(imageIDinBasket); - } catch (ItemNotFoundException e) { - e.printStackTrace(); - } - - _log.debug("pathToFile: " + pathToFile); - File f = null; - String toReturn =""; - if (item.getType() == WorkspaceItemType.FOLDER_ITEM) { - _log.debug("\nItem is a BASKET_ITEM"); - FolderItem bi = (FolderItem) item; - try { - File dir = new File(pathToFile); - _log.debug("DIR: " + pathToFile); - if (! dir.exists() ) - dir.mkdirs(); - - - - InputStream data = null; - - if (bi.getFolderItemType()==FolderItemType.EXTERNAL_IMAGE){ - _log.debug("EXTERNAL_IMAGE -|- " + item.getType()); - ExternalImage image = (ExternalImage)item; - data = image.getData(); - } - - if (bi.getFolderItemType()==FolderItemType.IMAGE_DOCUMENT){ - ImageDocument image = (ImageDocument)item; - if (image.getMimeType().equals("image/tiff")) - data = image.getThumbnail(); - else - data = image.getData(); - } - toReturn = filename + "." + getImageExtension(bi); - f = new File(pathToFile+toReturn); - OutputStream out = new FileOutputStream(f); - - byte buf[] = new byte[1024]; - int len; - while((len = data.read(buf))>0) - out.write(buf,0,len); - out.close(); - data.close(); - } - catch (IOException e){ - e.printStackTrace(); - } catch (InternalErrorException e) { - e.printStackTrace(); - } - } - _log.info("RETURNING: " + f.getAbsolutePath()); - return toReturn; - } - - /** * return a string for the file extension given a mimetype * @@ -964,7 +873,7 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe /** * used to save the report in the same folder * */ - public void saveReport() { + public void saveReport(Model toSave) { Workspace root = null; try { root = getWorkspaceArea(); @@ -988,7 +897,7 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe } catch (InternalErrorException e) { e.printStackTrace(); } - saveReport(folderid, itemName); + saveReport(toSave, folderid, itemName); } @@ -996,9 +905,10 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe * @param save a report in another folder . * */ - public void saveReport(String folderid, String newname) { + public void saveReport(Model toSave, String folderid, String newname) { - Model model = readTemplateFromSession(); + Model model = toSave; + storeTemplateInSession(toSave); _log.info("Serializing Model in folder: " + folderid ); _log.info("Trying to convert dynamic images ... "); convertDynamicImagesFromHL(model); @@ -1457,7 +1367,7 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe /** * update the Workflow Document in session */ - public void updateWorkflowDocument(boolean update) { + public void updateWorkflowDocument(Model toSave, boolean update) { ASLSession session = getASLSession(); ServiceUtil myUtil = new ServiceUtil(session); @@ -1468,12 +1378,10 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe if (update) { _log.debug("SAVING in WorkflowDocument Library "); - model = (Model) session.getAttribute(CURRENT_REPORT_INSTANCE); - + model = (Model) toSave; _log.debug("Trying to convert dynamic images ... "); convertDynamicImagesFromHL(model); - boolean result = myUtil.writeModel(model, "CURRENT_OPEN", getVreName(), getUsername()); if (!result) { diff --git a/src/main/webapp/images/reports-saving.gif b/src/main/webapp/images/reports-saving.gif new file mode 100644 index 0000000000000000000000000000000000000000..89ae681f66a017f1e57e7ec46f7808489ae876cc GIT binary patch literal 17090 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 Mx=8)S!lu&y0<|xX!2kdN literal 0 HcmV?d00001