/**
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.server.services.api.bo.IDataSet;
import it.eng.spagobi.studio.core.wizards.deployWizard.SpagoBIDeployWizard;
import it.eng.spagobi.studio.utils.bo.Document;
import it.eng.spagobi.studio.utils.bo.Template;
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.SpagoBIStudioConstants;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.rmi.RemoteException;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import org.eclipse.core.runtime.CoreException;
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.WizardDialog;
import org.eclipse.ui.PlatformUI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DeployTemplateService {
ISelection selection;
private static Logger logger = LoggerFactory.getLogger(DeployTemplateService.class);
String projectname = null;
SpagoBIDeployWizard sbdw = null;
public DeployTemplateService(ISelection _selection, SpagoBIDeployWizard _sbdw) {
selection = _selection;
sbdw = _sbdw;
}
/** if document has meadata associated do the automated deploy
*
* @return if automated eply has been done
*/
public boolean doAutomaticDeploy(){
logger.debug("IN");
IStructuredSelection sel=(IStructuredSelection)selection;
// go on only if you selected a document
Object objSel = sel.toList().get(0);
org.eclipse.core.internal.resources.File fileSel = null;
fileSel=(org.eclipse.core.internal.resources.File)objSel;
projectname = fileSel.getProject().getName();
//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);
}
// IF File selected has already and id of document associated do the upload wiyhout asking further informations
boolean newDeploy = false;
if(document_idString!=null){
logger.debug("Template already associated to document "+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("Deploying to document "+label2, IProgressMonitor.UNKNOWN);
if(projectname == null){
projectname = fileSel2.getProject().getName();
}
try{
// document associated, upload the template
SpagoBIServerObjectsFactory spagoBIServerObjects = new SpagoBIServerObjectsFactory(projectname);
URI uri=fileSel2.getLocationURI();
File fileJava=new File(uri.getPath());
FileDataSource fileDataSource=new FileDataSource(fileJava);
DataHandler dataHandler=new DataHandler(fileDataSource);
Template template=new Template();
template.setFileName(fileSel2.getName());
template.setContent(dataHandler);
// check document still exists
//Document doc=spagoBIServerObjects.getServerDocuments().getDocumentById(idInteger);
Document doc=spagoBIServerObjects.getServerDocuments().getDocumentByLabel(label2);
if(doc==null){
documentException.setNoDocument(true);
logger.warn("Document not retrieved; check it is still on server and you have enough permission to reach it"+idInteger);
return;
}
else{
documentException.setNoDocument(false);
// **** Label defined inside template (Ext Chart case) ***
// in thecaseof an extChart also te dataset must be re-assigned because it could have been changed
String labelInsideXml = null;
try {
labelInsideXml = fileSel2.getPersistentProperty(SpagoBIStudioConstants.DATASET_LABEL_INSIDE);
} catch (CoreException e) {
logger.warn("Errorin finding dataset label nto template, go on anyway using server one");
}
IDataSet found = null;
if(labelInsideXml != null){ // EXT CHART CASE
logger.debug("Set dataset document on server to "+labelInsideXml);
IDataSet[] datasets = spagoBIServerObjects.getServerDatasets().getDataSetList();
// get the id of the new datset
for (int i = 0; i < datasets.length && found == null; i++) {
if(datasets[i].getLabel().equals(labelInsideXml)){
found = datasets[i];
}
}
if(found != null){
Integer id = found.getId();
doc.setDataSetId(id);
logger.debug("update document with new dataset reference");
}
else{
logger.error("dataset "+labelInsideXml+" not found in server. delete dataset association");
doc.setDataSetId(null);
}
spagoBIServerObjects.getServerDocuments().saveNewDocument(doc, template, null);
}
else{ // OTHER DOCUMENTS CASE
spagoBIServerObjects.getServerDocuments().uploadTemplate(idInteger, template);
}
// ALl documents case
// in case of dataset definition changed the dataset label as file metadata must be changed
if(found != null){
try {
fileSel2.setPersistentProperty(SpagoBIStudioConstants.DATASET_ID, found.getId().toString());
fileSel2.setPersistentProperty(SpagoBIStudioConstants.DATASET_LABEL, found.getLabel());
fileSel2.setPersistentProperty(SpagoBIStudioConstants.DATASET_NAME, found.getName());
fileSel2.setPersistentProperty(SpagoBIStudioConstants.DATASET_DESCRIPTION, found.getDescription());
} catch (CoreException e) {
logger.error("Errorn updating file metadata about new dataset associated: go on anyway");
}
}
}
}
catch (NoActiveServerException e1) {
// no active server found
noActiveServerException.setNoServer(true);
return;
}
catch (RemoteException 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;
}
monitor.done();
if (monitor.isCanceled())
logger.error("Operation not ended",new InterruptedException("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 false;
} catch (InterruptedException 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 false;
}
if(documentException.isNoDocument()){
logger.error("Document not retrieved; check it is still on server and you have enough permission to reach it");
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");
newDeploy = true;
sbdw.setNewDeployFromOld(true);
}
if(noActiveServerException.isNoServer()){
logger.error("No server is defined active");
MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
"Error", "No server is defined active");
return false;
}
dialog.close();
if(!newDeploy){
MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),"Deploy succesfull", "Deployed to the associated document "+document_label+" succesfull");
logger.debug("Deployed to the associated document "+document_label+" succesfull");
}
}
else{
newDeploy = true;
}
if(newDeploy)
{
logger.debug("deploy a new Document: start wizard");
// init wizard
sbdw.init(PlatformUI.getWorkbench(), sel);
// Create the wizard dialog
WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),sbdw);
// {
// @Override
// protected void configureShell(Shell newShell) {
// super.configureShell(newShell);
// newShell.setSize(1300, 600);
// }
// };
// Open the wizard dialog
dialog.open();
}
logger.debug("OUT");
return true;
}
}