/* * Copyright (C) 2012 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.config; import org.exoplatform.commons.utils.SecurityHelper; import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; /** * Provides means to parse workspace components parameter values and names from system properties. * Properties have the following priority: * <br>Forced properties: * <br>  * workspace scope * <br>  * repository scope * <br>  * all scope * <br>Default properties: * <br>  * workspace scope * <br>  * repository scope * <br>  * all scope * * @author <a href="mailto:dkuleshov@exoplatform.com">Dmitry Kuleshov</a> * @version $Id: SystemPropertiesParser.java 02.07.2012 dkuleshov $ * */ public class PropertiesParser { public static final String EXO_JCR_CONFIG = "exo.jcr.config."; public static final String DEFAULT_TYPE = "default."; public static final String FORCE_TYPE = "force."; public static final String WORKSPACE_SCOPE = "workspace."; public static final String REPOSITORY_SCOPE = "repository."; public static final String ALL_SCOPE = "all."; protected final WorkspaceEntry workspaceEntry; private List<String> forceParameterPrefixes; private List<String> defaultParameterPrefixes; private final String componentName; PropertiesParser(WorkspaceEntry workspaceEntry, String componentName) { this.workspaceEntry = workspaceEntry; this.componentName = componentName; } public String getForcedParameterValue(String parameterShortName, Map<String, String> parameters) { List<String> longNames = generateForceParameterLongNames(parameterShortName); return chooseAppropriateParameterValue(longNames, parameters); } public String getDefaultParameterValue(String parameterShortName, Map<String, String> parameters) { List<String> longNames = generateDefaultParameterLongNames(parameterShortName); return chooseAppropriateParameterValue(longNames, parameters); } /** * Provides a set of workspace components parameters short names (without long prefixes * e.g. "exo.jcr.config.force.all") defined (no matter how many times) * via system properties. Set is ok to be used because it is assumed that there should be * no naming collisions between different components' parameter names. */ public Set<String> getParameterNames(Set<String> allParameterNames) { Set<String> names = new HashSet<String>(); for (String propertyName : allParameterNames) { int index = propertyNameMatchIndex(propertyName); if (index > 0) { names.add(propertyName.substring(index)); } } return names; } private void prepareForceParameterPrefixes() { forceParameterPrefixes = new ArrayList<String>(); forceParameterPrefixes.add(generateForceParameterPrefix(WORKSPACE_SCOPE)); forceParameterPrefixes.add(generateForceParameterPrefix(REPOSITORY_SCOPE)); forceParameterPrefixes.add(generateForceParameterPrefix(ALL_SCOPE)); } private void prepareDefaultParameterPrefixes() { defaultParameterPrefixes = new ArrayList<String>(); defaultParameterPrefixes.add(generateDafaultParameterPrefix(WORKSPACE_SCOPE)); defaultParameterPrefixes.add(generateDafaultParameterPrefix(REPOSITORY_SCOPE)); defaultParameterPrefixes.add(generateDafaultParameterPrefix(ALL_SCOPE)); } private String generateForceParameterPrefix(String scope) { return generateParameterPrefix(FORCE_TYPE, scope); } private String generateDafaultParameterPrefix(String scope) { return generateParameterPrefix(DEFAULT_TYPE, scope); } private String generateParameterPrefix(String type, String scope) { StringBuilder sb = new StringBuilder(EXO_JCR_CONFIG); sb.append(type); sb.append(scope); if (REPOSITORY_SCOPE.equals(scope)) { sb.append(generateRepositoryName()); sb.append("."); } if (WORKSPACE_SCOPE.equals(scope)) { sb.append(workspaceEntry.getUniqueName()); sb.append("."); } sb.append(componentName + "."); return sb.toString(); } private List<String> generateForceParameterLongNames(String parameterShortName) { prepareForceParameterPrefixes(); return generateParameterLongNames(parameterShortName, forceParameterPrefixes); } private List<String> generateDefaultParameterLongNames(String parameterShortName) { prepareDefaultParameterPrefixes(); return generateParameterLongNames(parameterShortName, defaultParameterPrefixes); } private List<String> generateParameterLongNames(String parameterShortName, List<String> parameterPrefixes) { List<String> forceParameterLongNames = new ArrayList<String>(); for (String parameterPrefix : parameterPrefixes) { forceParameterLongNames.add(parameterPrefix + parameterShortName); } return forceParameterLongNames; } private String chooseAppropriateParameterValue(List<String> parameterNames, Map<String, String> parameters) { String parameterValue; for (String parameterName : parameterNames) { parameterValue = parameters.get(parameterName); if (parameterValue != null) { return parameterValue; } } return null; } private int propertyNameMatchIndex(String propertyFullName) { prepareForceParameterPrefixes(); for (String prefix : forceParameterPrefixes) { if (propertyFullName.startsWith(prefix)) { return prefix.length(); } } prepareDefaultParameterPrefixes(); for (String prefix : defaultParameterPrefixes) { if (propertyFullName.startsWith(prefix)) { return prefix.length(); } } return -1; } static public Properties getSystemProperties() { return SecurityHelper.doPrivilegedAction(new PrivilegedAction<Properties>() { public Properties run() { return System.getProperties(); } }); } private String generateRepositoryName() { String workspaceUniqueName = workspaceEntry.getUniqueName(); int workspaceNameIndex = workspaceUniqueName.indexOf(workspaceEntry.getName()); return workspaceUniqueName.substring(0, workspaceNameIndex - 1); } }