it.eng.spagobi.sdk.datasets.impl.DataSetsSDKServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for it.eng.spagobi.sdk.datasets.impl.DataSetsSDKServiceImpl.java

Source

/* 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, without the "Incompatible With Secondary Licenses" notice. 
 * 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.sdk.datasets.impl;

import it.eng.spago.security.IEngUserProfile;
import it.eng.spagobi.commons.constants.SpagoBIConstants;
import it.eng.spagobi.commons.dao.DAOFactory;
import it.eng.spagobi.sdk.AbstractSDKService;
import it.eng.spagobi.sdk.datasets.DataSetsSDKService;
import it.eng.spagobi.sdk.datasets.bo.SDKDataSet;
import it.eng.spagobi.sdk.datasets.bo.SDKDataSetParameter;
import it.eng.spagobi.sdk.datasets.bo.SDKDataStoreMetadata;
import it.eng.spagobi.sdk.exceptions.InvalidParameterValue;
import it.eng.spagobi.sdk.exceptions.MissingParameterValue;
import it.eng.spagobi.sdk.exceptions.NotAllowedOperationException;
import it.eng.spagobi.sdk.utilities.SDKObjectsConverter;
import it.eng.spagobi.tools.dataset.bo.DataSetParameterItem;
import it.eng.spagobi.tools.dataset.bo.DataSetParametersList;
import it.eng.spagobi.tools.dataset.bo.GuiGenericDataSet;
import it.eng.spagobi.tools.dataset.bo.IDataSet;
import it.eng.spagobi.tools.dataset.common.datastore.IDataStore;
import it.eng.spagobi.tools.dataset.common.datawriter.JSONDataWriter;
import it.eng.spagobi.tools.dataset.common.metadata.IMetaData;
import it.eng.spagobi.tools.dataset.common.metadata.MetaData;
import it.eng.spagobi.tools.dataset.dao.IDataSetDAO;
import it.eng.spagobi.tools.dataset.utils.DatasetMetadataParser;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.validator.GenericValidator;
import org.apache.log4j.Logger;

public class DataSetsSDKServiceImpl extends AbstractSDKService implements DataSetsSDKService {

    static private Logger logger = Logger.getLogger(DataSetsSDKServiceImpl.class);

    public SDKDataSet getDataSet(Integer dataSetId) throws NotAllowedOperationException {
        SDKDataSet toReturn = null;
        logger.debug("IN: dataSetId in input = " + dataSetId);

        this.setTenant();

        try {
            super.checkUserPermissionForFunctionality(SpagoBIConstants.DATASET_MANAGEMENT,
                    "User cannot see datasets congifuration.");
            if (dataSetId == null) {
                logger.warn("DataSet identifier in input is null!");
                return null;
            }
            IDataSet dataSet = DAOFactory.getDataSetDAO().loadActiveIDataSetByID(dataSetId);
            if (dataSet == null) {
                logger.warn("DataSet with identifier [" + dataSetId + "] not existing.");
                return null;
            }
            toReturn = new SDKObjectsConverter().fromSpagoBiDataSetToSDKDataSet(dataSet.toSpagoBiDataSet());
        } catch (NotAllowedOperationException e) {
            throw e;
        } catch (Exception e) {
            logger.error("Error while retrieving SDKEngine list", e);
            logger.debug("Returning null");
            return null;
        } finally {
            this.unsetTenant();
            logger.debug("OUT");
        }
        return toReturn;
    }

    public SDKDataSet[] getDataSets() throws NotAllowedOperationException {
        SDKDataSet[] toReturn = null;
        logger.debug("IN");

        this.setTenant();

        try {
            super.checkUserPermissionForFunctionality(SpagoBIConstants.DATASET_MANAGEMENT,
                    "User cannot see datasets congifuration.");
            List dataSetList = DAOFactory.getDataSetDAO().loadAllActiveDataSets();
            toReturn = new SDKDataSet[dataSetList.size()];
            for (int i = 0; i < dataSetList.size(); i++) {
                IDataSet dataSet = (IDataSet) dataSetList.get(i);
                SDKDataSet sdkDataSet = new SDKObjectsConverter()
                        .fromSpagoBiDataSetToSDKDataSet(dataSet.toSpagoBiDataSet());
                toReturn[i] = sdkDataSet;
            }
        } catch (NotAllowedOperationException e) {
            throw e;
        } catch (Exception e) {
            logger.error("Error while retrieving SDKEngine list", e);
            logger.debug("Returning null");
            return null;
        } finally {
            this.unsetTenant();
            logger.debug("OUT");
        }
        return toReturn;
    }

    public SDKDataStoreMetadata getDataStoreMetadata(SDKDataSet sdkDataSet)
            throws NotAllowedOperationException, MissingParameterValue, InvalidParameterValue {
        SDKDataStoreMetadata toReturn = null;
        IMetaData dsMeta = null;
        Integer dataSetId = null;
        logger.debug("IN");

        this.setTenant();

        try {
            super.checkUserPermissionForFunctionality(SpagoBIConstants.DATASET_MANAGEMENT,
                    "User cannot see datasets congifuration.");
            if (sdkDataSet == null) {
                logger.warn("SDKDataSet in input is null!");
                return null;
            }
            dataSetId = sdkDataSet.getId();
            logger.debug("Looking for dataset with id = " + dataSetId);
            IDataSet dataSet = DAOFactory.getDataSetDAO().loadActiveIDataSetByID(dataSetId);
            if (dataSet == null) {
                logger.warn("DataSet with identifier [" + dataSetId + "] not found.");
                return null;
            }

            // First I try recovering dsMetadataField, only if not present I try executing the dataset, 

            String dsMetadata = dataSet.getDsMetadata();
            if (dsMetadata != null) {
                try {
                    dsMeta = new DatasetMetadataParser().xmlToMetadata(dsMetadata);

                } catch (Exception e) {
                    logger.warn("error in parsing, recover metadata executing again the dataset! ", e);
                }
            }

            if (dsMeta == null) {
                logger.warn("error in parsing, recover metadata executing again the dataset! ");
                Map parameters = new HashMap();
                List parametersToFill = null;
                String parametersXML = dataSet.toSpagoBiDataSet().getParameters();
                if (parametersXML != null && !((parametersXML.trim()).equals(""))) {
                    DataSetParametersList dsParam = new DataSetParametersList(parametersXML);
                    parametersToFill = dsParam.getItems();
                }
                if (parametersToFill != null && parametersToFill.size() > 0) {
                    Iterator it = parametersToFill.iterator();
                    while (it.hasNext()) {
                        DataSetParameterItem aDataSetParameterItem = (DataSetParameterItem) it.next();
                        SDKDataSetParameter sdkParameter = findRelevantSDKDataSetParameter(aDataSetParameterItem,
                                sdkDataSet);
                        if (sdkParameter == null) {
                            logger.error("SDKDataSetParameter for DataSetParameterItem with name ["
                                    + aDataSetParameterItem.getName() + "] not found!!");
                            throw new MissingParameterValue(aDataSetParameterItem.getName());
                        }
                        String[] values = sdkParameter.getValues();
                        logger.debug("Values set for parameter [" + aDataSetParameterItem.getName() + "] are: "
                                + values);
                        if (values == null || values.length == 0) {
                            logger.error(
                                    "SDKDataSetParameter contains no values for DataSetParameterItem with name ["
                                            + aDataSetParameterItem.getName() + "]!!");
                            throw new MissingParameterValue(aDataSetParameterItem.getName());
                        }
                        checkParameterValues(values, aDataSetParameterItem);
                        String parameterValues = getParameterValues(values, aDataSetParameterItem);
                        logger.debug("Setting values [" + parameterValues + "] for parameter with name = ["
                                + aDataSetParameterItem.getName() + "]");
                        parameters.put(aDataSetParameterItem.getName(), parameterValues);
                    }
                }
                dataSet.setParamsMap(parameters);
                dataSet.loadData();
                IDataStore dataStore = dataSet.getDataStore();
                dsMeta = (MetaData) dataStore.getMetaData();

            }

            toReturn = new SDKObjectsConverter().fromDataStoreMetadataToSDKDataStoreMetadata((MetaData) dsMeta);

        } catch (NotAllowedOperationException e) {
            throw e;
        } catch (MissingParameterValue e) {
            throw e;
        } catch (InvalidParameterValue e) {
            throw e;
        } catch (Exception e) {
            logger.error("Error while retrieving SDKDataStoreMetadata for dataset with id = " + dataSetId, e);
            logger.debug("Returning null");
            return null;
        } finally {
            this.unsetTenant();
            logger.debug("OUT");
        }
        return toReturn;
    }

    public Integer saveDataset(SDKDataSet sdkDataSet) throws NotAllowedOperationException {
        logger.debug("IN");
        Integer dataSetId = null;
        Integer toReturn = null;

        this.setTenant();

        try {
            IEngUserProfile profile = getUserProfile();
            super.checkUserPermissionForFunctionality(SpagoBIConstants.DATASET_MANAGEMENT,
                    "User cannot see datasets congifuration.");
            if (sdkDataSet == null) {
                logger.warn("SDKDataSet in input is null!");
                return null;
            }
            //defines the new dataset from the sdk object
            GuiGenericDataSet sbiDataset = new SDKObjectsConverter().fromSDKDatasetToBIDataset(sdkDataSet);

            dataSetId = sdkDataSet.getId();
            logger.debug("Looking for dataset with id = " + dataSetId);
            if (dataSetId == null) {
                logger.warn("DataSet with identifier [" + dataSetId + "] not found. Create it!");
                IDataSetDAO dataSetDao = DAOFactory.getDataSetDAO();
                dataSetDao.setUserProfile(profile);
                toReturn = dataSetDao.insertDataSet(sbiDataset);
                if (toReturn != null) {
                    logger.info("DataSet saved with id = " + toReturn);
                } else {
                    logger.error("DataSet not modified!!");
                }
            } else {
                logger.warn("DataSet with identifier [" + dataSetId + "] found. Modified it!");
                IDataSetDAO datasetDAO = DAOFactory.getDataSetDAO();
                datasetDAO.setUserProfile(profile);
                datasetDAO.modifyDataSet(sbiDataset);
            }

        } catch (Exception e) {
            logger.error("Error while saving dataset", e);
            return null;
            // TODO: throw an exception when error rises
        } finally {
            this.unsetTenant();
            logger.debug("OUT");
        }

        return toReturn;
    }

    /**
     * 
     */
    public String executeDataSet(String label, SDKDataSetParameter[] params) throws NotAllowedOperationException {
        String toReturn = null;
        logger.debug("IN: label in input = " + label);

        this.setTenant();

        try {
            super.checkUserPermissionForFunctionality(SpagoBIConstants.DATASET_MANAGEMENT,
                    "User cannot see datasets congifuration.");
            if (label == null) {
                logger.warn("DataSet identifier in input is null!");
                return null;
            }
            IDataSet dataSet = DAOFactory.getDataSetDAO().loadActiveDataSetByLabel(label);
            if (dataSet == null) {
                logger.warn("DataSet with label [" + label + "] not existing.");
                return null;
            }
            if (params != null && params.length > 0) {
                HashMap parametersFilled = new HashMap();
                for (int i = 0; i < params.length; i++) {
                    SDKDataSetParameter par = params[i];
                    parametersFilled.put(par.getName(), par.getValues()[0]);
                    logger.debug("Add parameter: " + par.getName() + "/" + par.getValues()[0]);
                }
                dataSet.setParamsMap(parametersFilled);
            }
            dataSet.loadData();
            //toReturn = dataSet.getDataStore().toXml();

            JSONDataWriter writer = new JSONDataWriter();
            toReturn = (writer.write(dataSet.getDataStore())).toString();

        } catch (NotAllowedOperationException e) {
            throw e;
        } catch (Exception e) {
            logger.error("Error while retrieving SDKEngine list", e);
            logger.debug("Returning null");
            return null;
        } finally {
            this.unsetTenant();
            logger.debug("OUT");
        }
        return toReturn;
    }

    private String getParameterValues(String[] values, DataSetParameterItem dataSetParameterItem) {
        logger.debug("IN");
        StringBuffer toReturn = new StringBuffer();
        try {
            String parameterType = dataSetParameterItem.getType();
            if (parameterType.equalsIgnoreCase("String")) {
                for (int i = 0; i < values.length; i++) {
                    String value = values[i];
                    if (!value.startsWith("'")) {
                        value = "'" + value;
                    }
                    if (!value.endsWith("'")) {
                        value = value + "'";
                    }
                    toReturn.append(value);
                    if (i < values.length - 1) {
                        toReturn.append(",");
                    }
                }
            } else {
                for (int i = 0; i < values.length; i++) {
                    String value = values[i];
                    toReturn.append(value);
                    if (i < values.length - 1) {
                        toReturn.append(",");
                    }
                }
            }
        } catch (Exception e) {
            logger.error("Error while retrieving revelant SDKDataSetParameter for a DataSetParameterItem", e);
            logger.debug("Returning null");
            return null;
        } finally {
            logger.debug("OUT");
        }
        return toReturn.toString();
    }

    private void checkParameterValues(String[] values, DataSetParameterItem dataSetParameterItem)
            throws InvalidParameterValue {
        logger.debug("IN");
        try {
            String parameterType = dataSetParameterItem.getType();
            if (parameterType.equalsIgnoreCase("Number")) {
                for (int i = 0; i < values.length; i++) {
                    String value = values[i];
                    if (GenericValidator.isBlankOrNull(value) || (!(GenericValidator.isInt(value)
                            || GenericValidator.isFloat(value) || GenericValidator.isDouble(value)
                            || GenericValidator.isShort(value) || GenericValidator.isLong(value)))) {
                        InvalidParameterValue error = new InvalidParameterValue();
                        error.setParameterName(dataSetParameterItem.getName());
                        error.setParameterType(parameterType);
                        error.setWrongParameterValue(value);
                        error.setParameterFormat("");
                        throw error;
                    }
                }
            }
        } finally {
            logger.debug("OUT");
        }
    }

    private SDKDataSetParameter findRelevantSDKDataSetParameter(DataSetParameterItem dataSetParameterItem,
            SDKDataSet sdkDataSet) {
        logger.debug("IN");
        SDKDataSetParameter toReturn = null;
        try {
            String parameterName = dataSetParameterItem.getName();
            SDKDataSetParameter[] parameters = sdkDataSet.getParameters();
            if (parameters != null && parameters.length > 0) {
                for (int i = 0; i < parameters.length; i++) {
                    SDKDataSetParameter aSDKDataSetParameter = parameters[i];
                    if (aSDKDataSetParameter.getName().equals(parameterName)) {
                        toReturn = aSDKDataSetParameter;
                        break;
                    }
                }
            }
        } catch (Exception e) {
            logger.error("Error while retrieving revelant SDKDataSetParameter for a DataSetParameterItem", e);
            logger.debug("Returning null");
            return null;
        } finally {
            logger.debug("OUT");
        }
        return toReturn;
    }

}