/** SpagoBI, the Open Source Business Intelligence suite Copyright (C) 2012 Engineering Ingegneria Informatica S.p.A. - SpagoBI Competency Center This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. **/ package it.eng.spagobi.studio.core.wizards.downloadWizard; import it.eng.spagobi.studio.core.log.SpagoBILogger; import it.eng.spagobi.studio.utils.bo.Document; import it.eng.spagobi.studio.utils.bo.DocumentParameter; import it.eng.spagobi.studio.utils.bo.Engine; import it.eng.spagobi.studio.utils.bo.Functionality; import it.eng.spagobi.studio.utils.bo.Template; import it.eng.spagobi.studio.utils.bo.xmlMapping.XmlParametersMapping; import it.eng.spagobi.studio.utils.exceptions.NoActiveServerException; import it.eng.spagobi.studio.utils.sdk.SDKProxyFactory; import it.eng.spagobi.studio.utils.services.SpagoBIServerObjectsFactory; import it.eng.spagobi.studio.utils.util.BiObjectUtilities; import it.eng.spagobi.studio.utils.wizard.AbstractSpagoBIDocumentWizard; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Vector; import javax.activation.DataHandler; import org.dom4j.Node; import org.dom4j.io.SAXReader; import org.eclipse.core.internal.resources.Folder; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchWizard; import org.eclipse.ui.PlatformUI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SpagoBIDownloadWizard extends AbstractSpagoBIDocumentWizard { private SpagoBIDownloadWizardPage page; String projectName = null; private static Logger logger = LoggerFactory.getLogger(SpagoBIDownloadWizard.class); /** * vector that stores user messages to show at the end of download */ Vector<String> messages = new Vector<String>(); /** * Constructor for SampleNewWizard. */ public SpagoBIDownloadWizard() { super(); setNeedsProgressMonitor(true); } /** * Adding the page to the wizard. */ public void addPages() { page = new SpagoBIDownloadWizardPage(selection); addPage(page); } /** * Download document, if it is a document composition ask if want to download all * @param document */ public boolean downloadDocument(Document document){ logger.debug("IN"); // if it is a document composed download also contained documents if(document.getType().equalsIgnoreCase("DOCUMENT_COMPOSITE") ){ // ask user if wants to download related template boolean downloadContained=MessageDialog.openQuestion(getShell(), "Download contained Documents?", "You have selected a document composition, do you want to download contained documents? You will be notified if they already esists in your workspace"); if(downloadContained==true){ downloadContainedTemplate(document); } } logger.debug("OUT"); return downloadTemplate(document); } /** Download contained documents and also nto subfolders * * @param functionality * @return */ public boolean downloadDocumentsFromFunctionality(Functionality functionality){ logger.debug("IN"); Document[] documents = functionality.getContainedDocuments(); // Download contained Documents for (int i = 0; i < documents.length; i++) { Document document = documents[i]; downloadDocument(document); } Functionality[] funcitonalities = functionality.getContainedFunctionalities(); // Download contained subfolders for (int i = 0; i < funcitonalities.length; i++) { Functionality funct = funcitonalities[i]; downloadDocumentsFromFunctionality(funct); } logger.debug("OUT"); return true; } /** * This method is called when 'Finish' button is pressed in * the wizard. We will create an operation and run it * using wizard as execution context. */ public boolean performFinish() { logger.debug("IN"); TreeItem[] selectedItems=page.getTree().getSelection(); if(selectedItems==null){ logger.warn("Error; no item selected"); } else{ // cycle on selected items for (int i = 0; i < selectedItems.length; i++) { TreeItem selectedItem=selectedItems[i]; Object docObject=selectedItem.getData(); // check if it is a folder or a document if(docObject instanceof Document){ Document document= (Document)docObject; downloadDocument(document); } else if(docObject instanceof Functionality){ // cycle on all document contained (also subfolders?) Functionality functionality = (Functionality)docObject; downloadDocumentsFromFunctionality(functionality); } else{ logger.warn("Could not save documetns,not a right folder was selected"); } } // print messages on file that could not be written if(messages.size()>0){ String message = "Following files could not be added because already exist in project with the same name. You must delete firstly the existing ones: "; for (Iterator iterator = messages.iterator(); iterator.hasNext();) { String msg = (String) iterator.next(); message += msg; if(iterator.hasNext()){ message += ", "; } } MessageDialog.openWarning(page.getShell(), "Warning", message); messages= new Vector<String>(); } doFinish(); } logger.debug("OUT"); return true; } public boolean downloadContainedTemplate(Document document){ logger.debug("IN"); boolean toReturn=true; Integer id=document.getId(); Template template=null; SpagoBIServerObjectsFactory proxyServerObjects = null; try{ proxyServerObjects = new SpagoBIServerObjectsFactory(projectName); } catch (NoActiveServerException e1) { SpagoBILogger.errorLog("No active server found", e1); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "No active server found"); return false; } int numDocs=0; try{ template=proxyServerObjects.getServerDocuments().downloadTemplate(id); } catch (NullPointerException e) { logger.error("No comunication with server, check SpagoBi Server definition in preferences page", e); MessageDialog.openError(getShell(), "Error", "No comunication with server, check SpagoBi Server definition in preferences page"); return false; } catch (Exception e) { logger.error("No comunication with SpagoBI server, could not retrieve template",e); MessageDialog.openError(getShell(), "Error", "Could not get the template from server for document with id "+id); return false; } template.getContent(); String xmlString=null; DataHandler dh=template.getContent(); InputStream is=null; try { is=dh.getInputStream(); xmlString=readInputStreamAsString(is); xmlString="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+xmlString; is=new ByteArrayInputStream(xmlString.getBytes("UTF-8")); // put all the labels in an array, so if there is a problem in parsing does not download anything boolean correctParsing=true; SAXReader reader = new SAXReader(); org.dom4j.Document thisDocument = null; List<String> labels=new ArrayList<String>(); try{ thisDocument=reader.read(is); List docs= thisDocument.selectNodes("//DOCUMENTS_COMPOSITION/DOCUMENTS_CONFIGURATION/DOCUMENT"); for (int i = 0; i < docs.size(); i++) { Node doc = (Node) docs.get(i); String label = doc.valueOf("@sbi_obj_label"); if (label!=null) { labels.add(label); } else{ correctParsing=false; } } } catch (Exception e) { correctParsing=false; } if(correctParsing==false){ logger.error("error in reading the file searching for document labels "); MessageDialog.openWarning(getShell(), "Warning", "error in reading template searching for document labels: will not download contained documents but only composed one"); return false; } for (int i = 0; i < labels.size(); i++) { Document docToDownload=proxyServerObjects.getServerDocuments().getDocumentByLabel(labels.get(i)); if(docToDownload!=null){ toReturn = downloadTemplate(docToDownload); if(toReturn==true){ numDocs++; logger.debug("Download document with label "+docToDownload.getName()); } } } } catch (Exception e1) { logger.error("Error in writing the file", e1); MessageDialog.openWarning(getShell(), "Warning", "Error in downloading contained documents; will not download contained documents but only composed one"); return false; } logger.debug("Downloaded # document "+numDocs); logger.debug("OUT"); return toReturn; } public boolean downloadTemplate(it.eng.spagobi.studio.utils.bo.Document document){ logger.debug("IN"); InputStream is=null; //try{ Integer id=document.getId(); SDKProxyFactory proxyFactory = null; SpagoBIServerObjectsFactory spagoBIServerObjects = null; // Recover information field like dataSource, dataSet, engine names! //Get the parameters String[] roles; try{ spagoBIServerObjects = new SpagoBIServerObjectsFactory(projectName); roles=spagoBIServerObjects.getServerDocuments().getCorrectRolesForExecution(id); } catch (NoActiveServerException e1) { SpagoBILogger.errorLog("No active server found", e1); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "No active server found"); return false; } catch (NullPointerException e) { logger.error("No comunication with server, check SpagoBi Server definition in preferences page",e); MessageDialog.openError(getShell(), "Error", "No comunication with server, check SpagoBi Server definition in preferences page"); return false; } catch (Exception e) { logger.error("No comunication with SpagoBI server, could not retrieve roles for execution",e); MessageDialog.openError(getShell(), "Could not retrieve roles for execution", "Could not retrieve roles for execution"); return false; } if(roles==null || roles.length==0){ logger.error("No roles for execution found"); MessageDialog.openError(getShell(), "No roles for execution found", "No roles for execution found"); return false; } //SDKDocumentParameter[] parameters=null; DocumentParameter[] parameters=null; try{ parameters=spagoBIServerObjects.getServerDocuments().getDocumentParameters(id, roles[0]); } catch (NullPointerException e) { logger.error("No comunication with server, check SpagoBi Server definition in preferences page",e); MessageDialog.openError(getShell(), "Error", "No comunication with server, check SpagoBi Server definition in preferences page"); return false; } catch (Exception e) { logger.error("No comunication with SpagoBI server, could not retrieve document parameters",e); MessageDialog.openError(getShell(), "Could not retrieve document parameters for execution", "Could not retrieve roles for execution"); return false; } // get the extension Integer engineId=document.getEngineId(); Engine sdkEngine=null; try{ sdkEngine=spagoBIServerObjects.getServerEngines().getEngine(engineId); } catch (Exception e) { if(e.getClass().toString().equalsIgnoreCase("class it.eng.spagobi.sdk.exceptions.NotAllowedOperationException")){ logger.error("Current User has no permission to retrieve engines", e); MessageDialog.openError(getShell(), "", "Current user has no permission to retrieve engines"); } else{ logger.error("No comunication with SpagoBI server, could not get engine", e); MessageDialog.openError(getShell(), "", "Could not get engine the template from server"); } return false; } String type=document.getType(); String engineName=sdkEngine!=null?sdkEngine.getLabel(): null; // create the file in the selected directory // get the folder selected Object objSel = selection.toList().get(0); Folder folderSel = null; folderSel=(Folder)objSel; String projectName = folderSel.getProject().getName(); //Take workspace IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); // get the folder where to insert the template document IProject project = root.getProject(projectName); IPath pathFolder = folderSel.getProjectRelativePath(); Template template=null; try{ template = spagoBIServerObjects.getServerDocuments().downloadTemplate(id); } catch (NullPointerException e) { logger.error("No comunication with server, check SpagoBi Server definition in preferences page",e); MessageDialog.openError(getShell(), "Error", "No comunication with server, check SpagoBi Server definition in preferences page"); return false; } catch (Exception e) { logger.error("No comunication with SpagoBI server, could not retrieve template",e); MessageDialog.openError(getShell(), "Error", "Could not get the template from server"); return false; } if(template == null){ logger.error("Template download is null for documentId "+id+" and label "+document.getLabel()); return false; } String templateFileName=template.getFileName(); String previousExtension = null; int index=templateFileName.indexOf('.'); if(index!=-1){ previousExtension=templateFileName.substring(index+1, templateFileName.length()); } String extension=BiObjectUtilities.getFileExtension(getShell(), type, engineName, previousExtension); // remove previous extensions only if a new Extension was found String fileName=""; if(extension!=null){ int indexPoint=templateFileName.indexOf('.'); if(indexPoint!=-1){ templateFileName=templateFileName.substring(0, indexPoint); fileName=templateFileName+extension; } } else{ fileName=templateFileName; } IPath pathNewFile = pathFolder.append(fileName); IFile newFile = project.getFile(pathNewFile); logger.debug("file path to download "+pathNewFile.toString()); DataHandler dh=template.getContent(); try { is=dh.getInputStream(); } catch (IOException e1) { logger.error("Error in writing the file", e1); return false; } IPath projectFolder=project.getLocation(); // Check there is not another existing file with the same name inside project directory workspace!!! boolean alreadyFound=it.eng.spagobi.studio.utils.util.FileFinder.fileExistsInSubtree(fileName, projectFolder.toString()); if(alreadyFound){ messages.add(fileName); logger.warn("File "+fileName+" already exists in your project: to download it againg you must first delete the existing one"); return false; //write=MessageDialog.openQuestion(workbench.getActiveWorkbenchWindow().getShell(), "File exists: Overwrite?", "File "+newFile.getName()+" already exists, overwrite?"); } if(true){ try{ newFile.create(is, true, null); } catch (CoreException e) { logger.error("error while creating new file", e); return false; } //Set File Metadata try{ newFile=BiObjectUtilities.setFileMetaData(newFile,document, false, spagoBIServerObjects); } catch (CoreException e) { logger.error("Error while setting meta data", e); return false; } catch (NoActiveServerException e1) { SpagoBILogger.errorLog("No active server found", e1); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "No active server found"); return false; } //Set ParametersFile Metadata if(parameters.length>0){ try{ newFile=XmlParametersMapping.setFileParametersMetaData(newFile,parameters); } catch (Exception e) { e.printStackTrace(); logger.error("Error while setting meta data", e); return false; } } try{ newFile=BiObjectUtilities.setFileLastRefreshDateMetaData(newFile); } catch (Exception e) { e.printStackTrace(); logger.error("Error while setting last refresh date", e); return false; } } else // choose not to overwrite the file { logger.debug("Choose to not overwrite file "+newFile.getName()); } logger.debug("OUT"); return true; } /** The worker method. Download the template and creates the file * * @param document: the SdkDocument refderencing the BiObject * @throws CoreException * */ private void doFinish() { logger.debug("Documents downloaded"); } /** * We will accept the selection in the workbench to see if * we can initialize from it. * @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection) */ public void init(IWorkbench _workbench, IStructuredSelection _selection) { this.selection = _selection; this.workbench=_workbench; Object objSel = selection.toList().get(0); Folder fileSelected=(Folder)objSel; projectName = fileSelected.getProject().getName(); } public static String readInputStreamAsString(InputStream in) throws IOException { logger.debug("IN"); BufferedInputStream bis = new BufferedInputStream(in); ByteArrayOutputStream buf = new ByteArrayOutputStream(); int result = bis.read(); while(result != -1) { byte b = (byte)result; buf.write(b); result = bis.read(); } logger.debug("OUT"); return buf.toString(); } }