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