001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 package org.apache.fulcrum.yaafi.framework.util; 020 021 import java.util.Map; 022 023 import org.apache.avalon.framework.configuration.Configuration; 024 import org.apache.avalon.framework.configuration.ConfigurationException; 025 import org.apache.avalon.framework.configuration.DefaultConfiguration; 026 import org.apache.avalon.framework.logger.Logger; 027 028 /** 029 * Helper class to expand the value and all attributes. 030 * 031 * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a> 032 */ 033 public class ConfigurationUtil 034 { 035 /** 036 * Expand place holders found in values or attrbute values with the 037 * content of the given variables. The implementation assumes that 038 * the given configuration can be cast to a DefaultConfiguration 039 * otherwise we can't use any setters. 040 * 041 * @param logger the logger to write diagnostic messages 042 * @param defaultConfiguration the configuration 043 * @param vars the map holding the variables 044 * @throws ConfigurationException parsing the configuration failed 045 */ 046 public static void expand(Logger logger, DefaultConfiguration defaultConfiguration, Map vars) throws ConfigurationException 047 { 048 if((vars == null) || (vars.size() == 0)) 049 { 050 return; 051 } 052 053 // update the value of the configuration element 054 055 if(defaultConfiguration.getValue(null) != null) 056 { 057 String oldValue = defaultConfiguration.getValue(); 058 String newValue = ConfigurationUtil.expand(oldValue, vars); 059 defaultConfiguration.setValue(newValue); 060 061 if(oldValue.equals(newValue) == false) 062 { 063 logger.debug("Changed element <" 064 + defaultConfiguration.getName() 065 + "> from '" 066 + oldValue 067 + "' ==> '" 068 + newValue 069 + "'" 070 ); 071 } 072 } 073 074 // update all attributes 075 076 String attributeName = null; 077 String[] attributeNames = defaultConfiguration.getAttributeNames(); 078 079 for(int i=0; i<attributeNames.length; i++) 080 { 081 attributeName = attributeNames[i]; 082 String oldAttributeValue = defaultConfiguration.getAttribute(attributeName); 083 String newAttributeValue = ConfigurationUtil.expand(oldAttributeValue, vars); 084 defaultConfiguration.setAttribute(attributeName, newAttributeValue); 085 086 if(oldAttributeValue.equals(newAttributeValue) == false) 087 { 088 logger.debug("Changed attribute '" 089 + defaultConfiguration.getName() + "@" + attributeName 090 + "' from '" 091 + oldAttributeValue 092 + "' ==> '" 093 + newAttributeValue 094 + "'" 095 ); 096 } 097 } 098 099 // and now recurse through all children (children are in general a lot of work) 100 101 Configuration[] children = defaultConfiguration.getChildren(); 102 103 for(int i=0; i<children.length; i++) 104 { 105 ConfigurationUtil.expand(logger, ((DefaultConfiguration) children[i]), vars); 106 } 107 } 108 109 /** 110 * @return the expand a string 111 */ 112 private static String expand(String value, Map vars) 113 { 114 return StringUtils.stringSubstitution(value, vars, true).toString(); 115 } 116 }