it.eng.spagobi.analiticalmodel.document.dao.BIObjectDAOHibImpl.java Source code

Java tutorial

Introduction

Here is the source code for it.eng.spagobi.analiticalmodel.document.dao.BIObjectDAOHibImpl.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/. */
/*
 * Created on 21-giu-2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package it.eng.spagobi.analiticalmodel.document.dao;

import it.eng.spago.base.RequestContainer;
import it.eng.spago.base.SourceBean;
import it.eng.spago.error.EMFErrorSeverity;
import it.eng.spago.error.EMFInternalError;
import it.eng.spago.error.EMFUserError;
import it.eng.spago.security.IEngUserProfile;
import it.eng.spagobi.analiticalmodel.document.bo.BIObject;
import it.eng.spagobi.analiticalmodel.document.bo.ObjTemplate;
import it.eng.spagobi.analiticalmodel.document.bo.Snapshot;
import it.eng.spagobi.analiticalmodel.document.bo.SubObject;
import it.eng.spagobi.analiticalmodel.document.bo.Viewpoint;
import it.eng.spagobi.analiticalmodel.document.metadata.SbiObjFunc;
import it.eng.spagobi.analiticalmodel.document.metadata.SbiObjFuncId;
import it.eng.spagobi.analiticalmodel.document.metadata.SbiObjPar;
import it.eng.spagobi.analiticalmodel.document.metadata.SbiObjTemplates;
import it.eng.spagobi.analiticalmodel.document.metadata.SbiObjects;
import it.eng.spagobi.analiticalmodel.functionalitytree.metadata.SbiFunctions;
import it.eng.spagobi.behaviouralmodel.analyticaldriver.bo.BIObjectParameter;
import it.eng.spagobi.behaviouralmodel.analyticaldriver.bo.Parameter;
import it.eng.spagobi.behaviouralmodel.analyticaldriver.dao.BIObjectParameterDAOHibImpl;
import it.eng.spagobi.behaviouralmodel.analyticaldriver.dao.IBIObjectParameterDAO;
import it.eng.spagobi.behaviouralmodel.analyticaldriver.dao.IParameterDAO;
import it.eng.spagobi.behaviouralmodel.analyticaldriver.metadata.SbiParameters;
import it.eng.spagobi.commons.bo.Role;
import it.eng.spagobi.commons.bo.UserProfile;
import it.eng.spagobi.commons.constants.SpagoBIConstants;
import it.eng.spagobi.commons.dao.AbstractHibernateDAO;
import it.eng.spagobi.commons.dao.DAOFactory;
import it.eng.spagobi.commons.metadata.SbiBinContents;
import it.eng.spagobi.commons.metadata.SbiDomains;
import it.eng.spagobi.commons.utilities.ObjectsAccessVerifier;
import it.eng.spagobi.engines.config.dao.EngineDAOHibImpl;
import it.eng.spagobi.engines.config.metadata.SbiEngines;
import it.eng.spagobi.engines.documentcomposition.configuration.DocumentCompositionConfiguration;
import it.eng.spagobi.engines.dossier.dao.IDossierPartsTempDAO;
import it.eng.spagobi.engines.dossier.dao.IDossierPresentationsDAO;
import it.eng.spagobi.tools.dataset.metadata.SbiDataSetConfig;
import it.eng.spagobi.tools.datasource.metadata.SbiDataSource;
import it.eng.spagobi.tools.objmetadata.bo.ObjMetacontent;
import it.eng.spagobi.tools.objmetadata.bo.ObjMetadata;
import it.eng.spagobi.tools.objmetadata.dao.IObjMetacontentDAO;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Expression;
import org.safehaus.uuid.UUID;
import org.safehaus.uuid.UUIDGenerator;

import com.jamonapi.Monitor;
import com.jamonapi.MonitorFactory;

/**
 *   Defines the Hibernate implementations for all DAO methods,
 *  for a BI Object.  
 */
public class BIObjectDAOHibImpl extends AbstractHibernateDAO implements IBIObjectDAO {

    public static final String COLUMN_LABEL = "LABEL";
    public static final String COLUMN_NAME = "NAME";
    public static final String COLUMN_ENGINE = "ENGINE";
    public static final String COLUMN_STATE = "STATE";
    public static final String COLUMN_TYPE = "TYPE";
    public static final String COLUMN_DATE = "CREATION_DATE";
    public static final String SCOPE_NODE = "node";

    public static final String START_WITH = "START_WITH";
    public static final String END_WITH = "END_WITH";
    public static final String NOT_EQUALS_TO = "NOT_EQUALS_TO";
    public static final String EQUALS_TO = "EQUALS_TO";
    public static final String CONTAINS = "CONTAINS";
    public static final String LESS_THAN = "LESS_THAN";
    public static final String EQUALS_OR_GREATER_THAN = "EQUALS_OR_GREATER_THAN";
    public static final String GREATER_THAN = "GREATER_THAN";
    public static final String EQUALS_OR_LESS_THAN = "EQUALS_OR_LESS_THAN";
    public static final String NOT_ENDS_WITH = "NOT_ENDS_WITH";
    public static final String NOT_CONTAINS = "NOT_CONTAINS";
    public static final String IS_NULL = "IS_NULL";
    public static final String NOT_NULL = "NOT_NULL";

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

    /**
     * Load bi object for execution by id and role.
     * 
     * @param id the id
     * @param role the role
     * 
     * @return the BI object
     * 
     * @throws EMFUserError the EMF user error
     * 
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#loadBIObjectForExecutionByIdAndRole(java.lang.Integer, java.lang.String)
     */
    public BIObject loadBIObjectForExecutionByIdAndRole(Integer id, String role) throws EMFUserError {
        logger.debug("IN");
        Monitor monitor = MonitorFactory.start("spagobi.core.BIObjectDAO.loadBIObjectForExecutionByIdAndRole");
        Session aSession = null;
        Transaction tx = null;
        BIObject biObject = null;
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            biObject = loadBIObjectForDetail(id);
            //String hql = "from SbiObjPar s where s.sbiObject.biobjId = " + biObject.getId() + " order by s.priority asc";
            String hql = "from SbiObjPar s where s.sbiObject.biobjId = ? order by s.priority asc";
            Query hqlQuery = aSession.createQuery(hql);
            hqlQuery.setInteger(0, biObject.getId().intValue());
            List hibObjectPars = hqlQuery.list();
            SbiObjPar hibObjPar = null;
            Iterator it = hibObjectPars.iterator();
            BIObjectParameter tmpBIObjectParameter = null;
            BIObjectParameterDAOHibImpl aBIObjectParameterDAOHibImpl = new BIObjectParameterDAOHibImpl();
            IParameterDAO aParameterDAO = DAOFactory.getParameterDAO();
            List biObjectParameters = new ArrayList();
            Parameter aParameter = null;
            int count = 1;
            while (it.hasNext()) {
                hibObjPar = (SbiObjPar) it.next();
                tmpBIObjectParameter = aBIObjectParameterDAOHibImpl.toBIObjectParameter(hibObjPar);

                //*****************************************************************
                //**************** START PRIORITY RECALCULATION *******************
                //*****************************************************************
                Integer priority = tmpBIObjectParameter.getPriority();
                if (priority == null || priority.intValue() != count) {
                    logger.warn("The priorities of the biparameters for the document with id = " + biObject.getId()
                            + " are not sorted. Priority recalculation starts.");
                    aBIObjectParameterDAOHibImpl.recalculateBiParametersPriority(biObject.getId(), aSession);
                    tmpBIObjectParameter.setPriority(new Integer(count));
                }
                count++;
                //*****************************************************************
                //**************** END PRIORITY RECALCULATION *******************
                //*****************************************************************

                aParameter = aParameterDAO.loadForExecutionByParameterIDandRoleName(tmpBIObjectParameter.getParID(),
                        role);
                tmpBIObjectParameter.setParID(aParameter.getId());
                tmpBIObjectParameter.setParameter(aParameter);
                biObjectParameters.add(tmpBIObjectParameter);
            }
            biObject.setBiObjectParameters(biObjectParameters);
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
            monitor.stop();
        }
        logger.debug("OUT");
        return biObject;
    }

    /**
     * Load bi object by id.
     * 
     * @param biObjectID the bi object id
     * 
     * @return the BI object
     * 
     * @throws EMFUserError the EMF user error
     * 
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#loadBIObjectById(java.lang.Integer)
     */
    public BIObject loadBIObjectById(Integer biObjectID) throws EMFUserError {
        logger.debug("IN");
        Monitor monitor = MonitorFactory.start("spagobi.core.BIObjectDAO.loadBIObjectById");
        BIObject toReturn = null;
        Session aSession = null;
        Transaction tx = null;
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            SbiObjects hibBIObject = (SbiObjects) aSession.load(SbiObjects.class, biObjectID);
            toReturn = toBIObject(hibBIObject);
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
            monitor.stop();
        }
        logger.debug("OUT");
        return toReturn;
    }

    /**
     * Load bi object for detail.
     * 
     * @param id the id
     * 
     * @return the BI object
     * 
     * @throws EMFUserError the EMF user error
     * 
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#loadBIObjectForDetail(java.lang.Integer)
     */
    public BIObject loadBIObjectForDetail(Integer id) throws EMFUserError {
        logger.debug("IN");
        BIObject biObject = null;
        Session aSession = null;
        Transaction tx = null;
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            //String hql = " from SbiObjects where biobjId = " + id;
            String hql = " from SbiObjects where biobjId = ?";
            Query hqlQuery = aSession.createQuery(hql);
            hqlQuery.setInteger(0, id.intValue());
            SbiObjects hibObject = (SbiObjects) hqlQuery.uniqueResult();
            if (hibObject == null)
                return null;
            biObject = toBIObject(hibObject);
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
        logger.debug("OUT");
        return biObject;
    }

    /**
     * Load bi object by label.
     * 
     * @param label the label
     * 
     * @return the BI object
     * 
     * @throws EMFUserError the EMF user error
     * 
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#loadBIObjectByLabel(java.lang.String)
     */
    public BIObject loadBIObjectByLabel(String label) throws EMFUserError {
        logger.debug("IN");
        Monitor monitor = MonitorFactory.start("spagobi.core.BIObjectDAO.loadBIObjectByLabel");
        BIObject biObject = null;
        Session aSession = null;
        Transaction tx = null;
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            Criterion labelCriterrion = Expression.eq("label", label);
            Criteria criteria = aSession.createCriteria(SbiObjects.class);
            criteria.add(labelCriterrion);
            SbiObjects hibObject = (SbiObjects) criteria.uniqueResult();
            if (hibObject == null)
                return null;
            biObject = toBIObject(hibObject);
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
            monitor.stop();
        }
        logger.debug("OUT");
        return biObject;
    }

    /**
     * Load bi object for tree.
     * 
     * @param id the id
     * 
     * @return the BI object
     * 
     * @throws EMFUserError the EMF user error
     * 
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#loadBIObjectForTree(java.lang.Integer)
     */
    public BIObject loadBIObjectForTree(Integer id) throws EMFUserError {
        logger.debug("IN. start method with input id:" + id);
        BIObject biObject = null;
        Session aSession = null;
        Transaction tx = null;
        try {
            aSession = getSession();
            logger.debug("hibernate session obtained:" + aSession);
            tx = aSession.beginTransaction();
            logger.debug("hibernate transaction started");
            Criterion domainCdCriterrion = Expression.eq("biobjId", id);
            Criteria criteria = aSession.createCriteria(SbiObjects.class);
            criteria.add(domainCdCriterrion);
            logger.debug("hibernate criteria filled:" + criteria);
            SbiObjects hibObject = (SbiObjects) criteria.uniqueResult();
            logger.debug("hibernate object retrived:" + hibObject);
            if (hibObject == null) {
                return null;
            }
            biObject = toBIObject(hibObject);
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            logger.error("hibernate exception", he);
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
            logger.debug("OUT.end method with input id:" + id);
        }
        return biObject;
    }

    /**
     * Modify bi object.
     * 
     * @param obj the obj
     * 
     * @throws EMFUserError the EMF user error
     * 
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#modifyBIObject(it.eng.spagobi.analiticalmodel.document.bo.BIObject)
     */
    public void modifyBIObject(BIObject obj) throws EMFUserError {
        internalModify(obj, null, false);
    }

    /**
     * Modify bi object.
     * 
     * @param obj the obj
     * @param loadParsDC boolean for management Document Composition params
     * 
     * @throws EMFUserError the EMF user error
     * 
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#modifyBIObject(it.eng.spagobi.analiticalmodel.document.bo.BIObject)
     */
    public void modifyBIObject(BIObject obj, boolean loadParsDC) throws EMFUserError {
        internalModify(obj, null, loadParsDC);
    }

    /**
     * Modify bi object.
     * 
     * @param obj the obj
     * @param objTemp the obj temp
     * 
     * @throws EMFUserError the EMF user error
     * 
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#modifyBIObjectWithoutVersioning(it.eng.spagobi.analiticalmodel.document.bo.BIObject)
     */
    public void modifyBIObject(BIObject obj, ObjTemplate objTemp) throws EMFUserError {
        internalModify(obj, objTemp, false);
    }

    /**
     * Modify bi object.
     * 
     * @param obj the obj
     * @param objTemp the obj temp
     * @param loadParsDC boolean for management Document Composition params
     * 
     * @throws EMFUserError the EMF user error
     * 
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#modifyBIObjectWithoutVersioning(it.eng.spagobi.analiticalmodel.document.bo.BIObject)
     */
    public void modifyBIObject(BIObject obj, ObjTemplate objTemp, boolean loadParsDC) throws EMFUserError {
        internalModify(obj, objTemp, loadParsDC);

    }

    /**
     * Updates the biobject data into database.
     * @param biObject The BI Object as input
     * @param objTemp The BIObject template 
     * @throws EMFUserError If any exception occurred
     */
    private void internalModify(BIObject biObject, ObjTemplate objTemp, boolean loadParsDC) throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            SbiObjects hibBIObject = (SbiObjects) aSession.load(SbiObjects.class, biObject.getId());

            updateSbiCommonInfo4Update(hibBIObject);

            SbiEngines hibEngine = (SbiEngines) aSession.load(SbiEngines.class, biObject.getEngine().getId());
            hibBIObject.setSbiEngines(hibEngine);
            SbiDataSource dSource = null;
            if (biObject.getDataSourceId() != null) {
                dSource = (SbiDataSource) aSession.load(SbiDataSource.class, biObject.getDataSourceId());
            }
            hibBIObject.setDataSource(dSource);

            SbiDataSetConfig dSet = null;
            if (biObject.getDataSetId() != null) {
                dSet = (SbiDataSetConfig) aSession.load(SbiDataSetConfig.class, biObject.getDataSetId());
            }
            hibBIObject.setDataSet(dSet);

            hibBIObject.setDescr(biObject.getDescription());
            hibBIObject.setLabel(biObject.getLabel());
            hibBIObject.setName(biObject.getName());

            if (biObject.getEncrypt() != null)
                hibBIObject.setEncrypt(new Short(biObject.getEncrypt().shortValue()));
            if (biObject.getVisible() != null)
                hibBIObject.setVisible(new Short(biObject.getVisible().shortValue()));

            hibBIObject.setProfiledVisibility(biObject.getProfiledVisibility());
            hibBIObject.setRelName(biObject.getRelName());
            SbiDomains hibState = (SbiDomains) aSession.load(SbiDomains.class, biObject.getStateID());
            hibBIObject.setState(hibState);
            hibBIObject.setStateCode(biObject.getStateCode());
            SbiDomains hibObjectType = (SbiDomains) aSession.load(SbiDomains.class, biObject.getBiObjectTypeID());
            hibBIObject.setObjectType(hibObjectType);
            hibBIObject.setObjectTypeCode(biObject.getBiObjectTypeCode());

            hibBIObject.setRefreshSeconds(biObject.getRefreshSeconds());

            // functionalities erasing
            Set hibFunctionalities = hibBIObject.getSbiObjFuncs();
            for (Iterator it = hibFunctionalities.iterator(); it.hasNext();) {
                aSession.delete((SbiObjFunc) it.next());
            }
            // functionalities storing
            Set hibObjFunc = new HashSet();
            List functionalities = biObject.getFunctionalities();
            for (Iterator it = functionalities.iterator(); it.hasNext();) {
                Integer functId = (Integer) it.next();
                SbiFunctions aSbiFunctions = (SbiFunctions) aSession.load(SbiFunctions.class, functId);
                SbiObjFuncId aSbiObjFuncId = new SbiObjFuncId();
                aSbiObjFuncId.setSbiFunctions(aSbiFunctions);
                aSbiObjFuncId.setSbiObjects(hibBIObject);
                SbiObjFunc aSbiObjFunc = new SbiObjFunc(aSbiObjFuncId);
                updateSbiCommonInfo4Update(aSbiObjFunc);
                aSession.save(aSbiObjFunc);
                hibObjFunc.add(aSbiObjFunc);
            }
            hibBIObject.setSbiObjFuncs(hibObjFunc);

            tx.commit();

            // update biobject template info 
            if (objTemp != null) {
                try {
                    ObjTemplate oldTemp = DAOFactory.getObjTemplateDAO()
                            .getBIObjectActiveTemplate(biObject.getId());
                    // set the biobject id into ObjTemplate (it should not be necessary, but to avoid errors ...)
                    objTemp.setBiobjId(biObject.getId());
                    //insert or update new template
                    IObjTemplateDAO dao = DAOFactory.getObjTemplateDAO();
                    dao.setUserProfile(this.getUserProfile());
                    dao.insertBIObjectTemplate(objTemp);
                    //if the input document is a document composition and template is changed deletes existing parameters 
                    //and creates all new parameters automatically 
                    //(the parameters are recovered from all documents that compose general document)
                    if (loadParsDC && (oldTemp == null || objTemp.getId() == null
                            || objTemp.getId().compareTo(oldTemp.getId()) != 0)) {
                        insertParametersDocComposition(biObject, objTemp, true);
                    }
                } catch (Exception e) {
                    logger.error("Error during creation of document composition parameters : ", e);
                    throw new EMFUserError(EMFErrorSeverity.ERROR, e.getMessage());
                }

            }

            logger.debug("OUT");
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
    }

    /**
     * Implements the query to insert a BIObject and its template. All information needed is stored
     * into the input <code>BIObject</code> and <code>ObjTemplate</code> objects.
     * 
     * @param obj The object containing all insert information
     * @param objTemp The template of the biobject
     * 
     * @throws EMFUserError If an Exception occurred
     */
    public void insertBIObject(BIObject obj, ObjTemplate objTemp, boolean loadParsDC) throws EMFUserError {
        internalInsertBIObject(obj, objTemp, loadParsDC);
    }

    /**
     * Implements the query to insert a BIObject. All information needed is stored
     * into the input <code>BIObject</code> object.
     * 
     * @param obj The object containing all insert information
     * 
     * @throws EMFUserError If an Exception occurred
     */
    public void insertBIObject(BIObject obj) throws EMFUserError {
        internalInsertBIObject(obj, null, false);
    }

    /**
     * Implements the query to insert a BIObject. All information needed is stored
     * into the input <code>BIObject</code> object.
     * 
     * @param obj The object containing all insert information
     * @param loadParsDC boolean for management Document Composition params
     * 
     * @throws EMFUserError If an Exception occurred
     */
    public void insertBIObject(BIObject obj, boolean loadParsDC) throws EMFUserError {
        internalInsertBIObject(obj, null, loadParsDC);
    }

    /**
     * Implements the query to insert a BIObject. All information needed is stored
     * into the input <code>BIObject</code> object.
     * 
     * @param obj The object containing all insert information
     * @param loadParsDC boolean for management Document Composition params
     * 
     * @throws EMFUserError If an Exception occurred
     */
    public Integer insertBIObject(BIObject obj, ObjTemplate objTemp) throws EMFUserError {
        return internalInsertBIObject(obj, objTemp, false);
    }

    private Integer internalInsertBIObject(BIObject obj, ObjTemplate objTemp, boolean loadParsDC)
            throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        Integer idToReturn = null;
        try {

            aSession = getSession();
            tx = aSession.beginTransaction();
            SbiObjects hibBIObject = new SbiObjects();
            // add the common info

            SbiEngines hibEngine = (SbiEngines) aSession.load(SbiEngines.class, obj.getEngine().getId());
            hibBIObject.setSbiEngines(hibEngine);
            hibBIObject.setDescr(obj.getDescription());

            hibBIObject.setLabel(obj.getLabel());
            hibBIObject.setName(obj.getName());
            if (obj.getEncrypt() != null) {
                hibBIObject.setEncrypt(new Short(obj.getEncrypt().shortValue()));
            }
            if (obj.getVisible() != null) {
                hibBIObject.setVisible(new Short(obj.getVisible().shortValue()));
            }
            hibBIObject.setProfiledVisibility(obj.getProfiledVisibility());
            hibBIObject.setRelName(obj.getRelName());

            SbiDomains hibState = (SbiDomains) aSession.load(SbiDomains.class, obj.getStateID());
            hibBIObject.setState(hibState);
            hibBIObject.setStateCode(obj.getStateCode());
            SbiDomains hibObjectType = (SbiDomains) aSession.load(SbiDomains.class, obj.getBiObjectTypeID());
            hibBIObject.setObjectType(hibObjectType);
            hibBIObject.setObjectTypeCode(obj.getBiObjectTypeCode());
            SbiDataSource dSource = null;
            if (obj.getDataSourceId() != null) {
                dSource = (SbiDataSource) aSession.load(SbiDataSource.class, obj.getDataSourceId());
            }
            hibBIObject.setDataSource(dSource);

            SbiDataSetConfig dSet = null;
            if (obj.getDataSetId() != null) {
                dSet = (SbiDataSetConfig) aSession.load(SbiDataSetConfig.class, obj.getDataSetId());
            }
            hibBIObject.setDataSet(dSet);

            Integer refreshSeconds = obj.getRefreshSeconds();
            if (refreshSeconds == null)
                refreshSeconds = new Integer(0);
            hibBIObject.setRefreshSeconds(refreshSeconds);

            // uuid generation
            UUIDGenerator uuidGenerator = UUIDGenerator.getInstance();
            UUID uuidObj = uuidGenerator.generateTimeBasedUUID();
            String uuid = uuidObj.toString();
            hibBIObject.setUuid(uuid);

            hibBIObject.setCreationDate(new Date());
            hibBIObject.setCreationUser(obj.getCreationUser());

            updateSbiCommonInfo4Insert(hibBIObject);

            // save biobject
            Integer id = (Integer) aSession.save(hibBIObject);
            idToReturn = id;
            // recover the saved hibernate object
            hibBIObject = (SbiObjects) aSession.load(SbiObjects.class, id);
            // functionalities storing
            Set hibObjFunc = new HashSet();
            List functionalities = obj.getFunctionalities();
            for (Iterator it = functionalities.iterator(); it.hasNext();) {
                Integer functId = (Integer) it.next();
                SbiFunctions aSbiFunctions = (SbiFunctions) aSession.load(SbiFunctions.class, functId);
                SbiObjFuncId aSbiObjFuncId = new SbiObjFuncId();
                aSbiObjFuncId.setSbiFunctions(aSbiFunctions);
                aSbiObjFuncId.setSbiObjects(hibBIObject);
                SbiObjFunc aSbiObjFunc = new SbiObjFunc(aSbiObjFuncId);
                updateSbiCommonInfo4Insert(aSbiObjFunc);
                aSession.save(aSbiObjFunc);
                hibObjFunc.add(aSbiObjFunc);
            }
            hibBIObject.setSbiObjFuncs(hibObjFunc);

            // we must close transaction before saving ObjTemplate, 
            // since ObjTemplateDAO opens a new transaction and it would fail in Ingres
            tx.commit();
            obj.setId(id);

            if (objTemp != null) {
                objTemp.setBiobjId(id);

                IObjTemplateDAO dao = DAOFactory.getObjTemplateDAO();
                dao.setUserProfile(this.getUserProfile());
                dao.insertBIObjectTemplate(objTemp);
            }

            //if the document is a document composition creates all parameters automatically 
            //(the parameters are recovered from all documents that compose general document)
            if (loadParsDC) {
                insertParametersDocComposition(id);
            }
        } catch (HibernateException he) {
            logger.error("HibernateException", he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } catch (EMFInternalError e) {
            logger.error("Error inserting new BIObject", e);
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
        logger.debug("OUT");
        return idToReturn;
    }

    /**
     * Erase bi object.
     * 
     * @param obj the obj
     * @param idFunct the id funct
     * 
     * @throws EMFUserError the EMF user error
     * 
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#eraseBIObject(it.eng.spagobi.analiticalmodel.document.bo.BIObject, java.lang.Integer)
     */
    public void eraseBIObject(BIObject obj, Integer idFunct) throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            // load object
            SbiObjects hibBIObject = (SbiObjects) aSession.load(SbiObjects.class, obj.getId());
            // erase object from functionalities 
            Set hibObjFuncs = hibBIObject.getSbiObjFuncs();
            Iterator itObjFunc = hibObjFuncs.iterator();
            while (itObjFunc.hasNext()) {
                SbiObjFunc aSbiObjFunc = (SbiObjFunc) itObjFunc.next();
                if (idFunct == null
                        || aSbiObjFunc.getId().getSbiFunctions().getFunctId().intValue() == idFunct.intValue()) {
                    logger.debug("Deleting object [" + obj.getName() + "] from folder ["
                            + aSbiObjFunc.getId().getSbiFunctions().getPath() + "]");
                    aSession.delete(aSbiObjFunc);
                }
            }

            aSession.flush();
            // reload object
            aSession.refresh(hibBIObject);

            // if the object is no more referenced in any folder, erases it from sbi_obejcts table 
            hibObjFuncs = hibBIObject.getSbiObjFuncs();
            if (hibObjFuncs == null || hibObjFuncs.size() == 0) {

                logger.debug("The object [" + obj.getName()
                        + "] is no more referenced by any functionality. It will be completely deleted from db.");

                // delete templates
                String hql = "from SbiObjTemplates sot where sot.sbiObject.biobjId=" + obj.getId();
                Query query = aSession.createQuery(hql);
                List templs = query.list();
                Iterator iterTempls = templs.iterator();
                while (iterTempls.hasNext()) {
                    SbiObjTemplates hibObjTemp = (SbiObjTemplates) iterTempls.next();
                    SbiBinContents hibBinCont = hibObjTemp.getSbiBinContents();
                    aSession.delete(hibObjTemp);
                    aSession.delete(hibBinCont);

                }

                //delete subobjects eventually associated
                ISubObjectDAO subobjDAO = DAOFactory.getSubObjectDAO();
                List subobjects = subobjDAO.getSubObjects(obj.getId());
                for (int i = 0; i < subobjects.size(); i++) {
                    SubObject s = (SubObject) subobjects.get(i);
                    //subobjDAO.deleteSubObject(s.getId());
                    subobjDAO.deleteSubObjectSameConnection(s.getId(), aSession);
                }

                //delete viewpoints eventually associated
                List viewpoints = new ArrayList();
                IViewpointDAO biVPDAO = DAOFactory.getViewpointDAO();
                viewpoints = biVPDAO.loadAllViewpointsByObjID(obj.getId());
                for (int i = 0; i < viewpoints.size(); i++) {
                    Viewpoint vp = (Viewpoint) viewpoints.get(i);
                    biVPDAO.eraseViewpoint(vp.getVpId());
                }

                //delete snapshots eventually associated
                ISnapshotDAO snapshotsDAO = DAOFactory.getSnapshotDAO();
                List snapshots = snapshotsDAO.getSnapshots(obj.getId());
                for (int i = 0; i < snapshots.size(); i++) {
                    Snapshot aSnapshots = (Snapshot) snapshots.get(i);
                    snapshotsDAO.deleteSnapshot(aSnapshots.getId());
                }

                //delete notes eventually associated
                IObjNoteDAO objNoteDAO = DAOFactory.getObjNoteDAO();
                objNoteDAO.eraseNotes(obj.getId());

                //delete metadata eventually associated
                List metadata = DAOFactory.getObjMetadataDAO().loadAllObjMetadata();
                IObjMetacontentDAO objMetaContentDAO = DAOFactory.getObjMetacontentDAO();
                if (metadata != null && !metadata.isEmpty()) {
                    Iterator it = metadata.iterator();
                    while (it.hasNext()) {
                        ObjMetadata objMetadata = (ObjMetadata) it.next();
                        ObjMetacontent objMetacontent = (ObjMetacontent) DAOFactory.getObjMetacontentDAO()
                                .loadObjMetacontent(objMetadata.getObjMetaId(), obj.getId(), null);
                        if (objMetacontent != null) {
                            objMetaContentDAO.eraseObjMetadata(objMetacontent);
                        }
                    }
                }

                // delete parameters associated
                // before deleting parameters associated is needed to delete all dependencies,
                // otherwise in case there could be error if is firstly deleted a parameter from wich some else is dependant
                // (thought priority parameter is not costraining dependencies definition)

                Set objPars = hibBIObject.getSbiObjPars();

                Iterator itObjParDep = objPars.iterator();
                BIObjectParameterDAOHibImpl objParDAO = new BIObjectParameterDAOHibImpl();
                while (itObjParDep.hasNext()) {
                    SbiObjPar aSbiObjPar = (SbiObjPar) itObjParDep.next();
                    BIObjectParameter aBIObjectParameter = new BIObjectParameter();
                    aBIObjectParameter.setId(aSbiObjPar.getObjParId());
                    objParDAO.eraseBIObjectParameterDependencies(aBIObjectParameter, aSession);
                }

                Iterator itObjPar = objPars.iterator();
                while (itObjPar.hasNext()) {
                    SbiObjPar aSbiObjPar = (SbiObjPar) itObjPar.next();
                    BIObjectParameter aBIObjectParameter = new BIObjectParameter();
                    aBIObjectParameter.setId(aSbiObjPar.getObjParId());

                    objParDAO.eraseBIObjectParameter(aBIObjectParameter, aSession, false);
                }

                // delete dossier temp parts eventually associated
                IDossierPartsTempDAO dptDAO = DAOFactory.getDossierPartsTempDAO();
                dptDAO.eraseDossierParts(obj.getId());
                // delete dossier presentations eventually associated
                IDossierPresentationsDAO dpDAO = DAOFactory.getDossierPresentationDAO();
                dpDAO.deletePresentations(obj.getId());

                // update subreports table 
                ISubreportDAO subrptdao = DAOFactory.getSubreportDAO();
                subrptdao.eraseSubreportByMasterRptId(obj.getId());
                subrptdao.eraseSubreportBySubRptId(obj.getId());

                // delete object
                aSession.delete(hibBIObject);
                logger.debug("OUT");

            }
            // commit all changes
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null && tx.isActive())
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } catch (Exception ex) {
            logger.error(ex);
            if (tx != null && tx.isActive())
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
    }

    /**
     * Gets the correct roles for execution.
     * 
     * @param id the id
     * @param profile the profile
     * 
     * @return the correct roles for execution
     * 
     * @throws EMFUserError the EMF user error
     * 
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#getCorrectRolesForExecution(java.lang.Integer, it.eng.spago.security.IEngUserProfile)
     */
    public List getCorrectRolesForExecution(Integer id, IEngUserProfile profile) throws EMFUserError {
        logger.debug("IN");
        List correctRoles = null;
        try {
            correctRoles = getCorrectRoles(id, ((UserProfile) profile).getRolesForUse());
        } catch (EMFInternalError emfie) {
            logger.error("error getting role from the user profile", emfie);
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        }
        logger.debug("OUT");
        return correctRoles;
    }

    /**
     * Gets the correct roles for execution.
     * 
     * @param id the id
     * 
     * @return the correct roles for execution
     * 
     * @throws EMFUserError the EMF user error
     * 
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#getCorrectRolesForExecution(java.lang.Integer)
     */
    public List getCorrectRolesForExecution(Integer id) throws EMFUserError {
        logger.debug("IN");
        List roles = DAOFactory.getRoleDAO().loadAllRoles();
        List nameRoles = new ArrayList();
        Iterator iterRoles = roles.iterator();
        Role role = null;
        while (iterRoles.hasNext()) {
            role = (Role) iterRoles.next();
            nameRoles.add(role.getName());
        }
        logger.debug("OUT");
        return getCorrectRoles(id, nameRoles);
    }

    /**
     * Gets a list of correct role according to the report at input, identified
     * by its id
     * 
     * @param id   The Integer representing report's id
     * @param roles   The collection of all roles
     * @return The correct roles list
     * @throws EMFUserError if any exception occurred
     */
    private List getCorrectRoles(Integer id, Collection roles) throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        Query hqlQuery = null;
        String hql = null;
        List correctRoles = new ArrayList();
        Monitor monitor = MonitorFactory.start("spagobi.core.BIObjectDAO.getCorrectRoles");

        try {
            aSession = getSession();
            tx = aSession.beginTransaction();

            logger.debug("The user have [" + roles.size() + "] different roles");

            // allRolesWithPermission will store all roles with permissions on folders containing the required document
            List allRolesWithPermission = new ArrayList();

            // first filter on roles: finds only roles with permissions on folders containing the required document
            SbiObjects hibBIObject = (SbiObjects) aSession.load(SbiObjects.class, id);
            String objectState = hibBIObject.getState().getValueCd();
            String permission = ObjectsAccessVerifier.getPermissionFromDocumentState(objectState);
            Set hibObjFuncs = hibBIObject.getSbiObjFuncs();
            Iterator itObjFunc = hibObjFuncs.iterator();
            while (itObjFunc.hasNext()) {
                SbiObjFunc aSbiObjFunc = (SbiObjFunc) itObjFunc.next();
                SbiFunctions aSbiFunctions = aSbiObjFunc.getId().getSbiFunctions();
                String funcTypeCd = aSbiFunctions.getFunctTypeCd();
                logger.debug("Folder type [" + funcTypeCd + "]");
                if (!funcTypeCd.equalsIgnoreCase("USER_FUNCT")) {
                    logger.debug("Folder id [" + aSbiFunctions.getFunctId() + "]");
                    logger.debug("Document state [" + objectState + "]");

                    String rolesHql = "select distinct roles.name from "
                            + "SbiExtRoles as roles, SbiFuncRole as funcRole "
                            + "where roles.extRoleId = funcRole.id.role.extRoleId and "
                            + "      funcRole.id.function.functId = " + aSbiFunctions.getFunctId() + " and "
                            + "      funcRole.id.state.valueCd = '" + permission + "' ";
                    Query rolesHqlQuery = aSession.createQuery(rolesHql);
                    // get the list of roles that can see the document (in REL or TEST state) in that functionality
                    List rolesNames = new ArrayList();
                    rolesNames = rolesHqlQuery.list();
                    allRolesWithPermission.addAll(rolesNames);
                } else {
                    List l = new ArrayList();
                    l.addAll(roles);
                    return l;
                }
            }

            logger.debug("There are [" + allRolesWithPermission.size() + "] roles that can execut doc [" + id
                    + "] depending on its location");

            // userRolesWithPermission will store the filtered roles with permissions on folders containing the required document
            List userRolesWithPermission = new ArrayList();
            Iterator rolesIt = roles.iterator();
            while (rolesIt.hasNext()) {
                // if the role is a user role and can see the document (in REL or TEST state), 
                // it is a correct role
                String role = rolesIt.next().toString();
                if (allRolesWithPermission.contains(role))
                    userRolesWithPermission.add(role);
            }

            logger.debug("The user have [" + userRolesWithPermission.size()
                    + "] different roles that can execute doc [" + id + "] depending on its location");

            // find all id parameters relative to the objects
            hql = "select par.parId from " + "SbiParameters as par, SbiObjects as obj, SbiObjPar as objpar  "
                    + "where obj.biobjId = ?  and " + "      obj.biobjId = objpar.sbiObject.biobjId and "
                    + "      par.parId = objpar.id.sbiParameter.parId ";
            hqlQuery = aSession.createQuery(hql);
            hqlQuery.setInteger(0, id.intValue());
            List idParameters = hqlQuery.list();

            if (idParameters.size() == 0) {
                // if the object has not parameter associates all the roles that have the execution or
                // test permissions on the containing folders are correct roles in the same manner.
                return userRolesWithPermission;
            }

            // second filter on roles: finds only roles with correct modalities of the parameters of the required document
            Iterator iterRoles = userRolesWithPermission.iterator();
            Iterator iterParam = null;
            String role = null;
            String idPar = null;
            List parUses = null;
            // for each role of the user
            while (iterRoles.hasNext()) {
                boolean correct = true;
                role = iterRoles.next().toString();
                iterParam = idParameters.iterator();
                // for each parameter get the number of the modality for the current role
                while (iterParam.hasNext()) {
                    idPar = iterParam.next().toString();
                    hql = "select puseDet.id.sbiParuse.useId " + "from SbiParuse as puse, "
                            + "     SbiParuseDet as puseDet, " + "     SbiExtRoles as rol  " + "where rol.name = '"
                            + role + "' and " + "      puseDet.id.sbiExtRoles.extRoleId = rol.extRoleId and "
                            + "      puse.sbiParameters.parId = " + idPar + " and "
                            + "      puseDet.id.sbiParuse.useId = puse.useId";
                    hqlQuery = aSession.createQuery(hql);
                    parUses = hqlQuery.list();
                    // if the modality for the current role and the current parameter are more
                    // or less than one the  role can't execute the report and so it isn't
                    // correct
                    if (parUses.size() != 1) {
                        correct = false;
                    }
                }
                if (correct) {
                    correctRoles.add(role);
                    logger.debug("There is one  available modality for role [" + role + "] on parameter [" + idPar
                            + "]");
                } else {
                    logger.debug(
                            "There is no modality available for role [" + role + "] on parameter [" + idPar + "]");
                }
            }
            tx.rollback();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
            monitor.stop();
        }
        logger.debug("OUT");
        return correctRoles;
    }

    /**
     * From the Hibernate BI object at input, gives the corrispondent BI
     * object.
     * 
     * @param hibBIObject The Hibernate BI object
     * 
     * @return the corrispondent output <code>BIObject</code>
     */
    public BIObject toBIObject(SbiObjects hibBIObject) {
        logger.debug("IN");
        // create empty biobject
        BIObject aBIObject = new BIObject();
        // set type (type code and id)
        aBIObject.setBiObjectTypeCode(hibBIObject.getObjectTypeCode());
        aBIObject.setBiObjectTypeID(hibBIObject.getObjectType().getValueId());
        // set description
        String descr = hibBIObject.getDescr();
        if (descr == null)
            descr = "";
        aBIObject.setDescription(descr);
        // set encrypt flag
        if (hibBIObject.getEncrypt() != null) {
            aBIObject.setEncrypt(new Integer(hibBIObject.getEncrypt().intValue()));
        } else
            aBIObject.setEncrypt(new Integer(0));

        // set visible flag
        if (hibBIObject.getVisible() != null) {
            aBIObject.setVisible(new Integer(hibBIObject.getVisible().intValue()));
        } else
            aBIObject.setVisible(new Integer(0));

        // set profiled visibility information
        aBIObject.setProfiledVisibility(hibBIObject.getProfiledVisibility());
        // set engine                  
        aBIObject.setEngine(new EngineDAOHibImpl().toEngine(hibBIObject.getSbiEngines()));
        // set data source
        if (hibBIObject.getDataSource() != null) {
            aBIObject.setDataSourceId(new Integer(hibBIObject.getDataSource().getDsId()));
        }
        if (hibBIObject.getDataSet() != null) {
            aBIObject.setDataSetId(new Integer(hibBIObject.getDataSet().getDsId()));
        }

        // set id
        aBIObject.setId(hibBIObject.getBiobjId());
        aBIObject.setLabel(hibBIObject.getLabel());
        aBIObject.setName(hibBIObject.getName());
        aBIObject.setTenant(hibBIObject.getCommonInfo().getOrganization());

        // set path
        aBIObject.setPath(hibBIObject.getPath());
        aBIObject.setUuid(hibBIObject.getUuid());
        aBIObject.setRelName(hibBIObject.getRelName());
        aBIObject.setStateCode(hibBIObject.getStateCode());
        aBIObject.setStateID(hibBIObject.getState().getValueId());

        List functionlities = new ArrayList();
        Set hibObjFuncs = hibBIObject.getSbiObjFuncs();
        for (Iterator it = hibObjFuncs.iterator(); it.hasNext();) {
            SbiObjFunc aSbiObjFunc = (SbiObjFunc) it.next();
            Integer functionalityId = aSbiObjFunc.getId().getSbiFunctions().getFunctId();
            functionlities.add(functionalityId);
        }
        aBIObject.setFunctionalities(functionlities);

        List businessObjectParameters = new ArrayList();
        Set hibObjPars = hibBIObject.getSbiObjPars();
        if (hibObjPars != null) {
            for (Iterator it = hibObjPars.iterator(); it.hasNext();) {
                SbiObjPar aSbiObjPar = (SbiObjPar) it.next();
                BIObjectParameter par = toBIObjectParameter(aSbiObjPar);
                businessObjectParameters.add(par);
            }
            aBIObject.setBiObjectParameters(businessObjectParameters);
        }

        aBIObject.setCreationDate(hibBIObject.getCreationDate());
        aBIObject.setCreationUser(hibBIObject.getCreationUser());

        aBIObject.setRefreshSeconds(hibBIObject.getRefreshSeconds());
        logger.debug("OUT");
        return aBIObject;
    }

    /**
     * From the hibernate BI object parameter at input, gives
     * the corrispondent <code>BIObjectParameter</code> object.
     * 
     * @param hiObjPar The hybernate BI object parameter
     * 
     * @return The corrispondent <code>BIObjectParameter</code>
     */
    public BIObjectParameter toBIObjectParameter(SbiObjPar hiObjPar) {
        BIObjectParameter aBIObjectParameter = new BIObjectParameter();
        aBIObjectParameter.setId(hiObjPar.getObjParId());
        aBIObjectParameter.setLabel(hiObjPar.getLabel());
        aBIObjectParameter.setModifiable(new Integer(hiObjPar.getModFl().intValue()));
        aBIObjectParameter.setMultivalue(new Integer(hiObjPar.getMultFl().intValue()));
        aBIObjectParameter.setBiObjectID(hiObjPar.getSbiObject().getBiobjId());
        aBIObjectParameter.setParameterUrlName(hiObjPar.getParurlNm());
        aBIObjectParameter.setParID(hiObjPar.getSbiParameter().getParId());
        aBIObjectParameter.setRequired(new Integer(hiObjPar.getReqFl().intValue()));
        aBIObjectParameter.setVisible(new Integer(hiObjPar.getViewFl().intValue()));
        aBIObjectParameter.setPriority(hiObjPar.getPriority());
        aBIObjectParameter.setProg(hiObjPar.getProg());
        Parameter parameter = new Parameter();
        parameter.setId(hiObjPar.getSbiParameter().getParId());
        aBIObjectParameter.setParameter(parameter);
        return aBIObjectParameter;
    }

    /* (non-Javadoc)
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#loadAllBIObjects()
     */
    public List loadAllBIObjects() throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        List realResult = new ArrayList();
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            Query hibQuery = aSession.createQuery(" from SbiObjects s order by s.label");
            List hibList = hibQuery.list();
            Iterator it = hibList.iterator();
            while (it.hasNext()) {
                realResult.add(toBIObject((SbiObjects) it.next()));
            }
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
        logger.debug("OUT");
        return realResult;
    }

    /* (non-Javadoc)
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#loadAllBIObjects(java.lang.String)
     */
    public List loadAllBIObjects(String filterOrder) throws EMFUserError {
        logger.debug("IN.filterOrder=" + filterOrder);
        Session aSession = null;
        Transaction tx = null;
        List realResult = new ArrayList();
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            Query hibQuery = aSession.createQuery("from SbiObjects s  order by s." + filterOrder);
            //Query hibQuery = aSession.createQuery("from SbiObjects s  order by ?" );
            //hibQuery.setString(0, filterOrder);
            List hibList = hibQuery.list();

            //Criteria criteria = aSession.createCriteria(SbiObjects.class);
            //criteria.setFetchMode("sbiObjFuncs.sbiEngines", FetchMode.JOIN);
            //criteria.addOrder(Order.asc(filterOrder));
            //List hibList = criteria.list();
            Iterator it = hibList.iterator();
            while (it.hasNext()) {
                realResult.add(toBIObject((SbiObjects) it.next()));
            }
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
        logger.debug("OUT");
        return realResult;
    }

    /**
     * Gets the biparameters associated with to a biobject.
     * 
     * @param aBIObject BIObject the biobject to analize
     * 
     * @return List, list of the biparameters associated with the biobject
     * 
     * @throws EMFUserError the EMF user error
     */
    public List getBIObjectParameters(BIObject aBIObject) throws EMFUserError {
        IBIObjectParameterDAO biobjDAO = DAOFactory.getBIObjectParameterDAO();
        List biparams = biobjDAO.loadBIObjectParametersById(aBIObject.getId());
        return biparams;
    }

    /* (non-Javadoc)
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#loadAllBIObjectsFromInitialPath(java.lang.String)
     */
    public List loadAllBIObjectsFromInitialPath(String initialPath) throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        List realResult = new ArrayList();
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            /*Query hibQuery = aSession.createQuery(
            "select " +
            "   distinct(objects) " +
            "from " +
            "   SbiObjects as objects, SbiObjFunc as objFuncs, SbiFunctions as functions " +
            "where " +
            "   objects.biobjId = objFuncs.id.sbiObjects.biobjId " +
            "   and objFuncs.id.sbiFunctions.functId = functions.functId " +
            "   and " +
            "      (functions.path = '" + initialPath + "' " +
            "       or functions.path like '" + initialPath + "/%' ) " + 
            "order by " +
            "   objects.label");*/

            Query hibQuery = aSession.createQuery("select " + "   distinct(objects) " + "from "
                    + "   SbiObjects as objects, SbiObjFunc as objFuncs, SbiFunctions as functions " + "where "
                    + "   objects.biobjId = objFuncs.id.sbiObjects.biobjId "
                    + "   and objFuncs.id.sbiFunctions.functId = functions.functId " + "   and "
                    + "      (functions.path = ? " + "       or functions.path like ?) " + "order by "
                    + "   objects.label");

            hibQuery.setString(0, initialPath);
            hibQuery.setString(1, initialPath + "%");
            List hibList = hibQuery.list();

            Iterator it = hibList.iterator();
            while (it.hasNext()) {
                realResult.add(toBIObject((SbiObjects) it.next()));
            }
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);

            if (tx != null)
                tx.rollback();

            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);

        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
        logger.debug("OUT");
        return realResult;
    }

    /* (non-Javadoc)
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#loadAllBIObjectsFromInitialPath(java.lang.String, java.lang.String)
     */
    public List loadAllBIObjectsFromInitialPath(String initialPath, String filterOrder) throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        List realResult = new ArrayList();
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            /*
            Query hibQuery = aSession.createQuery(
            "select " +
            "   distinct(objects) " +
            "from " +
            "   SbiObjects as objects, SbiObjFunc as objFuncs, SbiFunctions as functions " +
            "where " +
            "   objects.biobjId = objFuncs.id.sbiObjects.biobjId " +
            "   and objFuncs.id.sbiFunctions.functId = functions.functId " +
            "   and " +
            "      (functions.path = '" + initialPath + "' " +
            "       or functions.path like '" + initialPath + "/%' ) " + 
            "order by " +
            "   objects." + filterOrder);
             */
            Query hibQuery = aSession.createQuery("select " + "   distinct(objects) " + "from "
                    + "   SbiObjects as objects, SbiObjFunc as objFuncs, SbiFunctions as functions " + "where "
                    + "   objects.biobjId = objFuncs.id.sbiObjects.biobjId "
                    + "   and objFuncs.id.sbiFunctions.functId = functions.functId " + "   and "
                    + "      (functions.path = ? " + "       or functions.path like ? " + "order by ? ");
            hibQuery.setString(0, initialPath);
            hibQuery.setString(1, initialPath + "%");
            hibQuery.setString(2, "   objects." + filterOrder);

            List hibList = hibQuery.list();
            Iterator it = hibList.iterator();
            while (it.hasNext()) {
                realResult.add(toBIObject((SbiObjects) it.next()));
            }
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);

            if (tx != null)
                tx.rollback();

            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);

        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
        logger.debug("OUT");
        return realResult;
    }

    /* (non-Javadoc)
     * @see it.eng.spagobi.analiticalmodel.document.dao.IBIObjectDAO#loadBIObjectForDetail(java.lang.String)
     */
    public BIObject loadBIObjectForDetail(String path) throws EMFUserError {
        logger.debug("IN");
        BIObject biObject = null;
        Session aSession = null;
        Transaction tx = null;
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            //String hql = " from SbiObjects where path = '" + path + "'";
            String hql = " from SbiObjects where path = ? ";

            Query hqlQuery = aSession.createQuery(hql);
            hqlQuery.setSerializable(0, path);

            SbiObjects hibObject = (SbiObjects) hqlQuery.uniqueResult();
            if (hibObject == null)
                return null;
            biObject = toBIObject(hibObject);
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
        logger.debug("OUT");
        return biObject;
    }

    /**
     * Called only for document composition (update object modality).
     * Puts parameters into the document composition getting these from document's children.
     * @param aSession the hibernate session
     * @param biObject the BI object of document composition
     * @param template the BI last active template 
     * @param flgDelete the flag that suggest if is necessary to delete parameters before the insertion
     * @throws EMFUserError
     */
    private void insertParametersDocComposition(BIObject biObject, ObjTemplate template, boolean flgDelete)
            throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        //get informations about documents child
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            //gets document composition configuration
            if (template == null)
                return;
            byte[] contentBytes = template.getContent();
            String contentStr = new String(contentBytes);
            SourceBean content = SourceBean.fromXMLString(contentStr);
            DocumentCompositionConfiguration docConf = new DocumentCompositionConfiguration(content);
            List lstLabeldDocs = docConf.getSbiObjLabelsArray();
            List totalParameters = new ArrayList();

            //if flag flgDelete is true delete all parameters associated to document composition
            if (flgDelete) {
                List lstDocParameters = DAOFactory.getBIObjectParameterDAO()
                        .loadBIObjectParametersById(biObject.getId());
                for (int i = 0; i < lstDocParameters.size(); i++) {
                    BIObjectParameter docParam = (BIObjectParameter) lstDocParameters.get(i);
                    SbiObjects aSbiObject = new SbiObjects();
                    Integer objId = biObject.getId();
                    aSbiObject.setBiobjId(biObject.getId());

                    SbiParameters aSbiParameter = new SbiParameters();
                    aSbiParameter.setParId(docParam.getParameter().getId());

                    SbiObjPar hibObjPar = new SbiObjPar();
                    hibObjPar.setObjParId(docParam.getId());
                    hibObjPar.setLabel(docParam.getLabel());

                    hibObjPar.setSbiObject(aSbiObject);
                    hibObjPar.setSbiParameter(aSbiParameter);

                    aSession.delete(hibObjPar);
                }
            }

            //for every document child gets parameters and inserts these into new document composition object
            for (int i = 0; i < lstLabeldDocs.size(); i++) {
                //BIObject docChild = DAOFactory.getBIObjectDAO().loadBIObjectByLabel((String)lstLabeldDocs.get(i));
                BIObject docChild = loadBIObjectByLabel((String) lstLabeldDocs.get(i));

                if (docChild == null) {
                    logger.error("Error while getting document child " + (String) lstLabeldDocs.get(i)
                            + " for document composition.");
                    List lstLabel = new ArrayList();
                    lstLabel.add((String) lstLabeldDocs.get(i));
                    throw new EMFUserError(EMFErrorSeverity.ERROR, "1005", lstLabel,
                            "component_spagobidocumentcompositionIE_messages");
                } else {
                    List lstDocChildParameters = DAOFactory.getBIObjectParameterDAO()
                            .loadBIObjectParametersById(docChild.getId());
                    for (int j = 0; j < lstDocChildParameters.size(); j++) {
                        BIObjectParameter objPar = (BIObjectParameter) lstDocChildParameters.get(j);
                        if (!totalParameters.contains(objPar.getLabel())) {
                            SbiObjects aSbiObject = new SbiObjects();
                            //aSbiObject.setBiobjId(biObject.getId());
                            Integer objId = biObject.getId();
                            if (objId == null || objId.compareTo(new Integer("0")) == 0)
                                objId = biObject.getId();
                            aSbiObject.setBiobjId(objId);

                            SbiParameters aSbiParameter = new SbiParameters();
                            aSbiParameter.setParId(objPar.getParID());
                            SbiObjPar sbiObjPar = new SbiObjPar();
                            sbiObjPar.setSbiObject(aSbiObject);
                            sbiObjPar.setSbiParameter(aSbiParameter);
                            sbiObjPar.setObjParId(new Integer("-1"));
                            sbiObjPar.setLabel(objPar.getLabel());
                            sbiObjPar.setParurlNm(objPar.getParameterUrlName());
                            sbiObjPar.setReqFl(new Short(objPar.getRequired().shortValue()));
                            sbiObjPar.setModFl(new Short(objPar.getModifiable().shortValue()));
                            sbiObjPar.setViewFl(new Short(objPar.getVisible().shortValue()));
                            sbiObjPar.setMultFl(new Short(objPar.getMultivalue().shortValue()));
                            sbiObjPar.setProg(objPar.getProg());
                            sbiObjPar.setPriority(new Integer(totalParameters.size() + 1));
                            updateSbiCommonInfo4Insert(sbiObjPar);
                            aSession.save(sbiObjPar);
                            totalParameters.add(objPar.getLabel());
                        }
                    }
                }
            }
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } catch (EMFUserError eu) {
            throw eu;
        } catch (Exception e) {
            logger.error("Error while creating parameter for document composition.", e);
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
        logger.debug("OUT");

    }

    /**
     * Called only for document composition (insert object modality).
     * Puts parameters into the document composition getting these from document's children.
     * @param biobjectId the document composition biobject id
     * @throws EMFUserError
     */
    private void insertParametersDocComposition(Integer biobjectId) throws EMFUserError {
        logger.debug("IN");
        //get informations about documents child
        Session aSession = null;
        Transaction tx = null;
        try {
            //gets document composition configuration
            ObjTemplate template = DAOFactory.getObjTemplateDAO().getBIObjectActiveTemplate(biobjectId);
            aSession = getSession();
            tx = aSession.beginTransaction();
            logger.debug("Template document composition in insert: " + template);
            if (template == null)
                return;
            byte[] contentBytes = template.getContent();
            String contentStr = new String(contentBytes);
            SourceBean content = SourceBean.fromXMLString(contentStr);
            DocumentCompositionConfiguration docConf = new DocumentCompositionConfiguration(content);
            List lstLabeldDocs = docConf.getSbiObjLabelsArray();
            List totalParameters = new ArrayList();

            //for every document child gets parameters and inserts these into new document composition object
            for (int i = 0; i < lstLabeldDocs.size(); i++) {
                BIObject docChild = loadBIObjectByLabel((String) lstLabeldDocs.get(i));
                if (docChild == null) {
                    logger.error("Error while getting document child " + (String) lstLabeldDocs.get(i)
                            + " for document composition.");
                    List lstLabel = new ArrayList();
                    lstLabel.add((String) lstLabeldDocs.get(i));
                    throw new EMFUserError(EMFErrorSeverity.ERROR, "1005", lstLabel,
                            "component_spagobidocumentcompositionIE");
                } else {
                    List lstDocChildParameters = DAOFactory.getBIObjectParameterDAO()
                            .loadBIObjectParametersById(docChild.getId());
                    for (int j = 0; j < lstDocChildParameters.size(); j++) {
                        BIObjectParameter objPar = (BIObjectParameter) lstDocChildParameters.get(j);
                        if (!totalParameters.contains(objPar.getLabel())) {
                            SbiObjects aSbiObject = new SbiObjects();
                            //aSbiObject.setBiobjId(biObject.getId());
                            Integer objId = biobjectId;
                            if (objId == null || objId.compareTo(new Integer("0")) == 0)
                                objId = biobjectId;
                            aSbiObject.setBiobjId(objId);

                            SbiParameters aSbiParameter = new SbiParameters();
                            aSbiParameter.setParId(objPar.getParID());
                            SbiObjPar sbiObjPar = new SbiObjPar();
                            sbiObjPar.setSbiObject(aSbiObject);
                            sbiObjPar.setSbiParameter(aSbiParameter);
                            sbiObjPar.setObjParId(new Integer("-1"));
                            sbiObjPar.setLabel(objPar.getLabel());
                            sbiObjPar.setParurlNm(objPar.getParameterUrlName());
                            sbiObjPar.setReqFl(new Short(objPar.getRequired().shortValue()));
                            sbiObjPar.setModFl(new Short(objPar.getModifiable().shortValue()));
                            sbiObjPar.setViewFl(new Short(objPar.getVisible().shortValue()));
                            sbiObjPar.setMultFl(new Short(objPar.getMultivalue().shortValue()));
                            sbiObjPar.setProg(objPar.getProg());
                            sbiObjPar.setPriority(new Integer(totalParameters.size() + 1));
                            updateSbiCommonInfo4Insert(sbiObjPar);
                            aSession.save(sbiObjPar);
                            totalParameters.add(objPar.getLabel());
                        }
                    }
                }
            }
            tx.commit();
        } catch (EMFUserError e) {
            throw e;
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } catch (Exception e) {
            logger.error("Error while creating parameter for document composition.", e);
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
        logger.debug("OUT");
    }

    public List loadBIObjects(String type, String state, String folderPath) throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        List realResult = new ArrayList();
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();

            //         Criteria criteria = aSession.createCriteria(SbiObjFunc.class);
            //         if (type != null) {
            //         Criterion typeCriterion = Expression.eq("id.sbiObjects.objectTypeCode", type);
            //         criteria.add(typeCriterion);
            //         }
            //         if (state != null) {
            //         Criterion stateCriterion = Expression.eq("id.sbiObjects.stateCode", state);
            //         criteria.add(stateCriterion);
            //         }
            //         if (folderPath != null) {
            //         Criterion folderPathCriterion = Expression.eq("id.sbiFunctions.path", folderPath);
            //         criteria.add(folderPathCriterion);
            //         }
            //         List hibList = criteria.list();

            StringBuffer buffer = new StringBuffer();
            if (folderPath != null) {
                buffer.append(
                        "select distinct(objects) from SbiObjects as objects, SbiObjFunc as objFuncs, SbiFunctions as functions "
                                + "where objects.biobjId = objFuncs.id.sbiObjects.biobjId and objFuncs.id.sbiFunctions.functId = functions.functId "
                                + "and functions.path = :PATH and ");
            } else {
                buffer.append("select objects from SbiObjects as objects where ");
            }
            if (state != null) {
                buffer.append(" objects.stateCode = :STATE and ");
            }
            if (type != null) {
                buffer.append(" objects.objectTypeCode = :TYPE");
            }
            String hql = buffer.toString();
            if (hql.endsWith(" and ")) {
                hql = hql.substring(0, hql.length() - " and ".length());
            }
            if (hql.endsWith(" where ")) {
                hql = hql.substring(0, hql.length() - " where ".length());
            }

            Query query = aSession.createQuery(hql);
            if (folderPath != null) {
                query.setParameter("PATH", folderPath);
            }
            if (state != null) {
                query.setParameter("STATE", state);
            }
            if (type != null) {
                query.setParameter("TYPE", type);
            }

            List hibList = query.list();
            Iterator it = hibList.iterator();
            while (it.hasNext()) {
                SbiObjects object = (SbiObjects) it.next();
                realResult.add(toBIObject(object));
            }
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
        logger.debug("OUT");
        return realResult;
    }

    /**
     * Loads visible objects of the user roles
     * @param folderID
     * @param profile the profile of the user
     * @return
     * @throws EMFUserError
     */
    public List loadBIObjects(Integer folderID, IEngUserProfile profile, boolean isPersonalFolder)
            throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        List realResult = new ArrayList();
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            StringBuffer buffer = new StringBuffer();
            Collection roles = null;

            if (!isPersonalFolder) {

                try {
                    if (profile != null)
                        roles = ((UserProfile) profile).getRolesForUse();
                } catch (Exception e) {
                    logger.error("Error while recovering user profile", e);
                }

                if (folderID != null && roles != null && roles.size() > 0) {
                    buffer.append("select o from SbiObjects o, SbiObjFunc sof, SbiFunctions f,  SbiFuncRole fr "
                            + "where sof.id.sbiFunctions.functId = f.functId and o.biobjId = sof.id.sbiObjects.biobjId  "
                            + " and fr.id.role.extRoleId IN (select extRoleId from SbiExtRoles e  where  e.name in (:ROLES)) "
                            + " and fr.id.function.functId = f.functId " + " and f.functId = :FOLDER_ID  ");

                    if (profile.isAbleToExecuteAction(SpagoBIConstants.DOCUMENT_MANAGEMENT_ADMIN)) {
                        //                  buffer.append(" and ( fr.id.state.valueId = o.state OR o.stateCode = 'SUSP') " ); 

                        buffer.append(" and (" + "(fr.id.state.valueCd = '"
                                + SpagoBIConstants.PERMISSION_ON_FOLDER_TO_DEVELOP + "' AND o.state.valueCd = '"
                                + SpagoBIConstants.DOC_STATE_DEV + "') OR" + "(fr.id.state.valueCd = '"
                                + SpagoBIConstants.PERMISSION_ON_FOLDER_TO_TEST + "' AND o.state.valueCd = '"
                                + SpagoBIConstants.DOC_STATE_TEST + "') OR " + "(fr.id.state.valueCd = '"
                                + SpagoBIConstants.PERMISSION_ON_FOLDER_TO_EXECUTE + "' AND o.state.valueCd = '"
                                + SpagoBIConstants.DOC_STATE_REL + "') OR " + "o.stateCode = '"
                                + SpagoBIConstants.DOC_STATE_SUSP + "'" + ") ");
                    } else {
                        buffer.append(" and (" + "(fr.id.state.valueCd = '"
                                + SpagoBIConstants.PERMISSION_ON_FOLDER_TO_DEVELOP + "' AND o.state.valueCd = '"
                                + SpagoBIConstants.DOC_STATE_DEV + "') OR" + "(fr.id.state.valueCd = '"
                                + SpagoBIConstants.PERMISSION_ON_FOLDER_TO_TEST + "' AND o.state.valueCd = '"
                                + SpagoBIConstants.DOC_STATE_TEST + "') OR " + "(fr.id.state.valueCd = '"
                                + SpagoBIConstants.PERMISSION_ON_FOLDER_TO_EXECUTE + "' AND o.state.valueCd = '"
                                + SpagoBIConstants.DOC_STATE_REL + "')" + ") ");
                    }

                    if (!profile.isAbleToExecuteAction(SpagoBIConstants.DOCUMENT_MANAGEMENT_ADMIN)
                            && !profile.isAbleToExecuteAction(SpagoBIConstants.DOCUMENT_MANAGEMENT_DEV)) {
                        buffer.append(" and o.visible = 1"); //only visible objetcs (1 means true)
                    }
                    buffer.append(" order by o.name");
                } else {
                    buffer.append("select objects from SbiObjects as objects ");
                }
            } else {
                if (folderID != null) {
                    buffer.append("select o from SbiObjects o, SbiObjFunc sof, SbiFunctions f "
                            + "where sof.id.sbiFunctions.functId = f.functId and o.biobjId = sof.id.sbiObjects.biobjId  "
                            + " and f.functId = :FOLDER_ID  ");

                    if (!profile.isAbleToExecuteAction(SpagoBIConstants.DOCUMENT_MANAGEMENT_ADMIN)
                            && !profile.isAbleToExecuteAction(SpagoBIConstants.DOCUMENT_MANAGEMENT_DEV)) {
                        buffer.append(" and o.visible = 1"); //only visible objetcs (1 means true)
                    }
                    buffer.append(" order by o.name");
                }
            }

            String hql = buffer.toString();
            Query query = aSession.createQuery(hql);

            if (!isPersonalFolder) {
                if (folderID != null && roles != null && roles.size() > 0) {
                    query.setInteger("FOLDER_ID", folderID.intValue());
                    query.setParameterList("ROLES", roles);
                }
            } else {
                if (folderID != null) {
                    query.setInteger("FOLDER_ID", folderID.intValue());
                }
            }

            List hibList = query.list();
            Iterator it = hibList.iterator();
            while (it.hasNext()) {
                SbiObjects object = (SbiObjects) it.next();
                realResult.add(toBIObject(object));
            }
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } catch (Exception e) {
            logger.error(e);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
        logger.debug("OUT");
        return realResult;
    }

    /**
     * Search objects with the features specified
     * @param valueFilter  the value of the filter for the research
     * @param typeFilter   the type of the filter (the operator: equals, starts...)
     * @param columnFilter the column on which the filter is applied
     * @param nodeFilter   the node (folder id) on which the filter is applied
     * @param profile      the profile of the user
     * @return
     * @throws EMFUserError
     */
    public List searchBIObjects(String valueFilter, String typeFilter, String columnFilter, String scope,
            Integer nodeFilter, IEngUserProfile profile) throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        List realResult = new ArrayList();
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();

            Collection roles = null;
            try {
                RequestContainer reqCont = RequestContainer.getRequestContainer();
                roles = ((UserProfile) profile).getRolesForUse();
                logger.debug("Profile roles: " + roles);

            } catch (Exception e) {
                logger.error("Error while recovering user profile", e);
                throw new EMFUserError(EMFErrorSeverity.ERROR, 1084);
            }

            StringBuffer bufferSelect = new StringBuffer();
            StringBuffer bufferFrom = new StringBuffer();
            StringBuffer bufferWhere = new StringBuffer();
            StringBuffer bufferOrder = new StringBuffer();

            //definition of the the search query 
            if (roles != null && roles.size() > 0) {
                bufferSelect.append(" select distinct o ");
                /*bufferSelect.append(" select distinct o.biobjId, o.sbiEngines, o.descr, o.label, o.path, o.relName, o.state, "+
                    " o.stateCode, o.objectTypeCode, o.objectType, o.schedFl, "+
                    " o.execMode, o.stateConsideration, o.execModeCode, o.stateConsiderationCode, o.name, o.visible, o.uuid, " +
                    " o.extendedDescription, o.objectve, o.language, o.creationDate, o.creationUser, "+
                    " o.keywords, o.refreshSeconds, o.profiledVisibility ");*/
                bufferFrom
                        .append(" from SbiObjects as o, SbiObjFunc as sof, SbiFunctions as f,  SbiFuncRole as fr ");
                bufferWhere.append(
                        " where sof.id.sbiFunctions.functId = f.functId and o.biobjId = sof.id.sbiObjects.biobjId and "
                                + " ((fr.id.role.extRoleId IN (select extRoleId from SbiExtRoles e  where  e.name in (:ROLES)) "
                                + " and fr.id.function.functId = f.functId and (" + "(fr.id.state.valueCd = '"
                                + SpagoBIConstants.PERMISSION_ON_FOLDER_TO_DEVELOP + "' AND o.state.valueCd = '"
                                + SpagoBIConstants.DOC_STATE_DEV + "') OR" + "(fr.id.state.valueCd = '"
                                + SpagoBIConstants.PERMISSION_ON_FOLDER_TO_TEST + "' AND o.state.valueCd = '"
                                + SpagoBIConstants.DOC_STATE_TEST + "') OR " + "(fr.id.state.valueCd = '"
                                + SpagoBIConstants.PERMISSION_ON_FOLDER_TO_EXECUTE + "' AND o.state.valueCd = '"
                                + SpagoBIConstants.DOC_STATE_REL + "') "
                                + ") ) OR  f.path like :PERSONAL_FOLDER_PREFIX )");

            }
            String operCondition = "";
            String likeStart = "";
            String likeEnd = "";
            if (valueFilter != null && !valueFilter.equals("") && typeFilter != null && !typeFilter.equals("")
                    && columnFilter != null && !columnFilter.equals("")) {
                //defines correct logical operator
                if (typeFilter.equalsIgnoreCase(START_WITH)) {
                    operCondition = " like :VALUE_FILTER";
                    likeStart = "";
                    likeEnd = "%";
                } else if (typeFilter.equalsIgnoreCase(END_WITH)) {
                    operCondition = " like :VALUE_FILTER";
                    likeStart = "%";
                    likeEnd = "";
                } else if (EQUALS_TO.equalsIgnoreCase(typeFilter)) {
                    operCondition = " = :VALUE_FILTER";
                } else if (NOT_EQUALS_TO.equalsIgnoreCase(typeFilter)) {
                    operCondition = " != :VALUE_FILTER";
                } else if (GREATER_THAN.equalsIgnoreCase(typeFilter)) {
                    operCondition = " > :VALUE_FILTER";
                } else if (LESS_THAN.equalsIgnoreCase(typeFilter)) {
                    operCondition = " < :VALUE_FILTER";
                } else if (CONTAINS.equalsIgnoreCase(typeFilter)) {
                    operCondition = " like :VALUE_FILTER";
                    likeStart = "%";
                    likeEnd = "%";
                } else if (EQUALS_OR_LESS_THAN.equalsIgnoreCase(typeFilter)) {
                    operCondition = " <= :VALUE_FILTER";
                } else if (EQUALS_OR_GREATER_THAN.equalsIgnoreCase(typeFilter)) {
                    operCondition = " >= :VALUE_FILTER";
                    /*
                    }else if (NOT_ENDS_WITH.equalsIgnoreCase( typeFilter )) {
                    operCondition =  "NOT LIKE %:VALUE_FILTER";
                    } else if (NOT_CONTAINS.equalsIgnoreCase( typeFilter )) {
                    operCondition =  "NOT LIKE %:VALUE_FILTER%";
                    } else if (IS_NULL.equalsIgnoreCase( typeFilter )) {
                    operCondition =  "IS NULL";
                    } else if (NOT_NULL.equalsIgnoreCase( typeFilter )) {
                    operCondition =  "IS NOT NULL";*/
                } else {
                    logger.error("The query Operator " + typeFilter + " is invalid.");
                    throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
                }

                if (columnFilter.equalsIgnoreCase(COLUMN_LABEL)) {
                    bufferWhere.append(" and o.label " + operCondition);
                }
                if (columnFilter.equalsIgnoreCase(COLUMN_NAME)) {
                    bufferWhere.append(" and o.name " + operCondition);
                }
                if (columnFilter.equalsIgnoreCase(COLUMN_ENGINE)) {
                    bufferFrom.append(", SbiEngines e ");
                    bufferWhere.append(" and e.engineId = o.sbiEngines and e.name " + operCondition);
                }

                if (columnFilter.equalsIgnoreCase(COLUMN_STATE)) {
                    bufferFrom.append(", SbiDomains d ");
                    bufferWhere.append(" and d.valueId = o.state and d.valueCd " + operCondition);
                }

                if (columnFilter.equalsIgnoreCase(COLUMN_TYPE)) {
                    bufferFrom.append(", SbiDomains d ");
                    bufferWhere.append(" and d.valueId = o.objectType and d.valueCd " + operCondition);
                }

                if (columnFilter != null && columnFilter.equalsIgnoreCase(COLUMN_DATE)) {
                    bufferWhere.append(" and convert(o.creationDate, DATE) " + operCondition);
                }

            }

            if (scope != null && scope.equals(SCOPE_NODE) && nodeFilter != null && !nodeFilter.equals("")) {
                bufferWhere.append(" and (f.functId = :FOLDER_ID or f.parentFunct = :FOLDER_ID) ");
            }

            bufferOrder.append(" order by o.name");

            String hql = bufferSelect.toString() + bufferFrom.toString() + bufferWhere.toString()
                    + bufferOrder.toString();

            logger.debug("query hql: " + hql);

            Query query = aSession.createQuery(hql);

            query.setParameter("PERSONAL_FOLDER_PREFIX",
                    "/" + ((UserProfile) profile).getUserId().toString() + "%");

            //setting query parameters
            query.setParameterList("ROLES", roles);
            logger.debug("Parameter value ROLES: " + roles);

            if (valueFilter != null) {
                if (!likeStart.equals("") || !likeEnd.equals("")) {
                    query.setParameter("VALUE_FILTER", likeStart + valueFilter + likeEnd);
                    logger.debug("Parameter value VALUE_FILTER: " + likeStart + valueFilter + likeEnd);
                } else {
                    query.setParameter("VALUE_FILTER", valueFilter);
                    logger.debug("Parameter value VALUE_FILTER: " + valueFilter);
                }
            }

            if (scope != null && scope.equals("node") && nodeFilter != null && !nodeFilter.equals("")) {
                query.setParameter("FOLDER_ID", nodeFilter);
                logger.debug("Parameter value FOLDER_ID: " + nodeFilter);
            }
            //executes query
            List hibList = query.list();
            Iterator it = hibList.iterator();
            while (it.hasNext()) {
                SbiObjects object = (SbiObjects) it.next();
                realResult.add(toBIObject(object));
            }
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } catch (Exception e) {
            logger.error(e.getStackTrace());
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
        }
        logger.debug("OUT");
        return realResult;
    }

    public Integer countBIObjects() throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        Integer resultNumber;

        try {
            aSession = getSession();
            tx = aSession.beginTransaction();

            String hql = "select count(*) from SbiObjects ";
            Query hqlQuery = aSession.createQuery(hql);
            Long temp = (Long) hqlQuery.uniqueResult();
            resultNumber = new Integer(temp.intValue());

        } catch (HibernateException he) {
            logger.error("Error while loading the list of BIObjects", he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 9104);

        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
                logger.debug("OUT");
            }
        }
        return resultNumber;
    }

    public List loadPagedObjectsList(Integer offset, Integer fetchSize) throws EMFUserError {
        logger.debug("IN");
        List toReturn = null;
        Session aSession = null;
        Transaction tx = null;
        Integer resultNumber;
        Query hibernateQuery;

        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            toReturn = new ArrayList();
            List toTransform = null;

            String hql = "select count(*) from SbiObjects ";
            Query hqlQuery = aSession.createQuery(hql);
            Long temp = (Long) hqlQuery.uniqueResult();
            resultNumber = new Integer(temp.intValue());

            offset = offset < 0 ? 0 : offset;
            if (resultNumber > 0) {
                fetchSize = (fetchSize > 0) ? Math.min(fetchSize, resultNumber) : resultNumber;
            }

            hibernateQuery = aSession.createQuery("from SbiObjects order by label");
            hibernateQuery.setFirstResult(offset);
            if (fetchSize > 0)
                hibernateQuery.setMaxResults(fetchSize);

            toTransform = hibernateQuery.list();

            Iterator it = toTransform.iterator();
            while (it.hasNext()) {
                SbiObjects object = (SbiObjects) it.next();
                toReturn.add(toBIObject(object));
            }
        } catch (HibernateException he) {
            logger.error("Error while loading the list of Resources", he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 9104);

        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
                logger.debug("OUT");
            }
        }
        return toReturn;
    }

    public BIObject loadBIObjectForExecutionByLabelAndRole(String label, String role) throws EMFUserError {
        logger.debug("IN");
        Session aSession = null;
        Transaction tx = null;
        BIObject biObject = null;
        Monitor monitor = MonitorFactory.start("spagobi.core.BIObjectDAO.loadBIObjectForExecutionByLabelAndRole");
        try {
            aSession = getSession();
            tx = aSession.beginTransaction();
            biObject = loadBIObjectByLabel(label);
            String hql = "from SbiObjPar s where s.sbiObject.label = ? order by s.priority asc";
            Query hqlQuery = aSession.createQuery(hql);
            hqlQuery.setString(0, biObject.getLabel());
            List hibObjectPars = hqlQuery.list();
            SbiObjPar hibObjPar = null;
            Iterator it = hibObjectPars.iterator();
            BIObjectParameter tmpBIObjectParameter = null;
            BIObjectParameterDAOHibImpl aBIObjectParameterDAOHibImpl = new BIObjectParameterDAOHibImpl();
            IParameterDAO aParameterDAO = DAOFactory.getParameterDAO();
            List biObjectParameters = new ArrayList();
            Parameter aParameter = null;
            int count = 1;
            while (it.hasNext()) {
                hibObjPar = (SbiObjPar) it.next();
                tmpBIObjectParameter = aBIObjectParameterDAOHibImpl.toBIObjectParameter(hibObjPar);

                //*****************************************************************
                //**************** START PRIORITY RECALCULATION *******************
                //*****************************************************************
                Integer priority = tmpBIObjectParameter.getPriority();
                if (priority == null || priority.intValue() != count) {
                    logger.warn("The priorities of the biparameters for the document with id = " + biObject.getId()
                            + " are not sorted. Priority recalculation starts.");
                    aBIObjectParameterDAOHibImpl.recalculateBiParametersPriority(biObject.getId(), aSession);
                    tmpBIObjectParameter.setPriority(new Integer(count));
                }
                count++;
                //*****************************************************************
                //**************** END PRIORITY RECALCULATION *******************
                //*****************************************************************

                aParameter = aParameterDAO.loadForExecutionByParameterIDandRoleName(tmpBIObjectParameter.getParID(),
                        role);
                tmpBIObjectParameter.setParID(aParameter.getId());
                tmpBIObjectParameter.setParameter(aParameter);
                biObjectParameters.add(tmpBIObjectParameter);
            }
            biObject.setBiObjectParameters(biObjectParameters);
            tx.commit();
        } catch (HibernateException he) {
            logger.error(he);
            if (tx != null)
                tx.rollback();
            throw new EMFUserError(EMFErrorSeverity.ERROR, 100);
        } finally {
            if (aSession != null) {
                if (aSession.isOpen())
                    aSession.close();
            }
            monitor.stop();
        }
        logger.debug("OUT");
        return biObject;
    }
}