Package com.dotmarketing.util

Source Code of com.dotmarketing.util.ImportExportUtil$ObjectFilter

/**
*
*/
package com.dotmarketing.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.nio.channels.FileChannel;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipFile;

import com.dotcms.repackage.net.sf.hibernate.HibernateException;
import com.dotcms.repackage.net.sf.hibernate.persister.AbstractEntityPersister;

import com.dotcms.repackage.org.apache.commons.beanutils.BeanUtils;

import com.dotmarketing.beans.Identifier;
import com.dotmarketing.beans.Tree;
import com.dotmarketing.business.APILocator;
import com.dotmarketing.business.CacheLocator;
import com.dotmarketing.business.DuplicateUserException;
import com.dotmarketing.business.Role;
import com.dotmarketing.common.db.DotConnect;
import com.dotmarketing.common.reindex.ReindexThread;
import com.dotmarketing.db.DbConnectionFactory;
import com.dotmarketing.db.HibernateUtil;
import com.dotmarketing.exception.DotDataException;
import com.dotmarketing.exception.DotHibernateException;
import com.dotmarketing.exception.DotSecurityException;
import com.dotmarketing.logConsole.model.LogMapperRow;
import com.dotmarketing.portlets.contentlet.business.ContentletAPI;
import com.dotmarketing.portlets.folders.model.Folder;
import com.dotmarketing.portlets.workflows.util.WorkflowImportExportUtil;
import com.liferay.portal.SystemException;
import com.liferay.portal.ejb.CompanyManagerUtil;
import com.liferay.portal.model.Company;
import com.liferay.portal.model.Image;
import com.liferay.portal.model.PortletPreferences;
import com.liferay.portal.model.User;
import com.liferay.util.FileUtil;
import com.dotcms.repackage.com.thoughtworks.xstream.XStream;


/**
* @author Jason Tesser
* @version 1.6
*
*/
public class ImportExportUtil {

    /**
     * The path where tmp files are stored. This gets wiped alot
     */
    private String backupTempFilePath = ConfigUtils.getBackupPath()+File.separator+"temp";
    private ArrayList<String> classesWithIdentity = new ArrayList<String>();
    private Map<String, String> sequences;
    private Map<String, String> tableIDColumns;
    private Map<String, String> tableNames;
    private static String assetRealPath = null;
    private static String assetPath = "/assets";
    private File companyXML;
    private File userXML;
    private File rolesLayoutsXML;
    private File layoutsPortletsXML;
    private File pluginPropertyXML;
    private File logMapperRowXML;
    private List<File> dashboardUserPreferencesXMLs = new ArrayList<File>();
    private List<File> analyticSummary404XMLs = new ArrayList<File>();
    private List<File> analyticSummaryRefererXMLs = new ArrayList<File>();
    private List<File> analyticSummaryContentXMLs = new ArrayList<File>();
    private List<File> analyticSummaryXMLs = new ArrayList<File>();
    private List<File> analyticSummaryPagesXMLs = new ArrayList<File>();
    private List<File> analyticSummaryVisitsXMLs = new ArrayList<File>();
    private List<File> roleXMLs = new ArrayList<File>();
    private List<File> usersRolesXML = new ArrayList<File>();
    private List<File> treeXMLs = new ArrayList<File>();
    private List<File> permissionXMLs = new ArrayList<File>();
    private List<File> contentletsXML = new ArrayList<File>();
    private List<File> menuLinksXML = new ArrayList<File>();
    private List<File> pagesXML = new ArrayList<File>();
    private List<File> structuresXML = new ArrayList<File>();
    private List<File> containersXML = new ArrayList<File>();
    private List<File> identifiersXML = new ArrayList<File>();
    private List<File> foldersXML = new ArrayList<File>();
    private List<File> templatesXML = new ArrayList<File>();
    private List<File> templateContainersXML = new ArrayList<File>();
    private List<File> containerStructuresXML = new ArrayList<File>();
    private List<File> filesXML = new ArrayList<File>();
    private List<File> versionInfoFilesXML = new ArrayList<File>();
    private List<File> workFlowTaskXML = new ArrayList<File>();
    private List<File> workFlowCommentXML = new ArrayList<File>();
    private List<File> workFlowHistoryXML = new ArrayList<File>();
    private List<File> workFlowTaskFilesXML = new ArrayList<File>();
    private List<File> tagFiles = new ArrayList<File>();
    private File workflowSchemaFile = null;

    public ImportExportUtil() {
        MaintenanceUtil.flushCache();
        // Set the asset paths
        try {
            assetRealPath = Config.getStringProperty("ASSET_REAL_PATH");
        } catch (Exception e) { }
        try {
            assetPath = Config.getStringProperty("ASSET_PATH");
        } catch (Exception e) { }
        //classesWithIdentity.add("Inode");
        classesWithIdentity.add("Rating");
        classesWithIdentity.add("dist_journal");
        classesWithIdentity.add("Language");
        classesWithIdentity.add("Permission");
        classesWithIdentity.add("PermissionReference");
        classesWithIdentity.add("UserPreference");
        //classesWithIdentity.add("WebForm");
        classesWithIdentity.add("UsersToDelete");
        //Dashboard Tables
        classesWithIdentity.add("Clickstream404");
        classesWithIdentity.add("DashboardUserPreferences");
        classesWithIdentity.add("DashboardWorkStream");
        classesWithIdentity.add("DashboardSummaryPeriod");
        classesWithIdentity.add("DashboardSummaryReferer");
        classesWithIdentity.add("DashboardSummary404");
        classesWithIdentity.add("DashboardSummaryPage");
        classesWithIdentity.add("DashboardSummary");
        classesWithIdentity.add("DashboardSummaryContent");
        classesWithIdentity.add("DashboardSummaryVisits");

        tableNames = new HashMap<String, String>();
        //tableNames.put("Inode", "inode");
        tableNames.put("Rating", "content_rating");
        tableNames.put("dist_journal", "dist_journal");
        tableNames.put("Language", "language");
        tableNames.put("Permission", "permission");
        tableNames.put("PermissionReference", "permission_reference");
        tableNames.put("UserPreference", "user_preferences");
        //tableNames.put("WebForm", "web_form");
        tableNames.put("UsersToDelete", "users_to_delete");
        //Dashboard Tables
        tableNames.put("Clickstream404","clickstream_404");
        tableNames.put("DashboardUserPreferences", "dashboard_user_preferences");
        tableNames.put("DashboardWorkStream", "analytic_summary_workstream");
        tableNames.put("DashboardSummaryPeriod", "analytic_summary_period");
        tableNames.put("DashboardSummaryReferer", "analytic_summary_referer");
        tableNames.put("DashboardSummary404", "analytic_summary_404");
        tableNames.put("DashboardSummaryPage", "analytic_summary_pages");
        tableNames.put("DashboardSummary", "analytic_summary");
        tableNames.put("DashboardSummaryContent", "analytic_summary_content");
        tableNames.put("DashboardSummaryVisits", "analytic_summary_visits");
        if(DbConnectionFactory.isPostgres() || DbConnectionFactory.isOracle()){
            sequences = new HashMap<String, String>();
            //sequences.put("inode", "inode_seq");
            sequences.put("content_rating", "content_rating_sequence");
            sequences.put("dist_journal", "dist_journal_id_seq");
            sequences.put("language", "language_seq");
            sequences.put("permission", "permission_seq");
            sequences.put("permission_reference", "permission_reference_seq");
            sequences.put("user_preferences", "user_preferences_seq");
            //sequences.put("web_form", "web_form_seq");
            sequences.put("users_to_delete", "user_to_delete_seq");
            //Dashboard Tables
            sequences.put("clickstream_404","clickstream_404_seq");
            sequences.put("dashboard_user_preferences", "dashboard_usrpref_seq");
            sequences.put("analytic_summary_workstream", "workstream_seq");
            sequences.put("analytic_summary_period", "summary_period_seq");
            sequences.put("analytic_summary_referer", "summary_referer_seq");
            sequences.put("analytic_summary_404", "summary_404_seq");
            sequences.put("analytic_summary_pages", "summary_pages_seq");
            sequences.put("analytic_summary", "summary_seq");
            sequences.put("analytic_summary_content", "summary_content_seq");
            sequences.put("analytic_summary_visits", "summary_visits_seq");
            tableIDColumns = new HashMap<String, String>();
            //tableIDColumns.put("inode", "inode");
            tableIDColumns.put("content_rating", "id");
            tableIDColumns.put("dist_journal", "id");
            tableIDColumns.put("language", "id");
            tableIDColumns.put("permission", "id");
            tableIDColumns.put("permission_reference", "id");
            tableIDColumns.put("user_preferences", "id");
            //tableIDColumns.put("web_form", "web_form_id");
            tableIDColumns.put("users_to_delete", "id");
            //Dashboard Tables
            tableIDColumns.put("clickstream_404","clickstream_404_id");
            tableIDColumns.put("dashboard_user_preferences", "id");
            tableIDColumns.put("analytic_summary_workstream", "id");
            tableIDColumns.put("analytic_summary_period", "id");
            tableIDColumns.put("analytic_summary_referer", "id");
            tableIDColumns.put("analytic_summary_404", "id");
            tableIDColumns.put("analytic_summary_pages", "id");
            tableIDColumns.put("analytic_summary", "id");
            tableIDColumns.put("analytic_summary_content", "id");
            tableIDColumns.put("analytic_summary_visits", "id");
        }
    }

    /**
     * Takes a zip file from the temp directory to restore dotCMS data. Currently it will blow away all current data
     * This method cannot currently be run in a transaction. For performance reasons with db drivers and connections it closes the
     * session every so often.
     * @param out A print writer for output
     * @throws IOException
     */
    public void doImport(PrintWriter out) throws IOException {
        File f = new File(getBackupTempFilePath());
        //    String[] _tempFiles = f.list(new XMLFileNameFilter());
        String[] _tempFiles = f.list();
        out.println("<pre>Found " + _tempFiles.length + " files to import");
        Logger.info(this, "Found " + _tempFiles.length + " files to import");
        deleteDotCMS();

        File assetDir = null;
        boolean hasAssetDir = false;
        for (int i = 0; i < _tempFiles.length; i++) {
            try {
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            File _importFile = new File(getBackupTempFilePath() + "/" + _tempFiles[i]);

            if(_importFile.isDirectory()){
                if(_importFile.getName().equals("asset")){
                    hasAssetDir = true;
                    assetDir = new File(_importFile.getPath());
                }
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.contentlet.business.Contentlet_")){
                contentletsXML.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.templates.model.Template_")){
                templatesXML.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.beans.TemplateContainers_")) {
                templateContainersXML.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.beans.ContainerStructure_")) {
                containerStructuresXML.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.containers.model.Container_")){
                containersXML.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.files.model.File_")){
                filesXML.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.htmlpages.model.HTMLPage_")){
                pagesXML.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.links.model.Link_")){
                menuLinksXML.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.structure.model.Structure_")){
                structuresXML.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.business.LayoutsRoles_")){
                rolesLayoutsXML = new File(_importFile.getPath());
            }else if(_importFile.getName().contains("com.dotmarketing.business.UsersRoles_")){
                usersRolesXML.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.business.PortletsLayouts_")){
                layoutsPortletsXML = new File(_importFile.getPath());
            }else if(_importFile.getName().contains("com.dotmarketing.plugin.model.PluginProperty_")){
                pluginPropertyXML = new File(_importFile.getPath());
            }else if(_importFile.getName().endsWith( "LogsMappers.xml" )){
                logMapperRowXML = new File(_importFile.getPath());
            }else if(_importFile.getName().contains("com.dotmarketing.beans.Tree_")){
                treeXMLs.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.business.Role_")){
                roleXMLs.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.dashboard.model.DashboardUserPreferences_")){
                dashboardUserPreferencesXMLs.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.dashboard.model.DashboardSummary404_")){
                analyticSummary404XMLs.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.dashboard.model.DashboardSummaryReferer_")){
                analyticSummaryRefererXMLs.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.dashboard.model.DashboardSummaryContent_")){
                analyticSummaryContentXMLs.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.dashboard.model.DashboardSummary_")){
                analyticSummaryXMLs.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.dashboard.model.DashboardSummaryPage_")){
                analyticSummaryPagesXMLs.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.dashboard.model.DashboardSummaryVisits_")){
                analyticSummaryVisitsXMLs.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().contains("com.dotmarketing.beans.Permission_")){
                permissionXMLs.add(new File(_importFile.getPath()));
            }else if(_importFile.getName().endsWith("User.xml")){
                userXML = new File(_importFile.getPath());
            }else if(_importFile.getName().endsWith("Company.xml")){
                companyXML = new File(_importFile.getPath());
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.folders.model.Folder_")){
                foldersXML.add(_importFile);
            }else if(_importFile.getName().contains("VersionInfo_")){
                versionInfoFilesXML.add(_importFile);
            }else if(_importFile.getName().contains("com.dotmarketing.beans.Identifier_")){
                identifiersXML.add(_importFile);
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.workflows.model.WorkflowTask_")){
              workFlowTaskXML.add(_importFile);
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.workflows.model.WorkflowComment_")){
              workFlowCommentXML.add(_importFile);
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.workflows.model.WorkflowHistory_")){
              workFlowHistoryXML.add(_importFile);
            }else if(_importFile.getName().contains("com.dotmarketing.portlets.workflows.model.WorkFlowTaskFiles_")){
              workFlowTaskFilesXML.add(_importFile);
            }else if(_importFile.getName().contains("com.dotmarketing.tag.model.Tag_")){
              tagFiles.add(0,_importFile);
          }else if(_importFile.getName().contains("com.dotmarketing.tag.model.TagInode_")){
            tagFiles.add(tagFiles.size(),_importFile);
            }else if(_importFile.getName().contains("WorkflowSchemeImportExportObject.json")){
              workflowSchemaFile = _importFile;
            }else if(_importFile.getName().endsWith(".xml")){
                try {
                    doXMLFileImport(_importFile, out);
                } catch (Exception e) {
                    Logger.error(this, "Unable to load " + _importFile.getName() + " : " + e.getMessage(), e);
                }
            }
            out.flush();
        }

        try {
            doXMLFileImport(companyXML, out);
        } catch (Exception e) {
            Logger.error(this, "Unable to load " + companyXML.getName() + " : " + e.getMessage(), e);
        }
        List<Role> roles = new ArrayList<Role>();
        String _className = null;
        for (File file : roleXMLs) {
            Reader charStream = null;
            XStream _xstream = null;
            Class _importClass = null;

            Pattern p = Pattern.compile("_[0-9]{8}");
            Matcher m  = p.matcher(file.getName());
            if(m.find()){
                _className = file.getName().substring(0, file.getName().lastIndexOf("_"));
            }
            else{
                _className = file.getName().substring(0, file.getName().lastIndexOf("."));
            }

            try{
                _importClass = Class.forName(_className);
            }catch (Exception e) {
                Logger.error(this, "Class not found " + _className, e);
                return;
            }

            _xstream = new XStream();

            try{
                charStream = new InputStreamReader(new FileInputStream(file), "UTF-8");
            }catch (UnsupportedEncodingException uet) {
                Logger.error(this, "Reader doesn't not recoginize Encoding type: ", uet);
            }
            try{
                roles.addAll((List<Role>) _xstream.fromXML(charStream));
            }catch(Exception e){
                Logger.error(this, "Unable to import " + _className, e);
            }
        }

        Collections.sort(roles);
        try{
            HibernateUtil.closeSession();
            for (Role role : roles) {
                HibernateUtil _dh = new HibernateUtil(Role.class);
                String id = HibernateUtil.getSession().getSessionFactory().getClassMetadata(Role.class).getIdentifierPropertyName();
                HibernateUtil.getSession().close();

                if (UtilMethods.isSet(id)) {
                    String prop = BeanUtils.getProperty(role, id);

                    try {
                        if(id.equalsIgnoreCase("id")){
                            Long myId = new Long(Long.parseLong(prop));
                            HibernateUtil.saveWithPrimaryKey(role, myId);
                        }else{
                            HibernateUtil.saveWithPrimaryKey(role, prop);
                        }
                    } catch (Exception e) {
                        try {
                            HibernateUtil.saveWithPrimaryKey(role, prop);
                        } catch (DotHibernateException ex) {
                            Logger.error(this, "Unable to save role " + role.getId(), ex);
                        }
                    }

                } else {
                    HibernateUtil.save(role);
                }
                HibernateUtil.getSession().flush();
                try {
                    Thread.sleep(3);
                } catch (InterruptedException e) {
                    Logger.error(this,e.getMessage(),e);
                }
            }
        } catch (Exception e) {
            Logger.error(this, "Unable to load role : " + e.getMessage(), e);
        }
        try{
            doXMLFileImport(userXML, out);
        } catch (Exception e) {
            Logger.error(this, "Unable to load " + userXML.getName() + " : " + e.getMessage(), e);
        }

        for (File file : usersRolesXML) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        try{
            doXMLFileImport(layoutsPortletsXML, out);
        } catch (Exception e) {
            Logger.error(this, "Unable to load " + layoutsPortletsXML.getName() + " : " + e.getMessage(), e);
        }
        try{
            doXMLFileImport(pluginPropertyXML, out);
        } catch (Exception e) {
            Logger.error(this, "Unable to load " + pluginPropertyXML.getName() + " : " + e.getMessage(), e);
        }
        try {
            doXMLFileImport( logMapperRowXML, out );
        } catch ( Exception e ) {
            Logger.error( this, "Unable to load " + logMapperRowXML.getName() + " : " + e.getMessage(), e );
        }
        try{
            doXMLFileImport(rolesLayoutsXML, out);
        } catch (Exception e) {
            Logger.error(this, "Unable to load " + rolesLayoutsXML.getName() + " : " + e.getMessage(), e);
        }

        try{
            /* Because of the parent check we do at db we need to import
             * folder identifiers first but for the same reason we need to sort them first
             * by parent_path
             */

            final List<Identifier> folderIdents=new ArrayList<Identifier>();
            final XStream xstream = new XStream();

            // collecting all folder identifiers
            for(File ff : identifiersXML) {
                List<Identifier> idents=(List<Identifier>)xstream.fromXML(new FileInputStream(ff));
                for(Identifier ident : idents) {
                    if(ident.getAssetType().equals("folder"))
                        folderIdents.add(ident);
                }
            }

            // sorting folder identifiers by parent path in order to pass parent check
            Collections.sort(folderIdents, new Comparator<Identifier>() {
                public int compare(Identifier o1, Identifier o2) {
                    return o1.getParentPath().compareTo(o2.getParentPath());
                }
            });

            // saving folder identifiers
            for(Identifier ident : folderIdents) {
                Logger.info(this, "Importing folder path "+ident.getParentPath()+ident.getAssetName());
                HibernateUtil.saveWithPrimaryKey(ident, ident.getId());
            }
            HibernateUtil.flush();
            HibernateUtil.closeSession();

            // now we need to save all remaining identifiers (folders already added)
            for(File ff : identifiersXML) {
                try {
                    doXMLFileImport(ff, out, new ObjectFilter() {
                        public boolean includeIt(Object obj) {
                            return !((Identifier)obj).getAssetType().equals("folder");
                        }
                    });
                } catch (Exception e) {
                    Logger.error(this, "Unable to load " + ff.getName() + " : " + e.getMessage(), e);
                }
            }

            HibernateUtil.closeSession();

            // we store here defaultFileType for every folder
            // because of mutual folder <--> structure dependency
            final Map<String,String> fileTypesInodes=new HashMap<String,String>();

            // now we can import folders
            for(File ff : foldersXML) {
                try {
                    doXMLFileImport(ff, out, new ObjectFilter() {
                        public boolean includeIt(Object obj) {
                            Folder f=(Folder)obj;
                            fileTypesInodes.put(f.getInode(), f.getDefaultFileType());
                            f.setDefaultFileType(null);
                            return true;
                        }
                    });
                } catch (Exception e) {
                    Logger.error(this, "Unable to load " + ff.getName() + " : " + e.getMessage(), e);
                }
            }

            HibernateUtil.closeSession();

            // we need structures before contentlets
            // but structures have references to folders and hosts identifiers
            // so, here is the place to do it
            for (File file : structuresXML) {
                try {
                    doXMLFileImport(file, out);
                } catch (Exception e) {
                    Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
                }
            }

            // updating file_type on folder now that structures were added
            DotConnect dc = new DotConnect();
            for(Entry<String,String> entry : fileTypesInodes.entrySet()) {
                dc.setSQL("update folder set default_file_type=? where inode=?");
                dc.addParam(entry.getValue());
                dc.addParam(entry.getKey());
                dc.loadResult();
            }

            HibernateUtil.closeSession();

            // We have all identifiers, structures and users. Ready to import contentlets!
            for (File file : contentletsXML) {
                try{
                    doXMLFileImport(file, out);
                } catch (Exception e) {
                    Logger.error(this, "Unable to load hosts from " + file.getName() + " : " + e.getMessage(), e);
                }
            }

        } catch (Exception e) {
            Logger.error(this, "Unable to load contentlet, structures and folders " + e.getMessage(), e);
        }

        for (File file : templatesXML) {
            try{
                HibernateUtil.closeSession();
            } catch (DotHibernateException e) {
                Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
            }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }

        for (File file : templateContainersXML) {
            try{
                HibernateUtil.closeSession();
            } catch (DotHibernateException e) {
                Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
            }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : containerStructuresXML) {
            try{
                HibernateUtil.closeSession();
            } catch (DotHibernateException e) {
                Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
            }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : pagesXML) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : menuLinksXML) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : filesXML) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : containersXML) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }

        for (File file : treeXMLs) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : analyticSummaryXMLs) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : analyticSummary404XMLs) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : analyticSummaryRefererXMLs) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : analyticSummaryContentXMLs) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : analyticSummaryPagesXMLs) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : analyticSummaryVisitsXMLs) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : dashboardUserPreferencesXMLs) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }


        // workflow schemas need to come before permissions
        if(workflowSchemaFile != null){
          try{
            WorkflowImportExportUtil.getInstance().importWorkflowExport(workflowSchemaFile);

          }catch(Exception e){
             Logger.error(this, "Unable to import workflowSchemaFile" + e.getMessage(), e);
          }

        }




        for (File file : permissionXMLs) {
            try{
        HibernateUtil.closeSession();
      } catch (DotHibernateException e) {
        Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
      }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }

        // finally as all assets are loaded we can import versionInfo files
        for (File file : versionInfoFilesXML) {
            try{
                HibernateUtil.closeSession();
            } catch (DotHibernateException e) {
                Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
            }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : workFlowTaskXML) {
            try{
                HibernateUtil.closeSession();
            } catch (DotHibernateException e) {
                Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
            }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : workFlowHistoryXML) {
            try{
                HibernateUtil.closeSession();
            } catch (DotHibernateException e) {
                Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
            }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : workFlowCommentXML) {
            try{
                HibernateUtil.closeSession();
            } catch (DotHibernateException e) {
                Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
            }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }
        for (File file : workFlowTaskFilesXML) {
            try{
                HibernateUtil.closeSession();
            } catch (DotHibernateException e) {
                Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
            }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }

        for (File file : tagFiles) {
            try{
                HibernateUtil.closeSession();
            } catch (DotHibernateException e) {
                Logger.error(this, "Unable to close Session : " + e.getMessage(), e);
            }
            try{
                doXMLFileImport(file, out);
            } catch (Exception e) {
                Logger.error(this, "Unable to load " + file.getName() + " : " + e.getMessage(), e);
            }
        }












        cleanUpDBFromImport();
        if(hasAssetDir && assetDir!= null && assetDir.exists())
            copyAssetDir(assetDir);


        out.println("Done Importing");

        deleteTempFiles();

        try {
            HibernateUtil.commitTransaction();
        } catch (DotHibernateException e) {
            Logger.error(this, e.getMessage(),e);
        }

        MaintenanceUtil.flushCache();

        ReindexThread.startThread(Config.getIntProperty("REINDEX_THREAD_SLEEP", 500), Config.getIntProperty("REINDEX_THREAD_INIT_DELAY", 5000));

        ContentletAPI conAPI = APILocator.getContentletAPI();
        Logger.info(this, "Building Initial Index");
        try {
            APILocator.getContentletIndexAPI().getRidOfOldIndex();
        } catch (DotDataException e1) {
            Logger.warn(this, "Exception trying to delete old indexes",e1);
        }
        conAPI.refreshAllContent();
        long recordsToIndex = 0;
        try {
            recordsToIndex = APILocator.getDistributedJournalAPI().recordsLeftToIndexForServer();
            Logger.info(this, "Records left to index : " + recordsToIndex);
        } catch (DotDataException e) {
            Logger.error(ImportExportUtil.class,e.getMessage() + " while trying to get the number of records left to index",e);
        }
        int counter = 0;

        while(recordsToIndex > 0){
            if(counter > 600){
                try {
                    Logger.info(this, "Records left to index : " + APILocator.getDistributedJournalAPI().recordsLeftToIndexForServer());
                } catch (DotDataException e) {
                    Logger.error(ImportExportUtil.class,e.getMessage() + " while trying to get the number of records left to index",e);
                }
                counter = 0;
            }
            if(counter % 100 == 0){
                try{
                    recordsToIndex = APILocator.getDistributedJournalAPI().recordsLeftToIndexForServer();
                } catch (DotDataException e) {
                    Logger.error(ImportExportUtil.class,e.getMessage() + " while trying to get the number of records left to index",e);
                }
            }
            try{
                Thread.sleep(100);
            }catch (Exception e) {
                Logger.debug(this, "Cannot sleep : ", e);
            }
            counter++;
        }
        Logger.info(this, "Finished Building Initial Index");
        ReindexThread.stopThread();

        CacheLocator.getCacheAdministrator().flushAll();
        MaintenanceUtil.deleteStaticFileStore();
        MaintenanceUtil.deleteMenuCache();

    }

    private void copyAssetDir(File fromAssetDir){
        File ad;
        if(!UtilMethods.isSet(assetRealPath)){
            ad = new File(FileUtil.getRealPath(assetPath));
        }else{
            ad = new File(assetRealPath);
        }
        ad.mkdirs();
        String[] fileNames = fromAssetDir.list();
        for (int i = 0; i < fileNames.length; i++) {
            File f = new File(fromAssetDir.getPath() + File.separator + fileNames[i]);
            if(f.getName().equals(".svn")){
                continue;
            }
            if(f.getName().equals("license.dat")){
                continue;
            }
            if(f.isDirectory()){
                FileUtil.copyDirectory(f.getPath(), ad.getPath() + File.separator + f.getName());
            }else{
                FileUtil.copyFile(f.getPath(), ad.getPath() + File.separator + f.getName());
            }
        }
    }
    /**
     * Does what it says - deletes all files from the backupTempFilePath
     * @author Will
     */
    private void deleteTempFiles() {
        File f = new File(backupTempFilePath);
        String[] _tempFiles = f.list();
        if(_tempFiles != null){
            for (int i = 0; i < _tempFiles.length; i++) {
                f = new File(backupTempFilePath + "/" + _tempFiles[i]);
                f.delete();
            }
        }
    }

    /**
     * This is not completed should delete all the dotcms data from an install
     * @author Will
     */
    private void deleteDotCMS() {
        try {
            /* get a list of all our tables */
            //      Set<String> _tablesToDelete = new HashSet<String>();
            ArrayList<String> _tablesToDelete = new ArrayList<String>();
            Map map =null;

            try {
                map = HibernateUtil.getSession().getSessionFactory().getAllClassMetadata();
            } catch (DotHibernateException e) {
                Logger.error(this,e.getMessage(),e);
            }

            Iterator it = map.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry pairs = (Map.Entry) it.next();
                AbstractEntityPersister cmd = (AbstractEntityPersister) pairs.getValue();
                String tableName = cmd.getTableName();
                //        Class x = (Class) pairs.getKey();

                if(!tableName.equalsIgnoreCase("inode")
                        && !tableName.equalsIgnoreCase("plugin")
                        && !tableName.equalsIgnoreCase("plugin_property")
                        && !tableName.equalsIgnoreCase("cms_layouts_portlets")
                        && !tableName.equalsIgnoreCase("layouts_cms_roles")
                        && !tableName.equalsIgnoreCase("users_cms_roles")
                        && !tableName.equalsIgnoreCase("cms_role")
                        && !tableName.equalsIgnoreCase("cms_layout")
                        && !tableName.equalsIgnoreCase("analytic_summary")
                        && !tableName.equalsIgnoreCase("analytic_summary_content")
                        && !tableName.equalsIgnoreCase("analytic_summary_period")
                        && !tableName.equalsIgnoreCase("structure")
                        && !tableName.equalsIgnoreCase("folder")
                        && !tableName.equalsIgnoreCase("identifier")
                        && !tableName.equalsIgnoreCase("inode")){
                    _tablesToDelete.add(tableName);
                }
            }
            //these tables should be deleted in this order to avoid conflicts with foreign keys
            _tablesToDelete.add("cms_layouts_portlets");
            _tablesToDelete.add("layouts_cms_roles");
            _tablesToDelete.add("users_cms_roles");
            _tablesToDelete.add("cms_role");
            _tablesToDelete.add("cms_layout");
            _tablesToDelete.add("analytic_summary_content");
            _tablesToDelete.add("analytic_summary");
            _tablesToDelete.add("analytic_summary_period");
            _tablesToDelete.add("structure");
            _tablesToDelete.add("folder");
            _tablesToDelete.add("identifier");
            _tablesToDelete.add("inode");;
            _tablesToDelete.add("user_");
            _tablesToDelete.add("company");
            _tablesToDelete.add("counter");
            _tablesToDelete.add("image");
            _tablesToDelete.add("portlet");
            _tablesToDelete.add("portletpreferences");
            _tablesToDelete.add("address");
            _tablesToDelete.add("address");
            _tablesToDelete.add("plugin_property");
            _tablesToDelete.add("plugin");
            _tablesToDelete.add("pollschoice");
            _tablesToDelete.add("pollsdisplay");
            _tablesToDelete.add("pollsquestion");
            _tablesToDelete.add("pollsvote");


            DotConnect _dc = null;
            for (String table : _tablesToDelete) {
                Logger.info(this, "About to delete all records from " + table);
                _dc = new DotConnect();
                _dc.setSQL("delete from " + table);
                _dc.getResult();
                Logger.info(this, "Deleted all records from " + table);
            }
        } catch (HibernateException e) {
            Logger.error(this,e.getMessage(),e);
        }
        File ad;
        if(!UtilMethods.isSet(assetRealPath)){
            ad = new File(FileUtil.getRealPath(assetPath));
        }else{
            ad = new File(assetRealPath);
        }
        ad.mkdirs();
        String[] fl = ad.list();
        for (String fileName : fl) {
          if(fileName.equalsIgnoreCase("license")) continue;
         
            File f = new File(ad.getPath() + File.separator + fileName);
            if(f.isDirectory()){
                FileUtil.deltree(f);
            }else{
                f.delete();
            }
        }
    }

    interface ObjectFilter {
        boolean includeIt(Object obj);
    }

    /**
     * This method takes an xml file and will try to import it via XStream and
     * Hibernate
     *
     * @param f
     *            File to be parsed and imported
     * @param out
     *            Printwriter to write responses to Reponse Printwriter so this
     *            method can write to screen.
     *
     * @author Will
     */
    private void doXMLFileImport(File f, PrintWriter out)throws DotDataException, HibernateException {
        doXMLFileImport(f, out, null);
    }

    private void doXMLFileImport(File f, PrintWriter out, ObjectFilter filter)throws DotDataException, HibernateException {
        if( f ==null){
            return;
        }

        BufferedInputStream _bin = null;
        Reader charStream = null;
        try {
            XStream _xstream = null;
            String _className = null;
            Class _importClass = null;
            HibernateUtil _dh = null;

            boolean counter = false;
            boolean image = false;
            boolean portlet = false;
            boolean logsMappers = false;
            boolean portletpreferences = false;
            boolean address = false;
            boolean pollschoice = false;
            boolean pollsdisplay = false;
            boolean pollsquestion = false;
            boolean pollsvote = false;

            /* if we have a multipart import file */
            Pattern p = Pattern.compile("_[0-9]{8}");
            Matcher m  = p.matcher(f.getName());
            if(m.find()){
                _className = f.getName().substring(0, f.getName().lastIndexOf("_"));
            }
            else{
                _className = f.getName().substring(0, f.getName().lastIndexOf("."));
            }

            if(_className.equals("Counter")){
                counter = true;
            }else if(_className.equals("Image")){
                image = true;
            }else if(_className.equals("Portlet")){
                portlet = true;
            }else if(_className.equals("LogsMappers")){
                logsMappers = true;
            }else if(_className.equals("Portletpreferences")){
                portletpreferences = true;
            }else if(_className.equals("Pollschoice")){
                pollschoice = true;
            }else if(_className.equals("Address")){
                address = true;
            }else if(_className.equals("Pollsdisplay")){
                pollsdisplay = true;
            }else if(_className.equals("Pollsquestion")){
                pollsquestion = true;
            }else if(_className.equals("Pollsvote")){
                pollsvote = true;
            }else{
                try{
                    _importClass = Class.forName(_className);
                }catch (Exception e) {
                    Logger.error(this, "Class not found " + _className, e);
                    return;
                }
            }
            _xstream = new XStream();
            out.println("Importing:\t" + _className);
            Logger.info(this, "Importing:\t" + _className);

            try{
                charStream = new InputStreamReader(new FileInputStream(f), "UTF-8");
            }catch (UnsupportedEncodingException uet) {
                Logger.error(this, "Reader doesn't not recoginize Encoding type: ", uet);
            }
            List l = new ArrayList();
            try{
                List all = (List) _xstream.fromXML(charStream);
                if(filter!=null) {
                    for(Object obj : all)
                        if(filter.includeIt(obj))
                            l.add(obj);
                }
                else {
                    l = all;
                }
            }catch(Exception e){
                Logger.error(this, "Unable to import " + _className, e);
            }
            out.println("Found :\t" + l.size() + " " + _className + "(s)");
            Logger.info(this, "Found :\t" + l.size() + " " + _className + "(s)");
            if(address){
                for (int j = 0; j < l.size(); j++) {
                    HashMap<String, String> dcResults = (HashMap<String,String>)l.get(j);
                    DotConnect dc = new DotConnect();
                    dc.setSQL("insert into address values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
                    dc.addParam(dcResults.get("addressid"));
                    dc.addParam(dcResults.get("companyid"));
                    dc.addParam(dcResults.get("userid"));
                    dc.addParam(dcResults.get("username"));
                    dc.addParam(dcResults.get("createDate"));
                    dc.addParam(dcResults.get("ModifiedDate"));
                    dc.addParam(dcResults.get("classname"));
                    dc.addParam(dcResults.get("classpk"));
                    dc.addParam(dcResults.get("description"));
                    dc.addParam(dcResults.get("street1"));
                    dc.addParam(dcResults.get("street2"));
                    dc.addParam(dcResults.get("city"));
                    dc.addParam(dcResults.get("state"));
                    dc.addParam(dcResults.get("zip"));
                    dc.addParam(dcResults.get("country"));
                    dc.addParam(dcResults.get("phone"));
                    dc.addParam(dcResults.get("fax"));
                    dc.addParam(dcResults.get("cell"));
                    dc.addParam(UtilMethods.isSet(dcResults.get("priority")) ? Integer.parseInt(dcResults.get("priority")) : null);
                    dc.getResults();
                }
            }else if(counter){
                for (int j = 0; j < l.size(); j++) {
                    HashMap<String, String> dcResults = (HashMap<String,String>)l.get(j);
                    DotConnect dc = new DotConnect();
                    dc.setSQL("insert into counter values (?,?)");
                    dc.addParam(dcResults.get("name"));
                    dc.addParam(Integer.valueOf(dcResults.get("currentid")));
                    dc.getResults();
                }
            }else if(pollschoice){
                for (int j = 0; j < l.size(); j++) {
                    HashMap<String, String> dcResults = (HashMap<String,String>)l.get(j);
                    DotConnect dc = new DotConnect();
                    dc.setSQL("insert into pollschoice values (?,?,?)");
                    dc.addParam(dcResults.get("choiceid"));
                    dc.addParam(dcResults.get("questionid"));
                    dc.addParam(dcResults.get("description"));
                    dc.getResults();
                }
            }else if(pollsdisplay){
                for (int j = 0; j < l.size(); j++) {
                    HashMap<String, String> dcResults = (HashMap<String,String>)l.get(j);
                    DotConnect dc = new DotConnect();
                    dc.setSQL("insert into pollsdisplay values (?,?,?,?)");
                    dc.addParam(dcResults.get("layoutid"));
                    dc.addParam(dcResults.get("userid"));
                    dc.addParam(dcResults.get("portletid"));
                    dc.addParam(dcResults.get("questionid"));
                    dc.getResults();
                }
            }else if(pollsquestion){
                for (int j = 0; j < l.size(); j++) {
                    HashMap<String, String> dcResults = (HashMap<String,String>)l.get(j);
                    DotConnect dc = new DotConnect();
                    dc.setSQL("insert into pollsquestion values (?,?,?,?,?,?,?,?,?,?,?,?)");
                    dc.addParam(dcResults.get("questionid"));
                    dc.addParam(dcResults.get("portletid"));
                    if(UtilMethods.isSet(dcResults.get("groupid"))){
                        dc.addParam(dcResults.get("groupid"));
                    }else{
                        dc.addParam(-1);
                    }
                    dc.addParam(dcResults.get("companyid"));
                    dc.addParam(dcResults.get("userid"));
                    dc.addParam(dcResults.get("username"));
                    if(UtilMethods.isSet(dcResults.get("createdate"))){
                        dc.addParam(java.sql.Timestamp.valueOf(dcResults.get("createdate")));
                    }else{
                        dc.addParam(new java.sql.Timestamp(0));
                    }
                    if(UtilMethods.isSet(dcResults.get("modifieddate"))){
                        dc.addParam(java.sql.Timestamp.valueOf(dcResults.get("modifieddate")));
                    }else{
                        dc.addParam(new java.sql.Timestamp(0));
                    }
                    dc.addParam(dcResults.get("title"));
                    dc.addParam(dcResults.get("description"));
                    if(UtilMethods.isSet(dcResults.get("expirationdate"))){
                        dc.addParam(java.sql.Timestamp.valueOf(dcResults.get("expirationdate")));
                    }else{
                        dc.addParam(new java.sql.Timestamp(0));
                    }
                    if(UtilMethods.isSet(dcResults.get("lastvotedate"))){
                        dc.addParam(java.sql.Timestamp.valueOf(dcResults.get("lastvotedate")));
                    }else{
                        dc.addParam(new java.sql.Timestamp(0));
                    }
                    dc.getResults();
                }
            }else if(pollsvote){
                for (int j = 0; j < l.size(); j++) {
                    HashMap<String, String> dcResults = (HashMap<String,String>)l.get(j);
                    DotConnect dc = new DotConnect();
                    dc.setSQL("insert into pollsvote values (?,?,?,?)");
                    dc.addParam(dcResults.get("questionid"));
                    dc.addParam(dcResults.get("userid"));
                    dc.addParam(dcResults.get("choiceid"));
                    if(UtilMethods.isSet(dcResults.get("lastvotedate"))){
                        dc.addParam(java.sql.Timestamp.valueOf(dcResults.get("lastvotedate")));
                    }else{
                        dc.addParam(new java.sql.Timestamp(0));
                    }
                    dc.getResults();
                }
            }else if(image){
                /*
                 * The changes in this part were made for Oracle databases. Oracle has problems when
                 * getString() method is called on a LONG field on an Oracle database. Because of this,
                 * the object is loaded from liferay and DotConnect is not used
                 * http://jira.dotmarketing.net/browse/DOTCMS-1911
                 */
                for (int j = 0; j < l.size(); j++) {
                    Image im = (Image)l.get(j);
                    DotConnect dc = new DotConnect();
                    dc.setSQL("insert into image values (?,?)");
                    if(!UtilMethods.isSet(im.getImageId()) && DbConnectionFactory.isOracle()){
                        continue;
                    }
                    dc.addParam(im.getImageId());
                    dc.addParam(im.getText());
                    dc.getResults();
                }
            }else if(portlet){
                for (int j = 0; j < l.size(); j++) {
                    HashMap<String, String> dcResults = (HashMap<String,String>)l.get(j);
                    DotConnect dc = new DotConnect();
                    StringBuffer sb = new StringBuffer("insert into portlet values (?,?,?,?,");
                    if(dcResults.get("narrow").equalsIgnoreCase("f") || dcResults.get("narrow").equalsIgnoreCase("false") || dcResults.get("narrow").equalsIgnoreCase("0") || dcResults.get("narrow").equals(DbConnectionFactory.getDBFalse()))
                        sb.append(DbConnectionFactory.getDBFalse() + ",?,");
                    else
                        sb.append(DbConnectionFactory.getDBTrue() + ",?,");
                    if(dcResults.get("active_").equalsIgnoreCase("f") || dcResults.get("active_").equalsIgnoreCase("false") || dcResults.get("active_").equalsIgnoreCase("0") || dcResults.get("active_").equals(DbConnectionFactory.getDBFalse()))
                        sb.append(DbConnectionFactory.getDBFalse() + ")");
                    else
                        sb.append(DbConnectionFactory.getDBTrue() + ")");
                    dc.setSQL(sb.toString());
                    dc.addParam(dcResults.get("portletid"));
                    dc.addParam(dcResults.get("groupid"));
                    dc.addParam(dcResults.get("companyid"));
                    dc.addParam(dcResults.get("defaultpreferences"));
                    dc.addParam(dcResults.get("roles"));
                    dc.getResults();
                }
            }else if(logsMappers){
                for ( int j = 0; j < l.size(); j++ ) {
                    LogMapperRow logMapperRow = ( LogMapperRow ) l.get( j );
                    DotConnect dc = new DotConnect();
                    dc.setSQL( "insert into log_mapper values (?,?,?)" );
                    dc.addParam( logMapperRow.getEnabled() ? 1 : 0 );
                    dc.addParam( logMapperRow.getLog_name() );
                    dc.addParam( logMapperRow.getDescription() );
                    dc.getResults();
                }
            }else if(portletpreferences){
                /*
                 * The changes in this part were made for Oracle databases. Oracle has problems when
                 * getString() method is called on a LONG field on an Oracle database. Because of this,
                 * the object is loaded from liferay and DotConnect is not used
                 * http://jira.dotmarketing.net/browse/DOTCMS-1911
                 */
                for (int j = 0; j < l.size(); j++) {
                    PortletPreferences portletPreferences = (PortletPreferences)l.get(j);
                    DotConnect dc = new DotConnect();
                    dc.setSQL("insert into portletpreferences values (?,?,?,?)");
                    dc.addParam(portletPreferences.getPortletId());
                    dc.addParam(portletPreferences.getUserId());
                    dc.addParam(portletPreferences.getLayoutId());
                    dc.addParam(portletPreferences.getPreferences());
                    dc.getResults();
                }
            }else if (_importClass.equals(User.class)) {
                for (int j = 0; j < l.size(); j++) {
                    User u = (User)l.get(j);
                    u.setModified(true);
                    if(!u.isDefaultUser() && !u.getUserId().equals("system")){
                        try{
                            User u1 = APILocator.getUserAPI().createUser(u.getUserId(), u.getEmailAddress());
                            u.setUserId(u1.getUserId());
                            u.setEmailAddress(u.getEmailAddress());
                        }catch (DuplicateUserException e) {
                            Logger.info(this, "user already exists going to update");
                            try{
                                u = APILocator.getUserAPI().loadUserById(u.getUserId(), APILocator.getUserAPI().getSystemUser(),false);
                            }catch (Exception e1) {
                                Logger.info(this, "couldn't find user by ID going to lookup by email address");
                                u = APILocator.getUserAPI().loadByUserByEmail(u.getEmailAddress(), APILocator.getUserAPI().getSystemUser(),false);
                            }
                        }
                        APILocator.getUserAPI().save(u,APILocator.getUserAPI().getSystemUser(),false);
                    }else{
                        Logger.info(this, "");
                    }
                }
            } else if (_importClass.equals(Company.class)) {
                for (int j = 0; j < l.size(); j++) {
                    Company c = (Company)l.get(j);
                    try {
                        c.setModified(true);
                        CompanyManagerUtil.updateCompany(c);
                    } catch (SystemException e) {
                        throw new DotDataException("Unable to load company",e);
                    }
                }
            }else {
                _dh = new HibernateUtil(_importClass);
                String id = HibernateUtil.getSession().getSessionFactory().getClassMetadata(_importClass).getIdentifierPropertyName();
                HibernateUtil.getSession().close();
                boolean identityOn = false;
                String cName = _className.substring(_className.lastIndexOf(".") + 1);



                String tableName = "";
                if(classesWithIdentity.contains(cName) && DbConnectionFactory.isMsSql() && !cName.equalsIgnoreCase("inode")){
                    tableName = tableNames.get(cName);
                    turnIdentityOnMSSQL(tableName);
                    identityOn = true;
                }/*else if(dbType.equals(DbConnectionFactory.MSSQL)){
          DotConnect dc = new DotConnect();
          dc.executeStatement("set IDENTITY_INSERT inode on;");
        }*/
                for (int j = 0; j < l.size(); j++) {
                    Object obj = l.get(j);
                    if(l.get(j) instanceof com.dotmarketing.portlets.contentlet.business.Contentlet && DbConnectionFactory.isMsSql()){
                        com.dotmarketing.portlets.contentlet.business.Contentlet contentlet = (com.dotmarketing.portlets.contentlet.business.Contentlet)l.get(j);
                        changeDateForSQLServer(contentlet, out);
                    }

                    if (UtilMethods.isSet(id)) {
                        String prop = BeanUtils.getProperty(obj, id);

                        try {
                            HibernateUtil.startTransaction();
                            if(id.substring(id.length()-2,id.length()).equalsIgnoreCase("id")){
                                if(obj instanceof Identifier){
                                    HibernateUtil.saveWithPrimaryKey(obj, prop);
                                }else{
                                    Long myId = new Long(Long.parseLong(prop));
                                    HibernateUtil.saveWithPrimaryKey(obj, myId);
                                }
                                HibernateUtil.commitTransaction();
                            }else{
                                HibernateUtil.saveWithPrimaryKey(obj, prop);
                                HibernateUtil.commitTransaction();
                            }
                        } catch (Exception e) {
                            try{
                                HibernateUtil.saveWithPrimaryKey(obj, prop);
                                HibernateUtil.commitTransaction();
                            }catch (Exception ex) {
                                Logger.debug(this, "Usually not a problem can be that duplicate data or many times a row of data that is created by the system and is trying to be imported again : " + ex.getMessage(), ex);
                                Logger.warn(this, "Usually not a problem can be that duplicate data or many times a row of data that is created by the system and is trying to be imported again : " + ex.getMessage());
                                Logger.info(this, "Problematic object: "+obj+" prop:"+prop);
                                Logger.info(this, _xstream.toXML(obj));

                                try{
                                    HibernateUtil.rollbackTransaction();
                                    HibernateUtil.closeSession();
                                }catch (Exception e1) {}
                                continue;
                            }
                        }

                    } else {
                        if(obj instanceof Tree){
                            Tree t = (Tree) obj;
                            DotConnect dc = new DotConnect();
                            List<String> inodeList = new ArrayList<String>();
                            dc.setSQL("select inode from inode where inode = ? or inode = ?");
                            dc.addParam(t.getParent());
                            dc.addParam(t.getChild());
                            inodeList = dc.getResults();
                            dc.setSQL("select id from identifier where id = ? or id = ?");
                            dc.addParam(t.getParent());
                            dc.addParam(t.getChild());
                            inodeList.addAll(dc.getResults());
                            if(inodeList.size() > 1){
                                HibernateUtil.save(obj);
                            }
                            else{
                                Logger.warn(this.getClass(), "Can't import tree- no matching inodes: {parent=" + t.getParent() + ", child=" + t.getChild() +"}");

                            }
                        }
                        else{
                            try {
                                HibernateUtil.save(obj);
                            } catch (DotHibernateException e) {
                                Logger.error(this,e.getMessage(),e);
                            }
                        }
                    }
                    HibernateUtil.getSession().flush();
                    HibernateUtil.closeSession();
                    try {


                        Thread.sleep(3);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        Logger.error(this,e.getMessage(),e);
                    }
                }
                if(identityOn){
                    turnIdentityOffMSSQL(tableName);
                }/*else if(dbType.equals(DbConnectionFactory.MSSQL)){
          turnIdentityOffMSSQL("inode");
        }*/
            }
        } catch (FileNotFoundException e) {
            Logger.error(this,e.getMessage(),e);
        } catch (IllegalAccessException e) {
            Logger.error(this,e.getMessage(),e);
        } catch (InvocationTargetException e) {
            Logger.error(this,e.getMessage(),e);
        } catch (NoSuchMethodException e) {
            Logger.error(this,e.getMessage(),e);
        } catch (SQLException e) {
            Logger.error(this,e.getMessage(),e);
        } catch (DotSecurityException e) {
            Logger.error(this,e.getMessage(),e);
        } finally {

            try {

                if (charStream != null) {
                    charStream.close();
                }
            } catch (IOException e) {
                Logger.error(this,e.getMessage(),e);
            }
        }
    }

    /**
     * Simple FileNameFilter for XML files
     *
     * @author will
     *
     */
    private class XMLFileNameFilter implements FilenameFilter {

        public boolean accept(File f, String s) {
            if (s.toLowerCase().endsWith(".xml")) {
                return true;
            } else {
                return false;
            }
        }
    }

    private void turnIdentityOnMSSQL(String tableName) throws SQLException{
        DotConnect dc = new DotConnect();
        dc.executeStatement("set identity_insert " + tableName + " on");
    }

    private void turnIdentityOffMSSQL(String tableName) throws SQLException{
        DotConnect dc = new DotConnect();
        dc.executeStatement("set identity_insert " + tableName + " off");
    }

    private void cleanUpDBFromImport(){
        String dbType = DbConnectionFactory.getDBType();
        DotConnect dc = new DotConnect();
        try {
            if(DbConnectionFactory.isMsSql()){
            }else if(DbConnectionFactory.isOracle()){
                for (String clazz : classesWithIdentity) {
                    String tableName = tableNames.get(clazz);
                    dc.setSQL("drop sequence " + sequences.get(tableName));
                    dc.getResults();
                    dc.setSQL("select max(" + tableIDColumns.get(tableName) + ") as maxID from " + tableName);
                    ArrayList<HashMap<String, String>> results = dc.getResults();
                    int max = dc.getResults().size() == 0 ? 0 : Parameter.getInt(dc.getString("maxID"),1);
                    dc.setSQL("CREATE SEQUENCE " + sequences.get(tableName) + " MINVALUE 1 START WITH " + (max + 100) + " INCREMENT BY 1");
                    dc.getResults();
                }
            }else if(DbConnectionFactory.isPostgres()){
                for (String clazz : classesWithIdentity) {
                    String tableName = tableNames.get(clazz);
                    dc.setSQL("select max(" + tableIDColumns.get(tableName) + ") as maxID from " + tableName);
                    ArrayList<HashMap<String, String>> results = dc.getResults();
                    int max = dc.getResults().size() == 0 ? 0 : Parameter.getInt(dc.getString("maxID"),1);
                    dc.setSQL("alter sequence " + sequences.get(tableName) + " restart with " + (max + 1));
                    dc.getResults();
                }
            }
        } catch (DotDataException e) {
            Logger.error(this,"cleanUpDBFromImport failed:"+ e, e);
        }
    }

    public String getBackupTempFilePath() {
        return backupTempFilePath;
    }

    public void setBackupTempFilePath(String backupTempFilePath) {
        this.backupTempFilePath = backupTempFilePath;
    }


    /**
     *
     * @param zipFile
     * @return
     */
    public boolean validateZipFile(File zipFile){

        String tempdir = getBackupTempFilePath();
        try {
            deleteTempFiles();

            File ftempDir = new File(tempdir);
            ftempDir.mkdirs();
            File tempZip = new File(tempdir + File.separator + zipFile.getName());
            tempZip.createNewFile();
            FileChannel ic = new FileInputStream(zipFile).getChannel();
            FileChannel oc = new FileOutputStream(tempZip).getChannel();

            // to handle huge zipfiles
            ic.transferTo(0, ic.size(), oc);

            ic.close();
            oc.close();


            /*
             * Unzip zipped backups
             */
            if (zipFile != null && zipFile.getName().toLowerCase().endsWith(".zip")) {
                ZipFile z = new ZipFile(zipFile);
                ZipUtil.extract(z, new File(backupTempFilePath));
            }
            return true;

        } catch (Exception e) {
            Logger.error(this,"Error with file",e);
            return false;
        }
    }

    private boolean validateDate(Date date){
        java.util.Calendar calendar = java.util.Calendar.getInstance();
        calendar.set(1753, 01, 01);
        boolean validated = true;
        if(date != null && date.before(calendar.getTime()) ){
            validated = false;
        }
        return validated;

    }

    private void changeDateForSQLServer(com.dotmarketing.portlets.contentlet.business.Contentlet contentlet, PrintWriter out){
        if(!validateDate(contentlet.getDate1())){
            contentlet.setDate1(new Date());
            out.println("Unsupported data in SQL Server, so changed date to current date for contentlet with inode ");
        }
        if(!validateDate(contentlet.getDate2())){
            contentlet.setDate2(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate3())){
            contentlet.setDate3(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate4())){
            contentlet.setDate4(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate5())){
            contentlet.setDate5(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate6())){
            contentlet.setDate6(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate7())){
            contentlet.setDate7(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate8())){
            contentlet.setDate8(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate9())){
            contentlet.setDate9(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate10())){
            contentlet.setDate10(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate11())){
            contentlet.setDate11(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate12())){
            contentlet.setDate12(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate13())){
            contentlet.setDate13(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate14())){
            contentlet.setDate14(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate15())){
            contentlet.setDate15(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate16())){
            contentlet.setDate16(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate17())){
            contentlet.setDate17(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate18())){
            contentlet.setDate18(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate19())){
            contentlet.setDate19(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate20())){
            contentlet.setDate20(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate21())){
            contentlet.setDate21(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate22())){
            contentlet.setDate22(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate23())){
            contentlet.setDate23(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate24())){
            contentlet.setDate24(new Date());
            out.println("Date changed to current date");
        }
        if(!validateDate(contentlet.getDate25())){
            contentlet.setDate25(new Date());
            out.println("Date changed to current date");
        }
    }
}
TOP

Related Classes of com.dotmarketing.util.ImportExportUtil$ObjectFilter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.