Package org.jahia.admin.sites

Source Code of org.jahia.admin.sites.ManageSites

/**
* This file is part of Jahia, next-generation open source CMS:
* Jahia's next-generation, open source CMS stems from a widely acknowledged vision
* of enterprise application convergence - web, search, document, social and portal -
* unified by the simplicity of web content management.
*
* For more information, please visit http://www.jahia.com.
*
* Copyright (C) 2002-2011 Jahia Solutions Group SA. All rights reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* As a special exception to the terms and conditions of version 2.0 of
* the GPL (or any later version), you may redistribute this Program in connection
* with Free/Libre and Open Source Software ("FLOSS") applications as described
* in Jahia's FLOSS exception. You should have received a copy of the text
* describing the FLOSS exception, and it is also available here:
* http://www.jahia.com/license
*
* Commercial and Supported Versions of the program (dual licensing):
* alternatively, commercial and supported versions of the program may be used
* in accordance with the terms and conditions contained in a separate
* written agreement between you and Jahia Solutions Group SA.
*
* If you are unsure which license is appropriate for your use,
* please contact the sales department at sales@jahia.com.
*/

// $Id: ManageSites.java 38178 2011-06-01 16:11:16Z tdraier $
//
//  ManageSites
//
//  02.04.2001  MJ  added in jahia.
//  19.04.2001  AK  multisite first steps.
//  20.04.2001  AK  change selection way for re-use existant administrator.
//  21.04.2001  AK  complete add a site capability.
//  22.04.2001  AK  edit a site and delete a site capabilities.
//  27.04.2001  NK  added default site handling.
//  02.05.2001  NK  added templates, applications, users, files repository
//          full deletion from disk and db storage when deleting a whole site
//  04.05.2001  NK  Can delete all sites, no server site anymore
//  16.05.2001  NK  Handle special case when the current site is deleted -> need session synchronisation.
//  16.05.2001  NK  Integrate License Check.
//  23.05.2001  NK  Add Site reminder previous data by storing temporaty new site in session allowing
//          GO BACK to the previous screen.
//  27.09.2001  NK  Add Site , added template set choice step
//

package org.jahia.admin.sites;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.jahia.admin.AbstractAdministrationModule;
import org.jahia.bin.Jahia;
import org.jahia.bin.JahiaAdministration;
import org.jahia.data.templates.JahiaTemplatesPackage;
import org.jahia.engines.EngineMessages;
import org.jahia.exceptions.JahiaException;
import org.jahia.params.ParamBean;
import org.jahia.params.ProcessingContext;
import org.jahia.registries.ServicesRegistry;
import org.jahia.services.content.JCRContentUtils;
import org.jahia.services.content.JCRNodeWrapper;
import org.jahia.services.content.JCRSessionFactory;
import org.jahia.services.content.JCRStoreService;
import org.jahia.services.importexport.ImportExportBaseService;
import org.jahia.services.pwdpolicy.JahiaPasswordPolicyService;
import org.jahia.services.pwdpolicy.PolicyEnforcementResult;
import org.jahia.services.render.URLGenerator;
import org.jahia.services.search.spell.CompositeSpellChecker;
import org.jahia.services.sites.JahiaSite;
import org.jahia.services.sites.JahiaSiteTools;
import org.jahia.services.sites.JahiaSitesBaseService;
import org.jahia.services.sites.JahiaSitesService;
import org.jahia.services.templates.JahiaTemplateManagerService;
import org.jahia.services.usermanager.*;
import org.jahia.settings.SettingsBean;
import org.jahia.tools.files.FileUpload;
import org.jahia.utils.LanguageCodeConverters;

import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.security.Principal;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
* This class provides the business methods for sites
* management, from the JahiaAdministration servlet.
*
* @author Khue Nguyen
*         <p/>
*         Copyright:    Copyright (c) 2002
*         Company:      Jahia Ltd
* @version 1.0
*/
public class ManageSites extends AbstractAdministrationModule {

  // authorized chars
    private static final String AUTHORIZED_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789.-";
   
    private static final HashSet<String> NON_SITE_IMPORTS = new HashSet<String>(Arrays.asList("serverPermissions.xml", "users.xml", "users.zip", JahiaSitesBaseService.SYSTEM_SITE_KEY + ".zip"));

    private static final Map<String, Integer> RANK;
    static {
        RANK = new HashMap<String, Integer>(3);
        RANK.put("users.xml", 10);
        RANK.put("serverPermissions.xml", 20);
        RANK.put("shared.zip", 30);
        RANK.put(JahiaSitesBaseService.SYSTEM_SITE_KEY+".zip", 40);
    }
    private static final Comparator<Map<Object, Object>> IMPORTS_COMPARATOR = new Comparator<Map<Object,Object>>() {
        public int compare(Map<Object, Object> o1, Map<Object, Object> o2) {
            Integer rank1 = RANK.get((String) o1.get("importFileName"));
            Integer rank2 = RANK.get((String) o2.get("importFileName"));
            rank1 = rank1 != null ? rank1 : 100;
            rank2 = rank2 != null ? rank2 : 100;
            return rank1.compareTo(rank2);
        }
    };
   
// ------------------------------ FIELDS ------------------------------

    private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ManageSites.class);

    private static final String CLASS_NAME = JahiaAdministration.CLASS_NAME;
    private static final String JSP_PATH = JahiaAdministration.JSP_PATH;

    private static final Pattern LANGUAGE_RANK_PATTERN = Pattern.compile("(?:language.)(\\w+)(?:.rank)");

    private static JahiaSitesService sMgr;

    private ProcessingContext jParams;

// --------------------------- CONSTRUCTORS ---------------------------

    /**
     * Default constructor.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     */
    public void service(HttpServletRequest request, HttpServletResponse response) throws Exception {

        ServicesRegistry sReg = ServicesRegistry.getInstance();
        if (sReg != null) {
            sMgr = sReg.getJahiaSitesService();
        }

        this.jParams = (ProcessingContext) request.getAttribute("org.jahia.params.ParamBean");

        userRequestDispatcher(request, response, request.getSession());
    } // end constructor

    /**
     * This method serves as a dispatcher for user requests.
     *
     * @param req  Servlet request.
     * @param res  Servlet response.
     * @param sess Servlet session for the current user.
     */
    private void userRequestDispatcher(HttpServletRequest req, HttpServletResponse res, HttpSession sess)
            throws IOException, ServletException {
        String op = req.getParameter("sub");
        if (op == null) {
            return;
        }
        if (op.equals("list")) {
            displayList(req, res, sess);
        } else if (op.equals("add")) {
            displayAdd(req, res, sess);
        } else if (op.equals("processadd")) {
            processAdd(req, res, sess);
        } else if (op.equals("displaycreateadmin")) {
            displayCreateAdmin(req, res, sess);
        } else if (op.equals("displayselectexistantadmin")) {
            displaySelectExistantAdmin(req, res, sess);
        } else if (op.equals("processcreateadmin")) {
            processCreateAdmin(req, res, sess);
        } else if (op.equals("processexistantadmin")) {
            processExistantAdmin(req, res, sess);
        } else if (op.equals("processadminselectsite")) {
            processExistantAdminSelectSite(req, res, sess);
        } else if (op.equals("processtemplatesetchoice")) {
            processTemplateSetChoice(req, res, sess);
        } else if (op.equals("edit")) {
            displayEdit(req, res, sess);
        } else if (op.equals("processedit")) {
            processEdit(req, res, sess);
        } else if (op.equals("delete")) {
            displayDelete(req, res, sess);
        } else if (op.equals("processdelete")) {
            processDelete(req, res, sess);
        } else if (op.equals("multipledelete")) {
            displayMultipleDelete(req, res, sess);
        } else if (op.equals("processmultipledelete")) {
            processMultipleDelete(req, res, sess);
        } else if (op.equals("prepareimport")) {
            prepareMultipleImport(req, res, sess);
        } else if (op.equals("processimport")) {
            processFileImport(req, res, sess);
        } else if (op.equals("createsite")) {
            createSite(req, res, sess);
        }
    } // userRequestDispatcher

    /**
     * Display the list of sites.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void displayList(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        logger.debug(" display sites list started ");

        // retrieve previous form values...
        String jahiaDisplayMessage = (String) request.getAttribute(CLASS_NAME + "jahiaDisplayMessage");
        String warningMsg = (String) request.getAttribute("warningMsg");
        if (warningMsg == null) {
            warningMsg = "";
        }

        // set default values...
        if (jahiaDisplayMessage == null) {
            jahiaDisplayMessage = Jahia.COPYRIGHT;
        }

        try {
            Iterator<JahiaSite> siteEnum = sMgr.getSites();
            List<JahiaSite> sortedSites = new ArrayList<JahiaSite>();
            while (siteEnum.hasNext()) {
                JahiaSite curSite = (JahiaSite) siteEnum.next();
                if (!curSite.getSiteKey().equals(JahiaSitesBaseService.SYSTEM_SITE_KEY)) {
                    sortedSites.add(curSite);
                }
            }
            Locale defaultLocale = (Locale) session.getAttribute(ProcessingContext.SESSION_LOCALE);
            if (defaultLocale != null) {
                Collections.sort(sortedSites, JahiaSite.getTitleComparator(defaultLocale));
            } else {
                Collections.sort(sortedSites, JahiaSite.getTitleComparator());
            }
            request.setAttribute("sitesList", sortedSites.iterator());
            if (sortedSites.size() == 0) {
                JahiaSite newJahiaSite = (JahiaSite) session.getAttribute(CLASS_NAME + "newJahiaSite");

                if (newJahiaSite == null) {
                    logger.debug("site not found in session, assuming new site ");

                    // it's the first time this screen is displayed, so create an empty one

                    newJahiaSite = new JahiaSite(-1, "My Site",        // site title
                            "localhost",        // site server name
                            "mySite",     // site key
                            // is active
                            // default page (homepage id)
                            "",        // description
                            null, null);
                }

                session.setAttribute(CLASS_NAME + "newJahiaSite", newJahiaSite);
                session.setAttribute(CLASS_NAME + "noSites", Boolean.TRUE);
            } else {
                session.removeAttribute(CLASS_NAME + "noSites");
            }
        } catch (JahiaException ex) {
            logger.error("Error while retrieving site list", ex);
            jahiaDisplayMessage =
                    getMessage("message.generalError");
        }
        // set request attributes...
        request.setAttribute("jahiaDisplayMessage", jahiaDisplayMessage);
        request.setAttribute("warningMsg", warningMsg);
        try {
            request.setAttribute("hasTemplateSets",getTemplatesSets().size() > 0);
        } catch (RepositoryException e) {
            e.printStackTrace();
        }
        // redirect...
        JahiaAdministration.doRedirect(request, response, session, JSP_PATH + "sites_management.jsp");
    } // end displayList

    /**
     * Display Add new site form
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void displayAdd(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        logger.debug(" display add site started ");

        // retrieve previous form values...
        String jahiaDisplayMessage = "";
        String warningMsg = (String) request.getAttribute("warningMsg");
        if (warningMsg == null) {
            warningMsg = "";
        }

        JahiaUser theUser = (JahiaUser) session.getAttribute(ProcessingContext.SESSION_USER);

        // check it there is a temporary new site in session
        JahiaSite newJahiaSite = (JahiaSite) session.getAttribute(CLASS_NAME + "newJahiaSite");

        if (newJahiaSite == null) {
            logger.debug("site not found in session, assuming new site ");

            // it's the first time this screen is displayed, so create an empty one

            newJahiaSite = new JahiaSite(-1, "My Site",        // site title
                    "localhost",        // site server name
                    "mySite",     // site key
                    // is active
                    // default page (homepage id)
                    "",        // description
                    null, null);
        }


        Boolean defaultSite = (Boolean) session.getAttribute(CLASS_NAME + "defaultSite");
        if (defaultSite == null) {
            try {
                if (ServicesRegistry.getInstance().getJahiaSitesService().getNbSites() > 1) {
                    defaultSite = Boolean.FALSE;
                } else {
                    defaultSite = Boolean.TRUE;
                }
            } catch (JahiaException e) {
                logger.error(e.getMessage(), e);
                defaultSite = Boolean.TRUE;
            }
        }

        // store in session
        session.setAttribute(CLASS_NAME + "newJahiaSite", newJahiaSite);
        session.setAttribute(CLASS_NAME + "defaultSite", defaultSite);

        session.setAttribute(CLASS_NAME + "adminPassword", "");

        List<JahiaSite> grantedSites = new ArrayList<JahiaSite>();
        if (theUser != null) {
            try {
                grantedSites =
                        ServicesRegistry.getInstance().getJahiaGroupManagerService().getAdminGrantedSites(theUser);
            } catch (JahiaException je) {
            }
            if (grantedSites == null) {
                grantedSites = new ArrayList<JahiaSite>();
            } else {
                Locale defaultLocale = (Locale) session.getAttribute(ProcessingContext.SESSION_LOCALE);
                if (defaultLocale != null) {
                    Collections.sort(grantedSites, JahiaSite.getTitleComparator(defaultLocale));
                } else {
                    Collections.sort(grantedSites, JahiaSite.getTitleComparator());
                }
            }
        }

        // set request attributes...
        request.setAttribute("newJahiaSite", newJahiaSite);
        request.setAttribute("jahiaDisplayMessage", jahiaDisplayMessage);
        request.setAttribute("warningMsg", warningMsg);
        request.setAttribute("defaultSite", defaultSite);
        request.setAttribute("newAdminOnly", Boolean.valueOf(grantedSites.size() <= 0));

        try {
            // logger.debug(" license check ");

            // get the number of sites in db
            int nbSites = ServicesRegistry.getInstance().getJahiaSitesService().getNbSites();

            request.setAttribute("nbSites", new Integer(nbSites));

            // set license info
            request.setAttribute("siteLimit", Integer.valueOf(-1));

            //logger.debug(" let go in ");

            // redirect...
            JahiaAdministration.doRedirect(request, response, session, JSP_PATH + "site_add.jsp");
        } catch (JahiaException je) {
            logger.error("Error while retrieving number of site in database", je);
            // set request attributes...
            jahiaDisplayMessage =
                    getMessage("message.generalError");
            request.setAttribute("jahiaDisplayMessage", jahiaDisplayMessage);
            // redirect...
            JahiaAdministration.doRedirect(request, response, session, JSP_PATH + "sites_management.jsp");
        }
    } // end displayAdd

    /**
     * Process Add new site form
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void processAdd(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        logger.debug("started");

        boolean processError = true;

        // get form values...
        String siteTitle = StringUtils.left(StringUtils.defaultString(request.getParameter("siteTitle")).trim(), 100);
        String siteServerName = StringUtils.left(StringUtils.defaultString(request.getParameter("siteServerName")).trim(), 200);
        String siteKey = StringUtils.left(StringUtils.defaultString(request.getParameter("siteKey")).trim(), 50);
        String siteDescr = StringUtils.left(StringUtils.defaultString(request.getParameter("siteDescr")).trim(), 250);
        String siteAdmin = StringUtils.defaultString(request.getParameter("siteAdmin")).trim();
        Boolean defaultSite = Boolean.valueOf(request.getParameter("defaultSite") != null);

        request.getSession().setAttribute("siteAdminOption", siteAdmin);
        session.setAttribute("siteAdminOption", siteAdmin);
        String warningMsg = "";
        session.setAttribute(CLASS_NAME + "defaultSite", defaultSite);

        // create jahia site object if checks are in green light...
        try {
            // check validity...
            if (siteTitle != null && (siteTitle.length() > 0) && siteServerName != null &&
                    (siteServerName.length() > 0) && siteKey != null && (siteKey.length() > 0)) {
                if (!isSiteKeyValid(siteKey)) {
                    warningMsg =
                            getMessage("org.jahia.admin.warningMsg.onlyLettersDigitsUnderscore.label");
                } else if (siteKey.equals("site")) {
                    warningMsg =
                            getMessage("org.jahia.admin.warningMsg.chooseAnotherSiteKey.label");
                } else if (!isServerNameValid(siteServerName)) {
                    warningMsg =
                            getMessage("org.jahia.admin.warningMsg.invalidServerName.label");
                } else if (siteServerName.equals("default")) {
                    warningMsg =
                            getMessage("org.jahia.admin.warningMsg.chooseAnotherServerName.label");
                } else if (!URLGenerator.isLocalhost(siteServerName) && sMgr.getSite(siteServerName) != null) {
                    warningMsg =
                            getMessage("org.jahia.admin.warningMsg.chooseAnotherServerName.label");
                } else if (sMgr.getSiteByKey(siteKey) != null) {
                    warningMsg =
                            getMessage("org.jahia.admin.warningMsg.chooseAnotherSiteKey.label");
                } else {
                    processError = false;
                }
            } else {
                warningMsg =
                        getMessage("org.jahia.admin.warningMsg.completeRequestInfo.label");
            }

            if (!processError) {
                // save new jahia site...
                JahiaSite site = new JahiaSite(-1, siteTitle, siteServerName, siteKey,
                        // is active
                        // default page (homepage id)... subject to update in terminateAdd().
                        siteDescr, null, null);
//                site.setTemplatesAutoDeployMode(true);
//                site.setWebAppsAutoDeployMode(true);


                // set in session...
                session.setAttribute(CLASS_NAME + "newJahiaSite", site);

                // all is okay, go to add admin or use existent admin...
                if (siteAdmin.trim().equals("0")) {
                    displayCreateAdmin(request, response, session);
                } else if (siteAdmin.trim().equals("1")) {
                    displaySelectExistantAdmin(request, response, session);
                } else {
                    displayTemplateSetChoice(request, response, session);
                }

                site = null;
            } else {
                JahiaSite site = new JahiaSite(-1, siteTitle, siteServerName, siteKey, siteDescr, null, null);


                session.setAttribute(CLASS_NAME + "newJahiaSite", site);
                request.setAttribute("newJahiaSite", site);
                request.setAttribute("warningMsg", warningMsg);
                displayAdd(request, response, session);
            }
        } catch (JahiaException ex) {
            warningMsg =
                    getMessage("label.error.processingRequestError");
            request.setAttribute("warningMsg", warningMsg);
            displayAdd(request, response, session);
        } finally {
            siteTitle = null;
            siteServerName = null;
            siteKey = null;
            siteDescr = null;
            siteAdmin = null;
            defaultSite = null;
            warningMsg = null;
            request.getSession().setAttribute("lastPage", "processadd");
        }
    } // end processAdd

    public static boolean isServerNameValid(String serverName) {
        return StringUtils.isNotEmpty(serverName) && !serverName.contains(" ") && !serverName.contains(":");
    }

    /**
     * Display page to create an administrator for the new site.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void displayCreateAdmin(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        //logger.debug(" display create administrator started ");

        request.getSession().setAttribute("admin", "create");

        String warningMsg = (String) request.getAttribute("warningMsg");
        if (warningMsg == null) {
            warningMsg = "";
        }
        // retrieve previous form values...
        String jahiaDisplayMessage = (String) request.getAttribute(CLASS_NAME + "jahiaDisplayMessage");
        String adminUsername = (String) request.getAttribute("adminUsername");
        String adminPassword = (String) request.getAttribute("adminPassword");
        String adminConfirm = (String) request.getAttribute("adminConfirm");
        String adminFirstName = (String) request.getAttribute("adminFirstName");
        String adminLastName = (String) request.getAttribute("adminLastName");
        String adminOrganization = (String) request.getAttribute("adminOrganization");
        String adminEmail = (String) request.getAttribute("adminEmail");

        // set default values...
        if (jahiaDisplayMessage == null) {
            jahiaDisplayMessage = Jahia.COPYRIGHT;
        }
        if (adminUsername == null) {
            adminUsername = (String) session.getAttribute(CLASS_NAME + "adminUsername");
        }
        if (adminUsername == null) {
            JahiaUserManagerService userManager = ServicesRegistry.getInstance().getJahiaUserManagerService();
            for (int i = 1; adminUsername == null; i++) {
                String testUserName = "siteadmin";
                if (i > 1) {
                    testUserName += i;
                }
                if (userManager.lookupUser(testUserName) == null) {
                    adminUsername = testUserName;
                }
            }
        }
        if (adminPassword == null) {
            adminPassword = (String) session.getAttribute(CLASS_NAME + "adminPassword");
            adminConfirm = adminPassword;
        }
        if (adminPassword == null) {
            adminPassword = "";
            adminConfirm = "";
        }

        Properties userProps = (Properties) session.getAttribute(CLASS_NAME + "adminProps");

        if (adminFirstName == null && userProps != null) {
            adminFirstName = userProps.getProperty("firstname");
        }
        if (adminFirstName == null) {
            adminFirstName = "Site administrator";
        }
        if (adminLastName == null && userProps != null) {
            adminLastName = userProps.getProperty("lastname");
        }
        if (adminLastName == null) {
            adminLastName = "";
        }
        if (adminOrganization == null && userProps != null) {
            adminOrganization = userProps.getProperty("organization");
        }
        if (adminOrganization == null) {
            adminOrganization = "";
        }
        if (adminEmail == null && userProps != null) {
            adminEmail = userProps.getProperty("email");
        }
        if (adminEmail == null) {
            adminEmail = "";
        }

        // set display message...
        session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", jahiaDisplayMessage);

        // set request attributes...
        request.setAttribute("adminUsername", adminUsername);
        request.setAttribute("adminPassword", adminPassword);
        request.setAttribute("adminConfirm", adminConfirm);
        request.setAttribute("adminFirstName", adminFirstName);
        request.setAttribute("adminLastName", adminLastName);
        request.setAttribute("adminOrganization", adminOrganization);
        request.setAttribute("adminEmail", adminEmail);
        request.setAttribute("warningMsg", warningMsg);

        // redirect...
        JahiaAdministration.doRedirect(request, response, session, JSP_PATH + "site_create_admin.jsp");
        request.getSession().setAttribute("lastPage", "processcreateadmin");
    } // end displayCreateAdmin

    /**
     * Display page to select an existant administrator for the new site.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void displaySelectExistantAdmin(HttpServletRequest request, HttpServletResponse response,
                                            HttpSession session) throws IOException, ServletException {
        //logger.debug("display select existant administrator started ");

        request.getSession().setAttribute("admin", "create");

        // retrieve previous form values...
        String jahiaDisplayMessage = (String) request.getAttribute(CLASS_NAME + "jahiaDisplayMessage");
        String selectedSite = (String) request.getAttribute("selectedSite");

        // set default values...
        if (jahiaDisplayMessage == null) {
            jahiaDisplayMessage = Jahia.COPYRIGHT;
        }
        if (selectedSite == null) {
            if (request.getParameter("site") == null) {
                selectedSite = "0";
            } else {
                selectedSite = request.getParameter("site");
            }
        }

        try {
            // get admins list...
            JahiaGroupManagerService groupManager = ServicesRegistry.getInstance().getJahiaGroupManagerService();
            Iterator<JahiaSite> allSites = sMgr.getSites();
            List<JahiaSite> sitesList = new ArrayList<JahiaSite>();
            Integer siteIDInteger = new Integer(selectedSite);

            // clean sites...
            while (allSites.hasNext()) {
                JahiaSite site = (JahiaSite) allSites.next();
                if (site.getID() > 0) {
                    sitesList.add(site);
                }
            }

            // set the Iterator to null if the List is empty...
            if (sitesList.size() == 0) {
                allSites = null;
            } else {
                Locale defaultLocale = (Locale) session.getAttribute(ProcessingContext.SESSION_LOCALE);
                if (defaultLocale != null) {
                    Collections.sort(sitesList, JahiaSite.getTitleComparator(defaultLocale));
                } else {
                    Collections.sort(sitesList, JahiaSite.getTitleComparator());
                }
                allSites = sitesList.iterator();
            }

            // get users... only if allSites is not null...
            if ((allSites != null) && (!selectedSite.equals("0"))) {
                List<Map<String, String>> allAdministrators = new ArrayList<Map<String, String>>();

                JahiaGroup adminGroup = groupManager.getAdministratorGroup(siteIDInteger.intValue());
                Enumeration<Principal> admins = adminGroup.members();

                while (admins.hasMoreElements()) {
                    try {
                        JahiaUser user = (JahiaUser) admins.nextElement();
                        if (!user.isRoot()) {
                            Map<String, String> adminHash = new HashMap<String, String>();
                            adminHash.put("key", user.getUserKey());
                            adminHash.put("username", user.getUsername());
                            allAdministrators.add(adminHash);
                        }
                    } catch (Exception e) {
                        // do nothing...
                    }
                }

                request.setAttribute("adminsList", allAdministrators.iterator());
            }

            // set attributes...
            session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", jahiaDisplayMessage);
            request.setAttribute("allSites", allSites);
            request.setAttribute("allSitesJS", sitesList.iterator());
            request.setAttribute("selectedSite", new Integer(selectedSite));

            // redirect...
            JahiaAdministration.doRedirect(request, response, session, JSP_PATH + "site_existant_admin.jsp");
        } catch (JahiaException je) {
            logger.error("Error while displaying existing administrator selection UI", je);
            displayList(request, response, session);
        }

        // set default values...
        session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", Jahia.COPYRIGHT);
    } // end displaySelectExistantAdmin

    /**
     * Process create new administrator for this new site.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void processCreateAdmin(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        //logger.debug(" process create administrator started ");
        boolean processError = true;

        // get form values...
        String adminUsername = StringUtils.defaultString(request.getParameter("adminUsername")).trim();
        String adminPassword = StringUtils.defaultString(request.getParameter("adminPassword")).trim();
        String adminConfirm = StringUtils.defaultString(request.getParameter("adminConfirm")).trim();
        String adminFirstName = StringUtils.defaultString(request.getParameter("adminFirstName")).trim();
        String adminLastName = StringUtils.defaultString(request.getParameter("adminLastName")).trim();
        String adminOrganization = StringUtils.defaultString(request.getParameter("adminOrganization")).trim();
        String adminEmail = StringUtils.defaultString(request.getParameter("adminEmail")).trim();
        String warningMsg = "";
        // set request attributes...
        request.setAttribute("adminUsername", adminUsername);
        request.setAttribute("adminPassword", adminPassword);
        request.setAttribute("adminConfirm", adminConfirm);
        request.setAttribute("adminFirstName", adminFirstName);
        request.setAttribute("adminLastName", adminLastName);
        request.setAttribute("adminOrganization", adminOrganization);
        request.setAttribute("adminEmail", adminEmail);

        // get current user...
        JahiaUserManagerService userManager = ServicesRegistry.getInstance().getJahiaUserManagerService();

         if (adminUsername.length() == 0) {
            warningMsg =
                    getMessage("org.jahia.admin.userMessage.specifyUserName.label");
        } else if (!adminPassword.equals(adminConfirm)) {
            warningMsg =
                    getMessage("org.jahia.admin.JahiaDisplayMessage.confirmPasswdBeSame.label");
        } else if (adminPassword.length() == 0) {
            warningMsg =
                    getMessage("org.jahia.admin.userMessage.specifyPassword.label");
        } else if (!userManager.isUsernameSyntaxCorrect(adminUsername)) {
            warningMsg = StringUtils.capitalize(getMessage(
                    "org.jahia.admin.users.ManageUsers.onlyCharacters.label"));
        } else if ( userManager.lookupUser(adminUsername) != null) {
            warningMsg = getMessage("label.user") + " [" + adminUsername + "] " +
                    getMessage("org.jahia.admin.userMessage.alreadyExist.label") +
                    " ";
        } else {
            JahiaPasswordPolicyService pwdPolicyService =
                    ServicesRegistry.getInstance().getJahiaPasswordPolicyService();
            JahiaSite newSite = (JahiaSite) session.getAttribute(CLASS_NAME + "newJahiaSite");
            if (newSite != null) {
                PolicyEnforcementResult evalResult = pwdPolicyService.enforcePolicyOnUserCreate(adminUsername, adminPassword);
                if (!evalResult.isSuccess()) {
                    EngineMessages policyMsgs = evalResult.getEngineMessages();
                    policyMsgs.saveMessages(((ParamBean) jParams).getRequest());
                } else {
                    processError = false;
                }
            } else {
                processError = false;
            }
        }

        if (!processError) {
            // compose user properties...
            Properties userProps = new Properties();
            userProps.setProperty("firstname", adminFirstName);
            userProps.setProperty("lastname", adminLastName);
            userProps.setProperty("email", adminEmail);
            userProps.setProperty("organization", adminOrganization);

            session.setAttribute(CLASS_NAME + "adminUsername", adminUsername);
            session.setAttribute(CLASS_NAME + "adminPassword", adminPassword);
            session.setAttribute(CLASS_NAME + "adminProps", userProps);
            session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", Jahia.COPYRIGHT);

            // reset session
            session.setAttribute(CLASS_NAME + "existantAdminUser", null);

            JahiaTemplateManagerService templateManager =
                    ServicesRegistry.getInstance().getJahiaTemplateManagerService();
            if (templateManager != null && (templateManager.getAvailableTemplatePackagesCount() > 0)) {
                displayTemplateSetChoice(request, response, session);
            } else {
                // redirection to full sites list...
                if (!terminateAdd(request, session)) {
                    displayAdd(request, response, session);
                }
                redirectAfterAdd(request, response, session);
            }
        } else {
            request.setAttribute("warningMsg", warningMsg);
            displayCreateAdmin(request, response, session);
        }
    } // end processCreateAdmin

    /**
     * Display page to let user choose a set of templates.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void displayTemplateSetChoice(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        try {
            logger.debug("Display template set choice started ");

            // retrieve previous form values...
            String jahiaDisplayMessage = (String) request.getAttribute(CLASS_NAME + "jahiaDisplayMessage");
            // set default values...
            if (jahiaDisplayMessage == null) {
                jahiaDisplayMessage = Jahia.COPYRIGHT;
            }

            String selectedTmplSet = (String) request.getAttribute("selectedTmplSet");

            TreeMap<String, JCRNodeWrapper> orderedTemplateSets = getTemplatesSets();

            // try to select the default set if not selected
            if (selectedTmplSet == null) {
                selectedTmplSet = SettingsBean.getInstance().getPropertiesFile().getProperty("default_templates_set", orderedTemplateSets.firstKey());
            }

            JCRNodeWrapper selectedPackage = selectedTmplSet != null && orderedTemplateSets.containsKey(selectedTmplSet) ? orderedTemplateSets.get(selectedTmplSet) : orderedTemplateSets.get(orderedTemplateSets.firstKey());

            request.setAttribute("selectedTmplSet", selectedTmplSet);
            request.setAttribute("tmplSets", orderedTemplateSets.values());
            request.setAttribute("selectedPackage", selectedPackage);
            Locale currentLocale = (Locale) session.getAttribute(ProcessingContext.SESSION_LOCALE);
            if (currentLocale == null) {
                currentLocale = request.getLocale();
            }
            Locale selectedLocale = (Locale) session.getAttribute(CLASS_NAME + "selectedLocale");
            if (selectedLocale == null) {
                selectedLocale =
                        LanguageCodeConverters.languageCodeToLocale(Jahia.getSettings().getDefaultLanguageCode());
            }
            session.setAttribute(CLASS_NAME + "selectedLocale", selectedLocale);
            request.setAttribute("selectedLocale", selectedLocale);
            request.setAttribute("currentLocale", currentLocale);

            logger.debug("Nb template set found " + orderedTemplateSets.size());

            // redirect...
            JahiaAdministration.doRedirect(request, response, session, JSP_PATH + "site_choose_template_set.jsp");

            // set default values...
            session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", Jahia.COPYRIGHT);
        } catch (RepositoryException e) {
            throw new ServletException(e);
        }
    }

    /**
     * Terminate the creation of a new site. Create the site and dependancies.
     *
     * @param request Servlet request.
     * @param session HttpSession object.
     */
    public boolean terminateAdd(HttpServletRequest request, HttpSession session) throws IOException, ServletException {

        String warningMsg = "";

        JahiaSite currentSite = (JahiaSite) session.getAttribute(ProcessingContext.SESSION_SITE);

        // get objects temporary stocked in session...
        JahiaSite site = (JahiaSite) session.getAttribute(CLASS_NAME + "newJahiaSite");
        Boolean defaultSite = (Boolean) session.getAttribute(CLASS_NAME + "defaultSite");
        JahiaUser existantAdminUser = (JahiaUser) session.getAttribute(CLASS_NAME + "existantAdminUser");
        Locale selectedLocale = (Locale) session.getAttribute(CLASS_NAME + "selectedLocale");

        try {
            JahiaUser adminSiteUser = null;

            // get services...
            JahiaUserManagerService jums = ServicesRegistry.getInstance().getJahiaUserManagerService();
            JahiaSitesService jsms = ServicesRegistry.getInstance().getJahiaSitesService();

            JahiaUser currentUser = jums.lookupUser((String) session.getAttribute(CLASS_NAME + "jahiaLoginUsername"));
            // add the site in siteManager...
            site = jsms.addSite(currentUser, site.getTitle(), site.getServerName(), site.getSiteKey(), site.getDescr(),
                    selectedLocale, (String) request.getAttribute("selectedTmplSet"),
                    (String) request.getAttribute("firstImport"), (File) request.getAttribute("fileImport"),
                    (String) request.getAttribute("fileImportName"), (Boolean) request.getAttribute("asAJob"),
                    (Boolean) request.getAttribute("doImportServerPermissions"), (String) request.getAttribute("originatingJahiaRelease"));
            if (site != null) {
                jParams.setSite(site);
                jParams.setSiteID(site.getID());
                jParams.setSiteKey(site.getSiteKey());
                jParams.setCurrentLocale(selectedLocale);

                // set as default site
                if (defaultSite.booleanValue()) {
                    changeDefaultSite(site);
                }

                // create administrator user if requested...
                if (existantAdminUser == null) {
                    // get session administrator properties...
                    String adminUsername = (String) session.getAttribute(CLASS_NAME + "adminUsername");
                    String adminPassword = (String) session.getAttribute(CLASS_NAME + "adminPassword");
                    Properties adminProps = (Properties) session.getAttribute(CLASS_NAME + "adminProps");
                    if (adminUsername != null) {
                        // create user...
                        adminSiteUser = jums.createUser(adminUsername, adminPassword, adminProps);
                    }
                } else {
                    adminSiteUser = existantAdminUser;         // the administrator already exists... use this.
                }

                if (adminSiteUser != null) {
                    // attach admin to administrators group...
                    JahiaSiteTools.getAdminGroup(site).addMember(adminSiteUser);
                }

                // set as current site if the session site is null
                if (session.getAttribute(ProcessingContext.SESSION_SITE) == null) {
                    session.setAttribute(ProcessingContext.SESSION_SITE, site);
                    session.setAttribute(JahiaAdministration.CLASS_NAME + "manageSiteID", new Integer(site.getID()));
                }

                // set new site in session
                session.setAttribute(CLASS_NAME + "newJahiaSite", site);

                if (currentSite != null) {
                    jParams.setSite(currentSite);
                    jParams.setSiteID(currentSite.getID());
                }
                sMgr.updateSite(site);

                JahiaSite jahiaSite = sMgr.getSiteByKey(JahiaSitesBaseService.SYSTEM_SITE_KEY);
                jahiaSite.getLanguages().addAll(site.getLanguages());
                sMgr.updateSite(jahiaSite);
            } else {
                warningMsg =
                        getMessage("label.error.processingRequestError");
                request.setAttribute("warningMsg", warningMsg);

                if (currentSite != null) {
                    jParams.setSite(currentSite);
                    jParams.setSiteID(currentSite.getID());
                }
                return false;
            }
        } catch (Exception ex) {
            // clean site
            try {
                JahiaUserManagerService userServ = ServicesRegistry.getInstance().getJahiaUserManagerService();
                Object[] src = userServ.getProviderList().toArray();
                String[] provs = new String[src.length];
                System.arraycopy(src, 0, provs, 0, src.length);
                delete(site, jParams.getUser(), true);
                sMgr.removeSite(site);
            } catch (Exception t) {
                logger.error("Error while cleaning site", t);
            }

            logger.error("Error while adding site", ex);

            warningMsg =
                    getMessage("label.error.processingRequestError");
            request.setAttribute("warningMsg", warningMsg);
            return false;
        }
        return true;
    } // end terminateAdd

    /**
     * Set the site as default site in storage, if site == null , set default site to undefined
     *
     * @param site the site
     */
    private void changeDefaultSite(JahiaSite site) {
        //Site changes flush the ESI cache
        ServicesRegistry.getInstance().getJahiaSitesService().setDefaultSite(site);
    }

    /**
     * Process select existant administrator for this new site.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void processExistantAdmin(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {

        // get form values...
        String adminSelected = request.getParameter("adminSelected");
        String siteID = request.getParameter("site");

        if (adminSelected == null) {     // it's only the choice of site... display user list.
            request.setAttribute("selectedSite", siteID);
            String jahiaDisplayMessage =
                    getMessage("org.jahia.admin.JahiaDisplayMessage.chooseUserInList.label");
            request.setAttribute(CLASS_NAME + "jahiaDisplayMessage", jahiaDisplayMessage);
            displaySelectExistantAdmin(request, response, session);
        } else {
            // get the user...
            JahiaUserManagerService userManager = ServicesRegistry.getInstance().getJahiaUserManagerService();
            JahiaUser theUser = userManager.lookupUserByKey(adminSelected);

            session.setAttribute(CLASS_NAME + "existantAdminUser", theUser);

            JahiaTemplateManagerService templateManager =
                    ServicesRegistry.getInstance().getJahiaTemplateManagerService();
            if (templateManager != null && (templateManager.getAvailableTemplatePackagesCount() > 0)) {
                displayTemplateSetChoice(request, response, session);
            } else {
                if (!terminateAdd(request, session)) {
                    displayAdd(request, response, session);
                }
                // redirection to full sites list...
                displayList(request, response, session);
            }
        }
    }

    /**
     * Process select existant administrator for this new site.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void processExistantAdminSelectSite(HttpServletRequest request, HttpServletResponse response,
                                                HttpSession session) throws IOException, ServletException {

        request.setAttribute("selectedSite", request.getParameter("site"));
        displaySelectExistantAdmin(request, response, session);
    } // end processExistantAdminSelectSite

    /**
     * Process template set choice.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void processTemplateSetChoice(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        logger.debug("Process template set choice started ");

        // get form values...
        String operation = jParams.getParameter("operation");
        String selectTmplSet = jParams.getParameter("selectTmplSet");
        String siteAdminOption = (String) session.getAttribute("siteAdminOption");
        if (selectTmplSet == null || selectTmplSet.trim().equals("")) {
            selectTmplSet = "0";
        }

        logger.debug("operation = " + operation);
        logger.debug("selected template = " + selectTmplSet);

        request.setAttribute("siteAdminOption", siteAdminOption);
        request.setAttribute("selectedTmplSet", selectTmplSet);

        String firstImport = jParams.getParameter("firstImport");
        request.setAttribute("firstImport", firstImport);

        if (jParams.getParameter("importpath") != null) {
            File file = new File(jParams.getParameter("importpath"));
            if (file.exists()) {
                request.setAttribute("fileImport", file);
            }
        }

        String selectedLanguage = getStrParameter(jParams, "languageList", "").trim();
        if (!selectedLanguage.equals("")) {
            session.setAttribute(CLASS_NAME + "selectedLocale",
                    LanguageCodeConverters.languageCodeToLocale(selectedLanguage));
        }
        request.setAttribute("selectedlanguage", selectedLanguage);

        if (operation == null || !operation.trim().equals("save") || selectTmplSet.equals("0")) {
            displayTemplateSetChoice(request, response, session);
        } else {
            displayNewSiteValues(request, response, session);
        }
    }

    private void createSite(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        // selected template
        String selectTmplSet = jParams.getParameter("selectTmplSet");
        if (selectTmplSet == null || selectTmplSet.trim().equals("")) {
            selectTmplSet = "0";
        }
        logger.debug("selected template = " + selectTmplSet);
        request.setAttribute("selectedTmplSet", selectTmplSet);

        // first import
        String firstImport = jParams.getParameter("firstImport");
        request.setAttribute("firstImport", firstImport);

        // import path
        if (jParams.getParameter("importpath") != null) {
            File file = new File(jParams.getParameter("importpath"));
            if (file.exists()) {
                request.setAttribute("fileImport", file);
            }
        }

        // language
        String selectedLanguage = getStrParameter(jParams, "languageList", "").trim();
        if (!selectedLanguage.equals("")) {
            session.setAttribute(CLASS_NAME + "selectedLocale",
                    LanguageCodeConverters.languageCodeToLocale(selectedLanguage));
        }
        request.setAttribute("selectedlanguage", selectedLanguage);

        if (!terminateAdd(request, session)) {
            displayAdd(request, response, session);
        }

        JahiaSite site = (JahiaSite) session.getAttribute(CLASS_NAME + "newJahiaSite");
        logger.debug("Site = " + site.getID());

        // reset session
        session.setAttribute(CLASS_NAME + "newJahiaSite", null);

        redirectAfterAdd(request, response, session);
    }

    /**
     * Display Edit Site form
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void displayEdit(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        //logger.debug(" display edit site started ");

        try {
            // get site...
            String site_id = StringUtils.defaultString(request.getParameter("siteid")).trim();
            Integer siteID = new Integer(site_id);
            JahiaSite site = sMgr.getSite(siteID.intValue());

            // retrieve previous form values...
            String jahiaDisplayMessage = (String) request.getAttribute(CLASS_NAME + "jahiaDisplayMessage");
            String siteTitle = (String) request.getAttribute("siteTitle");
            String siteServerName = (String) request.getAttribute("siteServerName");
            String siteKey = (String) request.getAttribute("siteKey");
            String siteDescr = (String) request.getAttribute("siteDescr");
            String warningMsg = (String) request.getAttribute("warningMsg");

            Boolean defaultSite = Boolean.FALSE;

            if (request.getAttribute("defaultSite") == null) {
                JahiaSite defSite = getDefaultSite();
                if (defSite != null && defSite.getSiteKey().equals(site.getSiteKey())) {
                    defaultSite = Boolean.TRUE;
                }
            } else {
                defaultSite = (Boolean) request.getAttribute("defaultSite");
            }

            // set default values...
            if (jahiaDisplayMessage == null) {
                jahiaDisplayMessage = Jahia.COPYRIGHT;
            }
            if (siteTitle == null) {
                siteTitle = site.getTitle();
            }
            if (siteServerName == null) {
                siteServerName = site.getServerName();
            }
            if (siteKey == null) {
                siteKey = site.getSiteKey();
            }
            if (siteDescr == null) {
                siteDescr = site.getDescr();
            }
            if (warningMsg == null) {
                warningMsg = "";
            }

            // set request attributes...
            request.setAttribute("jahiaDisplayMessage", jahiaDisplayMessage);
            request.setAttribute("siteTitle", siteTitle);
            request.setAttribute("siteServerName", siteServerName);
            request.setAttribute("siteKey", siteKey);
            request.setAttribute("siteDescr", siteDescr);
            request.setAttribute("warningMsg", warningMsg);
            request.setAttribute("siteID", siteID);
            request.setAttribute("defaultSite", defaultSite);
            request.setAttribute("siteTemplatePackageName", site.getTemplatePackageName());

            // redirect...
            JahiaAdministration.doRedirect(request, response, session, JSP_PATH + "site_edit.jsp");
        } catch (Exception e) {
            logger.error("Error while displaying site edition UI", e);
            // redirect to list...
            String jahiaDisplayMessage =
                    getMessage("org.jahia.admin.JahiaDisplayMessage.processingError.label");
            session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", jahiaDisplayMessage);
            displayList(request, response, session);

            // reset display message...
            session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", Jahia.COPYRIGHT);
        }
    } // end displayEdit

    /**
     * Display Edit Site form
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void displayNewSiteValues(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        //logger.debug(" display edit site started ");

        try {
            // get site...
            JahiaSite site = (JahiaSite) session.getAttribute(CLASS_NAME + "newJahiaSite");

            // retrieve previous form values...
            String jahiaDisplayMessage = (String) request.getAttribute(CLASS_NAME + "jahiaDisplayMessage");
            String siteTitle = site.getTitle();
            String siteServerName = site.getServerName();
            String siteKey = site.getSiteKey();
            String siteDescr = site.getDescr();


            String selectedTmplSet = (String) request.getAttribute("selectedTmplSet");
            // get tmplPackage list...
            final JCRNodeWrapper tmplPack = JCRStoreService.getInstance().getSessionFactory().getCurrentUserSession()
                    .getNode("/templateSets/" + selectedTmplSet);


            Boolean defaultSite = Boolean.FALSE;
            if (request.getAttribute("defaultSite") == null) {
                defaultSite = Boolean.valueOf((Boolean) session.getAttribute(CLASS_NAME + "defaultSite"));
            } else {
                defaultSite = (Boolean) request.getAttribute("defaultSite");
            }

            Locale selectedLocale = (Locale) session.getAttribute(CLASS_NAME + "selectedLocale");
            if (selectedLocale == null) {
                selectedLocale = LanguageCodeConverters
                        .languageCodeToLocale(org.jahia.settings.SettingsBean.getInstance().getDefaultLanguageCode());
            }


            // set request site attributes...
            request.setAttribute("jahiaDisplayMessage", jahiaDisplayMessage);
            request.setAttribute("siteTitle", siteTitle);
            request.setAttribute("siteServerName", siteServerName);
            request.setAttribute("siteKey", siteKey);
            request.setAttribute("siteDescr", siteDescr);
            request.setAttribute("siteID", site.getID());
            request.setAttribute("defaultSite", defaultSite);

            if (tmplPack != null) {
                request.setAttribute("templateName", tmplPack.getName());
            }
            request.setAttribute("selectedTmplSet", selectedTmplSet);
            request.setAttribute("selectedLocale", selectedLocale);
            // set display message...
            session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", jahiaDisplayMessage);

            String adminUsername = (String) session.getAttribute(CLASS_NAME + "adminUsername");
            if (adminUsername == null) {
                adminUsername = "siteadmin";
            }
            request.setAttribute("adminUsername", adminUsername);

            // user properties
            Properties userProps;
            JahiaUser existantAdminUser = (JahiaUser) session.getAttribute(CLASS_NAME + "existantAdminUser");
            if (existantAdminUser == null) {
                userProps = (Properties) session.getAttribute(CLASS_NAME + "adminProps");
            } else {
                userProps = existantAdminUser.getProperties();
            }
            if (userProps != null) {
                request.setAttribute("adminFirstName", userProps.getProperty("firstname"));
                request.setAttribute("adminLastName", userProps.getProperty("lastname"));
                request.setAttribute("adminOrganization", userProps.getProperty("organization"));
                request.setAttribute("adminEmail", userProps.getProperty("email"));
            }

            // redirect...
            JahiaAdministration.doRedirect(request, response, session, JSP_PATH + "site_create_display_values.jsp");
        } catch (Exception e) {
            logger.error("Error while displaying new site values", e);
            // redirect to list...
            String jahiaDisplayMessage =
                    getMessage("org.jahia.admin.JahiaDisplayMessage.processingError.label");
            session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", jahiaDisplayMessage);
            displayList(request, response, session);

            // reset display message...
            session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", Jahia.COPYRIGHT);
        }
    } // end displayEdit


    /**
     * Return the default site or null if not found or undefined
     *
     * @return JahiaSite the default site
     */
    private JahiaSite getDefaultSite() {
        return ServicesRegistry.getInstance().getJahiaSitesService().getDefaultSite();
    }

    /**
     * Process Edit Site form
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void processEdit(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        logger.debug(" process edit site started ");

        boolean processError = false;

        // get form values...
        String siteTitle = StringUtils.left(StringUtils.defaultString(request.getParameter("siteTitle")).trim(), 100);
        String siteServerName = StringUtils.left(StringUtils.defaultString(request.getParameter("siteServerName")).trim(), 200);
//    String  siteKey          = StringUtils.defaultIfEmpty(request.getParameter("siteKey"),"").toLowerCase().trim();
        String siteDescr = StringUtils.left(StringUtils.defaultString(request.getParameter("siteDescr")).trim(), 250);

        String warningMsg = "";
        boolean defaultSite = (request.getParameter("defaultSite") != null);

        boolean versioningEnabled = (request.getParameter("versioningEnabled") != null);
        boolean stagingEnabled = (request.getParameter("stagingEnabled") != null);

        // set request attributes...
        request.setAttribute("siteTitle", siteTitle);
        request.setAttribute("siteServerName", siteServerName);
        request.setAttribute("siteDescr", siteDescr);
        request.setAttribute("defaultSite", Boolean.valueOf(defaultSite));
        request.setAttribute("versioningEnabled", Boolean.valueOf(versioningEnabled));
        request.setAttribute("stagingEnabled", Boolean.valueOf(stagingEnabled));

        try {
            // get site...
            String site_id = StringUtils.defaultString(request.getParameter("siteid")).trim();
            Integer siteID = new Integer(site_id);
            JahiaSite site = sMgr.getSite(siteID.intValue());

            // check validity...
            if (siteTitle != null && (siteTitle.trim().length() > 0) && siteServerName != null &&
                    (siteServerName.trim().length() > 0)) {
                if (!isServerNameValid(siteServerName)) {
                    warningMsg =
                            getMessage("org.jahia.admin.warningMsg.invalidServerName.label");
                    processError = true;
                } else if (!site.getServerName().equals(siteServerName)) {
                    if (!URLGenerator.isLocalhost(siteServerName) && sMgr.getSite(siteServerName) != null) {
                        warningMsg =
                                getMessage("org.jahia.admin.warningMsg.chooseAnotherServerName.label");
                        processError = true;
                    }
                }
            } else {
                warningMsg =
                        getMessage("org.jahia.admin.warningMsg.completeRequestInfo.label");
            }

            if (!processError) {
                // save modified informations...
                site.setTitle(siteTitle);
                site.setServerName(siteServerName);
                site.setDescr(siteDescr);

                sMgr.updateSite(site);

                JahiaSite defSite = getDefaultSite();
                if (defaultSite) {
                    if (defSite == null) {
                        changeDefaultSite(site);
                    } else if (!defSite.getSiteKey().equals(site.getSiteKey())) {
                        changeDefaultSite(site);
                    }
                } else {
                    if (defSite != null && defSite.getSiteKey().equals(site.getSiteKey())) {
                        changeDefaultSite(null);
                    }
                }

                // set message default values...
                session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", Jahia.COPYRIGHT);

                // redirect...
                displayList(request, response, session);
            } else {
                request.setAttribute("warningMsg", warningMsg);
                displayEdit(request, response, session);
            }
        } catch (JahiaException ex) {
            logger.warn("Error while processing site edition", ex);
            warningMsg =
                    getMessage("label.error.processingRequestError");
            request.setAttribute("warningMsg", warningMsg);
            displayEdit(request, response, session);
        }
    }

    /**
     * Display Delete Site confirmation.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void displayDelete(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        //logger.debug(" display delete site started ");

        // change session time out to 1 hour ( the extraction can be very long !)
        int timeOut = session.getMaxInactiveInterval();

        try {
            session.setMaxInactiveInterval(7200);

            // get site...
            String site_id = StringUtils.defaultString(request.getParameter("siteid")).trim();
            Integer siteID = new Integer(site_id);

            JahiaSite site = sMgr.getSite(siteID.intValue());

            // retrieve previous form values...
            String jahiaDisplayMessage = Jahia.COPYRIGHT;
            String siteTitle = (String) request.getAttribute("siteTitle");
            String siteServerName = (String) request.getAttribute("siteServerName");
            String siteKey = (String) request.getAttribute("siteKey");
            String siteDescr = (String) request.getAttribute("siteDescr");

            // set default values...
            if (siteTitle == null) {
                siteTitle = site.getTitle();
            }
            if (siteServerName == null) {
                siteServerName = site.getServerName();
            }
            if (siteKey == null) {
                siteKey = site.getSiteKey();
            }
            if (siteDescr == null) {
                siteDescr = site.getDescr();
            }

            // set request attributes...
            request.setAttribute("jahiaDisplayMessage", jahiaDisplayMessage);
            request.setAttribute("siteTitle", siteTitle);
            request.setAttribute("siteServerName", siteServerName);
            request.setAttribute("siteKey", siteKey);
            request.setAttribute("siteDescr", siteDescr);
            request.setAttribute("siteID", siteID);

            // list of user providers
            JahiaUserManagerService userServ = ServicesRegistry.getInstance().getJahiaUserManagerService();
            List<JahiaUserManagerProvider> usrProviders = new ArrayList<JahiaUserManagerProvider>();
            for (JahiaUserManagerProvider usrProviderBean : userServ.getProviderList()) {
                if (!usrProviderBean.isReadOnly()) {
                    usrProviders.add(usrProviderBean);
                }
            }
            request.setAttribute("usrProviders", usrProviders);

            // redirect...
            JahiaAdministration.doRedirect(request, response, session, JSP_PATH + "site_delete.jsp");
        } catch (Exception e) {
            logger.error("Error while display site delete UI", e);
            // redirect to list...
            String jahiaDisplayMessage =
                    getMessage("org.jahia.admin.warningMsg..processingError.label");
            session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", jahiaDisplayMessage);
            displayList(request, response, session);
        } finally {
            // restore time out
            session.setMaxInactiveInterval(timeOut);
        }

        // reset display message...
        session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", Jahia.COPYRIGHT);
    } // end displayEdit

    /**
     * Process Delete Site.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void processDelete(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        //logger.debug(" process delete site started ");

        JahiaUser theUser = (JahiaUser) session.getAttribute(ProcessingContext.SESSION_USER);

        try {
            // get site...
            String site_id = StringUtils.defaultString(request.getParameter("siteid")).trim();
            Integer siteID = new Integer(site_id);
            JahiaSite site = sMgr.getSite(siteID.intValue());

            boolean deleteFiles = request.getParameter("deleteFileRepository") != null;

            delete(site, theUser, deleteFiles);

            changeSiteIfCurrent(session, site);

            // redirect...
            displayList(request, response, session);
        } catch (JahiaException ex) {
            logger.error("Error while processing site deletion", ex);
            String warningMsg =
                    getMessage("label.error.processingRequestError");
            request.setAttribute("warningMsg", warningMsg);
            displayEdit(request, response, session);
        }
    }

    /**
     * Display Delete Site confirmation.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void displayMultipleDelete(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        //logger.debug(" display delete site started ");

        List<JahiaSite> sites = new ArrayList<JahiaSite>();
        String[] sitekeys = request.getParameterValues("sitebox");
        if (sitekeys != null) {
            for (int i = 0; i < sitekeys.length; i++) {
                final String sitekey = sitekeys[i];
                try {
                    final JahiaSite site = ServicesRegistry.getInstance().getJahiaSitesService().getSiteByKey(sitekey);
                    sites.add(site);
                } catch (JahiaException e) {
                    logger.error("Error getting site: " + sitekey);
                }
            }
        }
        request.setAttribute("sites", sites);

        // list of user providers
        JahiaUserManagerService userServ = ServicesRegistry.getInstance().getJahiaUserManagerService();
        List<JahiaUserManagerProvider> usrProviders = new ArrayList<JahiaUserManagerProvider>();
        for (JahiaUserManagerProvider usrProviderBean : userServ.getProviderList()) {
            if (!usrProviderBean.isReadOnly()) {
                usrProviders.add(usrProviderBean);
            }
        }
        request.setAttribute("usrProviders", usrProviders);

        // redirect...
        JahiaAdministration.doRedirect(request, response, session, JSP_PATH + "site_multiple_delete.jsp");

        // reset display message...
        session.setAttribute(CLASS_NAME + "jahiaDisplayMessage", Jahia.COPYRIGHT);
    } // end displayEdit

    /**
     * Process Delete Site.
     *
     * @param request  Servlet request.
     * @param response Servlet response.
     * @param session  HttpSession object.
     */
    private void processMultipleDelete(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        //logger.debug(" process delete site started ");

        JahiaUser theUser = (JahiaUser) session.getAttribute(ProcessingContext.SESSION_USER);

        try {
            // get site...
            List<JahiaSite> sites = new ArrayList<JahiaSite>();
            String[] sitekeys = request.getParameterValues("sitebox");
            for (int i = 0; i < sitekeys.length; i++) {
                String sitekey = sitekeys[i];
                try {
                    JahiaSite site = ServicesRegistry.getInstance().getJahiaSitesService().getSiteByKey(sitekey);
                    sites.add(site);
                } catch (JahiaException e) {

                }
            }

            boolean deleteFiles = request.getParameter("deleteFileRepository") != null;

            for (JahiaSite site : sites) {
                delete(site, theUser, deleteFiles);
                changeSiteIfCurrent(session, site);
            }

            // redirect...
            displayList(request, response, session);
        } catch (JahiaException ex) {
            logger.error("Error while deleting multiple sites", ex);
            String warningMsg =
                    getMessage("label.error.processingRequestError");
            request.setAttribute("warningMsg", warningMsg);
            displayEdit(request, response, session);
        }
    }

    private void changeSiteIfCurrent(HttpSession session, JahiaSite site) {
        JahiaSite sessSite = (JahiaSite) session.getAttribute(ProcessingContext.SESSION_SITE);

        if (sessSite != null && sessSite.getSiteKey().equals(site.getSiteKey())) {
            session.setAttribute(ProcessingContext.SESSION_SITE, null);
        }
        if (jParams.getSite() != null && jParams.getSite().getSiteKey().equals(site.getSiteKey())) {
            JahiaSite siteToUseNow = sMgr.getDefaultSite() != null ? sMgr.getDefaultSite() :
                    new JahiaSite(-1, "", "", "", "", new Properties(), null);
            jParams.setSite(siteToUseNow);
            jParams.setSiteKey(siteToUseNow.getSiteKey());
            session.setAttribute(ProcessingContext.SESSION_SITE, siteToUseNow);
        }
    }

    private void delete(JahiaSite site, JahiaUser theUser, boolean deleteFiles) throws JahiaException, IOException {
        // now let's check if this site is the default site, in which case
        // we need to change the default site to another one.
        JahiaSite defSite = getDefaultSite();

        // first let's build a list of the all the sites except the
        // current one.
        List<JahiaSite> otherSites = new ArrayList<JahiaSite>();
        for (Iterator<JahiaSite> siteIt = ServicesRegistry.getInstance().getJahiaSitesService().getSites();
             siteIt.hasNext();) {
            JahiaSite curSite = siteIt.next();
            if (!curSite.getSiteKey().equals(site.getSiteKey())) {
                otherSites.add(curSite);
            }
        }
        if (defSite == null) {
            // no default site, let's assign once that isn't the current
            // one being deleted.
            if (otherSites.size() > 0) {
                changeDefaultSite((JahiaSite) otherSites.get(0));
            }
        } else if (defSite.getSiteKey().equals(site.getSiteKey())) {
            // the default site IS the site being deleted, let's set
            // another site as a default site.
            if (otherSites.size() > 0) {
                changeDefaultSite((JahiaSite) otherSites.get(0));
            } else {
                changeDefaultSite(null);
            }
        }

        // switch staging and versioning to false.
        sMgr.updateSite(site);

        //remove site definition
        sMgr.removeSite(site);

    }


    private void prepareMultipleImport(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        FileUpload fileUpload = ((ParamBean) jParams).getFileUpload();
        if (fileUpload != null) {
            Set<String> filesName = fileUpload.getFileNames();
            Iterator<String> iterator = filesName.iterator();
            if (iterator.hasNext()) {
                String n = iterator.next();
                File f = fileUpload.getFile(n);
                prepareFileImports(f, fileUpload.getFileSystemName(n), request);
            }

        }
        String importPath = jParams.getParameter("importpath");
        if (StringUtils.isNotBlank(importPath)) {
            File f = new File(importPath);

            if (f.exists()) {
                prepareFileImports(f, f.getName(), request);
            }
        }
        if (jParams.getSessionState().getAttribute("importsInfos") != null) {
            if (!((List<?>) jParams.getSessionState().getAttribute("importsInfos")).isEmpty()) {
                try {
                    TreeMap<String, JCRNodeWrapper> orderedTemplateSets = getTemplatesSets();

                    request.setAttribute("tmplSets", new ArrayList<JCRNodeWrapper>(orderedTemplateSets.values()));
                } catch (RepositoryException e) {
                    logger.error("Error when getting templates", e);
                }
                JahiaAdministration.doRedirect(request, response, session, JSP_PATH + "import_choose.jsp");
                return;
            } else {
                request.setAttribute("warningMsg", getMessage(
                        "org.jahia.admin.site.ManageSites.multipleimport.noValidSite"));
            }
        } else {
            final String msg = fileUpload.getFileNames().size() == 0 && StringUtils.isBlank(importPath) ?
                    "org.jahia.admin.site.ManageSites.multipleimport.noFile" :
                    "org.jahia.admin.site.ManageSites.multipleimport.noValidSite";
            request.setAttribute("warningMsg", getMessage(msg));
        }

        displayList(request, response, session);
    }

    private void prepareFileImports(File f, String name, HttpServletRequest request) {
        if (f != null && f.exists()) {
            ZipInputStream zis = null;
            try {
                Properties exportProps = new Properties();
                zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(f)));
                ZipEntry z;
                Map<File, String> imports = new HashMap<File, String>();
                List<File> importList = new ArrayList<File>();
                while ((z = zis.getNextEntry()) != null) {
                    File i = File.createTempFile("import", ".zip");
                    OutputStream os = new BufferedOutputStream(new FileOutputStream(i));
                    try {
                        IOUtils.copy(zis, os);
                    } finally {
                        IOUtils.closeQuietly(os);
                    }

                    String n = z.getName();
                    if (n.equals("export.properties")) {
                        InputStream is = new BufferedInputStream(new FileInputStream(i));
                        try {
                            exportProps.load(is);
                        } finally {
                            IOUtils.closeQuietly(is);
                            FileUtils.deleteQuietly(i);
                        }
                        jParams.setAttribute("exportProps", exportProps);
                    } else if (n.equals("classes.jar")) {
                        FileUtils.deleteQuietly(i);
                    } else if (n.equals("site.properties") || ((n.startsWith("export_") && n.endsWith(".xml")))) {
                        // this is a single site import, stop everything and import
                        FileUtils.deleteQuietly(i);
                        for (File file : imports.keySet()) {
                            FileUtils.deleteQuietly(file);
                        }
                        imports.clear();
                        importList.clear();
                        File tempFile = File.createTempFile("import", ".zip");
                        FileUtils.copyFile(f, tempFile);
                        imports.put(tempFile, name);
                        importList.add(tempFile);
                        break;
                    } else {
                        imports.put(i, n);
                        importList.add(i);
                    }
                }

                List<Map<Object, Object>> importsInfos = new ArrayList<Map<Object, Object>>();
                for (Iterator<File> iterator = importList.iterator(); iterator.hasNext();) {
                    File i = iterator.next();
                    Map<Object, Object> value = prepareSiteImport(i, imports.get(i));
                    if (value != null) {
                        importsInfos.add(value);
                    }
                }

                Collections.sort(importsInfos, IMPORTS_COMPARATOR);

                List<File> sorted = new LinkedList<File>();
                for (Map<Object, Object> info : importsInfos) {
                    sorted.add((File) info.get("importFile"));
                }
               
                jParams.getSessionState().setAttribute("importsInfos", importsInfos);
                jParams.getSessionState().setAttribute("importsInfosSorted", sorted);
            } catch (IOException e) {
                logger.error("Cannot read import file :" + e.getMessage());
            } finally {
                IOUtils.closeQuietly(zis);
            }
        }
//        SharedTemplatePackagesRegistry tmplSetReg = SharedTemplatePackagesRegistry.getInstance();
//        Iterator en = tmplSetReg.getAllTemplatePackages();
//        List list = new ArrayList();
//        while (en.hasNext()) {
//            list.add(en.next());
//        }
        // TODO properly pol�late templates list
        request.setAttribute("tmplSets", Collections.emptyList());
    }

    private Map<Object, Object> prepareSiteImport(File i, String filename) throws IOException {
        Map<Object, Object> importInfos = new HashMap<Object, Object>();
        importInfos.put("importFile", i);
        importInfos.put("importFileName", filename);
        importInfos.put("selected", Boolean.TRUE);
        final Properties exportProps = (Properties) jParams.getAttribute("exportProps");
        if (exportProps != null) {
            importInfos.put("originatingJahiaRelease", exportProps.getProperty("JahiaRelease"));
        }
        if (filename.endsWith(".xml")) {
            importInfos.put("type", "xml");
        } else if (filename.endsWith("systemsite.zip")) {
            importInfos.put("type", "files");
        } else {
            ZipEntry z;
            ZipInputStream zis2 = new ZipInputStream(new BufferedInputStream(new FileInputStream(i)));
            boolean isSite = false;
            boolean isLegacySite = false;
            while ((z = zis2.getNextEntry()) != null) {
                if ("site.properties".equals(z.getName())) {
                    Properties p = new Properties();
                    p.load(zis2);
                    zis2.closeEntry();
                    importInfos.putAll(p);

                    importInfos.put("templates", "");
                    if (importInfos.containsKey("templatePackageName")) {
                        JahiaTemplateManagerService templateManager =
                                ServicesRegistry.getInstance().getJahiaTemplateManagerService();
                        JahiaTemplatesPackage pack = templateManager.getTemplatePackageByFileName((String) importInfos.get("templatePackageName"));
                        if (pack == null) {
                            pack = templateManager.getTemplatePackage((String) importInfos.get("templatePackageName"));
                        }
                        if (pack != null) {
                            importInfos.put("templates", pack.getFileName());
                        }
                    }
                    importInfos.put("oldsitekey", importInfos.get("sitekey"));
                    isSite = true;
                } else if (z.getName().startsWith("export_")) {
                    isLegacySite = true;
                }
            }
            importInfos.put("isSite", Boolean.valueOf(isSite));
            // todo import ga parameters
            if (isSite || isLegacySite) {
                importInfos.put("type", "site");
                if (!importInfos.containsKey("sitekey")) {
                    importInfos.put("sitekey", "");
                    importInfos.put("siteservername", "");
                    importInfos.put("sitetitle", "");
                    importInfos.put("description", "");
                    importInfos.put("mixLanguage", "false");
                    importInfos.put("templates", "");
                    importInfos.put("siteKeyInvalid", Boolean.TRUE);
                    importInfos.put("siteKeyExists", Boolean.TRUE);
                    importInfos.put("siteServerNameInvalid", Boolean.TRUE);
                    importInfos.put("siteServerNameExists", Boolean.TRUE);
                } else {
                    try {
                        String siteKey = (String) importInfos.get("sitekey");
                        boolean valid = isSiteKeyValid(siteKey);
                        importInfos.put("siteKeyInvalid", !valid);
            importInfos.put("siteKeyExists", valid
                    && ServicesRegistry.getInstance().getJahiaSitesService().getSiteByKey(siteKey) != null);
                        String serverName = (String) importInfos.get("siteservername");
                        valid = isServerNameValid(serverName);
                        importInfos.put("siteServerNameInvalid", !valid);
            importInfos.put("siteServerNameExists",
                    valid
                            && !URLGenerator.isLocalhost(serverName)
                            && ServicesRegistry.getInstance().getJahiaSitesService().getSite(serverName) != null);
                    } catch (JahiaException e) {
                        logger.error("Error while preparing site import", e);
                    }
                }
            } else {
                importInfos.put("type", "files");
            }

        }
        return importInfos;
    }

    private void processFileImport(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        @SuppressWarnings("unchecked")
        List<Map<Object, Object>> importsInfos = (List<Map<Object, Object>>) session.getAttribute("importsInfos");
        Map<Object, Object> siteKeyMapping = new HashMap<Object, Object>();
        boolean stillBad = false;
        JahiaSitesService jahiaSitesService = ServicesRegistry.getInstance().getJahiaSitesService();
        for (Map<Object, Object> infos : importsInfos) {
            File file = (File) infos.get("importFile");
            infos.put("sitekey", StringUtils.left(request.getParameter(file.getName() + "siteKey") == null ? null :
                    request.getParameter(file.getName() + "siteKey").trim(), 50));
            infos.put("oldsitekey", request.getParameter(file.getName() + "oldSiteKey") == null ? null :
                    request.getParameter(file.getName() + "oldSiteKey").trim());
            if (infos.get("sitekey") != null && !infos.get("sitekey").equals(infos.get("oldsitekey"))) {
                siteKeyMapping.put(infos.get("oldsitekey"), infos.get("sitekey"));
            }
            infos.put("siteservername", StringUtils.left(
                    request.getParameter(file.getName() + "siteServerName") == null ? null :
                            request.getParameter(file.getName() + "siteServerName").trim(), 200));
            infos.put("sitetitle", StringUtils.left(request.getParameter(file.getName() + "siteTitle") == null ? null :
                    request.getParameter(file.getName() + "siteTitle").trim(), 100));
            infos.put("selected", request.getParameter(file.getName() + "selected"));
            infos.put("templates", request.getParameter(file.getName() + "templates"));

            if (request.getParameter(file.getName() + "selected") != null) {
                try {
                    if (NON_SITE_IMPORTS.contains(infos.get("importFileName"))) {

                    } else {
                         infos.put("siteTitleInvalid", StringUtils.isEmpty((String) infos.get("sitetitle")));
                     
                        String siteKey = (String) infos.get("sitekey");
                      boolean valid = isSiteKeyValid(siteKey);
                      infos.put("siteKeyInvalid", !valid);
                         infos.put("siteKeyExists", valid && jahiaSitesService.getSiteByKey(siteKey) != null);

                         String serverName = (String) infos.get("siteservername");                       
                      valid = isServerNameValid(serverName);
                      infos.put("siteServerNameInvalid", !valid);
                         infos.put("siteServerNameExists", valid && !URLGenerator.isLocalhost(serverName) && jahiaSitesService.getSite(serverName) != null);
                        
            stillBad = (Boolean) infos.get("siteKeyInvalid")
                    || (Boolean) infos.get("siteKeyExists")
                    || (Boolean) infos.get("siteServerNameInvalid")
                    || (Boolean) infos.get("siteServerNameExists");
                    }
                } catch (JahiaException e) {
                    logger.error("Error while processing file import", e);
                }
            } else {
                infos.put("siteKeyInvalid", Boolean.FALSE);
                infos.put("siteKeyExists", Boolean.FALSE);
                infos.put("siteServerNameInvalid", Boolean.FALSE);
                infos.put("siteServerNameExists", Boolean.FALSE);

            }
        }
        if (stillBad) {
            try {
                TreeMap<String, JCRNodeWrapper> orderedTemplateSets = getTemplatesSets();

                request.setAttribute("tmplSets", new ArrayList<JCRNodeWrapper>(orderedTemplateSets.values()));
            } catch (RepositoryException e) {
              logger.error(e.getMessage(), e);
            }

            JahiaAdministration.doRedirect(request, response, session, JSP_PATH + "import_choose.jsp");
        } else {

            boolean doImportServerPermissions = false;
      for (Map<Object, Object> infos : importsInfos) {
        File file = (File) infos.get("importFile");
        if (request.getParameter(file.getName() + "selected") != null
                && infos.get("importFileName").equals("serverPermissions.xml")) {
          doImportServerPermissions = true;
          break;
        }
      }

            request.setAttribute("doImportServerPermissions", Boolean.valueOf(doImportServerPermissions));

            for (Map<Object, Object> infos : importsInfos) {
                File file = (File) infos.get("importFile");
                if (request.getParameter(file.getName() + "selected") != null &&
                        infos.get("importFileName").equals("users.xml")) {
                    try {
                        ImportExportBaseService.getInstance().importUsers(file);
                    } finally {
                        file.delete();
                    }
                    break;
                }
            }

            for (Map<Object, Object> infos : importsInfos) {
                File file = (File) infos.get("importFile");
                if (request.getParameter(file.getName() + "selected") != null) {
                    if (infos.get("type").equals("files")) {
                        try {
                            JahiaSite system = ServicesRegistry.getInstance().getJahiaSitesService().getSiteByKey(JahiaSitesBaseService.SYSTEM_SITE_KEY);

                            Map<String,String> pathMapping = JCRSessionFactory.getInstance().getCurrentUserSession().getPathMapping();
                            pathMapping.put("/shared/files/", "/sites/" + system.getSiteKey() + "/files/");
                            pathMapping.put("/shared/mashups/", "/sites/" + system.getSiteKey() + "/portlets/");

                            ImportExportBaseService.getInstance().importSiteZip(file, system, infos);
                        } catch (Exception e) {
                            logger.error("Error when getting templates", e);
                        } finally {
                            file.delete();
                        }
                    } else if (infos.get("type").equals("xml") &&
                            (infos.get("importFileName").equals("serverPermissions.xml") ||
                                    infos.get("importFileName").equals("users.xml"))) {

                    } else if (infos.get("type").equals("site")) {
                        // site import
                        String tpl = (String) infos.get("templates");
                        if ("".equals(tpl)) {
                            tpl = null;
                        }
                        Locale defaultLocale = determineDefaultLocale(jParams, infos);
                        try {
                            JahiaSite site = jahiaSitesService
                                    .addSite(jParams.getUser(), (String) infos.get("sitetitle"),
                                            (String) infos.get("siteservername"), (String) infos.get("sitekey"), "",
                                            defaultLocale, tpl, "fileImport", file,
                                            (String) infos.get("importFileName"), false, false, (String) infos.get("originatingJahiaRelease"));
                            session.setAttribute(ProcessingContext.SESSION_SITE, site);
                            jParams.setSite(site);
                            jParams.setSiteID(site.getID());
                            jParams.setSiteKey(site.getSiteKey());
                            jParams.setCurrentLocale(defaultLocale);


                        } catch (Exception e) {
                            logger.error("Cannot create site " + infos.get("sitetitle"), e);
                        }
                    }
                }
            }

            CompositeSpellChecker.updateSpellCheckerIndex();
           
            redirectAfterAdd(request, response, session);
        }
    }

    private TreeMap<String, JCRNodeWrapper> getTemplatesSets() throws RepositoryException {
        TreeMap<String, JCRNodeWrapper> orderedTemplateSets = new TreeMap<String, JCRNodeWrapper>();
        final JCRNodeWrapper templatesSet =
                JCRStoreService.getInstance().getSessionFactory().getCurrentUserSession().getNode("/templateSets");
        NodeIterator templates = templatesSet.getNodes();
        while (templates.hasNext()) {
            JCRNodeWrapper node = (JCRNodeWrapper) templates.next();
            if (!node.getName().equals("templates-system") && node.hasProperty("j:siteType") &&
                    node.getProperty("j:siteType").getString().equals("templatesSet")) {
                orderedTemplateSets.put(node.getName(), node);
            }
        }
        return orderedTemplateSets;
    }

    private Locale determineDefaultLocale(ProcessingContext jParams, Map<Object, Object> infos) {
        Locale defaultLocale = jParams.getLocale();
        SortedMap<Integer, String> activeLanguageCodesByRank = new TreeMap<Integer, String>();
        for (Map.Entry<Object, Object> info : infos.entrySet()) {
            if (info.getKey() instanceof String) {
                Matcher m = LANGUAGE_RANK_PATTERN.matcher((String) info.getKey());
                if (m.find()) {
                    String languageCode = m.group(1);
                    boolean activated =
                            Boolean.parseBoolean((String) infos.get("language." + languageCode + ".activated"));

                    if (activated) {
                        if ("1".equals(info.getValue())) {
                            return LanguageCodeConverters.languageCodeToLocale(languageCode);
                        } else {
                            activeLanguageCodesByRank.put(new Integer((String) info.getValue()), languageCode);
                        }
                    }
                }
            }
        }
        if (!activeLanguageCodesByRank.isEmpty()) {
            defaultLocale = LanguageCodeConverters
                    .languageCodeToLocale(activeLanguageCodesByRank.get(activeLanguageCodesByRank.firstKey()));
        }
        return defaultLocale;
    }

    private void redirectAfterAdd(HttpServletRequest request, HttpServletResponse response, HttpSession session)
            throws IOException, ServletException {
        displayList(request, response, session);
    }

    /**
     * return a parameter of String type if not null or return the subsitute value
     *
     * @param processingContext the request object
     * @param paramName         the param name
     * @param nullVal           the subsitute value to return if the parameter is null
     * @return String the parameter value
     * @author NK
     */
    public static String getStrParameter(ProcessingContext processingContext, String paramName, String nullVal) {

        String val = (String) processingContext.getParameter(paramName);
        if (val == null) {
            return nullVal;
        }
        return val;
    }

    public static boolean isSiteKeyValid(String name) {
        if (StringUtils.isEmpty(name)) {
            return false;
        }

        if (JahiaSitesBaseService.SYSTEM_SITE_KEY.equals(name)) {
          return false;
        }
       
        boolean valid = true;
        for (char toBeTested : name.toCharArray()) {
          if (AUTHORIZED_CHARS.indexOf(toBeTested) == -1) {
            valid = false;
            break;
          }
        }

        return valid;
    }
}
TOP

Related Classes of org.jahia.admin.sites.ManageSites

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.