package org.gcube.portlets.user.reportgenerator.client.model; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Vector; import java.util.Map.Entry; import org.gcube.portlets.d4sreporting.common.client.ComponentType; import org.gcube.portlets.d4sreporting.common.shared.Metadata; import org.gcube.portlets.d4sreporting.common.shared.SerializableComponent; import org.gcube.portlets.d4sreporting.common.shared.SerializableModel; import org.gcube.portlets.d4sreporting.common.shared.SerializableSection; import org.gcube.portlets.d4sreporting.common.shared.SerializableTimeSeries; 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 com.extjs.gxt.ui.client.widget.MessageBox; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.ServiceDefTarget; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Widget; /** * The TemplateModel class represents the current Template state, the model in the the MVC pattern * * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it * @version July 2011 (3.0) */ public class TemplateModel { private ReportServiceAsync modelService = (ReportServiceAsync) GWT.create(ReportService.class); private ServiceDefTarget endpoint = (ServiceDefTarget) modelService; /** * default w and h */ public static final int OLD_TEMPLATE_WIDTH = 950; /** * */ public static final int TEMPLATE_WIDTH = 750; /** * TEMPLATE_HEIGHT */ public static final int TEMPLATE_HEIGHT= 1000; /** * DEFAULT_NAME */ public static final String DEFAULT_NAME = "No template loaded"; public static final String BIBLIO_SECTION = "isBibliography"; public static final String USER_COMMENT = "isComment"; public static final String USER_COMMENT_HEIGHT = "isCommentHeight"; /** * The name of the template */ private String templateName; /** * */ private int pageWidth; /** * */ private int pageHeight; /** * */ private int currentPage; /** * Total number of template pages */ private int totalPages; /** * Template left margin */ private int marginLeft; /** * Template right margin */ private int marginRight; /** * Template top margin */ private int marginTop; /** * Template bottom margin */ private int marginBottom; /** * columnWidth is the actual page width without margins, when columns is equal to 1 (which is always true in my case, since UI doesn't allow multi columns) */ private int columnWidth; /** * each object of this Hahsmap its a TemplateSection containing all the TemplateComponent of a template section * * object: a TemplateSection of Component containing all the TemplateComponent of the section */ private HashMap sections; /** * holds the metadata(s) for the model */ private List metadata; /** * The name of the author */ private String author; /** * The name of the author */ private String lastEditBy; /** * The name of the author */ private Date dateCreated; /** * The name of the author */ private Date lastEdit; private Presenter presenter; /** * Constructs a Default Template Model * @param presenter . */ public TemplateModel(Presenter presenter) { super(); this.templateName = DEFAULT_NAME; this.pageWidth = TEMPLATE_WIDTH; this.pageHeight = TEMPLATE_HEIGHT; this.currentPage = 1; this.totalPages = 1; this.marginLeft = 25; this.marginRight = 25; this.marginTop = 20; this.marginBottom = 20; this.columnWidth = pageWidth - (marginLeft + marginRight); this.author = ""; this.lastEdit = null; this.lastEditBy = ""; this.dateCreated = null; this.sections = new HashMap(); this.metadata = new LinkedList(); this.presenter = presenter; String moduleRelativeURL = GWT.getModuleBaseURL() + "ReportServiceImpl"; endpoint.setServiceEntryPoint(moduleRelativeURL); } /** * @param pageNo . * @return . */ public List getSectionComponent(int pageNo) { List toReturn = new LinkedList(); toReturn = sections.get(""+pageNo).getAllComponents(); return toReturn; } /** * look for the model in the current page and edits its size * @param toResize . * @param newWidth . * @param newHeight . */ public void addCommentToComponent(Widget component, String comment2Add, int visibleHeight) { String tcPage = ""+currentPage; TemplateSection singleSection = sections.get(tcPage); singleSection.addCommentToComponent(component, comment2Add, visibleHeight); storeInSession(); } public void removeComment(Widget toRemove) { String tcPage = ""+currentPage; TemplateSection singleSection = sections.get(tcPage); singleSection.discardComments(toRemove); storeInSession(); } /** * */ public void insertBiblioSection() { totalPages++; TemplateSection singleSection = new TemplateSection(); singleSection.addMetadata(BIBLIO_SECTION, "true"); SerializableComponent references = new SerializableComponent(0, 0,TEMPLATE_WIDTH - 50, 35, totalPages, ComponentType.HEADING_2, "", "REFERENCES", false, true, singleSection.getAllMetadata()); TemplateComponent referencesTC = new TemplateComponent(this, references, presenter); singleSection.addComponent(referencesTC); sections.put(""+totalPages, singleSection); storeInSession(); } /** * * @param citeKey - * @param citeText - */ public void addCitation(String citeKey, String citeText) { String citation ="" + citeKey + ". " + citeText; TemplateSection singleSection = getSection(totalPages); SerializableComponent entry = new SerializableComponent(0, 0,TEMPLATE_WIDTH - 50, 35, totalPages, ComponentType.HEADING_2, "", "Bibliographic Entry", false, true, singleSection.getAllMetadata()); TemplateComponent entryTC = new TemplateComponent(this, entry, presenter); singleSection.addComponent(entryTC); SerializableComponent entryText = new SerializableComponent(0, 0,TEMPLATE_WIDTH - 50, 35, totalPages, ComponentType.BODY, "", citation, false, false, singleSection.getAllMetadata()); TemplateComponent entryTextTC = new TemplateComponent(this, entryText, presenter); singleSection.addComponent(entryTextTC); storeInSession(); } /** * remove a Citation from the model * @param citeKey . */ public boolean removeCitation(String citeKey) { TemplateSection singleSection = getSection(totalPages); List components = singleSection.getAllComponents(); for (int i = 0; i < components.size(); i++) { TemplateComponent tc = components.get(i); if (tc.getType() == ComponentType.BODY) { SerializableComponent sc = tc.getSerializable(); HTML citationHTML = new HTML(sc.getPossibleContent().toString(), true); ///to clean the HTML String citation = citationHTML.getText(); if (citation.startsWith(citeKey)) { if (singleSection.removeComponent(tc)) { //removes also the previous heading 2 TemplateComponent h2 = components.get(i-1); singleSection.removeComponent(h2); storeInSession(); return true; } } } } return false; } /** * @param pageNo . * @return . */ public TemplateSection getSection(int pageNo) { return sections.get(""+pageNo); } /** * generally used when reaing a model form disk * @param toLoad the SerializableModel instance to load in the model * @param presenter . */ public void loadModel(SerializableModel toLoad, Presenter presenter) { //loading template from disk this.author = toLoad.getAuthor(); this.dateCreated = toLoad.getDateCreated(); this.lastEdit = toLoad.getLastEdit(); this.lastEditBy = toLoad.getLastEditBy(); this.templateName = toLoad.getTemplateName(); this.pageWidth = toLoad.getPageWidth(); this.pageHeight = toLoad.getPageHeight(); this.currentPage = toLoad.getCurrPage(); this.totalPages = toLoad.getTotalPages(); this.marginLeft = toLoad.getMarginLeft(); this.marginRight = toLoad.getMarginRight(); this.marginTop = toLoad.getMarginTop(); this.marginBottom = toLoad.getMarginBottom(); this.metadata = toLoad.getMetadata(); this.columnWidth = pageWidth - (marginLeft + marginRight); //the sections to be transferred Vector sectionsSerialized = toLoad.getSections(); //reset current sections container this.sections = new HashMap(); //page Number, this model uses a HashMap for each page, the key is the page number int pageNo = 1; for (SerializableSection serialazableSection : sectionsSerialized) { //for each section List myTemplateSection = new Vector(); for (SerializableComponent sc : serialazableSection.getComponents()) { //for each page component myTemplateSection.add(new TemplateComponent(this, sc, presenter)); } //TODO: load also metadata GWT.log("Section Metadata:"+serialazableSection.getMetadata().size(), null); this.sections.put(""+pageNo, new TemplateSection(myTemplateSection, serialazableSection.getMetadata())); pageNo++; } } /** * generally used when reaing a model form disk * @param toLoad the SerializableModel instance where toget the section * @param sectionNoToimport section to import 0 -> n-1 * @param beforeSection say where to import this section (before) * @param asLastSection say to import this section as last section in the curren template / report */ public void importSectionInModel(SerializableModel toLoad, int sectionNoToimport, int beforeSection, boolean asLastSection) { int pageNo = totalPages+1; //the section to be imported -1 beacuse it stays in a vector SerializableSection toImport = toLoad.getSections().get(sectionNoToimport-1); List myTemplateSection = new Vector(); for (SerializableComponent sc : toImport.getComponents()) { //for each page component myTemplateSection.add(new TemplateComponent(this, sc, presenter)); } //TODO: load also metadata GWT.log("Section Metadata:"+toImport.getMetadata().size(), null); if (asLastSection) this.sections.put(""+pageNo, new TemplateSection(myTemplateSection, toImport.getMetadata())); else { //insertin gnew section HashMap newSections = new HashMap(); boolean isAdded = false; for (int i = 1; i <= totalPages+1; i++) { if (beforeSection == i) { newSections.put(""+i, new TemplateSection(myTemplateSection, toImport.getMetadata())); isAdded = true; } else { int insertIn = (isAdded) ? (i-1): i; newSections.put(""+i, sections.get(""+insertIn)); GWT.log("Inserting " + insertIn + " into section " + i + " isAdded =" + (isAdded) , null); } } this.sections = newSections; GWT.log("NEW SECTION SIZE"+sections.size(), null); } totalPages++; } /** * * @param sectNo the section to discard * @return the removed element */ public TemplateSection discardSection(int sectNo) { TemplateSection toRemove = sections.remove(""+sectNo); for (int i = sectNo+1; i <= totalPages; i++) { sections.put(""+(i-1), sections.get(""+i)); } totalPages--; return toRemove; } /** * * @return a serialized version od the model */ public SerializableModel getSerializableModel() { Vector serializedsections = new Vector(); for (int i = 1; i <= sections.size(); i++) { //the pages String pageNo = ""+i; if (sections.get(pageNo) != null) { TemplateSection singleSection = sections.get(pageNo); List templateElements = singleSection.getAllComponents(); List serialazableComponents = new LinkedList(); //construct the serialized section SerializableSection aSection = new SerializableSection(); //copy the components for (TemplateComponent tc : templateElements) serialazableComponents.add(tc.getSerializable()); aSection.setComponents(serialazableComponents); aSection.setMetadata(singleSection.getAllMetadata()); //add the serialized section serializedsections.add(aSection); } } SerializableModel toReturn = new SerializableModel("UniqueID", author, dateCreated, lastEdit, lastEditBy, templateName, columnWidth, currentPage, marginBottom, marginLeft, marginRight, marginTop, pageHeight, pageWidth, serializedsections, totalPages, metadata); return toReturn; } /** * * @param folderid . * @param name . */ public void saveReport (String folderid, String name) { modelService.saveReport(folderid, name, new AsyncCallback() { public void onFailure(Throwable caught) { Window.alert("Report Not Saved: " + caught.getMessage()); } public void onSuccess(Void result) { Window.alert("Report Saved Successfully"); presenter.refreshWorkspace(); } }); } /** * * */ 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.alert("Warning","Report Saved Successfully", null); presenter.refreshWorkspace(); } }); } /** * look for the model in the current page and edits its size * @param toResize . * @param newWidth . * @param newHeight . */ public void resizeModelComponent(Widget toResize, int newWidth, int newHeight) { GWT.log("LOOKING CORRESPONDANCE", null); String tcPage = ""+currentPage; TemplateSection singleSection = sections.get(tcPage); singleSection.resizeModelComponent(toResize, newWidth, newHeight); storeInSession(); } /** * * @param type a * @param templateName a * return a URL which is lookable for on the web * * @return . */ public String getExportedFileURL(ExportManifestationType type, String templateName) { /** * PDFs will be stored under webapps/usersArea... */ // get e.g. http://dlib28.isti.cnr.it:9090/ String host = Window.Location.getProtocol()+"//"+Window.Location.getHost()+"/"; String exportedURL = ""; switch (type) { case DOCX: exportedURL = host + "usersArea/" + presenter.getCurrentScope() + "/templates/" + presenter.getCurrentUser() + "/EXPORTS/" + templateName + ".docx"; break; case PDF: exportedURL = host + "usersArea/" + presenter.getCurrentScope() + "/templates/" + presenter.getCurrentUser() + "/EXPORTS/" + templateName + ".pdf"; break; case HTML: exportedURL = host + "usersArea/" + presenter.getCurrentScope() + "/templates/" + presenter.getCurrentUser() + "/EXPORTS/" + templateName + ".html"; } return exportedURL; } /** * stores the current model in the session */ public void storeInSession() { AsyncCallback callback = new AsyncCallback() { public void onFailure(Throwable caught) { } public void onSuccess(Object result) { } }; SerializableModel modelToSend = getSerializableModel(); GWT.log("Storing in session: currpage = " + modelToSend.getCurrPage(), null); modelService.storeTemplateInSession(modelToSend, callback); } //****** GETTERS n SETTERS /** * @return . */ public int getCurrentPage() {return currentPage;} /** * @param currentPage . */ public void setCurrentPage(int currentPage) { this.currentPage = currentPage; storeInSession(); } /** * @return . */ public int getMarginBottom() {return marginBottom;} /** * @param marginBottom . */ public void setMarginBottom(int marginBottom) {this.marginBottom = marginBottom;} /** * @return . */ public int getMarginLeft() {return marginLeft; } /** * @param marginLeft . */ public void setMarginLeft(int marginLeft) { this.marginLeft = marginLeft; this.columnWidth = pageWidth - (marginLeft + marginRight); } /** * @return . */ public int getMarginRight() {return marginRight;} /** * @param marginRight . */ public void setMarginRight(int marginRight) { this.marginRight = marginRight; this.columnWidth = pageWidth - (marginLeft + marginRight); } /** * @return . */ public int getMarginTop() {return marginTop;} /** * @param marginTop . */ public void setMarginTop(int marginTop) {this.marginTop = marginTop;} /** * @return . */ public int getPageHeight() {return pageHeight; } /** * @param pageHeight . */ public void setPageHeight(int pageHeight) { this.pageHeight = pageHeight;} /** * @return . */ public int getPageWidth() { return pageWidth;} /** * @param pageWidth . */ public void setPageWidth(int pageWidth) { this.pageWidth = pageWidth; this.columnWidth = pageWidth - (marginLeft + marginRight); } /** * @return . */ public String getTemplateName() {return templateName;} /** * @param templateName . */ public void setTemplateName(String templateName) { this.templateName = templateName; storeInSession(); } /** * @return totalPages . */ public int getTotalPages() {return totalPages; } /** * @param totalPages . */ public void setTotalPages(int totalPages) { this.totalPages = totalPages;} /** * @return . */ public int getColumnWidth() {return columnWidth;} /** * @param columnWidth . */ public void setColumnWidth(int columnWidth) {this.columnWidth = columnWidth;} /** * @return . */ public ReportServiceAsync getModelService() {return modelService;} /** * metadata . * @return . */ public List getMetadata() { return metadata; } /** * * @return . * */ public String getLastEditBy() { return lastEditBy; } /** * * @param lastEditBy . */ public void setLastEditBy(String lastEditBy) { this.lastEditBy = lastEditBy; } /** * * @return . */ public boolean containsLargeTS() { sections.entrySet(); for (Entry entry : sections.entrySet()) { TemplateSection section = (TemplateSection) entry.getValue(); for (TemplateComponent tc : section.getAllComponents()) { if (tc.getType() == ComponentType.TIME_SERIES) { SerializableComponent sc = tc.getSerializable(); SerializableTimeSeries sts = (SerializableTimeSeries) sc.getPossibleContent(); if (sts.getFilter() != null) { int from = sts.getFilter().getFrom(); int to = sts.getFilter().getTo(); if (to - from > 200) return true; } } } } 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(); } }); } 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; }-*/; }