it.eng.spagobi.studio.core.services.template.RefreshTemplateService.java Source code

Java tutorial

Introduction

Here is the source code for it.eng.spagobi.studio.core.services.template.RefreshTemplateService.java

Source

/**
 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;
    }

}