/** 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.dataset; import it.eng.spagobi.server.services.api.bo.IDataSet; import it.eng.spagobi.studio.core.util.JSONReader; import it.eng.spagobi.studio.core.wizards.SpagoBIDeployDatasetWizard; import it.eng.spagobi.studio.utils.bo.Dataset; import it.eng.spagobi.studio.utils.exceptions.NoActiveServerException; import it.eng.spagobi.studio.utils.exceptions.NoDocumentException; import it.eng.spagobi.studio.utils.exceptions.NotAllowedOperationStudioException; import it.eng.spagobi.studio.utils.services.SpagoBIServerObjectsFactory; import it.eng.spagobi.studio.utils.util.BiObjectUtilities; import it.eng.spagobi.studio.utils.util.SpagoBIStudioConstants; import java.lang.reflect.InvocationTargetException; import java.rmi.RemoteException; import org.eclipse.core.resources.IFile; 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.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DeployDatasetService { ISelection selection; private static Logger logger = LoggerFactory.getLogger(DeployDatasetService.class); String projectname = null; SpagoBIDeployDatasetWizard sbdw = null; public DeployDatasetService(ISelection _selection, SpagoBIDeployDatasetWizard _sbdw) { selection = _selection; sbdw = _sbdw; } /** if document has meadata associated do the automated deploy * * @return if automated eply has been done */ public boolean tryAutomaticDeploy(){ logger.debug("IN"); IStructuredSelection sel=(IStructuredSelection)selection; // go on only if ysou 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 datasetId=null; String datasetLabel=null; String datasetCategory = null; try { datasetId=fileSel.getPersistentProperty(SpagoBIStudioConstants.DATASET_ID); datasetLabel=fileSel.getPersistentProperty(SpagoBIStudioConstants.DATASET_LABEL); datasetCategory=fileSel.getPersistentProperty(SpagoBIStudioConstants.DATASET_CATEGORY); } catch (CoreException e) { logger.error("Error in retrieving dataset Label", e); } // IF File selected has already an id of datasetassociated do the upload wiyhout asking further informations boolean automatic = false; boolean newDeployFromOld = false; if(datasetId!=null){ logger.debug("Query already associated to dataset"+datasetId+" - "+datasetLabel+ " - of category "+datasetCategory ); final Integer idInteger=Integer.valueOf(datasetId); final String label2=datasetLabel; final org.eclipse.core.internal.resources.File fileSel2=fileSel; final NoDocumentException datasetException=new NoDocumentException(); final NoActiveServerException noActiveServerException=new NoActiveServerException(); final NotAllowedOperationStudioException notAllowedOperationStudioException = new NotAllowedOperationStudioException(); IRunnableWithProgress op = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException { monitor.beginTask("Deploying to dataset existing dataset with label: "+label2+" and ID: "+idInteger, IProgressMonitor.UNKNOWN); if(projectname == null){ projectname = fileSel2.getProject().getName(); } try{ logger.debug("dataset associated, upload the query to dataset "+label2); SpagoBIServerObjectsFactory spagoBIServerObjects = new SpagoBIServerObjectsFactory(projectname); // check dataset still exists IDataSet ds=spagoBIServerObjects.getServerDatasets().getDataSet(idInteger); if(ds==null){ datasetException.setNoDocument(true); logger.warn("Dataset no more present on server: with id "+idInteger); } else{ logger.debug("update query to dataset"); String queryStr = null; String adaptedQueryStrList = null; try{ JSONObject obj = JSONReader.createJSONObject(fileSel2); queryStr = obj.optString("query"); logger.debug("query is "+queryStr); adaptedQueryStrList = DeployDatasetService.adaptQueryToList(queryStr); logger.debug("adapted query list is "+adaptedQueryStrList); //solvedeccoqui // only the query may be modified by meta so it is the only refreshed ds.addToConfiguration(Dataset.QBE_JSON_QUERY, adaptedQueryStrList); //ds.setJsonQuery(adaptedQueryStrList); datasetException.setNoDocument(false); Integer dsId = spagoBIServerObjects.getServerDatasets().saveDataSet(ds); if(ds == null){ logger.error("Error while uploading dataset on server; check log on server"); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error on deploy", "Error while uploading dataset; check server log to have details"); } BiObjectUtilities.setFileDataSetMetaData(fileSel2,ds); } catch (Exception e) { logger.error("error in reading JSON object, update failed", e); } } } catch (NoActiveServerException e1) { // no active server found noActiveServerException.setNoServer(true); } catch (RemoteException e) { if(e.getClass().toString().equalsIgnoreCase("class it.eng.spagobi.sdk.exceptions.NotAllowedOperationException")){ logger.error("Current User has no permission to deploy dataset", e); notAllowedOperationStudioException.setNotAllowed(true); } else{ 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"); } } 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(datasetException.isNoDocument()){ logger.error("Document no more present"); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error upload", "Dataset with ID "+idInteger+" no more present on server; you can do a new deploy"); sbdw.setNewDeployFromOld(true); newDeployFromOld = 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(notAllowedOperationStudioException.isNotAllowed()){ logger.error("Current User has no permission to deploy dataset"); MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "", "Current user has no permission to deploy dataset"); return false; } if(!newDeployFromOld){ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),"Deploy succesfull", "Deployed to the associated dataset with label: "+datasetLabel+" and ID: "+idInteger+" succesfull"); logger.debug("Deployed to the associated document "+datasetLabel+" succesfull: ID: is "+idInteger); automatic = true; } } else{ automatic = false; } if(!automatic || newDeployFromOld ) { logger.debug("deploy a new Dataset: start wizard"); // init wizard sbdw.init(PlatformUI.getWorkbench(), sel); // Create the wizard dialog WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),sbdw); dialog.setPageSize(650, 300); // Open the wizard dialog dialog.open(); } logger.debug("OUT"); return automatic; } /** * TODO CHECK not to lose some configurations * @param object * @param query * @return */ public static String adaptQueryToList(String query){ String toReturn = null; toReturn = "{\"catalogue\": " + "{\"queries\": " + "["; toReturn+=query; toReturn+="]}, "+ " \"version\":"+SpagoBIStudioConstants.QBE_VERSION+"," + " \"generator\": \"SpagoBIMeta\" } "; logger.debug("adapted query is "+toReturn); return toReturn; } /** get metaQuery from JSON Object * * @param objSel * @return */ public static String getMetaQuery(IFile objSel){ logger.debug("IN"); String queryStr = null; try{ JSONObject obj = JSONReader.createJSONObject(objSel); //JSONObject queryMeta = obj.optJSONObject("queryMeta"); queryStr = obj.optString("query"); logger.debug("query is :"+queryStr); } catch (Exception e) { logger.error("error in reading JSON object", e); } return queryStr; } }