it.eng.spagobi.tools.importexport.services.ImportExportModule.java Source code

Java tutorial

Introduction

Here is the source code for it.eng.spagobi.tools.importexport.services.ImportExportModule.java

Source

/* SpagoBI, the Open Source Business Intelligence suite
    
 * Copyright (C) 2012 Engineering Ingegneria Informatica S.p.A. - SpagoBI Competency Center
 * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0, without the "Incompatible With Secondary Licenses" notice. 
 * If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package it.eng.spagobi.tools.importexport.services;

import it.eng.spago.base.RequestContainer;
import it.eng.spago.base.ResponseContainer;
import it.eng.spago.base.SessionContainer;
import it.eng.spago.base.SourceBean;
import it.eng.spago.base.SourceBeanException;
import it.eng.spago.dispatching.module.AbstractHttpModule;
import it.eng.spago.dispatching.module.AbstractModule;
import it.eng.spago.error.EMFErrorHandler;
import it.eng.spago.error.EMFErrorSeverity;
import it.eng.spago.error.EMFUserError;
import it.eng.spago.security.IEngUserProfile;
import it.eng.spago.validation.EMFValidationError;
import it.eng.spagobi.commons.dao.DAOFactory;
import it.eng.spagobi.commons.dao.IRoleDAO;
import it.eng.spagobi.commons.metadata.SbiExtRoles;
import it.eng.spagobi.commons.utilities.AuditLogUtilities;
import it.eng.spagobi.commons.utilities.GeneralUtilities;
import it.eng.spagobi.commons.utilities.UploadedFile;
import it.eng.spagobi.engines.config.dao.IEngineDAO;
import it.eng.spagobi.engines.config.metadata.SbiEngines;
import it.eng.spagobi.tools.datasource.dao.IDataSourceDAO;
import it.eng.spagobi.tools.datasource.metadata.SbiDataSource;
import it.eng.spagobi.tools.importexport.ExportUtilities;
import it.eng.spagobi.tools.importexport.IExportManager;
import it.eng.spagobi.tools.importexport.IImportManager;
import it.eng.spagobi.tools.importexport.ImportExportConstants;
import it.eng.spagobi.tools.importexport.ImportManager;
import it.eng.spagobi.tools.importexport.ImportResultInfo;
import it.eng.spagobi.tools.importexport.ImportUtilities;
import it.eng.spagobi.tools.importexport.ImporterMetadata;
import it.eng.spagobi.tools.importexport.MetadataAssociations;
import it.eng.spagobi.tools.importexport.TransformManager;
import it.eng.spagobi.tools.importexport.UserAssociationsKeeper;
import it.eng.spagobi.tools.importexport.bo.AssociationFile;
import it.eng.spagobi.tools.importexport.dao.AssociationFileDAO;
import it.eng.spagobi.tools.importexport.dao.IAssociationFileDAO;

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

import org.apache.commons.fileupload.FileItem;
import org.apache.log4j.Logger;

/**
 * This class implements a module which handles the import / export operations
 */
public class ImportExportModule extends AbstractHttpModule {

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

    /**
     * Initialize the module.
     * 
     * @param config Configuration sourcebean of the module
     */
    public void init(SourceBean config) {
    }

    /**
     * Reads the operation asked by the user and calls the export or import
     * methods.
     * 
     * @param request The Source Bean containing all request parameters
     * @param response The Source Bean containing all response parameters
     * 
     * @throws exception If an exception occurs
     * @throws Exception the exception
     */
    public void service(SourceBean request, SourceBean response) throws Exception {
        logger.debug("IN");

        String message = (String) request.getAttribute("MESSAGEDET");
        message.toLowerCase();
        logger.debug("begin of import / export service with message =" + message);
        EMFErrorHandler errorHandler = getErrorHandler();
        try {
            if (message == null) {
                EMFUserError userError = new EMFUserError(EMFErrorSeverity.ERROR, "101",
                        ImportManager.messageBundle);
                logger.warn("The message parameter is null");
                errorHandler.addError(userError);
                throw userError;
            }
            if (message.trim().equalsIgnoreCase(ImportExportConstants.EXPORT)) {
                exportConf(request, response);
            } else if (message.trim().equalsIgnoreCase(ImportExportConstants.IMPORT)) {
                importConf(request, response);
            } else if (message.trim().equalsIgnoreCase(ImportExportConstants.IMPEXP_ROLE_ASSOCIATION)) {
                associateRoles(request, response);
            } else if (message.trim().equalsIgnoreCase(ImportExportConstants.IMPEXP_ENGINE_ASSOCIATION)) {
                associateEngines(request, response);
            } else if (message.trim().equalsIgnoreCase(ImportExportConstants.IMPEXP_DATA_SOURCE_ASSOCIATION)) {
                associateDataSources(request, response);
            } else if (message.trim().equalsIgnoreCase(ImportExportConstants.IMPEXP_METADATA_ASS)) {
                associateMetadata(request, response);
            } else if (message.trim().equalsIgnoreCase(ImportExportConstants.IMPEXP_EXIT)) {
                exitImport(request, response);
            } else if (message.trim().equalsIgnoreCase(ImportExportConstants.IMPEXP_BACK_ENGINE_ASS)) {
                backEngineAssociation(request, response);
            } else if (message.trim().equalsIgnoreCase(ImportExportConstants.IMPEXP_BACK_DS_ASS)) {
                backDataSourceAssociation(request, response);
            } else if (message.trim().equalsIgnoreCase(ImportExportConstants.IMPEXP_BACK_METADATA_ASS)) {
                backMetadataAssociation(request, response);
            }
        } catch (EMFUserError emfu) {
            logger.error("Error during the service execution", emfu);
            errorHandler.addError(emfu);
        } catch (Exception ex) {
            logger.error("Error during the service execution", ex);
            EMFUserError error = new EMFUserError(EMFErrorSeverity.ERROR, "100", ImportManager.messageBundle);
            errorHandler.addError(error);
            return;
        } finally {
            logger.debug("OUT");
        }
    }

    /**
     * Manages the request of the user to export some selected objects
     * 
     * @param request
     *                Spago SourceBean request
     * @param response
     *                Spago SourceBean response
     * @throws EMFUserError
     */
    private void exportConf(SourceBean request, SourceBean response) throws EMFUserError {
        logger.debug("IN");
        HashMap<String, String> logParam = new HashMap();
        IExportManager expManager = null;
        String exportFileName = (String) request.getAttribute("exportFileName");
        logParam.put("ExportFileName", exportFileName);

        SessionContainer permSess = getRequestContainer().getSessionContainer().getPermanentContainer();
        IEngUserProfile profile = (IEngUserProfile) permSess.getAttribute(IEngUserProfile.ENG_USER_PROFILE);

        if ((exportFileName == null) || (exportFileName.trim().equals(""))) {
            logger.error("Missing name of the exported file");
            throw new EMFValidationError(EMFErrorSeverity.ERROR, "exportFileName", "8006",
                    ImportManager.messageBundle);

        }
        try {
            String exportSubObject = (String) request.getAttribute("exportSubObj");
            boolean expSubObj = false;
            if (exportSubObject != null) {
                expSubObj = true;
            }
            String exportSnapshots = (String) request.getAttribute("exportSnapshots");
            boolean exportSnaps = false;
            if (exportSnapshots != null) {
                exportSnaps = true;
            }
            //       String exportResourcesStr = (String) request.getAttribute("exportResources");
            //       boolean exportResources = false;
            //       if (exportResourcesStr != null) {
            //          exportResources = true;
            //       }

            String pathExportFolder = ExportUtilities.getExportTempFolderPath();
            String idListStr = (String) request.getAttribute(ImportExportConstants.OBJECT_ID);
            String[] idListArray = idListStr.split(";");
            List ids = Arrays.asList(idListArray);
            expManager = ExportUtilities.getExportManagerInstance();
            expManager.prepareExport(pathExportFolder, exportFileName, expSubObj, exportSnaps);
            expManager.exportObjects(ids);
            //       if (exportResources) {
            //          logger.error("Exporting resources");
            //          expManager.exportResources();
            //       }
            expManager.createExportArchive();
            response.setAttribute(ImportExportConstants.EXPORT_FILE_PATH, exportFileName);
        } catch (EMFUserError emfue) {
            logger.error("Error while exporting ", emfue);
            expManager.cleanExportEnvironment();
            try {
                AuditLogUtilities.updateAudit(getHttpRequest(), profile, "EXPORT", logParam, "ERR");
            } catch (Exception ee) {
                ee.printStackTrace();
            }
            throw emfue;
        } catch (Exception e) {
            expManager.cleanExportEnvironment();
            logger.error("Error while exporting ", e);
            try {
                AuditLogUtilities.updateAudit(getHttpRequest(), profile, "EXPORT", logParam, "ERR");
            } catch (Exception ee) {
                ee.printStackTrace();
            }
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8005", ImportManager.messageBundle);
        } finally {
            logger.debug("OUT");
            try {
                AuditLogUtilities.updateAudit(getHttpRequest(), profile, "EXPORT", logParam, "OK");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /*
    private List extractObjId(List requests) {
    logger.debug("IN");
    List toReturn = new ArrayList();
    Iterator iter = requests.iterator();
    while (iter.hasNext()) {
       String id_path = (String) iter.next();
       String id = id_path.substring(0, id_path.indexOf('_'));
       toReturn.add(id);
    }
    logger.debug("OUT");
    return toReturn;
    }
    */

    /**
     * Manages the request of the user to import contents of an exported archive
     * 
     * @param request
     *                Spago SourceBean request
     * @param response
     *                Spago SourceBean response
     * @throws EMFUserError
     */
    private void importConf(SourceBean request, SourceBean response) throws EMFUserError {
        logger.debug("IN");
        HashMap<String, String> logParam = new HashMap();

        SessionContainer permanentSession = this.getRequestContainer().getSessionContainer()
                .getPermanentContainer();
        IEngUserProfile profile = (IEngUserProfile) permanentSession.getAttribute(IEngUserProfile.ENG_USER_PROFILE);

        IImportManager impManager = null;
        // get exported file and eventually the associations file
        //   UploadedFile archive = null;
        //   UploadedFile associationsFile = null;
        FileItem archive = null;
        FileItem associationsFileItem = null;
        UploadedFile associationsFile = null;
        AssociationFile assFile = null;
        try {
            String assKindFromReq = (String) request.getAttribute("importAssociationKind");
            boolean isNoAssociationModality = assKindFromReq != null
                    && assKindFromReq.equalsIgnoreCase("noassociations");
            List uplFiles = request.getAttributeAsList("UPLOADED_FILE");
            if (uplFiles != null) {
                logger.debug("Uploded files [" + uplFiles.size() + "]");
            }
            Iterator uplFilesIter = uplFiles.iterator();
            while (uplFilesIter.hasNext()) {
                FileItem uplFile = (FileItem) uplFilesIter.next();

                logger.debug("Uploded file name [" + uplFile + "]");
                logParam.put("ImportFileName", uplFile.getName());

                String nameInForm = uplFile.getFieldName();
                if (nameInForm.equals("exportedArchive")) {
                    archive = uplFile;
                } else if (nameInForm.equals("associationsFile")) {
                    associationsFileItem = uplFile;
                }
            }
            // check that the name of the uploaded archive is not empty
            //String archiveName = archive.getFileName();
            String archiveName = GeneralUtilities.getRelativeFileNames(archive.getName());
            logger.debug("Archive file name [" + archiveName + "]");
            if (archiveName.trim().equals("")) {
                logger.error("Missing exported file");
                response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportLoopbackStopImport");
                try {
                    AuditLogUtilities.updateAudit(getHttpRequest(), profile, "IMPORT", logParam, "KO");
                } catch (Exception e) {
                    e.printStackTrace();
                }
                throw new EMFValidationError(EMFErrorSeverity.ERROR, "exportedArchive", "8007",
                        ImportManager.messageBundle);
            }

            int maxSize = ImportUtilities.getImportFileMaxSize();
            if (archive.getSize() > maxSize) {
                logger.error("File is too large!!!");
                response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportLoopbackStopImport");
                try {
                    AuditLogUtilities.updateAudit(getHttpRequest(), profile, "IMPORT", logParam, "KO");
                } catch (Exception e) {
                    e.printStackTrace();
                }
                throw new EMFValidationError(EMFErrorSeverity.ERROR, "exportedArchive", "202");
            }

            // checks if the association file is bigger than 1 MB, that is more than enough!!
            if (associationsFileItem != null) {
                if (associationsFileItem.getSize() > 1048576) {
                    try {
                        AuditLogUtilities.updateAudit(getHttpRequest(), profile, "IMPORT", logParam, "KO");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    throw new EMFValidationError(EMFErrorSeverity.ERROR, "associationsFile", "202");
                }
                // loads association file
                associationsFile = new UploadedFile();
                associationsFile.setFileContent(associationsFileItem.get());
                associationsFile.setFieldNameInForm(associationsFileItem.getFieldName());
                associationsFile.setSizeInBytes(associationsFileItem.getSize());
                associationsFile.setFileName(GeneralUtilities.getRelativeFileNames(associationsFileItem.getName()));
            }

            // if the user choose to have no associations, checks the form, otherwise set the variable associationsFile = null
            if (!isNoAssociationModality) {
                // check if the name of associations file is empty (in this case set
                // null to the variable)
                if (associationsFile != null) {
                    String associationsFileName = associationsFile.getFileName();
                    if (associationsFileName.trim().equals("")) {
                        associationsFile = null;
                    }
                }
                // if the association file is empty then check if there is an
                // association id
                // rebuild the uploaded file and assign it to associationsFile variable
                if (associationsFile == null) {
                    String assId = (String) request.getAttribute("hidAssId");
                    if ((assId != null) && !assId.trim().equals("")) {
                        IAssociationFileDAO assfiledao = new AssociationFileDAO();
                        assFile = assfiledao.loadFromID(assId);
                        byte[] content = assfiledao.getContent(assFile);
                        UploadedFile uplFile = new UploadedFile();
                        uplFile.setSizeInBytes(content.length);
                        uplFile.setFileContent(content);
                        uplFile.setFileName("association.xml");
                        uplFile.setFieldNameInForm("");
                        associationsFile = uplFile;
                    }
                }
            } else {
                associationsFile = null;
            }

            // get the association mode
            String assMode = IImportManager.IMPORT_ASS_DEFAULT_MODE;
            if (assKindFromReq.equalsIgnoreCase("predefinedassociations")) {
                assMode = IImportManager.IMPORT_ASS_PREDEFINED_MODE;
            }
            // get bytes of the archive
            byte[] archiveBytes = archive.get();

            // get path of the import tmp directory
            String pathImpTmpFolder = ImportUtilities.getImportTempFolderPath();

            // apply transformation
            TransformManager transManager = new TransformManager();
            archiveBytes = transManager.applyTransformations(archiveBytes, archiveName, pathImpTmpFolder);
            logger.debug("Transformation applied succesfully");

            // prepare import environment

            impManager = ImportUtilities.getImportManagerInstance();
            impManager.setUserProfile(profile);
            impManager.init(pathImpTmpFolder, archiveName, archiveBytes);
            impManager.openSession();
            impManager.setAssociationFile(assFile);

            // if the associations file has been uploaded fill the association keeper
            if (associationsFile != null) {
                byte[] assFilebys = associationsFile.getFileContent();
                String assFileStr = new String(assFilebys);
                try {
                    impManager.getUserAssociation().fillFromXml(assFileStr);
                } catch (Exception e) {
                    logger.error("Error while loading association file content:\n " + e);
                    response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportLoopbackStopImport");
                    throw new EMFValidationError(EMFErrorSeverity.ERROR, "exportedArchive", "8009",
                            ImportManager.messageBundle);
                }
            }

            // set into import manager the association import mode
            impManager.setImpAssMode(assMode);

            RequestContainer requestContainer = this.getRequestContainer();
            SessionContainer session = requestContainer.getSessionContainer();
            session.setAttribute(ImportExportConstants.IMPORT_MANAGER, impManager);

            // start import operations
            if (impManager.getImpAssMode().equals(IImportManager.IMPORT_ASS_PREDEFINED_MODE)
                    && !impManager.associateAllExportedRolesByUserAssociation()) {
                response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportSkipRoleAssociation");
            } else {
                // move to jsp
                List exportedRoles = impManager.getExportedRoles();
                IRoleDAO roleDAO = DAOFactory.getRoleDAO();
                List currentRoles = roleDAO.loadAllRoles();
                response.setAttribute(ImportExportConstants.LIST_EXPORTED_ROLES, exportedRoles);
                response.setAttribute(ImportExportConstants.LIST_CURRENT_ROLES, currentRoles);
                response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportRoleAssociation");
            }
        } catch (EMFUserError emfue) {
            logger.error("Error inr etrieving import configuration ", emfue);
            if (impManager != null) {
                impManager.stopImport();
            }
            throw emfue;
        } catch (ClassNotFoundException cnde) {
            logger.error("Importer class not found", cnde);
            if (impManager != null)
                impManager.stopImport();
            try {
                AuditLogUtilities.updateAudit(getHttpRequest(), profile, "IMPORT", logParam, "ERR");
            } catch (Exception e) {
                e.printStackTrace();
            }
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } catch (InstantiationException ie) {
            logger.error("Cannot create an instance of importer class ", ie);
            if (impManager != null)
                impManager.stopImport();
            try {
                AuditLogUtilities.updateAudit(getHttpRequest(), profile, "IMPORT", logParam, "ERR");
            } catch (Exception e) {
                e.printStackTrace();
            }
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } catch (IllegalAccessException iae) {
            logger.error("Cannot create an instance of importer class ", iae);
            if (impManager != null)
                impManager.stopImport();
            try {
                AuditLogUtilities.updateAudit(getHttpRequest(), profile, "IMPORT", logParam, "ERR");
            } catch (Exception e) {
                e.printStackTrace();
            }
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } catch (SourceBeanException sbe) {
            logger.error("Error: " + sbe);
            if (impManager != null)
                impManager.stopImport();
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } catch (Exception e) {
            logger.error("An unexpected error occured while performing import", e);
            if (impManager != null) {
                impManager.stopImport();
            }
            try {
                AuditLogUtilities.updateAudit(getHttpRequest(), profile, "IMPORT", logParam, "ERR");
            } catch (Exception ee) {
                ee.printStackTrace();
            }
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } finally {
            if (impManager != null)
                impManager.closeSession();
            logger.debug("OUT");
            try {
                AuditLogUtilities.updateAudit(getHttpRequest(), profile, "IMPORT", logParam, "OK");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Manages the request of the user to associate some exported roles to the
     * roles of the portal in use
     * 
     * @param request
     *                Spago SourceBean request
     * @param response
     *                Spago SourceBean response
     * @throws EMFUserError
     */
    private void associateRoles(SourceBean request, SourceBean response) throws EMFUserError {
        logger.debug("IN");
        IImportManager impManager = null;
        try {
            RequestContainer requestContainer = this.getRequestContainer();
            SessionContainer session = requestContainer.getSessionContainer();
            impManager = (IImportManager) session.getAttribute(ImportExportConstants.IMPORT_MANAGER);
            impManager.openSession();
            MetadataAssociations metaAss = impManager.getMetadataAssociation();
            if (!request.containsAttribute("ROLES_ASSOCIATIONS_SKIPPED")) {
                // the roles associations form was submitted
                List expRoleIds = request.getAttributeAsList("expRole");
                Iterator iterExpRoles = expRoleIds.iterator();
                while (iterExpRoles.hasNext()) {
                    String expRoleId = (String) iterExpRoles.next();
                    String roleAssociateId = (String) request.getAttribute("roleAssociated" + expRoleId);
                    if (!roleAssociateId.trim().equals("")) {
                        metaAss.insertCoupleRole(new Integer(expRoleId), new Integer(roleAssociateId));
                        // insert into user associations
                        try {
                            Object existingRoleObj = impManager.getExistingObject(new Integer(roleAssociateId),
                                    SbiExtRoles.class);
                            Object exportedRoleObj = impManager.getExportedObject(new Integer(expRoleId),
                                    SbiExtRoles.class);
                            if ((existingRoleObj != null) && (exportedRoleObj != null)) {
                                SbiExtRoles existingRole = (SbiExtRoles) existingRoleObj;
                                SbiExtRoles exportedRole = (SbiExtRoles) exportedRoleObj;
                                UserAssociationsKeeper usrAssKeep = impManager.getUserAssociation();
                                String expRoleName = exportedRole.getName();
                                String exiRoleName = existingRole.getName();
                                usrAssKeep.recordRoleAssociation(expRoleName, exiRoleName);
                            } else {
                                throw new Exception("hibernate object of existing or exported role not recovered");
                            }
                        } catch (Exception e) {
                            logger.error("Error while recording user role association", e);
                        }
                    }
                }
            }
            // check role associations
            impManager.checkRoleReferences(metaAss.getRoleIDAssociation());

            if (impManager.getImpAssMode().equals(IImportManager.IMPORT_ASS_PREDEFINED_MODE)
                    && !impManager.associateAllExportedEnginesByUserAssociation()) {
                response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportSkipEngineAssociation");
            } else {
                // get the existing and exported engines
                // move to jsp
                List exportedEngines = impManager.getExportedEngines();
                IEngineDAO engineDAO = DAOFactory.getEngineDAO();
                List currentEngines = engineDAO.loadAllEngines();
                response.setAttribute(ImportExportConstants.LIST_EXPORTED_ENGINES, exportedEngines);
                response.setAttribute(ImportExportConstants.LIST_CURRENT_ENGINES, currentEngines);
                response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportEngineAssociation");
            }
        } catch (EMFUserError emfue) {
            logger.error("Error in associating roles: " + emfue);
            if (impManager != null)
                impManager.stopImport();
            throw emfue;
        } catch (SourceBeanException sbe) {
            logger.error("Error: " + sbe);
            if (impManager != null)
                impManager.stopImport();
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } catch (Exception e) {
            logger.error("Error while getting role association ", e);
            if (impManager != null)
                impManager.stopImport();
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } finally {
            if (impManager != null)
                impManager.closeSession();
            logger.debug("OUT");
        }
    }

    /**
     * Manages the request of the user to associate some exported engines to the
     * engines of the portal in use
     * 
     * @param request
     *                Spago SourceBean request
     * @param response
     *                Spago SourceBean response
     * @throws EMFUserError
     */
    private void associateEngines(SourceBean request, SourceBean response) throws EMFUserError {
        logger.debug("IN");
        IImportManager impManager = null;
        try {
            RequestContainer requestContainer = this.getRequestContainer();
            SessionContainer session = requestContainer.getSessionContainer();
            impManager = (IImportManager) session.getAttribute(ImportExportConstants.IMPORT_MANAGER);
            impManager.openSession();
            MetadataAssociations metaAss = impManager.getMetadataAssociation();
            if (!request.containsAttribute("ENGINES_ASSOCIATIONS_SKIPPED")) {
                List expEngineIds = request.getAttributeAsList("expEngine");
                Iterator iterExpEngines = expEngineIds.iterator();
                while (iterExpEngines.hasNext()) {
                    String expEngineId = (String) iterExpEngines.next();
                    String engineAssociateId = (String) request.getAttribute("engineAssociated" + expEngineId);
                    if (!engineAssociateId.trim().equals("")) {
                        metaAss.insertCoupleEngine(new Integer(expEngineId), new Integer(engineAssociateId));
                        // insert into user associations
                        try {
                            Object existingEngineObj = impManager.getExistingObject(new Integer(engineAssociateId),
                                    SbiEngines.class);
                            Object exportedEngineObj = impManager.getExportedObject(new Integer(expEngineId),
                                    SbiEngines.class);
                            if ((existingEngineObj != null) && (exportedEngineObj != null)) {
                                SbiEngines existingEngine = (SbiEngines) existingEngineObj;
                                SbiEngines exportedEngine = (SbiEngines) exportedEngineObj;
                                impManager.getUserAssociation().recordEngineAssociation(exportedEngine.getLabel(),
                                        existingEngine.getLabel());
                            } else {
                                throw new Exception(
                                        "hibernate object of existing or exported engine not recovered");
                            }
                        } catch (Exception e) {
                            logger.warn("Error while recording user engine association", e);
                        }
                    }
                }
            }

            if (impManager.getImpAssMode().equals(IImportManager.IMPORT_ASS_PREDEFINED_MODE)
                    && !impManager.associateAllExportedDataSourcesByUserAssociation()) {
                impManager.checkExistingMetadata();
                if (metaAss.isEmpty()) {
                    response.setAttribute(ImportExportConstants.PUBLISHER_NAME,
                            "ImportExportSkipExistingMetadataAssociation");
                } else {
                    response.setAttribute(ImportExportConstants.PUBLISHER_NAME,
                            "ImportExportExistingMetadataAssociation");
                }
            } else {
                // move to jsp
                List exportedDatasources = impManager.getExportedDataSources();
                IDataSourceDAO dsDao = DAOFactory.getDataSourceDAO();
                List currentDatasources = dsDao.loadAllDataSources();
                response.setAttribute(ImportExportConstants.LIST_EXPORTED_DATA_SOURCES, exportedDatasources);
                response.setAttribute(ImportExportConstants.LIST_CURRENT_DATA_SOURCES, currentDatasources);
                response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportDataSourceAssociation");
            }

        } catch (EMFUserError emfue) {
            logger.error("Error in associating engines: " + emfue);
            if (impManager != null)
                impManager.stopImport();
            throw emfue;
        } catch (SourceBeanException sbe) {
            logger.error("Error: " + sbe);
            if (impManager != null)
                impManager.stopImport();
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } catch (Exception e) {
            logger.error("Error while getting engine association ", e);
            if (impManager != null)
                impManager.stopImport();
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } finally {
            if (impManager != null)
                impManager.closeSession();
            logger.debug("OUT");
        }
    }

    /**
     * Manages the request of the user to associate some exported data sources to
     * the data sources of the portal in use
     * 
     * @param request
     *                Spago SourceBean request
     * @param response
     *                Spago SourceBean response
     * @throws EMFUserError
     */
    private void associateDataSources(SourceBean request, SourceBean response) throws EMFUserError {
        logger.debug("IN");
        IImportManager impManager = null;
        try {
            RequestContainer requestContainer = this.getRequestContainer();
            SessionContainer session = requestContainer.getSessionContainer();
            impManager = (IImportManager) session.getAttribute(ImportExportConstants.IMPORT_MANAGER);
            impManager.openSession();
            MetadataAssociations metaAss = impManager.getMetadataAssociation();
            List expDsIds = request.getAttributeAsList("expConn");
            Iterator iterExpConn = expDsIds.iterator();
            while (iterExpConn.hasNext()) {
                String expDsIdStr = (String) iterExpConn.next();
                String assDsIds = (String) request.getAttribute("connAssociated" + expDsIdStr);
                if (!assDsIds.equals("")) {
                    metaAss.insertCoupleDataSources(new Integer(expDsIdStr), new Integer(assDsIds));
                    Object existingDSObj = impManager.getExistingObject(new Integer(assDsIds), SbiDataSource.class);
                    Object exportedDSObj = impManager.getExportedObject(new Integer(expDsIdStr),
                            SbiDataSource.class);
                    if (existingDSObj != null && exportedDSObj != null) {
                        SbiDataSource existingDataSource = (SbiDataSource) existingDSObj;
                        SbiDataSource exportedDataSource = (SbiDataSource) exportedDSObj;
                        impManager.getUserAssociation().recordDataSourceAssociation(exportedDataSource.getLabel(),
                                existingDataSource.getLabel());
                        impManager.getUserAssociation().recordDataSourceAssociation(
                                Integer.valueOf(exportedDataSource.getDsId()),
                                Integer.valueOf(existingDataSource.getDsId()));
                    }
                }
                //         else {
                //            logger.error("Exported data source " +expConnName+" is not associated to a current " +
                //                                 "system data source");
                //            List exportedDataSources = impManager.getExportedDataSources();
                //            Map currentDataSources = getCurrentDataSourcesInfo();
                //            response.setAttribute(ImportExportConstants.LIST_EXPORTED_DATA_SOURCES, exportedDataSources);
                //            response.setAttribute(ImportExportConstants.MAP_CURRENT_DATA_SOURCES, currentDataSources);
                //            response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportDataSourceAssociation");
                //            throw new EMFValidationError(EMFErrorSeverity.ERROR, "connAssociated"+ expConnName, "sbi.impexp.datasourceNotAssociated");
                //         }
            }

            impManager.checkExistingMetadata();
            if (metaAss.isEmpty()) {
                response.setAttribute(ImportExportConstants.PUBLISHER_NAME,
                        "ImportExportSkipExistingMetadataAssociation");
            } else {
                response.setAttribute(ImportExportConstants.PUBLISHER_NAME,
                        "ImportExportExistingMetadataAssociation");
            }
        } catch (EMFValidationError emfve) {
            logger.error("Error ina ssocia6ting daytsource: " + emfve);
            throw emfve;
        } catch (EMFUserError emfue) {
            logger.error("Error in associating engines: " + emfue);
            if (impManager != null)
                impManager.stopImport();
            throw emfue;
        } catch (SourceBeanException sbe) {
            logger.error("Cannot populate response ", sbe);
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } catch (Exception e) {
            logger.error("Error while getting  association ", e);
            if (impManager != null)
                impManager.stopImport();
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8003", ImportManager.messageBundle);
        } finally {
            if (impManager != null)
                impManager.closeSession();
            logger.debug("OUT");
        }

    }

    /**
     * Manages the associations between the exported metadata and the one of the
     * portal in use
     * 
     * @param request  Spago SourceBean request
     * @param response Spago SourceBean response
     * @throws EMFUserError
     */
    private void associateMetadata(SourceBean request, SourceBean response) throws EMFUserError {
        logger.debug("IN");
        IImportManager impManager = null;
        try {
            String overwriteStr = (String) request.getAttribute("overwrite");
            boolean overwrite = false;
            try {
                overwrite = Boolean.parseBoolean(overwriteStr);
            } catch (Exception e) {
                logger.warn(
                        "Overwrite parameter is not a valid boolean; default value (that is false) will be considered.");
            }
            RequestContainer requestContainer = this.getRequestContainer();
            SessionContainer session = requestContainer.getSessionContainer();
            impManager = (IImportManager) session.getAttribute(ImportExportConstants.IMPORT_MANAGER);
            impManager.openSession();
            impManager.importObjects(overwrite);
            ImportResultInfo iri = impManager.commitAllChanges();
            response.setAttribute(ImportExportConstants.IMPORT_RESULT_INFO, iri);
            AssociationFile assFile = impManager.getAssociationFile();
            if (assFile != null)
                response.setAttribute(ImportExportConstants.IMPORT_ASSOCIATION_FILE, assFile);
        } catch (EMFUserError emfue) {
            logger.error("Error in associating engines: " + emfue);
            if (impManager != null)
                impManager.stopImport();
            throw emfue;
        } catch (SourceBeanException sbe) {
            logger.error("Cannot populate response ", sbe);
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } catch (Exception e) {
            if (impManager != null)
                impManager.stopImport();
            logger.error("error after data source association ", e);
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } finally {
            if (impManager != null)
                impManager.closeSession();
            logger.debug("OUT");
        }
    }

    /**
     * Manages the request of the user to exit from the import procedure
     * 
     * @param request
     *                Spago SourceBean request
     * @param response
     *                Spago SourceBean response
     * @throws EMFUserError
     */
    private void exitImport(SourceBean request, SourceBean response) throws EMFUserError {
        logger.debug("IN");
        RequestContainer requestContainer = this.getRequestContainer();
        SessionContainer session = requestContainer.getSessionContainer();
        IImportManager impManager = (IImportManager) session.getAttribute(ImportExportConstants.IMPORT_MANAGER);
        impManager.stopImport();
        try {
            response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportLoopbackStopImport");
        } catch (SourceBeanException sbe) {
            logger.error("Error while populating response source bean ", sbe);
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } finally {
            logger.debug("OUT");
        }
    }

    /**
     * Manages the request of the user to go back from the engines association
     * to the roles association
     * 
     * @param request
     *                Spago SourceBean request
     * @param response
     *                Spago SourceBean response
     * @throws EMFUserError
     */
    private void backEngineAssociation(SourceBean request, SourceBean response) throws EMFUserError {
        logger.debug("IN");
        IImportManager impManager = null;
        try {
            RequestContainer requestContainer = this.getRequestContainer();
            SessionContainer session = requestContainer.getSessionContainer();
            impManager = (IImportManager) session.getAttribute(ImportExportConstants.IMPORT_MANAGER);
            impManager.openSession();
            List exportedRoles = impManager.getExportedRoles();
            IRoleDAO roleDAO = DAOFactory.getRoleDAO();
            List currentRoles = roleDAO.loadAllRoles();
            response.setAttribute(ImportExportConstants.LIST_EXPORTED_ROLES, exportedRoles);
            response.setAttribute(ImportExportConstants.LIST_CURRENT_ROLES, currentRoles);
            response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportRoleAssociation");
        } catch (SourceBeanException sbe) {
            logger.error("Error while populating response source bean ", sbe);
            impManager.stopImport();
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } finally {
            if (impManager != null)
                impManager.closeSession();
            logger.debug("OUT");
        }
    }

    /**
     * Manages the request of the user to go back from the data sources
     * association to the engines association
     * 
     * @param request
     *                Spago SourceBean request
     * @param response
     *                Spago SourceBean response
     * @throws EMFUserError
     */
    private void backDataSourceAssociation(SourceBean request, SourceBean response) throws EMFUserError {
        logger.debug("IN");
        IImportManager impManager = null;
        try {
            RequestContainer requestContainer = this.getRequestContainer();
            SessionContainer session = requestContainer.getSessionContainer();
            impManager = (IImportManager) session.getAttribute(ImportExportConstants.IMPORT_MANAGER);
            impManager.openSession();
            List exportedEngines = impManager.getExportedEngines();
            IEngineDAO engineDAO = DAOFactory.getEngineDAO();
            List currentEngines = engineDAO.loadAllEngines();
            response.setAttribute(ImportExportConstants.LIST_EXPORTED_ENGINES, exportedEngines);
            response.setAttribute(ImportExportConstants.LIST_CURRENT_ENGINES, currentEngines);
            response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportEngineAssociation");
        } catch (SourceBeanException sbe) {
            logger.error("Error while populating response source bean ", sbe);
            impManager.stopImport();
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } finally {
            if (impManager != null)
                impManager.closeSession();
            logger.debug("OUT");
        }
    }

    /**
     * Manages the request of the user to go back from the metadata association
     * to the data sources association
     * 
     * @param request
     *                Spago SourceBean request
     * @param response
     *                Spago SourceBean response
     * @throws EMFUserError
     */
    private void backMetadataAssociation(SourceBean request, SourceBean response) throws EMFUserError {
        logger.debug("IN");
        IImportManager impManager = null;
        try {
            RequestContainer requestContainer = this.getRequestContainer();
            SessionContainer session = requestContainer.getSessionContainer();
            impManager = (IImportManager) session.getAttribute(ImportExportConstants.IMPORT_MANAGER);
            impManager.openSession();
            List exportedDataSources = impManager.getExportedDataSources();
            IDataSourceDAO dsDao = DAOFactory.getDataSourceDAO();
            List currentDatasources = dsDao.loadAllDataSources();
            response.setAttribute(ImportExportConstants.LIST_EXPORTED_DATA_SOURCES, exportedDataSources);
            response.setAttribute(ImportExportConstants.LIST_CURRENT_DATA_SOURCES, currentDatasources);
            response.setAttribute(ImportExportConstants.PUBLISHER_NAME, "ImportExportDataSourceAssociation");
        } catch (SourceBeanException sbe) {
            logger.error("Error while populating response source bean ", sbe);
            throw new EMFUserError(EMFErrorSeverity.ERROR, "8004", ImportManager.messageBundle);
        } finally {
            if (impManager != null)
                impManager.closeSession();
            logger.debug("OUT");
        }
    }

}