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