/** 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.geo.editors; import it.eng.spagobi.server.services.api.bo.IDataSet; import it.eng.spagobi.server.services.api.bo.IDataStoreMetadata; import it.eng.spagobi.server.services.api.bo.IDataStoreMetadataField; import it.eng.spagobi.server.services.api.exception.MissingParValueException; import it.eng.spagobi.server.services.api.exception.NoServerException; import it.eng.spagobi.studio.geo.Activator; import it.eng.spagobi.studio.geo.editors.model.bo.ColumnBO; import it.eng.spagobi.studio.geo.editors.model.bo.HierarchyBO; import it.eng.spagobi.studio.geo.editors.model.bo.LayerBO; import it.eng.spagobi.studio.geo.editors.model.bo.LayersBO; import it.eng.spagobi.studio.geo.editors.model.bo.LevelBO; import it.eng.spagobi.studio.geo.editors.model.bo.MetadataBO; import it.eng.spagobi.studio.geo.editors.model.bo.ModelBO; import it.eng.spagobi.studio.geo.editors.model.geo.Column; import it.eng.spagobi.studio.geo.editors.model.geo.GEODocument; import it.eng.spagobi.studio.geo.editors.model.geo.Hierarchies; import it.eng.spagobi.studio.geo.editors.model.geo.Hierarchy; import it.eng.spagobi.studio.geo.editors.model.geo.Layer; import it.eng.spagobi.studio.geo.editors.model.geo.Layers; import it.eng.spagobi.studio.geo.editors.model.geo.Level; import it.eng.spagobi.studio.geo.editors.model.geo.Metadata; import it.eng.spagobi.studio.geo.util.DeepCopy; import it.eng.spagobi.studio.geo.util.DesignerUtils; import it.eng.spagobi.studio.geo.util.XmlTemplateGenerator; import it.eng.spagobi.studio.utils.bo.DataSource; import it.eng.spagobi.studio.utils.bo.DataStoreMetadata; import it.eng.spagobi.studio.utils.bo.DataStoreMetadataField; import it.eng.spagobi.studio.utils.bo.Dataset; import it.eng.spagobi.studio.utils.bo.GeoFeature; import it.eng.spagobi.studio.utils.bo.GeoMap; import it.eng.spagobi.studio.utils.exceptions.NoActiveServerException; import it.eng.spagobi.studio.utils.services.SpagoBIServerObjectsFactory; import it.eng.spagobi.studio.utils.util.SpagoBIStudioConstants; import java.io.ByteArrayInputStream; import java.io.IOException; import java.rmi.RemoteException; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Vector; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.events.ExpansionAdapter; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.forms.widgets.TableWrapLayout; import org.eclipse.ui.part.EditorPart; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class GEOEditor extends EditorPart { private static Logger logger = LoggerFactory.getLogger(GEOEditor.class); protected boolean isDirty = false; final ImageDescriptor measureIcon = AbstractUIPlugin .imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/measure.gif"); final ImageDescriptor idIcon = AbstractUIPlugin .imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/key.gif"); String projectName = null; private Vector<String> dataSets; private Vector<String> maps; private HashMap<String, Dataset> datasetInfos; private HashMap<String, GeoMap> mapInfos; private HashMap<String, IDataStoreMetadata> tempDsMetadataInfos; private HashMap<String, GeoFeature[]> tempMapMetadataInfos; private String selectedDataset; private String selectedMap; private Table datasetTable; private Combo datasetCombo; private Table mapTable; private Vector<TableEditor> datasetTableEditors = new Vector<TableEditor>(); private Vector<TableEditor> mapTableEditors = new Vector<TableEditor>(); private MeasuresDesigner measuresDesigner; private static final int DATASET_NAME = 0; private static final int DATASET_CLASS = 1; private static final int DATASET_SELECT = 2; private static final int DATASET_AGGREGATION = 3; private static final int FEATURE_NAME = 0; private static final int FEATURE_DESCR = 1; private static final int FEATURE_DEFAULT_LEVEL = 2; private static final int FEATURE_DEFAULT_COLORS = 3; private GEODocument geoDocument; public void init(IEditorSite site, IEditorInput input) { logger.debug("IN"); try { this.setPartName(input.getName()); QualifiedName ciao = SpagoBIStudioConstants.MADE_WITH_STUDIO; FileEditorInput fei = (FileEditorInput) input; IFile file = fei.getFile(); projectName = file.getProject().getName(); ModelBO bo = new ModelBO(); try { geoDocument = bo.createModel(file); bo.saveModel(geoDocument); } catch (CoreException e) { e.printStackTrace(); logger.error(GEOEditor.class.toString() + ": Error in reading template", e); throw (new PartInitException("Error in reading template")); } setInput(input); setSite(site); mapInfos = new HashMap<String, GeoMap>(); datasetInfos = new HashMap<String, Dataset>(); tempDsMetadataInfos = new HashMap<String, IDataStoreMetadata>(); tempMapMetadataInfos = new HashMap<String, GeoFeature[]>(); } catch (Exception e) { logger.warn("Error occurred:" + e.getMessage()); } logger.debug("OUT"); } public void initializeEditor(GEODocument geoDocument) { logger.debug("IN"); // clean the properties View IWorkbenchWindow a = PlatformUI.getWorkbench().getWorkbenchWindows()[0]; // Document properties IWorkbenchPage aa = a.getActivePage(); IDataSet[] dataSets = null; Vector<IDataSet> datasetVector; SpagoBIServerObjectsFactory proxyServerObjects = null; try{ proxyServerObjects = new SpagoBIServerObjectsFactory(projectName); dataSets = proxyServerObjects.getServerDatasets().getDataSetList(); datasetVector = proxyServerObjects.getServerDatasets().getAllDatasets(); for (Iterator iterator = datasetVector.iterator(); iterator .hasNext();) { Dataset dataset = (Dataset) iterator.next(); datasetInfos.put(dataset.getLabel(), dataset); } Vector<GeoMap> mapVector = proxyServerObjects.getServerMaps().getAllGeoMaps(); for (Iterator iterator = mapVector.iterator(); iterator.hasNext();) { GeoMap geoMap = (GeoMap) iterator.next(); mapInfos.put(geoMap.getName(), geoMap); } } catch (NoActiveServerException e1) { logger.error("No active server found", e1); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "No active server found"); return; } catch (RemoteException e1) { logger.error("Error in retrieving the dataset and maps list", e1); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "Error in retrieving the dataset and maps list"); return; }catch (Exception e1) { logger.error("Not working server found", e1); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error", "Not working server found"); return; } // SpagoBIServerObjects proxyServerObjects = null; // try{ // proxyServerObjects = new SpagoBIServerObjects(projectName); // // } // catch (NoActiveServerException e1) { // logger.error("No active server found", e1); // MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), // "Error", "No active server found"); // return; // } // // try { // SDKProxyFactory proxyFactory = new SDKProxyFactory(projectName); // DataSetsSDKServiceProxy dataSetsServiceProxy = proxyFactory // .getDataSetsSDKServiceProxy(); // sdkDataSets = dataSetsServiceProxy.getDataSets(); // int i = 0; // } catch (Exception e) { // logger.error( // "No comunication with SpagoBI server, could not retrieve dataset informations", // e); // } // SpagoBIServerObjects sbso = new SpagoBIServerObjects(projectName); // Vector<Dataset> datasetVector; // try { // datasetVector = sbso.getAllDatasets(); // // for (Iterator iterator = datasetVector.iterator(); iterator // .hasNext();) { // Dataset dataset = (Dataset) iterator.next(); // datasetInfos.put(dataset.getLabel(), dataset); // } // Vector<GeoMap> mapVector = sbso.getAllGeoMaps(); // for (Iterator iterator = mapVector.iterator(); iterator.hasNext();) { // GeoMap geoMap = (GeoMap) iterator.next(); // mapInfos.put(geoMap.getName(), geoMap); // } // } catch (NoServerException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } logger.debug("OUT"); } @Override public void createPartControl(Composite parent) { logger.debug("IN"); FormToolkit toolkit = new FormToolkit(parent.getDisplay()); final ScrolledForm form = toolkit.createScrolledForm(parent); TableWrapLayout layout = new TableWrapLayout(); layout.numColumns = 1; layout.horizontalSpacing = 20; layout.verticalSpacing = 10; layout.topMargin = 20; layout.leftMargin = 20; form.getBody().setLayout(layout); final Section section = toolkit.createSection(form.getBody(), Section.TITLE_BAR | SWT.RESIZE | SWT.TOP); //section.setSize(1000, 1000); section.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { // parent.setSize(width, height); form.reflow(true); } }); section.setText("GEO designer"); Composite sectionClient = toolkit.createComposite(section, SWT.RESIZE); GridLayout gl = new GridLayout(); gl.numColumns = 2; gl.makeColumnsEqualWidth = true; gl.marginHeight = 5; gl.marginRight = 5; gl.marginLeft = 5; sectionClient.setLayout(gl); measuresDesigner = new MeasuresDesigner(sectionClient, this, geoDocument); initializeEditor(geoDocument); // creazione delle combo e tabelle Group datasetGroup = new Group(sectionClient, SWT.FILL | SWT.RESIZE); datasetGroup.setSize(800, 600); datasetGroup.setLayout(sectionClient.getLayout()); Group mapGroup = new Group(sectionClient, SWT.FILL | SWT.RESIZE); mapGroup.setSize(800, 600); mapGroup.setLayout(sectionClient.getLayout()); createDatasetCombo(sectionClient, datasetGroup, form); createMapCombo(sectionClient, mapGroup, form); createDatasetTable(sectionClient, datasetGroup); //enter couple of indications to the user: Color color = new org.eclipse.swt.graphics.Color(sectionClient.getDisplay(), 255,0,0); String infoText ="Once hierarchies are set:\n right click on 'measure' typed column to add KPI settings \n right click on 'geoid' typed column to add granularity level."; Label infos = new Label(sectionClient, SWT.LEFT); infos.setText(infoText); infos.setForeground(color); createMapTable(sectionClient, mapGroup); section.setClient(sectionClient); Section section0 = toolkit.createSection(form.getBody(), Section.DESCRIPTION|Section.TITLE_BAR|Section.TWISTIE); Composite sectionHier = toolkit.createComposite(section0, SWT.RESIZE); sectionHier.setLayout(gl); section0.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { form.reflow(true); } }); section0.setText("Hierarchies"); section0.setDescription("Define Hierarchies and Levels"); HierarchiesDesigner designer = new HierarchiesDesigner(sectionHier, this); geoDocument = Activator.getDefault().getGeoDocument(); designer.setGeoDocument(geoDocument); designer.createHierarchiesTree(sectionHier, toolkit); section0.setClient(sectionHier); Section section1 = toolkit.createSection(form.getBody(), Section.DESCRIPTION|Section.TITLE_BAR|Section.TWISTIE); Composite sectionCrossNav = toolkit.createComposite(section1, SWT.RESIZE); sectionCrossNav.setLayout(gl); section1.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { form.reflow(true); } }); section1.setText("Cross Navigation"); section1.setDescription("Fill parameters for Cross Navigation"); CrossNavigationDesigner crossNavigationDesigner = new CrossNavigationDesigner(sectionCrossNav, this, geoDocument); crossNavigationDesigner.createCrossnavigationTable(sectionCrossNav, toolkit); section1.setClient(sectionCrossNav); Section section2 = toolkit.createSection(form.getBody(), Section.DESCRIPTION|Section.TITLE_BAR|Section.TWISTIE); Composite sectionGUI = toolkit.createComposite(section2, SWT.RESIZE); sectionGUI.setLayout(gl); section2.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { form.reflow(true); } }); section2.setText("GUI Settings - Windows"); section2.setDescription("Insert parameters for GUI Settings Windows"); GuiSettingsDesigner guiSettingsDesigner = new GuiSettingsDesigner(sectionGUI, this, geoDocument); guiSettingsDesigner.createGuiSettingsWindows(sectionGUI, toolkit); section2.setClient(sectionGUI); Section section3 = toolkit.createSection(form.getBody(), Section.DESCRIPTION|Section.TITLE_BAR|Section.TWISTIE); Composite sectionGUIParams = toolkit.createComposite(section3, SWT.RESIZE); sectionGUIParams.setLayout(gl); section3.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { form.reflow(true); } }); section3.setText("GUI Settings - Params"); section3.setDescription("Insert parameters for GUI Settings Params"); GuiSettingsDesigner guiSettingsDesignerParams = new GuiSettingsDesigner(sectionGUIParams, this, geoDocument); guiSettingsDesignerParams.createGuiSettingsParams(sectionGUIParams, toolkit); section3.setClient(sectionGUIParams); Section section4 = toolkit.createSection(form.getBody(), Section.DESCRIPTION|Section.TITLE_BAR|Section.TWISTIE | SWT.RESIZE); Composite sectionGUILabels = toolkit.createComposite(section4, SWT.NONE); sectionGUILabels.setLayout(gl); section4.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { form.reflow(true); } }); section4.setText("GUI Settings - Labels"); section4.setDescription("Insert parameters for GUI Settings Labels"); GuiSettingsLabelDesigner guiSettingsDesignerLabels = new GuiSettingsLabelDesigner(sectionGUILabels, this, geoDocument); guiSettingsDesignerLabels.createGuiSettingsLabels(sectionGUILabels, toolkit, form); section4.setClient(sectionGUILabels); section.pack(); sectionClient.pack(); logger.debug("OUT"); } private void createDatasetCombo(final Composite sectionClient, final Group datasetGroup, final ScrolledForm form) { logger.debug("IN"); GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING); gd.horizontalSpan = 1; gd.horizontalAlignment = SWT.END; gd.grabExcessHorizontalSpace = true; gd.minimumWidth = 120; gd.verticalAlignment = SWT.TOP; Label datasetLabel = new Label(datasetGroup, SWT.SIMPLE); datasetLabel.setText("Data Set"); datasetLabel.setAlignment(SWT.RIGHT); Metadata metadata = MetadataBO.getMetadata(geoDocument); datasetCombo = new Combo(datasetGroup, SWT.SIMPLE | SWT.DROP_DOWN | SWT.READ_ONLY); int index = 0; Iterator<String> iterator = datasetInfos.keySet().iterator(); String[] datasets = new String[datasetInfos.keySet().size()]; int i =0; while (iterator.hasNext()) { String name = (String) iterator.next(); datasets[i] = name; //datasetCombo.add(name); i++; index++; } Arrays.sort(datasets); datasetCombo.setItems(datasets); // get the selection one! Index are changed so check out for name boolean found = false; for (int j = 0; j<datasetCombo.getItems().length && !found;j++) { String name = datasetCombo.getItems()[j]; if (metadata != null && metadata.getDataset() != null && metadata.getDataset().equals(name)) { datasetCombo.select(j); found = true; } } ///datasource if(metadata != null){ //Dataset dataset = datasetInfos.get(metadata.getDataset()); /* if(dataset != null){ Integer datasourceId = dataset.getJdbcDataSourceId(); SpagoBIServerObjects sbso=new SpagoBIServerObjects(); DataSource sdkdataSource; try { sdkdataSource = sbso.getDataSourceById(datasourceId); sdkdataSource.getUrlConnection(); Datasource datasource = DatasourceBO.setNewDatasource(geoDocument); datasource.setDriver(sdkdataSource.getDriver()); datasource.setPassword(sdkdataSource.getPwd()); datasource.setType("connection"); datasource.setUrl(sdkdataSource.getUrlConnection()); datasource.setUser(sdkdataSource.getName()); } catch (NoServerException e3) { logger.error(e3.getMessage(), e3); } }*/ } datasetCombo.setLayoutData(gd); datasetCombo.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { // Once selected the dataset fill the table with its metadata, // check first if they have been already recovered! datasetTable.removeAll(); datasetTable.setItemCount(0); datasetTable.pack(); SpagoBIServerObjectsFactory sbso= null; try{ sbso =new SpagoBIServerObjectsFactory(projectName); }catch (NoActiveServerException e1) { logger.error("No active server found",e1); return; } if (datasetTableEditors != null) { for (int i = 0; i < datasetTableEditors.size(); i++) { TableEditor editor = datasetTableEditors.elementAt(i); Control old = editor.getEditor(); if (old != null) old.dispose(); } } int indexSelection = datasetCombo.getSelectionIndex(); String datasetLabel = datasetCombo.getItem(indexSelection); selectedDataset = datasetLabel; IDataStoreMetadata dataStoreMetadata = null; // get the metadata if (tempDsMetadataInfos.get(datasetLabel) != null) { dataStoreMetadata = tempDsMetadataInfos.get(datasetLabel); } else { Dataset dataset = datasetInfos.get(datasetLabel); /* it.eng.spagobi.studio.geo.editors.model.geo.Dataset datasetGeo = DatasetBO .setNewDataset(geoDocument, dataset.getJdbcQuery());*/ //solvedeccoqui //Integer datasourceId = dataset.getJdbcDataSourceId(); DataSource sdkdataSource; try { Integer datasourceId = (dataset.getFromConfiguration(Dataset.DATA_SOURCE) != null) ? (Integer)dataset.getFromConfiguration(Dataset.DATA_SOURCE) : null; sdkdataSource = sbso.getServerDataSources().getDataSourceById(datasourceId); sdkdataSource.getUrlConnection(); /* Datasource datasource = DatasourceBO.setNewDatasource(geoDocument); datasource.setDriver(sdkdataSource.getDriver()); datasource.setPassword(sdkdataSource.getPwd()); datasource.setType("connection"); datasource.setUrl(sdkdataSource.getUrlConnection()); datasource.setUser(sdkdataSource.getName());*/ } catch (Exception e3) { logger.error(e3.getMessage(), e3); } try { dataStoreMetadata = sbso.getServerDatasets().getDataStoreMetadata(dataset.getId()); if (dataStoreMetadata != null) { tempDsMetadataInfos.put(datasetLabel, dataStoreMetadata); } else { logger.warn("Dataset returned no metadata"); MessageDialog.openWarning(sectionClient.getShell(), "Warning", "Dataset with label = " + datasetLabel + " returned no metadata"); } } catch (MissingParValueException e2) { logger.error( "Could not execute dataset with label = " + datasetLabel + " due to parameters lack: execute dataset test in server to retrieve metadata", e2); MessageDialog .openError( sectionClient.getShell(), "Error", "Could not execute dataset with label = " + datasetLabel + " due to parameters lack: execute dataset test in server to retrieve metadata"); } catch (NoServerException e1) { logger.error( "Error No comunciation with server retrieving dataset with label = " + datasetLabel + " metadata", e1); MessageDialog.openError(sectionClient.getShell(), "Error", "No comunciation with server retrieving dataset with label = " + datasetLabel + " metadata"); } } if (dataStoreMetadata != null) { fillDatasetTable(dataStoreMetadata, true); } // resize the row height using a MeasureItem listener datasetTable.addListener(SWT.MeasureItem, new Listener() { public void handleEvent(Event event) { // height cannot be per row so simply set event.height = 20; } }); datasetTable.pack(); datasetGroup.pack(); datasetGroup.redraw(); /* sectionClient.getParent().pack(); sectionClient.getParent().redraw();*/ form.reflow(true); setIsDirty(true); } public void widgetDefaultSelected(SelectionEvent e) { } }); logger.debug("OUT"); } private void createMapCombo(final Composite sectionClient, final Group mapGroup, final ScrolledForm form) { logger.debug("IN"); GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING); gd.horizontalSpan = 1; gd.horizontalAlignment = SWT.END; gd.grabExcessHorizontalSpace = true; gd.minimumWidth = 120; gd.verticalAlignment = SWT.TOP; Label mapLabel = new Label(mapGroup, SWT.SIMPLE); mapLabel.setText("Map"); mapLabel.setAlignment(SWT.RIGHT); Layers layers = LayersBO.getLayers(geoDocument); final Combo mapCombo = new Combo(mapGroup, SWT.SIMPLE | SWT.DROP_DOWN | SWT.READ_ONLY); int index = 0; String[] maps = new String[mapInfos.keySet().size()]; Iterator<String> iterator = mapInfos.keySet().iterator(); int i =0; while (iterator.hasNext()) { String name = (String) iterator.next(); maps[i] = name; i++; index++; } Arrays.sort(maps); mapCombo.setItems(maps); // get the selection one! Index are changed so check out for name boolean found = false; for (int j = 0; j<mapCombo.getItems().length && !found;j++) { String name = mapCombo.getItems()[j]; if (layers != null && layers.getMapName() != null && layers.getMapName().equals(name)) { mapCombo.select(j); found = true; } } mapCombo.setLayoutData(gd); mapCombo.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { // Once selected the dataset fill the table with its metadata, // check first if they have been already recovered! mapTable.removeAll(); mapTable.setItemCount(0); mapTable.pack(); SpagoBIServerObjectsFactory sbso= null; try{ sbso =new SpagoBIServerObjectsFactory(projectName); }catch (NoActiveServerException e1) { logger.error("No active server found",e1); return; } if (mapTableEditors != null) { for (int i = 0; i < mapTableEditors.size(); i++) { TableEditor editor = mapTableEditors.elementAt(i); Control old = editor.getEditor(); if (old != null) old.dispose(); } } int indexSelection = mapCombo.getSelectionIndex(); String mapLabel = mapCombo.getItem(indexSelection); selectedMap = mapLabel; //add mapName to mapprovider geoDocument.getMapProvider().setMapName(selectedMap); GeoFeature[] geoFeatures = null; // get the metadata if (tempMapMetadataInfos.get(mapLabel) != null) { geoFeatures = tempMapMetadataInfos.get(mapLabel); } else { GeoMap geoMap = mapInfos.get(mapLabel); try { geoFeatures = sbso.getServerMaps() .getFeaturesByMapId(geoMap.getMapId()); if (geoFeatures != null) { tempMapMetadataInfos.put(mapLabel, geoFeatures); } else { logger .warn("No features returned from map with label " + mapLabel); MessageDialog.openWarning(sectionClient.getShell(), "Warning", "No features returned from map with label " + mapLabel); } } catch (Exception e1) { logger.error( "Could not get features associated to map with label = " + mapLabel, e1); MessageDialog.openError(sectionClient.getShell(), "Error", "Could not get features associated to map with label = " + mapLabel); } } if (geoFeatures != null) { fillMapTable(geoFeatures, sectionClient, true); } // resize the row height using a MeasureItem listener mapTable.addListener(SWT.MeasureItem, new Listener() { public void handleEvent(Event event) { // height cannot be per row so simply set event.height = 25; } }); mapTable.redraw(); mapGroup.pack(); mapGroup.redraw(); form.reflow(true); setIsDirty(true); } public void widgetDefaultSelected(SelectionEvent e) { } }); logger.debug("OUT"); } private void createDatasetTable(final Composite sectionClient, Group datasetGroup) { logger.debug("IN"); GridData gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; datasetTable = new Table(datasetGroup, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION | SWT.CHECK); datasetTable.setLayoutData(gd); datasetTable.setLinesVisible(true); datasetTable.setHeaderVisible(true); String[] titles = { " Column name ", " Type ", " Select ", " Aggregation mode " }; for (int i = 0; i < titles.length; i++) { TableColumn column = new TableColumn(datasetTable, SWT.NONE); column.setText(titles[i]); // column.setResizable(true); } // look up for metadata stored in geodocument final Metadata metadata = MetadataBO.getMetadata(geoDocument); if (metadata != null && metadata.getDataset() != null && !metadata.getDataset().equals("")) { selectDataset(sectionClient, metadata); } else { for (int i = 0; i < 5; i++) { TableItem item = new TableItem(datasetTable, SWT.TRANSPARENT); } } for (int i = 0; i < titles.length; i++) { datasetTable.getColumn(i).pack(); } // resize the row height using a MeasureItem listener datasetTable.addListener(SWT.MeasureItem, new Listener() { public void handleEvent(Event event) { // height cannot be per row so simply set event.height = 20; } }); datasetTable.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { TableItem item = (TableItem)e.item; if(item != null){ String selType = e.detail == SWT.CHECK ? "Checked" : "Selected"; if(selType != null && selType.equals("Checked")){ String columnName = item.getText(); Column col = ColumnBO.getColumnByName(geoDocument, columnName); col.setChoosenForTemplate(item.getChecked()); setIsDirty(true); } } } }); // listener per measures --> right click datasetTable.addListener(SWT.MouseDown, new Listener() { public void handleEvent(Event event) { if (event.button == 3) { TableItem[] selection = datasetTable.getSelection(); // find the column Column col = ColumnBO.getColumnByName(geoDocument, selection[0].getText()); if (col != null && col.getType().equalsIgnoreCase("measure")) { measuresDesigner.createMeasuresShell(sectionClient, col .getColumnId()); }else if (col != null && col.getType().equalsIgnoreCase("geoid")) { //check if another geoid is already defined Column colGeoid = MetadataBO.geoidColumnExists(geoDocument); if(colGeoid == null ||(colGeoid != null && colGeoid.equals(col))){ createGeoIdHierarchiesShell(sectionClient, col); }else{ MessageDialog.openWarning(sectionClient.getShell(), "Warning", "Another column of type geoid is already defined."); } } else { MessageDialog.openWarning(sectionClient.getShell(), "Warning", "Operation denied."); } } } }); datasetTable.redraw(); logger.debug("OUT"); } private void createGeoIdHierarchiesShell(Composite sectionClient, final Column column){ logger.debug("IN"); final Shell dialog = new Shell (sectionClient.getDisplay(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); dialog.setText("Granularity Level"); FormLayout formLayout = new FormLayout (); formLayout.marginWidth = 10; formLayout.marginHeight = 10; formLayout.spacing = 10; dialog.setLayout (formLayout); Label label = new Label (dialog, SWT.RIGHT); label.setText ("Hierarchy:"); FormData data = new FormData (); data.width = 100; label.setLayoutData (data); Button cancel = new Button (dialog, SWT.PUSH); cancel.setText ("Cancel"); data = new FormData (); data.width = 60; data.right = new FormAttachment (100, 0); data.bottom = new FormAttachment (100, 0); cancel.setLayoutData (data); cancel.addSelectionListener (new SelectionAdapter () { public void widgetSelected (SelectionEvent e) { dialog.close (); } }); final Combo hierCombo = createHierachiesCombo(dialog); if(column != null && column.getHierarchy()!= null){ hierCombo.setText(column.getHierarchy()); } data = new FormData (); data.width = 200; data.left = new FormAttachment (label, 0, SWT.DEFAULT); data.right = new FormAttachment (100, 0); data.top = new FormAttachment (label, 0, SWT.CENTER); hierCombo.setLayoutData (data); //Level data = new FormData (); data.width = 100; data.top = new FormAttachment(hierCombo, 5); Label labelLevel = new Label (dialog, SWT.RIGHT); labelLevel.setText ("Level:"); labelLevel.setLayoutData (data); String hierarchyName = hierCombo.getText(); final Combo levelCombo = createLevelsCombo(dialog, hierarchyName); if(column != null && column.getLevel()!= null){ levelCombo.setText(column.getLevel()); } data = new FormData (); data.width = 200; data.left = new FormAttachment (labelLevel, 0, SWT.DEFAULT); data.right = new FormAttachment (100, 0); data.top = new FormAttachment (labelLevel, 0, SWT.CENTER); data.bottom = new FormAttachment (cancel, 0, SWT.DEFAULT); levelCombo.setLayoutData (data); hierCombo.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { String hierarchySelected = ((Combo)e.widget).getText(); recreateLevelsCombo(dialog, levelCombo, hierarchySelected); setIsDirty(true); levelCombo.redraw(); } public void widgetDefaultSelected(SelectionEvent e) { // TODO Auto-generated method stub } }); Button ok = new Button (dialog, SWT.PUSH); ok.setText ("OK"); data = new FormData (); data.width = 60; data.right = new FormAttachment (cancel, 0, SWT.DEFAULT); data.bottom = new FormAttachment (100, 0); ok.setLayoutData (data); ok.addSelectionListener (new SelectionAdapter () { public void widgetSelected (SelectionEvent e) { String level = levelCombo.getText(); String hierarchy = hierCombo.getText(); if(hierarchy != null && level != null){ column.setHierarchy(hierarchy); column.setLevel(level); } dialog.close (); } }); dialog.setDefaultButton (ok); dialog.pack (); dialog.open (); logger.debug("OUT"); } private Combo createHierachiesCombo(Composite dialog){ Combo hierCombo = new Combo(dialog, SWT.SIMPLE | SWT.DROP_DOWN | SWT.READ_ONLY); Hierarchies hierarchies=HierarchyBO.getAllHierarchies(geoDocument); if(hierarchies != null && hierarchies.getHierarchy() != null){ for(int i=0; i< hierarchies.getHierarchy().size(); i++){ Hierarchy hier = hierarchies.getHierarchy().elementAt(i); String name = hier.getName(); hierCombo.add(name); } } return hierCombo; } private Combo createLevelsCombo(Composite dialog, String hierarchyName){ Combo levelCombo = new Combo(dialog, SWT.SIMPLE | SWT.DROP_DOWN | SWT.READ_ONLY); if(hierarchyName != null && !hierarchyName.equals("")){ Vector<Level> levels=LevelBO.getLevelsByHierarchyName(geoDocument, hierarchyName); if(levels != null){ for(int i=0; i< levels.size(); i++){ Level level = levels.elementAt(i); String name = level.getName(); levelCombo.add(name); } } } return levelCombo; } private void recreateLevelsCombo(Composite dialog,Combo levelCombo, String hierarchyName){ levelCombo.removeAll(); if(hierarchyName != null && !hierarchyName.equals("")){ Vector<Level> levels=LevelBO.getLevelsByHierarchyName(geoDocument, hierarchyName); if(levels != null){ for(int i=0; i< levels.size(); i++){ Level level = levels.elementAt(i); String name = level.getName(); levelCombo.add(name); } } } } private void selectFeature(Composite sectionClient, Layers layers) { try { SpagoBIServerObjectsFactory sbso= null; try{ sbso =new SpagoBIServerObjectsFactory(projectName); }catch (NoActiveServerException e1) { logger.error("No active server found",e1); return; } selectedMap = layers.getMapName(); GeoMap geoMap = mapInfos.get(selectedMap); GeoFeature[] geoFeatures = sbso.getServerMaps().getFeaturesByMapId(geoMap.getMapId()); if (geoFeatures != null) { tempMapMetadataInfos.put(selectedMap, geoFeatures); fillMapTable(geoFeatures, sectionClient, false); } else { logger.warn("No features returned from map with label " + selectedMap); MessageDialog.openWarning(sectionClient.getShell(), "Warning", "No features returned from map with label " + selectedMap); } } catch (Exception e1) { logger.error( "Could not get features associated to map with label = " + selectedMap, e1); MessageDialog.openError(sectionClient.getShell(), "Error", "Could not get features associated to map with label = " + selectedMap); } } private void selectDataset(Composite sectionClient, Metadata metadata) { try { SpagoBIServerObjectsFactory sbso= null; try{ sbso =new SpagoBIServerObjectsFactory(projectName); }catch (NoActiveServerException e1) { logger.error("No active server found",e1); return; } selectedDataset = metadata.getDataset(); Dataset dataset = datasetInfos.get(metadata.getDataset()); IDataStoreMetadata dataStoreMetadata = sbso.getServerDatasets() .getDataStoreMetadata(dataset.getId()); if (dataStoreMetadata != null) { tempDsMetadataInfos.put(metadata.getDataset(), dataStoreMetadata); fillDatasetTable(dataStoreMetadata, false); } else { logger.warn("Dataset returned no metadata"); MessageDialog.openWarning(sectionClient.getShell(), "Warning", "Dataset with label = " + metadata.getDataset() + " returned no metadata"); } } catch (MissingParValueException e2) { logger.error("Could not execute dataset with label = " + metadata.getDataset() + " due to parameter lack: execute dataset test in server to retrieve metadata", e2); MessageDialog.openError(sectionClient.getShell(), "Error", "Could not execute dataset with label = " + metadata.getDataset() + " due to parameter lack: execute dataset test in server to retrieve metadata"); } catch (NoServerException e1) { logger.error( "Error No comunciation with server retrieving dataset with label = " + metadata.getDataset() + " metadata", e1); MessageDialog.openError(sectionClient.getShell(), "Error", "No comunciation with server retrieving dataset with label = " + metadata.getDataset() + " metadata"); } } private void createMapTable(Composite sectionClient, Group mapGroup) { logger.debug("IN"); GridData gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; mapTable = new Table(mapGroup, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION | SWT.CHECK); mapTable.setLayoutData(gd); mapTable.setLinesVisible(true); mapTable.setHeaderVisible(true); String[] titles = { " Feature name ", " Description ", "Select Default ", " Default Color " }; for (int i = 0; i < titles.length; i++) { TableColumn column = new TableColumn(mapTable, SWT.NONE); column.setText(titles[i]); // column.setResizable(true); } Layers layers = LayersBO.getLayers(geoDocument); if (layers != null && layers.getMapName() != null && !layers.getMapName().equals("")) { selectFeature(sectionClient, layers); } else { for (int i = 0; i < 5; i++) { TableItem item = new TableItem(mapTable, SWT.TRANSPARENT); } } for (int i = 0; i < titles.length; i++) { mapTable.getColumn(i).pack(); } // resize the row height using a MeasureItem listener mapTable.addListener(SWT.MeasureItem, new Listener() { public void handleEvent(Event event) { // height cannot be per row so simply set event.height = 25; } }); mapTable.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { TableItem item = (TableItem)e.item; if(item != null){ String selType = e.detail == SWT.CHECK ? "Checked" : "Selected"; if(selType != null && selType.equals("Checked")){ String featureId = item.getText(); Layer layer = LayerBO.getLayerByName(geoDocument, featureId); layer.setChoosenForTemplate(item.getChecked()); setIsDirty(true); } } } }); mapTable.redraw(); logger.debug("OUT"); } private void fillMapTable(GeoFeature[] geoFeatures, Composite sectionClient, boolean replace) { logger.debug("IN"); if (replace) { LayersBO.setNewLayers(geoDocument, selectedMap); } for (int i = 0; i < geoFeatures.length; i++) { GeoFeature geoFeature = geoFeatures[i]; Layer layer = LayerBO.getLayerByName(geoDocument, geoFeature .getName()); if (layer == null) { // if no column exists than create it layer = LayerBO.setNewLayer(geoDocument, geoFeature.getName(), selectedMap); } final Layer selectedLayer = layer; TableItem item = new TableItem(mapTable, SWT.CENTER); item.setChecked(selectedLayer.isChoosenForTemplate()); item.setText(FEATURE_NAME, geoFeature.getName()); TableEditor editor = new TableEditor(mapTable); Text newDescr = new Text(mapTable, SWT.BORDER); newDescr.setBackground(new Color(sectionClient.getDisplay(), new RGB(245, 245, 245))); newDescr.setText(geoFeature.getDescr() != null ? geoFeature .getDescr() : ""); if (layer != null && selectedLayer.getDescription() != null) { newDescr.setText(selectedLayer.getDescription()); } newDescr.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent me) { // System.out.println("Changed"); selectedLayer.setDescription(((Text) me.widget).getText()); setIsDirty(true); } }); editor.minimumWidth = newDescr.getBounds().x; editor.horizontalAlignment = SWT.CENTER; editor.grabHorizontal = true; editor.minimumHeight = newDescr.getBounds().y; editor.verticalAlignment = SWT.CENTER; editor.grabVertical = true; newDescr.selectAll(); newDescr.setFocus(); editor.setEditor(newDescr, item, FEATURE_DESCR); mapTableEditors.add(editor); final Button selButton = new Button(mapTable, SWT.RADIO); selButton.setText(""); editor = new TableEditor(mapTable); editor.minimumWidth = selButton.getBounds().x; editor.horizontalAlignment = SWT.CENTER; editor.grabHorizontal = true; editor.minimumHeight = selButton.getBounds().y; editor.verticalAlignment = SWT.CENTER; editor.grabVertical = true; editor.setEditor(selButton, item, FEATURE_DEFAULT_LEVEL); editor.layout(); final boolean[] isSelected = new boolean[1]; selButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { isSelected[0] = e.widget == selButton; selectedLayer.setSelected(String.valueOf(isSelected[0])); setIsDirty(true); } }); if (selectedLayer.getSelected() != null && selectedLayer.getSelected().equals("true")) { selButton.setSelection(true); } final String[] defaultFillColour = new String[1]; defaultFillColour[0] = "#FF0000"; if (selectedLayer.getDefaultFillColour() != null) { defaultFillColour[0] = selectedLayer.getDefaultFillColour(); } final Composite colorSection = DesignerUtils .createColorPickerFillLayer(mapTable, defaultFillColour[0], selectedLayer, this); String col = (String) colorSection.getData(); selectedLayer.setDefaultFillColour(defaultFillColour[0]); mapTableEditors.add(editor); editor = new TableEditor(mapTable); editor.horizontalAlignment = SWT.LEFT; editor.grabHorizontal = true; editor.setEditor(colorSection, item, FEATURE_DEFAULT_COLORS); editor.layout(); mapTableEditors.add(editor); } mapTable.pack(); mapTable.redraw(); logger.debug("OUT"); } private void fillDatasetTable(IDataStoreMetadata dataStoreMetadata, boolean replace) { // if dataset changed than new Metadata logger.debug("IN"); if (replace) { MetadataBO.setNewMetadata(geoDocument, selectedDataset); } for (int i = 0; i < dataStoreMetadata.getFieldsMetadata().length; i++) { IDataStoreMetadataField dsmf = dataStoreMetadata.getFieldsMetadata()[i]; // find out the current column Column column = ColumnBO.getColumnByName(geoDocument, dsmf .getName()); if (column == null) { // if no column exists than create it column = ColumnBO.setNewColumn(geoDocument, dsmf.getName(), selectedDataset); } final Column selectedColumn = column; final TableItem item = new TableItem(datasetTable, SWT.NONE); item.setChecked(selectedColumn.isChoosenForTemplate()); item.setText(DATASET_NAME, dsmf.getName()); item.setText(DATASET_CLASS, dsmf.getClassName()); // combo per geoid, measure final Combo comboSel = new Combo(datasetTable, SWT.SIMPLE | SWT.DROP_DOWN | SWT.READ_ONLY); //geoid is unique comboSel.add("geoid"); comboSel.add("measure"); //comboSel.add("geocd"); for (int k = 0; k < comboSel.getItemCount(); k++) { String typeText = comboSel.getItem(k); if (selectedColumn.getType() != null && selectedColumn.getType().equals(typeText)) { comboSel.select(k); } } if (comboSel.getText() != null) { item.setText(2, comboSel.getText()); if (comboSel.getText().equalsIgnoreCase("measure")) { item.setImage(0, measureIcon.createImage()); } else if(comboSel.getText().equalsIgnoreCase("geoid")){ item.setImage(0, idIcon.createImage()); }else{ if (item.getImage() != null) { item.setImage(0, null); } } } comboSel.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent event) { // per valorizzare table item col valore del widget // contenuto item.setText(2, comboSel.getText()); Column col = ColumnBO.getColumnByName(geoDocument, item.getText()); if (comboSel.getText().equalsIgnoreCase("measure")) { item.setImage(0, measureIcon.createImage()); } else if(comboSel.getText().equalsIgnoreCase("geoid")){ //check if another geoid is already defined Column colGeoid = MetadataBO.geoidColumnExists(geoDocument); if(colGeoid == null ||(colGeoid != null && colGeoid.equals(col))){ item.setImage(0, idIcon.createImage()); }else{ MessageDialog.openWarning(datasetTable.getParent().getShell(), "Warning", "Another column of type geoid is already defined."); comboSel.deselectAll(); } }else { if (item.getImage() != null) { item.setImage(0, null); } } // add type selectedColumn.setType(comboSel.getText()); setIsDirty(true); } }); selectedColumn.setType(comboSel.getText()); comboSel.pack(); TableEditor editor = new TableEditor(datasetTable); editor.minimumWidth = comboSel.getBounds().x; editor.horizontalAlignment = SWT.CENTER; editor.grabHorizontal = true; editor.minimumHeight = comboSel.getBounds().y; editor.verticalAlignment = SWT.CENTER; editor.grabVertical = true; editor.setEditor(comboSel, item, DATASET_SELECT); final Combo comboAgg = new Combo(datasetTable, SWT.SIMPLE | SWT.DROP_DOWN | SWT.READ_ONLY); comboAgg.add(""); comboAgg.add("sum"); comboAgg.add("avg"); for (int k = 0; k < comboAgg.getItemCount(); k++) { String aggText = comboAgg.getItem(k); if (selectedColumn.getAggFunction() != null && selectedColumn.getAggFunction().equals(aggText)) { comboAgg.select(k); } } comboAgg.pack(); // add aggregate function comboAgg.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent event) { selectedColumn.setAggFunction(comboAgg.getText()); setIsDirty(true); } }); datasetTableEditors.add(editor); editor = new TableEditor(datasetTable); editor.minimumWidth = comboAgg.getBounds().x; editor.horizontalAlignment = SWT.CENTER; editor.grabHorizontal = true; editor.minimumHeight = comboAgg.getBounds().y; editor.verticalAlignment = SWT.CENTER; editor.grabVertical = true; editor.setEditor(comboAgg, item, DATASET_AGGREGATION); datasetTableEditors.add(editor); item.setData(comboSel); datasetTable.pack(); datasetTable.redraw(); } logger.debug("OUT"); } @Override public void doSaveAs() { // TODO Auto-generated method stub } @Override public boolean isDirty() { // TODO Auto-generated method stub return isDirty; } @Override public void setFocus() { // TODO Auto-generated method stub } public void setIsDirty(boolean isDirty) { this.isDirty = isDirty; firePropertyChange(PROP_DIRTY); } @Override public void doSave(IProgressMonitor monitor) { // TODO Auto-generated method stub logger.debug("IN"); ByteArrayInputStream bais = null; try { FileEditorInput fei = (FileEditorInput) getEditorInput(); IFile file = fei.getFile(); ModelBO modelBO = new ModelBO(); GEODocument geoDocumentToSaveOnFile = (GEODocument)DeepCopy.copy(geoDocument); modelBO.cleanGEODocument(geoDocumentToSaveOnFile); String newContent = XmlTemplateGenerator .transformToXml(geoDocumentToSaveOnFile); // System.out.println("******** SAVING ***************"); // System.out.println(newContent); byte[] bytes = newContent.getBytes(); bais = new ByteArrayInputStream(bytes); file.setContents(bais, IFile.FORCE, null); } catch (CoreException e) { logger.error("Error while Saving GEO Template File", e); e.printStackTrace(); } finally { if (bais != null) try { bais.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } setIsDirty(false); logger.debug("OUT"); } @Override public boolean isSaveAsAllowed() { // TODO Auto-generated method stub return false; } public String getSelectedDataset() { return selectedDataset; } public void setSelectedDataset(String selectedDataset) { this.selectedDataset = selectedDataset; } public HashMap<String, IDataStoreMetadata> getTempDsMetadataInfos() { return tempDsMetadataInfos; } public void setTempDsMetadataInfos( HashMap<String, IDataStoreMetadata> tempDsMetadataInfos) { this.tempDsMetadataInfos = tempDsMetadataInfos; } public HashMap<String, it.eng.spagobi.studio.utils.bo.GeoFeature[]> getTempMapMetadataInfos() { return tempMapMetadataInfos; } public void setTempMapMetadataInfos( HashMap<String, GeoFeature[]> tempMapMetadataInfos) { this.tempMapMetadataInfos = tempMapMetadataInfos; } public HashMap<String, Dataset> getDatasetInfos() { return datasetInfos; } public void setDatasetInfos(HashMap<String, Dataset> datasetInfos) { this.datasetInfos = datasetInfos; } public HashMap<String, GeoMap> getMapInfos() { return mapInfos; } public void setMapInfos(HashMap<String, GeoMap> mapInfos) { this.mapInfos = mapInfos; } public String getSelectedMap() { return selectedMap; } public void setSelectedMap(String selectedMap) { this.selectedMap = selectedMap; } public Table getDatasetTable() { return datasetTable; } public void setDatasetTable(Table datasetTable) { this.datasetTable = datasetTable; } public String getProjectName() { return projectName; } public void setProjectName(String projectName) { this.projectName = projectName; } }