/**
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.downloadModelWizard;
import it.eng.spagobi.studio.core.Activator;
import it.eng.spagobi.studio.core.log.SpagoBILogger;
import it.eng.spagobi.studio.utils.exceptions.NoActiveServerException;
import it.eng.spagobi.studio.utils.services.SpagoBIServerObjectsFactory;
import it.eng.spagobi.studio.utils.util.ImageDescriptorGatherer;
import it.eng.spagobi.studio.utils.util.SpagoBIStudioConstants;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.IDialogPage;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.ProgressMonitorPart;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.PlatformUI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The Download Wizard let the user to select a model to download
*
*/
public class SpagoBIDownloadModelWizardPage extends WizardPage {
//private Text fileText;
private static Logger logger = LoggerFactory.getLogger(SpagoBIDownloadModelWizardPage.class);
private IStructuredSelection selection;
private Tree tree;
private Composite container;
private ProgressMonitorPart monitor;
private HashMap<String,String> models;
private List<String> actualModels = null;
String projectName = null;
private boolean viewTree = false;
private static ImageDescriptor treeBaseDescriptor = ImageDescriptorGatherer.getImageDesc("treebase.gif", Activator.PLUGIN_ID);
private static ImageDescriptor folderDescriptor = ImageDescriptorGatherer.getImageDesc("folder.gif", Activator.PLUGIN_ID);
private static ImageDescriptor fileDescriptor = ImageDescriptorGatherer.getImageDesc("spagobi_img16.bmp", Activator.PLUGIN_ID);
/**
* Constructor for SampleNewWizardPage.
*
* @param pageName
*/
public SpagoBIDownloadModelWizardPage(IStructuredSelection selection) {
super("wizardPage");
setTitle("Download Models Wizard");
setDescription("This wizard lets you download a model template from SpagoBI Resources");
this.selection = selection;
}
/** Creates the wizard form
* @see IDialogPage#createControl(Composite)
*/
public void createControl(Composite parent) {
logger.debug("IN");
monitor=new ProgressMonitorPart(getShell(), null);
initialize();
Composite container = new Composite(parent, SWT.NULL);
FillLayout layout= new FillLayout();
container.setLayout(layout);
IRunnableWithProgress op = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException {
monitor.beginTask("Download models", IProgressMonitor.UNKNOWN);
try{
SpagoBIServerObjectsFactory spagoBIServerObjects = new SpagoBIServerObjectsFactory(projectName);
models = spagoBIServerObjects.getServerDocuments().getAllDatamartModels();
}
catch (NoActiveServerException e1) {
SpagoBILogger.errorLog("No active server found", e1);
MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
"Error", "No active server found");
return;
}
catch (Exception e) {
SpagoBILogger.errorLog("No comunication with SpagoBI server", e);
MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "No comunication with server", "Error in comunication with SpagoBi Server; check its definition and check if the service is avalaible");
return;
}
monitor.done();
if (monitor.isCanceled())
SpagoBILogger.errorLog("Operation not ended",new InterruptedException("The long running operation was cancelled"));
}
};
ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell());
try {
dialog.run(true, true, op);
} catch (InvocationTargetException e1) {
SpagoBILogger.errorLog("No comunication with SpagoBI server", e1);
dialog.close();
MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "No comunication with server", "Error in comunication with SpagoBi Server; check its definition and check if the service is avalaible");
return;
} catch (InterruptedException e2) {
SpagoBILogger.errorLog("No comunication with SpagoBI server", e2);
dialog.close();
MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "No comunication with server", "Error in comunication with SpagoBi Server; check its definition and check if the service is avalaible");
return;
}
dialog.close();
try{
if (models == null || models.size() == 0){
SpagoBILogger.warningLog("No new models to download found");
MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
"Warning", "No Models to download found on the server!");
return;
}
tree = generateTree(container, models);
SpagoBILogger.infoLog("getChildren: " + tree.getItems().length);
if (tree == null || !isViewTree()){
SpagoBILogger.warningLog("No new models to download found");
MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
"Warning", "No new Models to download found!");
return;
}
}
catch (Exception e) {
SpagoBILogger.errorLog("Error while generating tree", e);
MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "Error in generating the tree, control if SpagoBI Server is defined and service is avalaible");
}
tree.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
//check if page is complete
boolean complete = isPageComplete(event);
if(complete){
setPageComplete(true);
}
else{
setPageComplete(false);
}
}
});
setControl(container);
logger.debug("OUT");
}
/**
* Tests if the current workbench selection is a suitable container to use.
*/
private void initialize() {
logger.debug("IN");
if (selection != null && selection.isEmpty() == false
&& selection instanceof IStructuredSelection) {
IStructuredSelection ssel = (IStructuredSelection) selection;
if (ssel.size() > 1)
return;
Object obj = ssel.getFirstElement();
if (obj instanceof IResource) {
IContainer container;
if (obj instanceof IContainer)
container = (IContainer) obj;
else
container = ((IResource) obj).getParent();
projectName =container.getProject().getName();
//gets all models yet present
try{
List tmpActualModels = new ArrayList();
IResource[] modelResources = container.members();
for (int i=0; i < modelResources.length; i++){
Object objRes = modelResources[i];
if (objRes instanceof IFile) {
IFile file = (IFile) objRes;
if (file.getName().endsWith(SpagoBIStudioConstants.MODEL_EXTENSION)){
tmpActualModels.add(file.getName());
}
}
}
this.setActualModels(tmpActualModels);
}catch(Exception e){
SpagoBILogger.errorLog("Error while getting actual models ", e);
}
}
}
logger.debug("OUT");
}
public Tree getTree() {
return tree;
}
public void setTree(Tree tree) {
this.tree = tree;
}
public HashMap<String, String> getModels() {
return models;
}
public void setModels(HashMap<String, String> models) {
this.models = models;
}
public List<String> getActualModels() {
return actualModels;
}
public void setActualModels(List<String> actualModels) {
this.actualModels = actualModels;
}
public boolean isViewTree() {
return viewTree;
}
public void setViewTree(boolean viewTree) {
this.viewTree = viewTree;
}
/**
* Downlaod wizard page is complete if something has been selected,
* both one or more model
*/
public boolean isPageComplete(Event event) {
boolean isComplete=false;
if(tree!=null){
TreeItem[] treeItems = tree.getSelection();
if(treeItems != null && treeItems.length >= 1){
if (event.item.getData() != null && event.item.getData().toString().endsWith(SpagoBIStudioConstants.MODEL_EXTENSION)){
isComplete = true;
}
}
}
return isComplete;
}
private Tree generateTree(Composite parent, HashMap mapModels){
container = parent;
tree = new Tree(parent, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
TreeItem root = new TreeItem(tree,SWT.SINGLE);
root.setText("Resources/qbe/datamarts");
root.setImage(treeBaseDescriptor.createImage());
createItemsList(root, mapModels);
setPageComplete(false);
return tree;
}
private void createItemsList(TreeItem parent, HashMap mapModels){
if (mapModels != null){
for (Iterator iterator = mapModels.keySet().iterator(); iterator.hasNext();) {
String folderName = (String) iterator.next();
String fileName = (String)mapModels.get(folderName);
if (!existModel(fileName)) {
setViewTree(true);
TreeItem currFolder = new TreeItem(parent, SWT.SINGLE);
currFolder.setText(folderName);
currFolder.setData(folderName);
currFolder.setImage(folderDescriptor.createImage());
TreeItem currModel = new TreeItem(currFolder, SWT.CHECK);
currModel.setText(fileName);
currModel.setData(fileName);
currModel.setImage(fileDescriptor.createImage());
}
}
}
}
private boolean existModel(String fileName){
boolean toReturn = false;
List actualModels = this.getActualModels();
for(int i=0; i < actualModels.size(); i++){
String modelName = (String)actualModels.get(i);
if (modelName.equals(fileName)){
toReturn = true;
break;
}
}
return toReturn;
}
}