001/*
002 * (C) Copyright 2006-20011 Nuxeo SAS (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     Nuxeo - initial API and implementation
016 *
017 */
018
019package org.nuxeo.ecm.platform.reporting.report;
020
021import java.util.HashMap;
022import java.util.List;
023import java.util.Map;
024import java.util.regex.Matcher;
025import java.util.regex.Pattern;
026
027import org.nuxeo.ecm.core.api.DocumentModel;
028
029/**
030 * Holds the logic to extract parameters from the Document Context.
031 *
032 * @author Tiry (tdelprat@nuxeo.com)
033 */
034public class ReportContext {
035
036    public static final String DOMAIN_DOCUMENT_TYPE = "Domain";
037
038    public static final String WORKSPACE_DOCUMENT_TYPE = "Workspace";
039
040    public static final String USER_NAME = "userName";
041
042    public static final String DOC_TYPE = "docType";
043
044    public static final String CURRENT_PATH = "currentPath";
045
046    public static final String CURRENT_REPOSITORY = "currentRepository";
047
048    public static final String CURRENT_SUPERSPACE_PATH = "currentSuperSpacePath";
049
050    public static final String CURRENT_SUPERSPACE_ID = "currentSuperSpaceId";
051
052    public static final String CURRENT_WORKSPACE_PATH = "currentWorkspacePath";
053
054    public static final String CURRENT_WORKSPACE_ID = "currentWorkspaceId";
055
056    public static final String CURRENT_DOMAIN_PATH = "currentDomainPath";
057
058    public static final String CURRENT_DOMAIN_ID = "currentDomainId";
059
060    public static final Pattern PATTERN_TO_CHECK = Pattern.compile("\\$\\{(\\w+)\\}");
061
062    public static void setContextualParameters(List<ReportParameter> reportParams, DocumentModel doc) {
063        Map<String, String> contextualParameters = buildContextualParametersMap(doc);
064        for (ReportParameter parameter : reportParams) {
065            String value = parameter.getStringValue();
066            if (value != null) {
067                Matcher matcher = PATTERN_TO_CHECK.matcher(value);
068                if (matcher.matches()) {
069                    String parameterName = matcher.group(1);
070                    if (contextualParameters.containsKey(parameterName)) {
071                        parameter.setValue(contextualParameters.get(parameterName));
072                    }
073                }
074            }
075        }
076    }
077
078    private static Map<String, String> buildContextualParametersMap(DocumentModel doc) {
079        Map<String, String> contextualParameters = new HashMap<String, String>();
080        contextualParameters.put(USER_NAME, doc.getCoreSession().getPrincipal().getName());
081        contextualParameters.put(DOC_TYPE, doc.getType());
082        contextualParameters.put(CURRENT_PATH, doc.getPathAsString());
083        contextualParameters.put(CURRENT_REPOSITORY, doc.getRepositoryName());
084
085        DocumentModel currentDomain = getFirstParentWithType(doc, DOMAIN_DOCUMENT_TYPE);
086        if (currentDomain != null) {
087            contextualParameters.put(CURRENT_DOMAIN_ID, currentDomain.getId());
088            contextualParameters.put(CURRENT_DOMAIN_PATH, currentDomain.getPathAsString());
089        }
090
091        DocumentModel currentWorkspace = getFirstParentWithType(doc, WORKSPACE_DOCUMENT_TYPE);
092        if (currentWorkspace != null) {
093            contextualParameters.put(CURRENT_WORKSPACE_ID, currentWorkspace.getId());
094            contextualParameters.put(CURRENT_WORKSPACE_PATH, currentWorkspace.getPathAsString());
095        }
096
097        DocumentModel currentSuperSpace = getCurrentSuperSpace(doc);
098        if (currentSuperSpace != null) {
099            contextualParameters.put(CURRENT_SUPERSPACE_ID, currentSuperSpace.getId());
100            contextualParameters.put(CURRENT_SUPERSPACE_PATH, currentSuperSpace.getPathAsString());
101        }
102        return contextualParameters;
103    }
104
105    private static DocumentModel getFirstParentWithType(DocumentModel doc, String type) {
106        List<DocumentModel> parents = doc.getCoreSession().getParentDocuments(doc.getRef());
107        for (DocumentModel parent : parents) {
108            if (parent.getType().equals(type)) {
109                return parent;
110            }
111        }
112        return null;
113    }
114
115    private static DocumentModel getCurrentSuperSpace(DocumentModel doc) {
116        return doc.getCoreSession().getSuperSpace(doc);
117    }
118
119}