org.silverpeas.components.kmelia.servlets.KmeliaRequestRouter.java Source code

Java tutorial

Introduction

Here is the source code for org.silverpeas.components.kmelia.servlets.KmeliaRequestRouter.java

Source

/*
 * Copyright (C) 2000 - 2018 Silverpeas
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * As a special exception to the terms and conditions of version 3.0 of
 * the GPL, you may redistribute this Program in connection with Free/Libre
 * Open Source Software ("FLOSS") applications as described in Silverpeas's
 * FLOSS exception. You should have received a copy of the text describing
 * the FLOSS exception, and it is also available here:
 * "https://www.silverpeas.org/legal/floss_exception.html"
 *
 * 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package org.silverpeas.components.kmelia.servlets;

import org.apache.commons.fileupload.FileItem;
import org.silverpeas.components.kmelia.KmeliaAuthorization;
import org.silverpeas.components.kmelia.KmeliaConstants;
import org.silverpeas.components.kmelia.SearchContext;
import org.silverpeas.components.kmelia.control.KmeliaSessionController;
import org.silverpeas.components.kmelia.model.FileFolder;
import org.silverpeas.components.kmelia.model.KmeliaPublication;
import org.silverpeas.components.kmelia.model.TopicDetail;
import org.silverpeas.components.kmelia.service.KmeliaHelper;
import org.silverpeas.components.kmelia.servlets.handlers.StatisticRequestHandler;
import org.silverpeas.core.ActionType;
import org.silverpeas.core.ResourceReference;
import org.silverpeas.core.admin.user.model.ProfileInst;
import org.silverpeas.core.admin.user.model.SilverpeasRole;
import org.silverpeas.core.contribution.ContributionStatus;
import org.silverpeas.core.contribution.content.form.DataRecord;
import org.silverpeas.core.contribution.content.form.Form;
import org.silverpeas.core.contribution.content.form.FormException;
import org.silverpeas.core.contribution.content.form.PagesContext;
import org.silverpeas.core.contribution.content.form.RecordSet;
import org.silverpeas.core.contribution.content.wysiwyg.service.WysiwygController;
import org.silverpeas.core.contribution.model.ContributionIdentifier;
import org.silverpeas.core.contribution.publication.model.Alias;
import org.silverpeas.core.contribution.publication.model.CompletePublication;
import org.silverpeas.core.contribution.publication.model.PublicationLink;
import org.silverpeas.core.contribution.publication.model.PublicationDetail;
import org.silverpeas.core.contribution.publication.model.PublicationPK;
import org.silverpeas.core.contribution.template.publication.PublicationTemplate;
import org.silverpeas.core.contribution.template.publication.PublicationTemplateException;
import org.silverpeas.core.contribution.template.publication.PublicationTemplateImpl;
import org.silverpeas.core.contribution.template.publication.PublicationTemplateManager;
import org.silverpeas.core.i18n.I18NHelper;
import org.silverpeas.core.importexport.report.ImportReport;
import org.silverpeas.core.importexport.versioning.DocumentVersion;
import org.silverpeas.core.io.media.image.thumbnail.control.ThumbnailController;
import org.silverpeas.core.io.upload.UploadedFile;
import org.silverpeas.core.node.model.NodeDetail;
import org.silverpeas.core.node.model.NodePK;
import org.silverpeas.core.security.authorization.PublicationAccessController;
import org.silverpeas.core.subscription.service.NodeSubscriptionResource;
import org.silverpeas.core.subscription.util.SubscriptionManagementContext;
import org.silverpeas.core.util.DateUtil;
import org.silverpeas.core.util.LocalizationBundle;
import org.silverpeas.core.util.MimeTypes;
import org.silverpeas.core.util.ResourceLocator;
import org.silverpeas.core.util.ServiceProvider;
import org.silverpeas.core.util.StringUtil;
import org.silverpeas.core.util.URLUtil;
import org.silverpeas.core.util.WAAttributeValuePair;
import org.silverpeas.core.util.error.SilverpeasTransverseErrorUtil;
import org.silverpeas.core.util.file.FileFolderManager;
import org.silverpeas.core.util.file.FileRepositoryManager;
import org.silverpeas.core.util.file.FileUploadUtil;
import org.silverpeas.core.util.file.FileUtil;
import org.silverpeas.core.util.logging.SilverLogger;
import org.silverpeas.core.web.http.HttpRequest;
import org.silverpeas.core.web.mvc.controller.ComponentContext;
import org.silverpeas.core.web.mvc.controller.MainSessionController;
import org.silverpeas.core.web.mvc.route.ComponentRequestRouter;
import org.silverpeas.core.web.mvc.util.WysiwygRouting;
import org.silverpeas.core.web.selection.Selection;
import org.silverpeas.core.web.util.ClientBrowserUtil;
import org.silverpeas.core.webapi.pdc.PdcClassificationEntity;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.StringTokenizer;

import static org.silverpeas.core.contribution.model.CoreContributionType.NODE;

public class KmeliaRequestRouter extends ComponentRequestRouter<KmeliaSessionController> {

    private static final long serialVersionUID = 1L;
    private static final StatisticRequestHandler STATISTIC_REQUEST_HANDLER = new StatisticRequestHandler();

    /**
     * This method creates a KmeliaSessionController instance
     * @param mainSessionCtrl The MainSessionController instance
     * @param context Context of current component instance
     * @return a KmeliaSessionController instance
     */
    @Override
    public KmeliaSessionController createComponentSessionController(MainSessionController mainSessionCtrl,
            ComponentContext context) {
        return new KmeliaSessionController(mainSessionCtrl, context);
    }

    /**
     * This method has to be implemented in the component request rooter class. returns the session
     * control bean name to be put in the request object ex : for almanach, returns "almanach"
     */
    @Override
    public String getSessionControlBeanName() {
        return "kmelia";
    }

    /**
     * This method has to be implemented by the component request rooter it has to compute a
     * destination page
     * @param function The entering request function ( : "Main.jsp")
     * @param kmelia The component Session Control, build and initialised.
     * @param request The entering request. The request rooter need it to get parameters
     * @return The complete destination URL for a forward (ex :
     * "/almanach/jsp/almanach.jsp?flag=user")
     */
    @Override
    public String getDestination(String function, KmeliaSessionController kmelia, HttpRequest request) {
        String destination = "";
        String rootDestination = "/kmelia/jsp/";
        boolean profileError = false;
        boolean kmaxMode = false;
        boolean toolboxMode;
        SilverpeasRole userRoleOnCurrentTopic = SilverpeasRole
                .from(kmelia.getUserTopicProfile(kmelia.getCurrentFolderId()));
        SilverpeasRole highestSilverpeasUserRoleOnCurrentTopic = null;
        if (userRoleOnCurrentTopic != null) {
            highestSilverpeasUserRoleOnCurrentTopic = SilverpeasRole.getHighestFrom(userRoleOnCurrentTopic);
        }
        try {
            if ("kmax".equals(kmelia.getComponentRootName())) {
                kmaxMode = true;
                kmelia.setKmaxMode(true);
            }
            request.setAttribute("KmaxMode", kmaxMode);

            toolboxMode = KmeliaHelper.isToolbox(kmelia.getComponentId());

            // Set language choosen by the user
            setLanguage(request, kmelia);

            if (function.startsWith("Main")) {
                if (kmaxMode) {
                    destination = getDestination("KmaxMain", kmelia, request);
                    kmelia.setSessionTopic(null);
                    kmelia.setSessionPath("");
                } else {
                    destination = getDestination("GoToTopic", kmelia, request);
                }
            } else if (function.startsWith("validateClassification")) {
                String[] publicationIds = request.getParameterValues("pubid");
                Collection<KmeliaPublication> publications = kmelia
                        .getPublications(asPks(kmelia.getComponentId(), publicationIds));
                request.setAttribute("Context", URLUtil.getApplicationURL());
                request.setAttribute("PublicationsDetails", publications);
                destination = rootDestination + "validateImportedFilesClassification.jsp";
            } else if (function.startsWith("portlet")) {
                kmelia.setSessionPublication(null);
                String flag = kmelia.getHighestSilverpeasUserRole().getName();
                if (kmaxMode) {
                    destination = rootDestination + "kmax_portlet.jsp?Profile=" + flag;
                } else {
                    destination = rootDestination + "portlet.jsp?Profile=user";
                }
            } else if (function.equals("FlushTrashCan")) {
                kmelia.flushTrashCan();
                if (kmaxMode) {
                    destination = getDestination("KmaxMain", kmelia, request);
                } else {
                    destination = getDestination("GoToCurrentTopic", kmelia, request);
                }
            } else if (function.equals("GoToDirectory")) {
                String topicId = request.getParameter("Id");

                String path;
                if (StringUtil.isDefined(topicId)) {
                    NodeDetail topic = kmelia.getNodeHeader(topicId);
                    path = topic.getPath();
                } else {
                    path = request.getParameter("Path");
                }

                FileFolder folder = new FileFolder(path);
                request.setAttribute("Directory", folder);
                request.setAttribute("LinkedPathString", kmelia.getSessionPath());

                destination = rootDestination + "repository.jsp";
            } else if ("GoToTopic".equals(function)) {
                String topicId = (String) request.getAttribute("Id");
                if (!StringUtil.isDefined(topicId)) {
                    topicId = request.getParameter("Id");
                    if (!StringUtil.isDefined(topicId)) {
                        topicId = NodePK.ROOT_NODE_ID;
                    }
                }
                kmelia.setCurrentFolderId(topicId, true);
                request.setAttribute("CurrentFolderId", topicId);
                request.setAttribute("DisplayNBPublis", kmelia.displayNbPublis());
                request.setAttribute("DisplaySearch", kmelia.isSearchOnTopicsEnabled());

                request.setAttribute("Profile", kmelia.getUserTopicProfile(topicId));
                request.setAttribute("IsGuest", kmelia.getUserDetail().isAccessGuest());
                request.setAttribute("RightsOnTopicsEnabled", kmelia.isRightsOnTopicsEnabled());
                request.setAttribute("WysiwygDescription", kmelia.getWysiwygOnTopic());
                request.setAttribute("PageIndex", kmelia.getIndexOfFirstPubToDisplay());

                if (kmelia.isTreeviewUsed()) {
                    destination = rootDestination + "treeview.jsp";
                } else if (kmelia.isTreeStructure()) {
                    destination = rootDestination + "oneLevel.jsp";
                } else {
                    destination = rootDestination + "simpleListOfPublications.jsp";
                }
            } else if ("GoToCurrentTopic".equals(function)) {
                if (!NodePK.ROOT_NODE_ID.equals(kmelia.getCurrentFolderId())) {
                    request.setAttribute("Id", kmelia.getCurrentFolderId());
                    destination = getDestination("GoToTopic", kmelia, request);
                } else {
                    destination = getDestination("Main", kmelia, request);
                }
            } else if (function.equals("GoToBasket")) {
                destination = rootDestination + "basket.jsp";
            } else if (function.equals("ViewPublicationsToValidate")) {
                destination = rootDestination + "publicationsToValidate.jsp";
            } else if ("GoBackToResults".equals(function)) {
                request.setAttribute("SearchContext", kmelia.getSearchContext());
                destination = getDestination("GoToCurrentTopic", kmelia, request);
            } else if (function.startsWith("searchResult")) {
                String id = request.getParameter("Id");
                String type = request.getParameter("Type");
                String fileAlreadyOpened = request.getParameter("FileOpened");
                String from = request.getParameter("From");
                if ("Search".equals(from)) {
                    // identify clearly access from global search
                    // because same URL is used from portlet, permalink...
                    request.setAttribute("SearchScope", SearchContext.GLOBAL);
                }

                if (type != null && ("Publication".equals(type)
                        || "org.silverpeas.core.personalorganizer.model.TodoDetail".equals(type)
                        || "Attachment".equals(type) || "Document".equals(type) || type.startsWith("Comment"))) {
                    KmeliaAuthorization security = new KmeliaAuthorization(kmelia.getOrganisationController());
                    try {
                        PublicationDetail pub2Check = kmelia.getPublicationDetail(id);
                        // If given PK defines a clone, change PK to master
                        if (pub2Check.haveGotClone()) {
                            // check if publication is really the master or the clone ?
                            int pubId = Integer.parseInt(pub2Check.getId());
                            int cloneId = Integer.parseInt(pub2Check.getCloneId());
                            boolean clone = pubId > cloneId;
                            if (clone) {
                                id = pub2Check.getCloneId();
                                request.setAttribute("ForcedId", id);
                            }
                        }
                        boolean accessAuthorized = security.isAccessAuthorized(kmelia.getComponentId(),
                                kmelia.getUserId(), id, "Publication");
                        if (accessAuthorized) {
                            processPath(kmelia, id);
                            if ("Attachment".equals(type)) {
                                String attachmentId = request.getParameter("AttachmentId");
                                request.setAttribute("AttachmentId", attachmentId);
                                destination = getDestination("ViewPublication", kmelia, request);
                            } else if ("Document".equals(type)) {
                                String documentId = request.getParameter("DocumentId");
                                request.setAttribute("DocumentId", documentId);
                                destination = getDestination("ViewPublication", kmelia, request);
                            } else {
                                if (kmaxMode) {
                                    request.setAttribute("FileAlreadyOpened", fileAlreadyOpened);
                                    destination = getDestination("ViewPublication", kmelia, request);
                                } else if (toolboxMode) {
                                    // we have to find which page contains the right publication
                                    List<KmeliaPublication> publications = kmelia.getSessionPublicationsList();
                                    int pubIndex = -1;
                                    for (int p = 0; p < publications.size() && pubIndex == -1; p++) {
                                        KmeliaPublication publication = publications.get(p);
                                        if (id.equals(publication.getDetail().getPK().getId())) {
                                            pubIndex = p;
                                        }
                                    }
                                    int nbPubliPerPage = kmelia.getNbPublicationsPerPage();
                                    if (nbPubliPerPage == 0) {
                                        nbPubliPerPage = pubIndex;
                                    }
                                    int ipage = pubIndex / nbPubliPerPage;
                                    kmelia.setIndexOfFirstPubToDisplay(Integer.toString(ipage * nbPubliPerPage));
                                    request.setAttribute("PubIdToHighlight", id);
                                    request.setAttribute("Id", kmelia.getCurrentFolderId());
                                    destination = getDestination("GoToTopic", kmelia, request);
                                } else {
                                    request.setAttribute("FileAlreadyOpened", fileAlreadyOpened);
                                    destination = getDestination("ViewPublication", kmelia, request);
                                }
                            }
                        } else {
                            destination = "/admin/jsp/accessForbidden.jsp";
                        }
                    } catch (Exception e) {
                        SilverLogger.getLogger(this).error("Document not found. {0}",
                                new String[] { e.getMessage() }, e);
                        destination = getDocumentNotFoundDestination(kmelia, request);
                    }
                } else if ("Node".equals(type)) {
                    if (kmaxMode) {
                        // Simuler l'action d'un utilisateur ayant slectionn la valeur id d'un axe
                        // SearchCombination est un chemin /0/4/i
                        NodeDetail node = kmelia.getNodeHeader(id);
                        String path = node.getPath() + id;
                        request.setAttribute("SearchCombination", path);
                        destination = getDestination("KmaxSearch", kmelia, request);
                    } else {
                        try {
                            request.setAttribute("Id", id);
                            destination = getDestination("GoToTopic", kmelia, request);
                        } catch (Exception e) {
                            SilverLogger.getLogger(this).error("Document not found. {0}",
                                    new String[] { e.getMessage() }, e);
                            destination = getDocumentNotFoundDestination(kmelia, request);
                        }
                    }
                } else if ("Wysiwyg".equals(type)) {
                    if (id.startsWith("Node")) {
                        id = id.substring("Node_".length(), id.length());
                        request.setAttribute("Id", id);
                        destination = getDestination("GoToTopic", kmelia, request);
                    } else {
                        destination = getDestination("ViewPublication", kmelia, request);
                    }
                } else {
                    request.setAttribute("Id", NodePK.ROOT_NODE_ID);
                    destination = getDestination("GoToTopic", kmelia, request);
                }
            } else if (function.startsWith("GoToFilesTab")) {
                String id = request.getParameter("Id");
                try {
                    processPath(kmelia, id);
                    if (toolboxMode) {
                        KmeliaPublication kmeliaPublication = kmelia.getPublication(id);
                        kmelia.setSessionPublication(kmeliaPublication);
                        kmelia.setSessionOwner(true);
                        destination = getDestination("ViewAttachments", kmelia, request);
                    } else {
                        destination = getDestination("ViewPublication", kmelia, request);
                    }
                } catch (Exception e) {
                    SilverLogger.getLogger(this).error("Document not found. {0}", new String[] { e.getMessage() },
                            e);
                    destination = getDocumentNotFoundDestination(kmelia, request);
                }
            } else if ("ToUpdatePublicationHeader".equals(function)) {
                request.setAttribute("Action", "UpdateView");
                destination = getDestination("ToPublicationHeader", kmelia, request);
            } else if ("ToPublicationHeader".equals(function)) {
                String action = (String) request.getAttribute("Action");
                if ("UpdateView".equals(action)) {
                    request.setAttribute("AttachmentsEnabled", false);
                    request.setAttribute("TaxonomyOK", kmelia.isPublicationTaxonomyOK());
                    request.setAttribute("ValidatorsOK", kmelia.isPublicationValidatorsOK());
                    request.setAttribute("Publication", kmelia.getSessionPubliOrClone());
                    setupRequestForSubscriptionNotificationSending(request, highestSilverpeasUserRoleOnCurrentTopic,
                            kmelia.getCurrentFolderPK(), kmelia.getSessionPubliOrClone().getDetail());
                } else if ("New".equals(action)) {
                    // Attachments area must be displayed or not ?
                    request.setAttribute("AttachmentsEnabled", kmelia.isAttachmentsEnabled());
                    request.setAttribute("TaxonomyOK", true);
                    request.setAttribute("ValidatorsOK", true);
                }

                request.setAttribute("Path", kmelia.getTopicPath(kmelia.getCurrentFolderId()));
                request.setAttribute("Profile", kmelia.getProfile());

                destination = rootDestination + "publicationManager.jsp";
                // thumbnail error for front explication
                if (request.getParameter("errorThumbnail") != null) {
                    destination = destination + "&resultThumbnail=" + request.getParameter("errorThumbnail");
                }
            } else if (function.equals("ToAddTopic")) {
                String topicId = request.getParameter("Id");
                if (!SilverpeasRole.admin.isInRole(kmelia.getUserTopicProfile(topicId))) {
                    destination = "/admin/jsp/accessForbidden.jsp";
                } else {
                    String isLink = request.getParameter("IsLink");
                    if (StringUtil.isDefined(isLink)) {
                        request.setAttribute("IsLink", Boolean.TRUE);
                    }

                    List<NodeDetail> path = kmelia.getTopicPath(topicId);
                    request.setAttribute("Path", kmelia.displayPath(path, false, 3));
                    request.setAttribute("PathLinked", kmelia.displayPath(path, true, 3));
                    request.setAttribute("Translation", kmelia.getCurrentLanguage());
                    request.setAttribute("NotificationAllowed", kmelia.isNotificationAllowed());
                    request.setAttribute("Parent", kmelia.getNodeHeader(topicId));

                    if (kmelia.isRightsOnTopicsEnabled()) {
                        request.setAttribute("Profiles", kmelia.getTopicProfiles());

                        // Rights of the component
                        request.setAttribute("RightsDependsOn", "ThisComponent");
                    }

                    destination = rootDestination + "addTopic.jsp";
                }
            } else if ("ToUpdateTopic".equals(function)) {
                String id = request.getParameter("Id");
                NodeDetail node = kmelia.getSubTopicDetail(id);
                if (!SilverpeasRole.admin.isInRole(kmelia.getUserTopicProfile(id))
                        && !SilverpeasRole.admin.isInRole(kmelia.getUserTopicProfile(NodePK.ROOT_NODE_ID))
                        && !SilverpeasRole.admin.isInRole(kmelia.getUserTopicProfile(node.getFatherPK().getId()))) {
                    destination = "/admin/jsp/accessForbidden.jsp";
                } else {
                    request.setAttribute("NodeDetail", node);

                    List<NodeDetail> path = kmelia.getTopicPath(id);
                    request.setAttribute("Path", kmelia.displayPath(path, false, 3));
                    request.setAttribute("PathLinked", kmelia.displayPath(path, true, 3));
                    request.setAttribute("Translation", kmelia.getCurrentLanguage());
                    request.setAttribute("NotificationAllowed", kmelia.isNotificationAllowed());

                    if (kmelia.isRightsOnTopicsEnabled()) {
                        request.setAttribute("Profiles", kmelia.getTopicProfiles(id));

                        if (node.haveInheritedRights()) {
                            request.setAttribute("RightsDependsOn", "AnotherTopic");
                        } else if (node.haveLocalRights()) {
                            request.setAttribute("RightsDependsOn", "ThisTopic");
                        } else {
                            // Rights of the component
                            request.setAttribute("RightsDependsOn", "ThisComponent");
                        }
                    }

                    destination = rootDestination + "updateTopicNew.jsp";
                }
            } else if (function.equals("AddTopic")) {
                String name = request.getParameter("Name");
                String description = request.getParameter("Description");
                String alertType = request.getParameter("AlertType");
                if (!StringUtil.isDefined(alertType)) {
                    alertType = "None";
                }
                String rightsUsed = request.getParameter("RightsUsed");
                String path = request.getParameter("Path");
                String parentId = request.getParameter("ParentId");

                NodeDetail topic = new NodeDetail("-1", name, description, 0, "X");
                I18NHelper.setI18NInfo(topic, request);

                if (StringUtil.isDefined(path)) {
                    topic.setType(NodeDetail.FILE_LINK_TYPE);
                    topic.setPath(path);
                }

                int rightsDependsOn = -1;
                if (StringUtil.isDefined(rightsUsed)) {
                    if ("father".equalsIgnoreCase(rightsUsed)) {
                        NodeDetail father = kmelia.getCurrentFolder();
                        rightsDependsOn = father.getRightsDependsOn();
                    } else {
                        rightsDependsOn = 0;
                    }
                    topic.setRightsDependsOn(rightsDependsOn);
                }
                NodePK nodePK = kmelia.addSubTopic(topic, alertType, parentId);
                if (kmelia.isRightsOnTopicsEnabled()) {
                    if (rightsDependsOn == 0) {
                        request.setAttribute("NodeId", nodePK.getId());
                        destination = getDestination("ViewTopicProfiles", kmelia, request);
                    } else {
                        destination = getDestination("GoToCurrentTopic", kmelia, request);
                    }
                } else {
                    destination = getDestination("GoToCurrentTopic", kmelia, request);
                }
            } else if ("UpdateTopic".equals(function)) {
                String name = request.getParameter("Name");
                String description = request.getParameter("Description");
                String alertType = request.getParameter("AlertType");
                if (!StringUtil.isDefined(alertType)) {
                    alertType = "None";
                }
                String id = request.getParameter("ChildId");
                String path = request.getParameter("Path");
                NodeDetail topic = new NodeDetail(id, name, description, 0, "X");
                I18NHelper.setI18NInfo(topic, request);
                if (StringUtil.isDefined(path)) {
                    topic.setType(NodeDetail.FILE_LINK_TYPE);
                    topic.setPath(path);
                }
                boolean goToProfilesDefinition = false;
                if (kmelia.isRightsOnTopicsEnabled()) {
                    int rightsUsed = Integer.parseInt(request.getParameter("RightsUsed"));
                    topic.setRightsDependsOn(rightsUsed);

                    // process destination
                    NodeDetail oldTopic = kmelia.getNodeHeader(id);
                    if (oldTopic.getRightsDependsOn() != rightsUsed && rightsUsed != -1) {
                        // rights dependency have changed and  folder uses its own rights
                        goToProfilesDefinition = true;
                    }
                }
                kmelia.updateTopicHeader(topic, alertType);

                if (goToProfilesDefinition) {
                    request.setAttribute("NodeId", id);
                    destination = getDestination("ViewTopicProfiles", kmelia, request);
                } else {
                    destination = getDestination("GoToCurrentTopic", kmelia, request);
                }
            } else if (function.equals("DeleteTopic")) {
                String id = request.getParameter("Id");
                kmelia.deleteTopic(id);
                destination = getDestination("GoToCurrentTopic", kmelia, request);
            } else if (function.equals("ViewClone")) {
                PublicationDetail pubDetail = kmelia.getSessionPublication().getDetail();

                // Reload clone and put it into session
                String cloneId = pubDetail.getCloneId();
                KmeliaPublication kmeliaPublication = kmelia.getPublication(cloneId);
                kmelia.setSessionClone(kmeliaPublication);

                request.setAttribute("Publication", kmeliaPublication);
                request.setAttribute("ValidationType", kmelia.getValidationType());
                request.setAttribute("Profile", kmelia.getProfile());
                request.setAttribute("VisiblePublicationId", pubDetail.getPK().getId());
                request.setAttribute("UserCanValidate", kmelia.isUserCanValidatePublication());
                request.setAttribute("TaxonomyOK", kmelia.isPublicationTaxonomyOK());
                request.setAttribute("ValidatorsOK", kmelia.isPublicationValidatorsOK());

                putXMLDisplayerIntoRequest(kmeliaPublication.getDetail(), kmelia, request);

                // Attachments area must be displayed or not ?
                request.setAttribute("AttachmentsEnabled", kmelia.isAttachmentsEnabled());

                destination = rootDestination + "clone.jsp";
            } else if ("ViewPublication".equals(function)) {
                String id = (String) request.getAttribute("ForcedId");
                if (!StringUtil.isDefined(id)) {
                    id = request.getParameter("PubId");
                    if (!StringUtil.isDefined(id)) {
                        id = request.getParameter("Id");
                        if (!StringUtil.isDefined(id)) {
                            id = (String) request.getAttribute("PubId");
                        }
                    }
                }

                if (!kmaxMode) {
                    boolean checkPath = StringUtil.getBooleanValue(request.getParameter("CheckPath"));
                    if (checkPath || KmeliaHelper.isToValidateFolder(kmelia.getCurrentFolderId())) {
                        processPath(kmelia, id);
                    } else {
                        processPath(kmelia, null);
                    }
                }

                // view publication from global search ?
                Integer searchScope = (Integer) request.getAttribute("SearchScope");
                if (searchScope == null) {
                    if (kmelia.getSearchContext() != null) {
                        request.setAttribute("SearchScope", SearchContext.LOCAL);
                    } else {
                        request.setAttribute("SearchScope", SearchContext.NONE);
                    }
                }

                KmeliaPublication kmeliaPublication;
                if (StringUtil.isDefined(id)) {
                    kmeliaPublication = kmelia.getPublication(id, true);
                    // Check user publication access
                    PublicationAccessController publicationAccessController = ServiceProvider
                            .getService(PublicationAccessController.class);
                    if (!publicationAccessController.isUserAuthorized(kmelia.getUserId(),
                            kmeliaPublication.getPk())) {
                        SilverLogger.getLogger(this).warn("Security alert from {0} with publication {1}",
                                kmelia.getUserId(), id);
                        return "/admin/jsp/accessForbidden.jsp";
                    }
                    kmelia.setSessionPublication(kmeliaPublication);

                    PublicationDetail pubDetail = kmeliaPublication.getDetail();
                    if (pubDetail.haveGotClone()) {
                        KmeliaPublication clone = kmelia.getPublication(pubDetail.getCloneId());
                        kmelia.setSessionClone(clone);
                    }
                } else {
                    kmeliaPublication = kmelia.getSessionPublication();
                    id = kmeliaPublication.getDetail().getPK().getId();
                }
                if (toolboxMode) {
                    destination = getDestination("ToUpdatePublicationHeader", kmelia, request);
                } else {
                    List<String> publicationLanguages = kmelia.getPublicationLanguages(); // languages of
                    // publication
                    // header and attachments
                    if (publicationLanguages.contains(kmelia.getCurrentLanguage())) {
                        request.setAttribute("ContentLanguage", kmelia.getCurrentLanguage());
                    } else {
                        request.setAttribute("ContentLanguage",
                                checkLanguage(kmelia, kmeliaPublication.getDetail()));
                    }
                    request.setAttribute("Languages", publicationLanguages);

                    // see also management
                    List<PublicationLink> links = kmeliaPublication.getCompleteDetail().getLinkList();
                    HashSet<String> linkedList = new HashSet<>(links.size());
                    for (PublicationLink link : links) {
                        linkedList.add(link.getTarget().getId() + "-" + link.getTarget().getComponentInstanceId());
                    }
                    // put into session the current list of selected publications (see also)
                    request.getSession().setAttribute(KmeliaConstants.PUB_TO_LINK_SESSION_KEY, linkedList);

                    request.setAttribute("Publication", kmeliaPublication);
                    request.setAttribute("PubId", id);
                    request.setAttribute("UserCanValidate",
                            kmelia.isUserCanValidatePublication() && kmelia.getSessionClone() == null);
                    request.setAttribute("ValidationStep", kmelia.getValidationStep());
                    request.setAttribute("ValidationType", kmelia.getValidationType());

                    // check if user is writer with approval right (versioning case)
                    request.setAttribute("WriterApproval", kmelia.isWriterApproval());
                    request.setAttribute("NotificationAllowed", kmelia.isNotificationAllowed());

                    // check is requested publication is an alias
                    boolean alias = checkAlias(kmelia, kmeliaPublication);

                    if (alias) {
                        request.setAttribute("Profile", "user");
                        request.setAttribute("TaxonomyOK", false);
                        request.setAttribute("ValidatorsOK", false);
                    } else {
                        request.setAttribute("Profile", kmelia.getProfile());
                        request.setAttribute("TaxonomyOK", kmelia.isPublicationTaxonomyOK());
                        request.setAttribute("ValidatorsOK", kmelia.isPublicationValidatorsOK());
                    }

                    request.setAttribute("Rang", kmelia.getRang());
                    if (kmelia.getSessionPublicationsList() != null) {
                        request.setAttribute("NbPublis", kmelia.getSessionPublicationsList().size());
                    } else {
                        request.setAttribute("NbPublis", 1);
                    }
                    putXMLDisplayerIntoRequest(kmeliaPublication.getDetail(), kmelia, request);
                    String fileAlreadyOpened = (String) request.getAttribute("FileAlreadyOpened");
                    boolean alreadyOpened = "1".equals(fileAlreadyOpened);
                    String attachmentId = (String) request.getAttribute("AttachmentId");
                    String documentId = (String) request.getAttribute("DocumentId");
                    if (!alreadyOpened && kmelia.openSingleAttachmentAutomatically()
                            && !kmelia.isCurrentPublicationHaveContent()) {
                        request.setAttribute("SingleAttachmentURL",
                                kmelia.getSingleAttachmentURLOfCurrentPublication(alias));
                    } else if (!alreadyOpened && attachmentId != null) {
                        request.setAttribute("SingleAttachmentURL", kmelia.getAttachmentURL(attachmentId, alias));
                    } else if (!alreadyOpened && documentId != null) {
                        request.setAttribute("SingleAttachmentURL", kmelia.getAttachmentURL(documentId, alias));
                    }

                    // Attachments area must be displayed or not ?
                    request.setAttribute("AttachmentsEnabled", kmelia.isAttachmentsEnabled());

                    // Last vistors area must be displayed or not ?
                    final boolean lastVisitorsEnabled = kmelia.isLastVisitorsEnabled();
                    request.setAttribute("LastVisitorsEnabled", lastVisitorsEnabled);
                    if (lastVisitorsEnabled) {
                        request.setAttribute("LastAccess", kmelia.getLastAccess(kmeliaPublication.getPk()));
                    }
                    request.setAttribute("PublicationRatingsAllowed", kmelia.isPublicationRatingAllowed());
                    request.setAttribute("SeeAlsoEnabled", kmelia.isSeeAlsoEnabled());

                    // Subscription management
                    setupRequestForSubscriptionNotificationSending(request, highestSilverpeasUserRoleOnCurrentTopic,
                            kmelia.getCurrentFolderPK(), kmeliaPublication.getDetail());

                    destination = rootDestination + "publication.jsp";
                }
            } else if (function.equals("PreviousPublication")) {
                // rcupration de la publication prcdente
                String pubId = kmelia.getPrevious();
                request.setAttribute("PubId", pubId);
                destination = getDestination("ViewPublication", kmelia, request);
            } else if (function.equals("NextPublication")) {
                // rcupration de la publication suivante
                String pubId = kmelia.getNext();
                request.setAttribute("PubId", pubId);
                destination = getDestination("ViewPublication", kmelia, request);
            } else if (function.startsWith("copy")) {
                String objectType = request.getParameter("Object");
                String objectId = request.getParameter("Id");
                if (StringUtil.isDefined(objectType) && "Node".equalsIgnoreCase(objectType)) {
                    kmelia.copyTopic(objectId);
                } else {
                    kmelia.copyPublication(objectId);
                }

                destination = URLUtil.getURL(URLUtil.CMP_CLIPBOARD, null, null)
                        + "Idle.jsp?message=REFRESHCLIPBOARD";
            } else if (function.startsWith("cut")) {
                String objectType = request.getParameter("Object");
                String objectId = request.getParameter("Id");
                if (StringUtil.isDefined(objectType) && "Node".equalsIgnoreCase(objectType)) {
                    kmelia.cutTopic(objectId);
                } else {
                    kmelia.cutPublication(objectId);
                }

                destination = URLUtil.getURL(URLUtil.CMP_CLIPBOARD, null, null)
                        + "Idle.jsp?message=REFRESHCLIPBOARD";
            } else if (function.equals("ReadingControl")) {
                PublicationDetail publication = kmelia.getSessionPublication().getDetail();
                request.setAttribute("LinkedPathString", kmelia.getSessionPath());
                request.setAttribute("Publication", publication);
                request.setAttribute("UserIds", kmelia.getUserIdsOfTopic());

                destination = rootDestination + "readingControlManager.jsp";
            } else if (function.startsWith("ViewAttachments")) {
                String flag = kmelia.getProfile();

                // Versioning is out of "Always visible publication" mode
                if (kmelia.isCloneNeeded() && !kmelia.isVersionControlled()) {
                    kmelia.clonePublication();
                }

                // put current publication
                if (!kmelia.isVersionControlled()) {
                    request.setAttribute("CurrentPublicationDetail", kmelia.getSessionPubliOrClone().getDetail());
                } else {
                    request.setAttribute("CurrentPublicationDetail", kmelia.getSessionPublication().getDetail());
                }

                // Paramtres de i18n
                List<String> attachmentLanguages = kmelia.getAttachmentLanguages();
                if (attachmentLanguages.contains(kmelia.getCurrentLanguage())) {
                    request.setAttribute("Language", kmelia.getCurrentLanguage());
                } else {
                    request.setAttribute("Language", checkLanguage(kmelia));
                }
                request.setAttribute("Languages", attachmentLanguages);

                request.setAttribute("XmlFormForFiles", kmelia.getXmlFormForFiles());

                destination = rootDestination + "attachmentManager.jsp?profile=" + flag;
            } else if (function.equals("DeletePublication")) {
                String pubId = request.getParameter("PubId");
                kmelia.deletePublication(pubId);

                if (kmaxMode) {
                    destination = getDestination("Main", kmelia, request);
                } else {
                    destination = getDestination("GoToCurrentTopic", kmelia, request);
                }
            } else if (function.equals("DeleteClone")) {
                kmelia.deleteClone();
                request.setAttribute("ForcedId", kmelia.getSessionPublication().getId());
                destination = getDestination("ViewPublication", kmelia, request);
            } else if (function.equals("ViewValidationSteps")) {
                request.setAttribute("LinkedPathString", kmelia.getSessionPath());
                request.setAttribute("Publication", kmelia.getSessionPubliOrClone().getDetail());
                request.setAttribute("ValidationSteps", kmelia.getValidationSteps());

                request.setAttribute("Role", kmelia.getProfile());

                destination = rootDestination + "validationSteps.jsp";
            } else if ("ValidatePublication".equals(function)) {
                String pubId = kmelia.getSessionPublication().getDetail().getPK().getId();
                boolean validationComplete = kmelia.validatePublication(pubId);
                if (validationComplete) {
                    request.setAttribute("Action", "ValidationComplete");
                    destination = getDestination("ViewPublication", kmelia, request);
                } else {
                    request.setAttribute("Action", "ValidationInProgress");
                    if (kmelia.getSessionClone() != null) {
                        destination = getDestination("ViewClone", kmelia, request);
                    } else {
                        destination = getDestination("ViewPublication", kmelia, request);
                    }
                }
            } else if (function.equals("ForceValidatePublication")) {
                String pubId = kmelia.getSessionPublication().getDetail().getPK().getId();
                kmelia.forcePublicationValidation(pubId);
                request.setAttribute("Action", "ValidationComplete");

                request.setAttribute("PubId", pubId);
                destination = getDestination("ViewPublication", kmelia, request);
            } else if ("Unvalidate".equals(function)) {
                String motive = request.getParameter("Motive");
                String pubId = kmelia.getSessionPublication().getDetail().getPK().getId();
                kmelia.unvalidatePublication(pubId, motive);

                request.setAttribute("Action", "Unvalidate");

                if (kmelia.getSessionClone() != null) {
                    destination = getDestination("ViewClone", kmelia, request);
                } else {
                    destination = getDestination("ViewPublication", kmelia, request);
                }
            } else if (function.equals("WantToSuspendPubli")) {
                String pubId = request.getParameter("PubId");

                PublicationDetail pubDetail = kmelia.getPublicationDetail(pubId);

                destination = rootDestination + "defermentMotive.jsp";
            } else if (function.equals("SuspendPublication")) {
                String motive = request.getParameter("Motive");
                String pubId = request.getParameter("PubId");

                kmelia.suspendPublication(pubId, motive);

                request.setAttribute("Action", "Suspend");

                destination = getDestination("ViewPublication", kmelia, request);
            } else if (function.equals("DraftIn")) {
                kmelia.draftInPublication();
                if (kmelia.getSessionClone() != null) {
                    // draft have generate a clone
                    destination = getDestination("ViewClone", kmelia, request);
                } else {
                    String from = request.getParameter("From");
                    if (StringUtil.isDefined(from)) {
                        destination = getDestination(from, kmelia, request);
                    } else {
                        destination = getDestination("ToUpdatePublicationHeader", kmelia, request);
                    }
                }
            } else if (function.equals("DraftOut")) {
                kmelia.draftOutPublication();

                destination = getDestination("ViewPublication", kmelia, request);
            } else if (function.equals("ToTopicWysiwyg")) {
                String topicId = request.getParameter("Id");
                String subTopicId = request.getParameter("ChildId");
                String flag = kmelia.getProfile();

                NodeDetail topic = kmelia.getSubTopicDetail(subTopicId);
                String browseInfo = kmelia.getSessionPathString();
                if (browseInfo != null && !browseInfo.contains(topic.getName())) {
                    browseInfo += topic.getName();
                }
                if (!StringUtil.isDefined(browseInfo)) {
                    browseInfo = kmelia.getString("TopicWysiwyg");
                } else {
                    browseInfo += " > " + kmelia.getString("TopicWysiwyg");
                }

                WysiwygRouting routing = new WysiwygRouting();
                WysiwygRouting.WysiwygRoutingContext context = WysiwygRouting.WysiwygRoutingContext
                        .fromComponentSessionController(kmelia).withBrowseInfo(browseInfo)
                        .withContributionId(
                                ContributionIdentifier.from(kmelia.getComponentId(), "Node_" + subTopicId, NODE))
                        .withContentLanguage(kmelia.getCurrentLanguage())
                        .withComeBackUrl(URLUtil.getApplicationURL()
                                + URLUtil.getURL(kmelia.getSpaceId(), kmelia.getComponentId())
                                + "FromTopicWysiwyg?Action=Search&Id=" + topicId + "&ChildId=" + subTopicId
                                + "&Profile=" + flag);

                destination = routing.getWysiwygEditorPath(context, request);
            } else if (function.equals("FromTopicWysiwyg")) {
                String subTopicId = request.getParameter("ChildId");

                kmelia.processTopicWysiwyg(subTopicId);

                destination = getDestination("GoToCurrentTopic", kmelia, request);
            } else if (function.equals("ChangeTopicStatus")) {
                String subTopicId = request.getParameter("ChildId");
                String newStatus = request.getParameter("Status");
                String recursive = request.getParameter("Recursive");

                if (recursive != null && recursive.equals("1")) {
                    kmelia.changeTopicStatus(newStatus, subTopicId, true);
                } else {
                    kmelia.changeTopicStatus(newStatus, subTopicId, false);
                }

                destination = getDestination("GoToCurrentTopic", kmelia, request);
            } else if (function.equals("ViewOnly")) {
                String id = request.getParameter("Id");
                destination = rootDestination + "publicationViewOnly.jsp?Id=" + id;
            } else if (function.equals("ImportFileUpload")) {
                destination = processFormUpload(kmelia, request, rootDestination, false);
            } else if (function.equals("ImportFilesUpload")) {
                destination = processFormUpload(kmelia, request, rootDestination, true);
            } else if (function.equals("ExportAttachementsToPDF")) {
                String topicId = request.getParameter("TopicId");
                // build an exploitable list by importExportPeas
                List<WAAttributeValuePair> publicationsIds = kmelia.getAllVisiblePublicationsByTopic(topicId);
                request.setAttribute("selectedResultsWa", publicationsIds);
                request.setAttribute("RootPK", new NodePK(topicId, kmelia.getComponentId()));
                // Go to importExportPeas
                destination = "/RimportExportPeas/jsp/ExportPDF";
            } else if (function.equals("NewPublication")) {
                request.setAttribute("Action", "New");
                request.setAttribute("ExtraForm", kmelia.getXmlFormForPublications());

                PublicationDetail volatilePublication = kmelia.prepareNewPublication();
                request.setAttribute("VolatilePublication", volatilePublication);

                PagesContext extraFormPageContext = new PagesContext();
                extraFormPageContext.setUserId(kmelia.getUserId());
                extraFormPageContext.setComponentId(kmelia.getComponentId());
                extraFormPageContext.setObjectId(volatilePublication.getPK().getId());
                extraFormPageContext.setNodeId(kmelia.getCurrentFolderId());
                extraFormPageContext.setLanguage(kmelia.getLanguage());
                request.setAttribute("ExtraFormPageContext", extraFormPageContext);

                destination = getDestination("ToPublicationHeader", kmelia, request);
            } else if (function.equals("ManageSubscriptions")) {
                destination = kmelia.manageSubscriptions();
            } else if (function.equals("AddPublication")) {
                List<FileItem> parameters = request.getFileItems();

                // create publication
                String positions = FileUploadUtil.getParameter(parameters, "KmeliaPubPositions");
                PdcClassificationEntity withClassification = PdcClassificationEntity.undefinedClassification();
                if (StringUtil.isDefined(positions)) {
                    withClassification = PdcClassificationEntity.fromJSON(positions);
                }
                PublicationDetail pubDetail = getPublicationDetail(parameters, kmelia);
                String newPubId = kmelia.createPublication(pubDetail, withClassification);

                if (kmelia.isReminderUsed()) {
                    PublicationDetail pubDetailCreated = kmelia.getPublicationDetail(newPubId);
                    kmelia.addPublicationReminder(pubDetailCreated, parameters);
                }

                // create thumbnail if exists
                boolean newThumbnail = ThumbnailController
                        .processThumbnail(new ResourceReference(newPubId, kmelia.getComponentId()), parameters);

                //process files
                Collection<UploadedFile> attachments = request.getUploadedFiles();
                kmelia.addUploadedFilesToPublication(attachments, pubDetail);

                String volatileId = FileUploadUtil.getParameter(parameters, "KmeliaPubVolatileId");
                if (StringUtil.isDefined(volatileId)) {
                    //process extra form
                    kmelia.saveXMLFormToPublication(pubDetail, parameters, false);
                }

                // force indexation to add thumbnail and attachments to publication index
                if ((newThumbnail || !attachments.isEmpty()) && pubDetail.isIndexable()) {
                    kmelia.getPublicationService().createIndex(pubDetail.getPK());
                }

                request.setAttribute("PubId", newPubId);
                processPath(kmelia, newPubId);
                StringBuffer requestURI = request.getRequestURL();
                destination = requestURI.substring(0, requestURI.indexOf("AddPublication"))
                        + "ViewPublication?PubId=" + newPubId;
            } else if ("UpdatePublication".equals(function)) {
                List<FileItem> parameters = request.getFileItems();

                PublicationDetail pubDetail = getPublicationDetail(parameters, kmelia);
                String pubId = pubDetail.getPK().getId();
                ThumbnailController.processThumbnail(new ResourceReference(pubId, kmelia.getComponentId()),
                        parameters);

                kmelia.updatePublication(pubDetail);

                if (kmelia.isReminderUsed()) {
                    kmelia.updatePublicationReminder(pubId, parameters);
                }

                if (kmelia.getSessionClone() != null) {
                    destination = getDestination("ViewClone", kmelia, request);
                } else {
                    request.setAttribute("PubId", pubId);
                    request.setAttribute("CheckPath", "1");
                    destination = getDestination("ViewPublication", kmelia, request);
                }
            } else if (function.equals("SelectValidator")) {
                String formElementName = request.getParameter("FormElementName");
                String formElementId = request.getParameter("FormElementId");
                String folderId = request.getParameter("FolderId");
                destination = kmelia.initUPToSelectValidator(formElementName, formElementId, folderId);
            } else if (function.equals("PublicationPaths")) {
                PublicationDetail publication = kmelia.getSessionPublication().getDetail();
                String pubId = publication.getPK().getId();
                request.setAttribute("Publication", publication);
                request.setAttribute("LinkedPathString", kmelia.getSessionPath());
                request.setAttribute("PathList", kmelia.getPublicationFathers(pubId));

                if (toolboxMode) {
                    request.setAttribute("Topics", kmelia.getAllTopics());
                } else {
                    List<Alias> aliases = kmelia.getAliases();
                    request.setAttribute("Aliases", aliases);
                    request.setAttribute("Components", kmelia.getComponents(aliases));
                }

                destination = rootDestination + "publicationPaths.jsp";
            } else if (function.equals("SetPath")) {
                String[] topics = request.getParameterValues("topicChoice");
                String loadedComponentIds = request.getParameter("LoadedComponentIds");

                Alias alias;
                List<Alias> aliases = new ArrayList<Alias>();
                for (int i = 0; topics != null && i < topics.length; i++) {
                    String topicId = topics[i];
                    StringTokenizer tokenizer = new StringTokenizer(topicId, ",");
                    String nodeId = tokenizer.nextToken();
                    String instanceId = tokenizer.nextToken();

                    alias = new Alias(nodeId, instanceId);
                    alias.setUserId(kmelia.getUserId());
                    aliases.add(alias);
                }

                // Tous les composants ayant un alias n'ont pas forcment t chargs
                List<Alias> oldAliases = kmelia.getAliases();
                for (Alias oldAlias : oldAliases) {
                    if (!loadedComponentIds.contains(oldAlias.getInstanceId())) {
                        // le composant de l'alias n'a pas t charg
                        aliases.add(oldAlias);
                    }
                }

                kmelia.setAliases(aliases);

                destination = getDestination("ViewPublication", kmelia, request);
            } else if (function.equals("ShowAliasTree")) {
                String componentId = request.getParameter("ComponentId");

                request.setAttribute("Tree", kmelia.getAliasTreeview(componentId));
                request.setAttribute("Aliases", kmelia.getAliases());

                destination = rootDestination + "treeview4PublicationPaths.jsp";
            } else if (function.equals("AddLinksToPublication")) {
                String id = request.getParameter("PubId");
                String topicId = request.getParameter("TopicId");
                //noinspection unchecked
                HashSet<String> list = (HashSet) request.getSession()
                        .getAttribute(KmeliaConstants.PUB_TO_LINK_SESSION_KEY);

                int nb = kmelia.addPublicationsToLink(id, list);

                request.setAttribute("NbLinks", Integer.toString(nb));

                destination = rootDestination + "publicationLinksManager.jsp?Action=Add&Id=" + topicId;
            } else if (function.equals("ExportTopic")) {
                String topicId = request.getParameter("TopicId");
                boolean exportFullApp = !StringUtil.isDefined(topicId) || NodePK.ROOT_NODE_ID.equals(topicId);
                if (kmaxMode) {
                    if (exportFullApp) {
                        destination = getDestination("KmaxExportComponent", kmelia, request);
                    } else {
                        destination = getDestination("KmaxExportPublications", kmelia, request);
                    }
                } else {
                    // build an exploitable list by importExportPeas
                    final List<WAAttributeValuePair> publicationsIds;
                    if (exportFullApp) {
                        publicationsIds = kmelia.getAllVisiblePublications();
                    } else {
                        publicationsIds = kmelia.getAllVisiblePublicationsByTopic(topicId);
                    }
                    request.setAttribute("selectedResultsWa", publicationsIds);
                    request.setAttribute("RootPK", new NodePK(topicId, kmelia.getComponentId()));
                    // Go to importExportPeas
                    destination = "/RimportExportPeas/jsp/SelectExportMode";
                }
            } else if (function.equals("ExportPublications")) {
                String selectedIds = request.getParameter("SelectedIds");
                String notSelectedIds = request.getParameter("NotSelectedIds");
                List<PublicationPK> pks = kmelia.processSelectedPublicationIds(selectedIds, notSelectedIds);

                List<WAAttributeValuePair> publicationIds = new ArrayList<WAAttributeValuePair>();
                for (PublicationPK pk : pks) {
                    publicationIds.add(new WAAttributeValuePair(pk.getId(), pk.getInstanceId()));
                }
                request.setAttribute("selectedResultsWa", publicationIds);
                request.setAttribute("RootPK", new NodePK(kmelia.getCurrentFolderId(), kmelia.getComponentId()));
                kmelia.resetSelectedPublicationPKs();
                // Go to importExportPeas
                destination = "/RimportExportPeas/jsp/SelectExportMode";
            } else if (function.equals("ToPubliContent")) {
                CompletePublication completePublication = kmelia.getSessionPubliOrClone().getCompleteDetail();
                if (WysiwygController.haveGotWysiwyg(kmelia.getComponentId(),
                        completePublication.getPublicationDetail().getPK().getId(), kmelia.getCurrentLanguage())) {

                    destination = getDestination("ToWysiwyg", kmelia, request);
                } else {
                    String infoId = completePublication.getPublicationDetail().getInfoId();
                    if (infoId == null || "0".equals(infoId)) {
                        List<String> usedModels = kmelia.getModelUsed();
                        if (usedModels.size() == 1) {
                            String modelId = usedModels.get(0);
                            if ("WYSIWYG".equals(modelId)) {
                                // Wysiwyg content
                                destination = getDestination("ToWysiwyg", kmelia, request);
                            } else {
                                // XML template
                                request.setAttribute("Name", modelId);
                                destination = getDestination("GoToXMLForm", kmelia, request);
                            }
                        } else {
                            destination = getDestination("ListModels", kmelia, request);
                        }
                    } else {
                        destination = getDestination("GoToXMLForm", kmelia, request);
                    }
                }
            } else if (function.equals("ListModels")) {
                setTemplatesUsedIntoRequest(kmelia, request);

                // put current publication
                request.setAttribute("CurrentPublicationDetail", kmelia.getSessionPublication().getDetail());

                destination = rootDestination + "modelsList.jsp";
            } else if (function.equals("ModelUsed")) {
                request.setAttribute("XMLForms", kmelia.getForms());

                Collection<String> modelUsed = kmelia.getModelUsed();
                request.setAttribute("ModelUsed", modelUsed);

                destination = rootDestination + "modelUsedList.jsp";
            } else if (function.equals("SelectModel")) {
                kmelia.setModelUsed(request.getParameterValues("modelChoice"));
                destination = getDestination("GoToCurrentTopic", kmelia, request);
            } else if ("ChangeTemplate".equals(function)) {
                kmelia.removePublicationContent();
                destination = getDestination("ToPubliContent", kmelia, request);
            } else if ("ToWysiwyg".equals(function)) {
                if (kmelia.isCloneNeeded()) {
                    kmelia.clonePublication();
                }
                // put current publication
                PublicationDetail publication = kmelia.getSessionPubliOrClone().getDetail();

                String browseInfo;
                if (kmaxMode) {
                    browseInfo = publication.getName();
                } else {
                    browseInfo = kmelia.getSessionPathString();
                    if (StringUtil.isDefined(browseInfo)) {
                        browseInfo += " > ";
                    }
                    browseInfo += publication.getName(kmelia.getCurrentLanguage());
                }

                // Subscription management
                setupRequestForSubscriptionNotificationSending(request, highestSilverpeasUserRoleOnCurrentTopic,
                        kmelia.getCurrentFolderPK(), publication);

                WysiwygRouting routing = new WysiwygRouting();
                WysiwygRouting.WysiwygRoutingContext context = WysiwygRouting.WysiwygRoutingContext
                        .fromComponentSessionController(kmelia).withBrowseInfo(browseInfo)
                        .withContributionId(ContributionIdentifier.from(kmelia.getComponentId(),
                                publication.getId(), publication.getContributionType()))
                        .withContentLanguage(checkLanguage(kmelia, publication))
                        .withComeBackUrl(URLUtil.getApplicationURL() + kmelia.getComponentUrl()
                                + "FromWysiwyg?PubId=" + publication.getId())
                        .withIndexation(false);
                destination = routing.getWysiwygEditorPath(context, request);
            } else if ("FromWysiwyg".equals(function)) {
                String id = request.getParameter("PubId");
                if (kmelia.getSessionClone() != null
                        && id.equals(kmelia.getSessionClone().getDetail().getPK().getId())) {
                    destination = getDestination("ViewClone", kmelia, request);
                } else {
                    destination = getDestination("ViewPublication", kmelia, request);
                }
            } else if (function.equals("GoToXMLForm")) {
                String xmlFormName = (String) request.getAttribute("Name");
                if (!StringUtil.isDefined(xmlFormName)) {
                    xmlFormName = request.getParameter("Name");
                }
                setXMLUpdateForm(request, kmelia, xmlFormName);
                // put current publication
                request.setAttribute("CurrentPublicationDetail", kmelia.getSessionPubliOrClone().getDetail());
                // template can be changed only if current topic is using at least two templates
                setTemplatesUsedIntoRequest(kmelia, request);
                @SuppressWarnings("unchecked")
                Collection<PublicationTemplate> templates = (Collection<PublicationTemplate>) request
                        .getAttribute("XMLForms");
                boolean wysiwygUsable = (Boolean) request.getAttribute("WysiwygValid");
                request.setAttribute("IsChangingTemplateAllowed",
                        templates.size() >= 2 || (!templates.isEmpty() && wysiwygUsable));

                setupRequestForSubscriptionNotificationSending(request, highestSilverpeasUserRoleOnCurrentTopic,
                        kmelia.getCurrentFolderPK(), kmelia.getSessionPubliOrClone().getDetail());

                destination = rootDestination + "xmlForm.jsp";
            } else if (function.equals("UpdateXMLForm")) {
                List<FileItem> items = request.getFileItems();

                kmelia.saveXMLForm(items, true);

                if (kmelia.getSessionClone() != null) {
                    destination = getDestination("ViewClone", kmelia, request);
                } else if (kmaxMode) {
                    destination = getDestination("ViewAttachments", kmelia, request);
                } else {
                    destination = getDestination("ViewPublication", kmelia, request);
                }
            } else if (function.startsWith("ToOrderPublications")) {
                List<KmeliaPublication> publications = kmelia.getSessionPublicationsList();

                request.setAttribute("Publications", publications);
                request.setAttribute("Path", kmelia.getSessionPath());

                destination = rootDestination + "orderPublications.jsp";
            } else if (function.startsWith("OrderPublications")) {
                String sortedIds = request.getParameter("sortedIds");

                StringTokenizer tokenizer = new StringTokenizer(sortedIds, ",");
                List<String> ids = new ArrayList<String>();
                while (tokenizer.hasMoreTokens()) {
                    ids.add(tokenizer.nextToken());
                }
                kmelia.orderPublications(ids);

                destination = getDestination("GoToCurrentTopic", kmelia, request);
            } else if (function.equals("ToOrderTopics")) {
                String id = request.getParameter("Id");
                if (!SilverpeasRole.admin.isInRole(kmelia.getUserTopicProfile(id))) {
                    destination = "/admin/jsp/accessForbidden.jsp";
                } else {
                    TopicDetail topic = kmelia.getTopic(id);
                    request.setAttribute("Nodes", topic.getNodeDetail().getChildrenDetails());
                    destination = rootDestination + "orderTopics.jsp";
                }
            } else if ("ViewTopicProfiles".equals(function)) {
                String role = request.getParameter("Role");
                if (!StringUtil.isDefined(role)) {
                    role = SilverpeasRole.admin.toString();
                }

                String id = request.getParameter("NodeId");
                if (!StringUtil.isDefined(id)) {
                    id = (String) request.getAttribute("NodeId");
                }
                if (!(kmelia.isTopicAdmin(id) || kmelia.isUserComponentAdmin())) {
                    SilverLogger.getLogger(this).warn("Security alert from {0}", kmelia.getUserId());
                    return "/admin/jsp/accessForbidden.jsp";
                }
                request.setAttribute("Profiles", kmelia.getTopicProfiles(id));
                NodeDetail topic = kmelia.getNodeHeader(id);
                ProfileInst profile;
                if (topic.haveInheritedRights()) {
                    profile = kmelia.getTopicProfile(role, Integer.toString(topic.getRightsDependsOn()));

                    request.setAttribute("RightsDependsOn", "AnotherTopic");
                } else if (topic.haveLocalRights()) {
                    profile = kmelia.getTopicProfile(role, Integer.toString(topic.getRightsDependsOn()));

                    request.setAttribute("RightsDependsOn", "ThisTopic");
                } else {
                    profile = kmelia.getProfile(role);
                    // Rights of the component
                    request.setAttribute("RightsDependsOn", "ThisComponent");
                }

                request.setAttribute("CurrentProfile", profile);
                request.setAttribute("Groups", kmelia.groupIds2Groups(profile.getAllGroups()));
                request.setAttribute("Users", kmelia.userIds2Users(profile.getAllUsers()));
                List<NodeDetail> path = kmelia.getTopicPath(id);
                request.setAttribute("Path", kmelia.displayPath(path, true, 3));
                request.setAttribute("NodeDetail", topic);

                destination = rootDestination + "topicProfiles.jsp";
            } else if (function.equals("TopicProfileSelection")) {
                String role = request.getParameter("Role");
                String nodeId = request.getParameter("NodeId");
                String[] userIds = StringUtil.split(request.getParameter("UserPanelCurrentUserIds"), ',');
                String[] groupIds = StringUtil.split(request.getParameter("UserPanelCurrentGroupIds"), ',');
                try {
                    kmelia.initUserPanelForTopicProfile(role, nodeId, groupIds, userIds);
                } catch (Exception e) {
                    SilverLogger.getLogger(this).error(e.getMessage(), e);
                }
                destination = Selection.getSelectionURL();
            } else if (function.equals("TopicProfileSetUsersAndGroups")) {
                String role = request.getParameter("Role");
                String nodeId = request.getParameter("NodeId");
                String[] userIds = StringUtil.split(request.getParameter("roleItems" + "UserPanelCurrentUserIds"),
                        ',');
                String[] groupIds = StringUtil.split(request.getParameter("roleItems" + "UserPanelCurrentGroupIds"),
                        ',');

                if (kmelia.isTopicAdmin(nodeId) || kmelia.isUserComponentAdmin()) {
                    kmelia.updateTopicRole(role, nodeId, groupIds, userIds);
                } else {
                    SilverLogger.getLogger(this).warn("Security alert from {0}", kmelia.getUserId());
                }
                destination = getDestination("ViewTopicProfiles", kmelia, request);
            } else if (function.equals("CloseWindow")) {
                destination = rootDestination + "closeWindow.jsp";
            }
            /**
             * *************************
             * Kmax mode ***********************
             */
            else if (function.equals("KmaxMain")) {
                destination = rootDestination + "kmax.jsp?Action=KmaxView&Profile=" + kmelia.getProfile();
            } else if (function.equals("KmaxAxisManager")) {
                destination = rootDestination + "kmax_axisManager.jsp?Action=KmaxViewAxis&Profile="
                        + kmelia.getProfile();
            } else if (function.equals("KmaxAddAxis")) {
                String newAxisName = request.getParameter("Name");
                String newAxisDescription = request.getParameter("Description");
                NodeDetail axis = new NodeDetail("-1", newAxisName, newAxisDescription, 0, "X");
                axis.setCreationDate(DateUtil.today2SQLDate());
                axis.setCreatorId(kmelia.getUserId());
                // I18N
                I18NHelper.setI18NInfo(axis, request);
                kmelia.addAxis(axis);

                request.setAttribute("urlToReload", "KmaxAxisManager");
                destination = rootDestination + "closeWindow.jsp";
            } else if (function.equals("KmaxUpdateAxis")) {
                String axisId = request.getParameter("AxisId");
                String newAxisName = request.getParameter("AxisName");
                String newAxisDescription = request.getParameter("AxisDescription");
                NodeDetail axis = new NodeDetail(axisId, newAxisName, newAxisDescription, 0, "X");
                // I18N
                I18NHelper.setI18NInfo(axis, request);
                kmelia.updateAxis(axis);
                destination = getDestination("KmaxAxisManager", kmelia, request);
            } else if (function.equals("KmaxDeleteAxis")) {
                String axisId = request.getParameter("AxisId");
                kmelia.deleteAxis(axisId);
                destination = getDestination("KmaxAxisManager", kmelia, request);
            } else if (function.equals("KmaxManageAxis")) {
                String axisId = request.getParameter("AxisId");
                String translation = request.getParameter("Translation");
                request.setAttribute("Translation", translation);
                destination = rootDestination + "kmax_axisManager.jsp?Action=KmaxManageAxis&Profile="
                        + kmelia.getProfile() + "&AxisId=" + axisId;
            } else if (function.equals("KmaxManagePosition")) {
                String positionId = request.getParameter("PositionId");
                String translation = request.getParameter("Translation");
                request.setAttribute("Translation", translation);
                destination = rootDestination + "kmax_axisManager.jsp?Action=KmaxManagePosition&Profile="
                        + kmelia.getProfile() + "&PositionId=" + positionId;
            } else if (function.equals("KmaxAddPosition")) {
                String axisId = request.getParameter("AxisId");
                String newPositionName = request.getParameter("Name");
                String newPositionDescription = request.getParameter("Description");
                String translation = request.getParameter("Translation");
                NodeDetail position = new NodeDetail("toDefine", newPositionName, newPositionDescription, 0, "X");
                // I18N
                I18NHelper.setI18NInfo(position, request);
                kmelia.addPosition(axisId, position);
                request.setAttribute("AxisId", axisId);
                request.setAttribute("Translation", translation);
                destination = getDestination("KmaxManageAxis", kmelia, request);
            } else if (function.equals("KmaxUpdatePosition")) {
                String positionId = request.getParameter("PositionId");
                String positionName = request.getParameter("PositionName");
                String positionDescription = request.getParameter("PositionDescription");
                NodeDetail position = new NodeDetail(positionId, positionName, positionDescription, 0, "X");
                // I18N
                I18NHelper.setI18NInfo(position, request);
                kmelia.updatePosition(position);
                destination = getDestination("KmaxAxisManager", kmelia, request);
            } else if (function.equals("KmaxDeletePosition")) {
                String positionId = request.getParameter("PositionId");
                kmelia.deletePosition(positionId);
                destination = getDestination("KmaxAxisManager", kmelia, request);
            } else if (function.equals("KmaxViewUnbalanced")) {
                List<KmeliaPublication> publications = kmelia.getUnbalancedPublications();
                kmelia.setSessionPublicationsList(publications);
                kmelia.orderPubs();

                destination = rootDestination + "kmax.jsp?Action=KmaxViewUnbalanced&Profile=" + kmelia.getProfile();
            } else if (function.equals("KmaxViewBasket")) {
                TopicDetail basket = kmelia.getTopic("1");
                List<KmeliaPublication> publications = (List<KmeliaPublication>) basket.getKmeliaPublications();
                kmelia.setSessionPublicationsList(publications);
                kmelia.orderPubs();

                destination = rootDestination + "kmax.jsp?Action=KmaxViewBasket&Profile=" + kmelia.getProfile();

            } else if (function.equals("KmaxViewToValidate")) {
                destination = rootDestination + "kmax.jsp?Action=KmaxViewToValidate&Profile=" + kmelia.getProfile();
            } else if (function.equals("KmaxSearch")) {
                String axisValuesStr = request.getParameter("SearchCombination");
                if (!StringUtil.isDefined(axisValuesStr)) {
                    axisValuesStr = (String) request.getAttribute("SearchCombination");
                }
                String timeCriteria = request.getParameter("TimeCriteria");

                List<String> combination = kmelia.getCombination(axisValuesStr);
                List<KmeliaPublication> publications;
                if (StringUtil.isDefined(timeCriteria) && !"X".equals(timeCriteria)) {
                    publications = kmelia.search(combination, Integer.parseInt(timeCriteria));
                } else {
                    publications = kmelia.search(combination);
                }

                kmelia.setIndexOfFirstPubToDisplay("0");
                kmelia.orderPubs();
                kmelia.setSessionCombination(combination);
                kmelia.setSessionTimeCriteria(timeCriteria);

                destination = rootDestination + "kmax.jsp?Action=KmaxSearchResult&Profile=" + kmelia.getProfile();
            } else if (function.equals("KmaxSearchResult")) {
                if (kmelia.getSessionCombination() == null) {
                    destination = getDestination("KmaxMain", kmelia, request);
                } else {
                    destination = rootDestination + "kmax.jsp?Action=KmaxSearchResult&Profile="
                            + kmelia.getProfile();
                }
            } else if (function.equals("KmaxViewCombination")) {
                request.setAttribute("CurrentCombination", kmelia.getCurrentCombination());
                destination = rootDestination + "kmax_viewCombination.jsp?Profile=" + kmelia.getProfile();
            } else if (function.equals("KmaxAddCoordinate")) {
                String pubId = request.getParameter("PubId");
                String axisValuesStr = request.getParameter("SearchCombination");
                StringTokenizer st = new StringTokenizer(axisValuesStr, ",");
                List<String> combination = new ArrayList<String>();
                String axisValue;
                while (st.hasMoreTokens()) {
                    axisValue = st.nextToken();
                    // axisValue is xx/xx/xx where xx are nodeId
                    axisValue = axisValue.substring(axisValue.lastIndexOf('/') + 1, axisValue.length());
                    combination.add(axisValue);
                }
                kmelia.addPublicationToCombination(pubId, combination);
                // Store current combination
                kmelia.setCurrentCombination(kmelia.getCombination(axisValuesStr));
                destination = getDestination("KmaxViewCombination", kmelia, request);
            } else if (function.equals("KmaxDeleteCoordinate")) {
                String coordinateId = request.getParameter("CoordinateId");
                String pubId = request.getParameter("PubId");
                kmelia.deletePublicationFromCombination(pubId, coordinateId);
                destination = getDestination("KmaxViewCombination", kmelia, request);
            } else if (function.equals("KmaxExportComponent")) {
                // build an exploitable list by importExportPeas
                List<WAAttributeValuePair> publicationsIds = kmelia.getAllVisiblePublications();
                request.setAttribute("selectedResultsWa", publicationsIds);

                // Go to importExportPeas
                destination = "/RimportExportPeas/jsp/KmaxExportComponent";
            } else if (function.equals("KmaxExportPublications")) {
                // build an exploitable list by importExportPeas
                List<WAAttributeValuePair> publicationsIds = kmelia.getCurrentPublicationsList();
                List<String> combination = kmelia.getSessionCombination();
                // get the time axis
                String timeCriteria = null;
                if (kmelia.isTimeAxisUsed() && StringUtil.isDefined(kmelia.getSessionTimeCriteria())) {
                    LocalizationBundle timeSettings = ResourceLocator
                            .getLocalizationBundle("org.silverpeas.kmelia.multilang.timeAxisBundle");
                    if (kmelia.getSessionTimeCriteria().equals("X")) {
                        timeCriteria = null;
                    } else {
                        String localizedCriteria = timeSettings.getString(kmelia.getSessionTimeCriteria());
                        if (localizedCriteria == null || localizedCriteria.trim().isEmpty()) {
                            localizedCriteria = "";
                        }
                        timeCriteria = "<b>" + kmelia.getString("TimeAxis") + "</b> > " + localizedCriteria;
                    }
                }
                request.setAttribute("selectedResultsWa", publicationsIds);
                request.setAttribute("Combination", combination);
                request.setAttribute("TimeCriteria", timeCriteria);
                // Go to importExportPeas
                destination = "/RimportExportPeas/jsp/KmaxExportPublications";
            } else if ("statistics".equals(function)) {
                destination = rootDestination + STATISTIC_REQUEST_HANDLER.handleRequest(request, function, kmelia);
            } else if ("statSelectionGroup".equals(function)) {
                destination = STATISTIC_REQUEST_HANDLER.handleRequest(request, function, kmelia);
            } else if ("SetPublicationValidator".equals(function)) {
                String userIds = request.getParameter("ValideurId");
                kmelia.setPublicationValidator(userIds);
                destination = getDestination("ViewPublication", kmelia, request);
            } else {
                destination = rootDestination + function;
            }

            if (profileError) {
                destination = ResourceLocator.getGeneralSettingBundle().getString("sessionTimeout");
            }
        } catch (Exception exceAll) {
            request.setAttribute("javax.servlet.jsp.jspException", exceAll);
            return "/admin/jsp/errorpageMain.jsp";
        }
        return destination;
    }

    @Override
    protected boolean checkUserAuthorization(final String function, final KmeliaSessionController kmelia) {
        KmeliaActionAccessController actionAccessController = ServiceProvider
                .getService(KmeliaActionAccessController.class);
        return actionAccessController.hasRightAccess(function, kmelia.getHighestSilverpeasUserRole());
    }

    private String getDocumentNotFoundDestination(KmeliaSessionController kmelia, HttpServletRequest request) {
        request.setAttribute("ComponentId", kmelia.getComponentId());
        return "/admin/jsp/documentNotFound.jsp";
    }

    private PublicationDetail getPublicationDetail(List<FileItem> parameters, KmeliaSessionController kmelia)
            throws Exception {
        String id = FileUploadUtil.getParameter(parameters, "KmeliaPubId");
        String status = FileUploadUtil.getParameter(parameters, "KmeliaPubStatus");
        String name = FileUploadUtil.getParameter(parameters, "KmeliaPubName");
        String description = FileUploadUtil.getParameter(parameters, "KmeliaPubDescription");
        String keywords = FileUploadUtil.getParameter(parameters, "KmeliaPubKeywords");
        String beginDate = FileUploadUtil.getParameter(parameters, "KmeliaPubBeginDate");
        String endDate = FileUploadUtil.getParameter(parameters, "KmeliaPubEndDate");
        String version = FileUploadUtil.getParameter(parameters, "KmeliaPubVersion");
        String importance = FileUploadUtil.getParameter(parameters, "KmeliaPubImportance");
        String beginHour = FileUploadUtil.getParameter(parameters, "KmeliaPubBeginHour");
        String endHour = FileUploadUtil.getParameter(parameters, "KmeliaPubEndHour");
        String author = FileUploadUtil.getParameter(parameters, "KmeliaPubAuthor");
        String targetValidatorId = FileUploadUtil.getParameter(parameters, "KmeliaPubValideurId");
        String tempId = FileUploadUtil.getParameter(parameters, "KmeliaPubTempId");
        String infoId = FileUploadUtil.getParameter(parameters, "KmeliaPubInfoId");
        String draftOutDate = FileUploadUtil.getParameter(parameters, "KmeliaPubDraftOutDate");

        Date jBeginDate = null;
        Date jEndDate = null;
        Date jDraftOutDate = null;

        if (StringUtil.isDefined(beginDate)) {
            jBeginDate = DateUtil.stringToDate(beginDate, kmelia.getLanguage());
        }
        if (StringUtil.isDefined(endDate)) {
            jEndDate = DateUtil.stringToDate(endDate, kmelia.getLanguage());
        }
        if (StringUtil.isDefined(draftOutDate)) {
            jDraftOutDate = DateUtil.stringToDate(draftOutDate, kmelia.getLanguage());
        }

        String pubId = "X";
        if (StringUtil.isDefined(id)) {
            pubId = id;
        }
        PublicationDetail pubDetail = new PublicationDetail(pubId, name, description, null, jBeginDate, jEndDate,
                null, importance, version, keywords, "", status, "", author);
        pubDetail.setBeginHour(beginHour);
        pubDetail.setEndHour(endHour);
        pubDetail.setStatus(status);
        pubDetail.setDraftOutDate(jDraftOutDate);
        if (StringUtil.isDefined(targetValidatorId)) {
            pubDetail.setTargetValidatorId(targetValidatorId);
        }

        pubDetail.setCloneId(tempId);

        if (StringUtil.isDefined(infoId)) {
            pubDetail.setInfoId(infoId);
        }

        I18NHelper.setI18NInfo(pubDetail, parameters);

        return pubDetail;
    }

    /**
     * Process Form Upload for publications import
     * @param kmeliaScc
     * @param request
     * @param routeDestination
     * @return destination
     */
    private String processFormUpload(KmeliaSessionController kmeliaScc, HttpRequest request,
            String routeDestination, boolean isMassiveMode) {
        String destination = "";
        String topicId = "";
        String importMode;
        boolean draftMode = false;
        String logicalName;
        String message;
        boolean error = false;

        String tempFolderName;
        String tempFolderPath = null;

        String fileType;
        long fileSize;
        long processStart = new Date().getTime();
        LocalizationBundle attachmentResourceLocator = ResourceLocator.getLocalizationBundle(
                "org.silverpeas.util.attachment.multilang.attachment", kmeliaScc.getLanguage());
        FileItem fileItem;
        int versionType = DocumentVersion.TYPE_DEFAULT_VERSION;

        try {
            List<FileItem> items = request.getFileItems();
            topicId = FileUploadUtil.getParameter(items, "topicId");
            importMode = FileUploadUtil.getParameter(items, "opt_importmode");

            String sVersionType = FileUploadUtil.getParameter(items, "opt_versiontype");
            if (StringUtil.isDefined(sVersionType)) {
                versionType = Integer.parseInt(sVersionType);
            }

            String sDraftMode = FileUploadUtil.getParameter(items, "chk_draft");
            if (StringUtil.isDefined(sDraftMode)) {
                draftMode = StringUtil.getBooleanValue(sDraftMode);
            }

            fileItem = FileUploadUtil.getFile(items, "file_name");

            if (fileItem != null) {
                logicalName = fileItem.getName();
                if (logicalName != null) {
                    boolean runOnUnix = !FileUtil.isWindows();
                    if (runOnUnix) {
                        logicalName = logicalName.replace('\\', File.separatorChar);
                    }

                    logicalName = logicalName.substring(logicalName.lastIndexOf(File.separator) + 1,
                            logicalName.length());

                    // Name of temp folder: timestamp and userId
                    tempFolderName = Long.toString(System.currentTimeMillis()) + "_" + kmeliaScc.getUserId();

                    // Mime type of the file
                    fileType = fileItem.getContentType();

                    // Zip contentType not detected under Firefox !
                    if (!ClientBrowserUtil.isInternetExplorer(request)) {
                        fileType = MimeTypes.ARCHIVE_MIME_TYPE;
                    }

                    fileSize = fileItem.getSize();

                    // Directory Temp for the uploaded file
                    tempFolderPath = FileRepositoryManager.getAbsolutePath(kmeliaScc.getComponentId())
                            + ResourceLocator.getGeneralSettingBundle().getString("RepositoryTypeTemp")
                            + File.separator + tempFolderName;
                    if (!new File(tempFolderPath).exists()) {
                        FileRepositoryManager.createAbsolutePath(kmeliaScc.getComponentId(),
                                ResourceLocator.getGeneralSettingBundle().getString("RepositoryTypeTemp")
                                        + File.separator + tempFolderName);
                    }

                    // Creation of the file in the temp folder
                    File fileUploaded = new File(FileRepositoryManager.getAbsolutePath(kmeliaScc.getComponentId())
                            + ResourceLocator.getGeneralSettingBundle().getString("RepositoryTypeTemp")
                            + File.separator + tempFolderName + File.separator + logicalName);
                    fileItem.write(fileUploaded);

                    // Is a real file ?
                    if (fileSize <= 0L) {
                        // File access failed
                        message = attachmentResourceLocator.getString("liaisonInaccessible");
                        error = true;
                    } else {
                        // Import !!
                        ImportReport importReport = kmeliaScc.importFile(fileUploaded, importMode, draftMode,
                                versionType);
                        long processDuration = new Date().getTime() - processStart;

                        // Compute nbPublication created
                        int nbPublication = kmeliaScc.getNbPublicationImported(importReport);

                        // nbFiles imported (only in unitary Import mode)
                        int nbFiles = importReport.getNbFilesProcessed();

                        // Title for popup report
                        String importModeTitle;
                        if (importMode.equals(KmeliaSessionController.UNITARY_IMPORT_MODE)) {
                            importModeTitle = kmeliaScc.getString("kmelia.ImportModeUnitaireTitre");
                        } else {
                            importModeTitle = kmeliaScc.getString("kmelia.ImportModeMassifTitre");
                        }
                        message = kmeliaScc.getErrorMessageImportation(importReport, importMode);

                        if (message != null && importMode.equals(KmeliaSessionController.UNITARY_IMPORT_MODE)) {
                            error = true;
                        }

                        request.setAttribute("NbPublication", nbPublication);
                        request.setAttribute("NbFiles", nbFiles);
                        request.setAttribute("ProcessDuration",
                                FileRepositoryManager.formatFileUploadTime(processDuration));
                        request.setAttribute("ImportMode", importMode);
                        request.setAttribute("DraftMode", draftMode);
                        request.setAttribute("Title", importModeTitle);
                        request.setAttribute("Context", URLUtil.getApplicationURL());
                        request.setAttribute("Message", message);

                        destination = routeDestination + "reportImportFiles.jsp";

                        String componentId = kmeliaScc.getComponentId();
                        if (kmeliaScc.isDefaultClassificationModifiable(topicId, componentId)) {
                            List<PublicationDetail> publicationDetails = kmeliaScc
                                    .getListPublicationImported(importReport, importMode);
                            if (publicationDetails.size() > 0) {
                                request.setAttribute("PublicationsDetails", publicationDetails);
                                destination = routeDestination + "validateImportedFilesClassification.jsp";
                            }
                        }
                    }

                    // Delete temp folder
                    FileFolderManager.deleteFolder(tempFolderPath);

                } else {
                    // the field did not contain a file
                    message = attachmentResourceLocator.getString("liaisonInaccessible");
                    error = true;
                }
            } else {
                // the field did not contain a file
                message = attachmentResourceLocator.getString("liaisonInaccessible");
                error = true;
            }

            if (error) {
                request.setAttribute("Message", message);
                request.setAttribute("TopicId", topicId);
                destination = routeDestination + "importOneFile.jsp";
                if (isMassiveMode) {
                    destination = routeDestination + "importMultiFiles.jsp";
                }
            }
        } catch (Exception e) {
            String exMessage = SilverpeasTransverseErrorUtil.performExceptionMessage(e, kmeliaScc.getLanguage());
            if (StringUtil.isNotDefined(exMessage)) {
                request.setAttribute("Message", e.getMessage());
            }
            // Other exception
            request.setAttribute("TopicId", topicId);
            destination = routeDestination + "importOneFile.jsp";
            if (isMassiveMode) {
                destination = routeDestination + "importMultiFiles.jsp";
            }

            SilverLogger.getLogger(this).error("Attachment upload failure", e);
        } finally {
            if (tempFolderPath != null) {
                FileFolderManager.deleteFolder(tempFolderPath);
            }
        }
        return destination;
    }

    private void processPath(KmeliaSessionController kmeliaSC, String id) {
        if (!kmeliaSC.isKmaxMode()) {
            NodePK pk;
            if (!StringUtil.isDefined(id)) {
                pk = kmeliaSC.getCurrentFolderPK();
            } else {
                pk = kmeliaSC.getAllowedPublicationFather(id); // get publication parent
                kmeliaSC.setCurrentFolderId(pk.getId(), true);
            }

            Collection<NodeDetail> pathColl = kmeliaSC.getTopicPath(pk.getId());
            String linkedPathString = kmeliaSC.displayPath(pathColl, true, 3);
            String pathString = kmeliaSC.displayPath(pathColl, false, 3);
            kmeliaSC.setSessionPath(linkedPathString);
            kmeliaSC.setSessionPathString(pathString);
        }
    }

    private void putXMLDisplayerIntoRequest(PublicationDetail pubDetail, KmeliaSessionController kmelia,
            HttpServletRequest request) throws PublicationTemplateException, FormException {
        String infoId = pubDetail.getInfoId();
        String pubId = pubDetail.getPK().getId();
        if (!StringUtil.isInteger(infoId)) {
            PublicationTemplateImpl pubTemplate = (PublicationTemplateImpl) getPublicationTemplateManager()
                    .getPublicationTemplate(pubDetail.getPK().getInstanceId() + ":" + infoId);
            Form formView = pubTemplate.getViewForm();
            // get displayed language
            String language = checkLanguage(kmelia, pubDetail);
            RecordSet recordSet = pubTemplate.getRecordSet();
            DataRecord data = recordSet.getRecord(pubId, language);
            if (data == null) {
                data = recordSet.getEmptyRecord();
                data.setId(pubId);
            }
            request.setAttribute("XMLForm", formView);
            request.setAttribute("XMLData", data);
        }
    }

    private void setXMLUpdateForm(HttpRequest request, KmeliaSessionController kmelia, String xmlFormName)
            throws PublicationTemplateException, FormException {
        PublicationDetail pubDetail = kmelia.getSessionPubliOrClone().getDetail();
        String pubId = pubDetail.getPK().getId();

        String xmlFormShortName;
        if (!StringUtil.isDefined(xmlFormName)) {
            xmlFormShortName = pubDetail.getInfoId();
            xmlFormName = null;
        } else {
            xmlFormShortName = xmlFormName.substring(xmlFormName.indexOf('/') + 1, xmlFormName.indexOf('.'));
            // register xmlForm to publication
            getPublicationTemplateManager()
                    .addDynamicPublicationTemplate(kmelia.getComponentId() + ":" + xmlFormShortName, xmlFormName);
        }
        PublicationTemplateImpl pubTemplate = (PublicationTemplateImpl) getPublicationTemplateManager()
                .getPublicationTemplate(kmelia.getComponentId() + ':' + xmlFormShortName, xmlFormName);
        Form formUpdate = pubTemplate.getUpdateForm();
        RecordSet recordSet = pubTemplate.getRecordSet();

        // get displayed language
        String language = checkLanguage(kmelia, pubDetail);

        DataRecord data = recordSet.getRecord(pubId, language);
        if (data == null || (language != null && !language.equals(data.getLanguage()))) {
            // This publication haven't got any content at all or for requested language
            data = recordSet.getEmptyRecord();
            data.setId(pubId);
            data.setLanguage(language);
        }

        request.setAttribute("Form", formUpdate);
        request.setAttribute("Data", data);
    }

    private void setLanguage(HttpServletRequest request, KmeliaSessionController kmelia) {
        String language = request.getParameter("SwitchLanguage");
        if (StringUtil.isDefined(language)) {
            kmelia.setCurrentLanguage(language);
        }
        request.setAttribute("Language", kmelia.getCurrentLanguage());
    }

    private String checkLanguage(KmeliaSessionController kmelia) {
        return checkLanguage(kmelia, kmelia.getSessionPublication().getDetail());
    }

    private String checkLanguage(KmeliaSessionController kmelia, PublicationDetail pubDetail) {
        return pubDetail.getLanguageToDisplay(kmelia.getCurrentLanguage());
    }

    private boolean checkAlias(KmeliaSessionController kmelia, KmeliaPublication publication) {
        if (!kmelia.getComponentId().equals(publication.getDetail().getPK().getInstanceId())) {
            publication.asAlias();
            return true;
        }
        return false;
    }

    /**
     * Gets an instance of PublicationTemplateManager.
     * @return an instance of PublicationTemplateManager.
     */
    public PublicationTemplateManager getPublicationTemplateManager() {
        return PublicationTemplateManager.getInstance();
    }

    private void setTemplatesUsedIntoRequest(KmeliaSessionController kmelia, HttpServletRequest request) {
        Collection<String> modelUsed = kmelia.getModelUsed();
        Collection<PublicationTemplate> listModelXml = new ArrayList<PublicationTemplate>();
        List<PublicationTemplate> templates = kmelia.getForms();
        // recherche de la liste des modles utilisables
        for (PublicationTemplate xmlForm : templates) {
            // recherche si le modle est dans la liste
            if (modelUsed.contains(xmlForm.getFileName())) {
                listModelXml.add(xmlForm);
            }
        }

        request.setAttribute("XMLForms", listModelXml);

        // recherche si modele Wysiwyg utilisable
        boolean wysiwygValid = false;
        if (modelUsed.contains("WYSIWYG")) {
            wysiwygValid = true;
        }
        request.setAttribute("WysiwygValid", wysiwygValid);

        // s'il n'y a pas de modles selectionns, les prsenter tous
        if (listModelXml.isEmpty() && !wysiwygValid) {
            request.setAttribute("XMLForms", templates);
            request.setAttribute("WysiwygValid", Boolean.TRUE);
        }
    }

    /**
     * Setup the request to manager some behaviors around subscription notification sending.
     * @param request the current request.
     * @param highestSilverpeasUserRoleOnCurrentTopic the highest role the user has on the current
     * folder.
     * @param currentFolderPK the primary key of the current folder.
     * @param publication the current handled publication.
     */
    private void setupRequestForSubscriptionNotificationSending(HttpRequest request,
            SilverpeasRole highestSilverpeasUserRoleOnCurrentTopic, NodePK currentFolderPK,
            PublicationDetail publication) {
        ContributionStatus statusBeforeSave = publication.isValid() ? ContributionStatus.VALIDATED
                : ContributionStatus.from(publication.getStatus());
        ContributionStatus statusAfterSave = ContributionStatus.UNKNOWN;
        if (highestSilverpeasUserRoleOnCurrentTopic.isGreaterThanOrEquals(SilverpeasRole.publisher)) {
            statusAfterSave = ContributionStatus.VALIDATED;
        }
        request.setAttribute("subscriptionManagementContext",
                SubscriptionManagementContext
                        .on(NodeSubscriptionResource.from(currentFolderPK), publication.getId())
                        .forPersistenceAction(statusBeforeSave, ActionType.UPDATE, statusAfterSave));
    }

    /**
     * Converts the specified identifier into a Silverpeas content primary key.
     * @param instanceId the unique identifier of the component instance to which the contents
     * belongs.
     * @param ids one or several identifiers of Silverpeas contents.
     * @return a list of one or several Silverpeas primary keys, each of them corresponding to one
     * specified identifier.
     */
    private List<ResourceReference> asPks(String instanceId, String... ids) {
        List<ResourceReference> pks = new ArrayList<ResourceReference>();
        for (String oneId : ids) {
            pks.add(new ResourceReference(oneId, instanceId));
        }
        return pks;
    }

}