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}