/** 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.services.template; import it.eng.spagobi.studio.core.wizards.deployWizard.SpagoBIDeployWizard; 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.Template; import it.eng.spagobi.studio.utils.bo.xmlMapping.XmlParametersMapping; import it.eng.spagobi.studio.utils.exceptions.AlreadyPresentException; import it.eng.spagobi.studio.utils.exceptions.NoActiveServerException; import it.eng.spagobi.studio.utils.exceptions.NoDocumentException; import it.eng.spagobi.studio.utils.services.SpagoBIServerObjectsFactory; import it.eng.spagobi.studio.utils.util.BiObjectUtilities; import it.eng.spagobi.studio.utils.util.FileFinder; import it.eng.spagobi.studio.utils.util.SpagoBIStudioConstants; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.rmi.RemoteException; import javax.activation.DataHandler; 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.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.ProgressMonitorPart; import org.eclipse.ui.PlatformUI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Called by action of refresh * @author gavardi * */ public class RefreshTemplateService { private final Template template= new Template(); Document document=null; ISelection selection; String projectName = null; // fields to retrieve only once String[] roles=null; DocumentParameter[] parameters=null; Engine engine=null; // if not null means that template has changed name (used for user advertisement) String newTemplateName=null; AlreadyPresentException alreadyPresentException=new AlreadyPresentException(); private static Logger logger = LoggerFactory.getLogger(RefreshTemplateService.class); public RefreshTemplateService(ISelection _selection) { selection = _selection; } public void refreshTemplate() { SpagoBIDeployWizard sbindw = new SpagoBIDeployWizard(); IStructuredSelection sel=(IStructuredSelection)selection; // go on only if you selected a document (a file) Object objSel = sel.toList().get(0); org.eclipse.core.internal.resources.File fileSel = null; try{ fileSel=(org.eclipse.core.internal.resources.File)objSel; projectName = fileSel.getProject().getName(); } catch (Exception e) { logger.error("No file selected",e); MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Not a file", "You must select a file to refresh"); return; } //if file has document metadata associated upload it, else call wizard String document_idString=null; String document_label=null; try { document_idString=fileSel.getPersistentProperty(SpagoBIStudioConstants.DOCUMENT_ID); document_label=fileSel.getPersistentProperty(SpagoBIStudioConstants.DOCUMENT_LABEL); } catch (CoreException e) { logger.error("Error in retrieving document Label",e); } //final Integer documentId=Integer.valueOf(document_idString); // IF File selected has already an id of document associated start the templater refresh, else throw an error if(document_idString!=null){ ProgressMonitorPart monitor; monitor=new ProgressMonitorPart(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), null); logger.debug("Metadata found: do the template refresh, document with id "+document_idString); final Integer idInteger=Integer.valueOf(document_idString); final String label2=document_label; final org.eclipse.core.internal.resources.File fileSel2=fileSel; final NoDocumentException documentException=new NoDocumentException(); final NoActiveServerException noActiveServerException=new NoActiveServerException(); IRunnableWithProgress op = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException { monitor.beginTask("Template Refresh for document "+label2, IProgressMonitor.UNKNOWN); // document associated, upload the template SpagoBIServerObjectsFactory spagoBIServerObjects = null; try{ spagoBIServerObjects = new SpagoBIServerObjectsFactory(projectName); // check document still exists document=spagoBIServerObjects.getServerDocuments().getDocumentByLabel(label2); if(document==null){ documentException.setNoDocument(true); return; } else{ documentException.setNoDocument(false); Template mytemplate = spagoBIServerObjects.getServerDocuments().downloadTemplate(idInteger); template.setContent(mytemplate.getContent()); template.setFileName(mytemplate.getFileName()); String fileName = mytemplate.getFileName(); String previousExtension = null; int index=fileName.indexOf('.'); if(index!=-1){ previousExtension=fileName.substring(index+1, fileName.length()); } // get documents metadata String fileExtension=recoverFileExtension(document,idInteger, spagoBIServerObjects, previousExtension); overwriteTemplate(template, fileSel2, fileExtension, spagoBIServerObjects); } } // catch (NotAllowedOperationException e) { // logger.error("Not Allowed Operation",e); // MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), // "Error upload", "Error while uploading the template: not allowed operation"); // return; // } catch (NoActiveServerException e1) { noActiveServerException.setNoServer(true); return; } catch (RemoteException e) { logger.error("Error comunicating with server",e); logger.error("Error comunicating with server", e); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error comunicating with server", "Error while uploading the template: missing comunication with server"); return; } catch (CoreException e) { logger.error("Error in fie creation",e); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error in file creation", "Error in file creation"); return; } monitor.done(); if (monitor.isCanceled()) logger.error("The long running operation was cancelled"); } }; ProgressMonitorDialog dialog=new ProgressMonitorDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell()); try { dialog.run(true, true, op); } catch (InvocationTargetException e1) { logger.error("Error comunicating with server", e1); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "Missing comunication with server; check server definition and if service is avalaible"); dialog.close(); return; } catch (InterruptedException e1) { logger.error("Error comunicating with server"); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "Missing comunication with server; check server definition and if service is avalaible"); dialog.close(); return; } if(noActiveServerException.isNoServer()){ logger.error("No server is defined active"); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "No server is defined active"); return; } // check if document has been found (could have been deleted) or if the template was already present somewhere else if(documentException.isNoDocument() || template.getContent()==null){ logger.warn("Document no more present on server or no permission "+document_label); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error upload", "Document not retrieved; check it is still on server and you have enough permission to reach it. Make a new Deploy."); return; } if(alreadyPresentException!=null && alreadyPresentException.isAlreadyPresent()){ logger.warn("Template ealready present in project workspace: "+newTemplateName); MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "File "+alreadyPresentException.getFilePath()+" already exists in your project: to download it againg you must first delete the existing one"); return; } dialog.close(); String succesfullMessage="Succesfully replaced with the last template version of the associated document "+document_label; if(newTemplateName!=null){ succesfullMessage+=": template file has changed its name; new one is "+newTemplateName; } logger.debug(succesfullMessage); MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),"Refresh succesfull", succesfullMessage); } else{ logger.warn("No document associated "); MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "No document warning", "The file selected has no document associated, to the deploy first"); } } public void overwriteTemplate(Template template, org.eclipse.core.internal.resources.File fileSel, String extension, SpagoBIServerObjectsFactory proxyServerObjects) throws CoreException{ // get template URL to overwrite try { URI uri=fileSel.getLocationURI(); // get the directory Folder folder=(Folder)fileSel.getParent(); String projectName=folder.getProject().getName(); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IProject project = root.getProject(projectName); IPath pathFolder = folder.getProjectRelativePath(); String templateFileName=template.getFileName(); String completeFileName=""; // if is defined a new extension use it, else keep its name if(extension!=null){ int indexPoint=templateFileName.indexOf('.'); if(indexPoint!=-1){ templateFileName=templateFileName.substring(0, indexPoint); completeFileName=templateFileName+extension; } } else{ completeFileName=templateFileName; } IPath pathNewFile = pathFolder.append(completeFileName); IFile newFile = project.getFile(pathNewFile); DataHandler dh=template.getContent(); InputStream is=null; is=dh.getInputStream(); IPath projectFolder=project.getLocation(); // if it has the same name as the one before do not have to check if name is already present if(completeFileName.equals(fileSel.getName())){ } else{ // Check there is not another existing file with the same name inside project directory workspace!!! boolean alreadyFound=FileFinder.fileExistsInSubtree(completeFileName, projectFolder.toString()); if(alreadyFound){ alreadyPresentException.setAlreadyPresent(true); alreadyPresentException.setFilePath(completeFileName); return; } newTemplateName=completeFileName; } // I must remove previous file and add new one because it could have changed its name // I have also to report metadata fileSel.delete(true, null); // create new File newFile.create(is, true, null); //Set File Metadata try{ newFile=BiObjectUtilities.setFileMetaData(newFile,document, true, proxyServerObjects); //newFile=BiObjectUtilities.setFileMetaData(newFile,document); //Set ParametersFile Metadata if(parameters.length>0){ newFile=XmlParametersMapping.setFileParametersMetaData(newFile,parameters); } newFile=BiObjectUtilities.setFileLastRefreshDateMetaData(newFile); } catch (Exception e) { logger.error("Error while setting meta data", e); return; } } catch (IOException e1) { MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "Error in writing the file"); logger.error("Error in writing the file", e1); return ; } } /** Retrieve document type and engine to set right file extension (if doessn't find leave the actual) * It saves paramters and engine informations in fields so they can be re used for metadata assignment * @param document * @param documentId * @return */ public String recoverFileExtension(Document document, Integer documentId, SpagoBIServerObjectsFactory proxyServerObjects, String previousExtension){ try{ roles=proxyServerObjects.getServerDocuments().getCorrectRolesForExecution(documentId); } catch (NullPointerException e) { logger.error("No comunication with server, check SpagoBi Server definition in preferences page", e); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "No comunication with server, check SpagoBi Server definition in preferences page"); return null; } catch (Exception e) { logger.error("No comunication with SpagoBI server, could not retrieve roles for execution", e); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "Could not retrieve roles for execution"); return null; } if(roles==null || roles.length==0){ logger.error("Could not retrieve roles for execution"); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "No roles for execution found", "No roles for execution found"); return null; } try{ parameters=proxyServerObjects.getServerDocuments().getDocumentParameters(documentId, roles[0]); } catch (NullPointerException e) { logger.error("No comunication with server, check SpagoBi Server definition in preferences page", e); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "No comunication with server, check SpagoBi Server definition in preferences page"); return null; } catch (Exception e) { logger.error("No comunication with SpagoBI server, could not get engine", e); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Could not retrieve document parameters for execution", "Could not retrieve roles for execution"); return null; } // get the extension Integer engineId=document.getEngineId(); Engine engine=null; try{ engine=proxyServerObjects.getServerEngines().getEngine(engineId); } catch (Exception e) { logger.error("No comunication with SpagoBI server, could not get engine", e); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "", "Could not get engine the template from server"); return null; } String type=document.getType(); String engineName=engine!=null?engine.getLabel(): null; String extension=BiObjectUtilities.getFileExtension(null,type, engineName, previousExtension); return extension; } }