001    package net.sf.logdistiller.util;
002    
003    /*
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    import java.util.Map;
018    
019    /**
020     * A small utility to replace properties within strings (syntax: <code>${<i>name</i>}</code>).
021     */
022    public class PropertiesReplacer
023    {
024        private final String beginMark;
025    
026        private final String endMark;
027    
028        private final Map properties;
029    
030        public PropertiesReplacer( Map properties, String beginMark, String endMark )
031        {
032            this.properties = properties;
033            this.beginMark = beginMark;
034            this.endMark = endMark;
035        }
036    
037        public PropertiesReplacer( Map properties )
038        {
039            this( properties, "${", "}" );
040        }
041    
042        /**
043         * Replace <code>${<i>name</i>}</code> by the value of the property.
044         *
045         * @param source String the string to interpret (or <code>null</code>)
046         * @return String the transformed string
047         * @throws IllegalArgumentException if the source string references an inexistent property
048         */
049        public String replaceProperties( String source )
050        {
051            if ( source == null )
052            {
053                return null;
054            }
055            int index = 0;
056            int nextBegin, nextEnd;
057            StringBuffer buff = new StringBuffer();
058            while ( ( ( nextBegin = source.indexOf( beginMark, index ) ) >= 0 )
059                && ( ( nextEnd = source.indexOf( endMark, nextBegin ) ) >= 0 ) )
060            {
061                String name = source.substring( nextBegin + 2, nextEnd );
062                String value = (String) properties.get( name );
063                if ( value == null )
064                {
065                    throw new IllegalArgumentException( "unknown property '" + name + "'" );
066                }
067                buff.append( source.substring( index, nextBegin ) );
068                buff.append( value );
069                index = nextEnd + 1;
070            }
071            if ( index == 0 )
072            {
073                // little optimization...
074                return source;
075            }
076            buff.append( source.substring( index ) );
077            return buff.toString();
078        }
079    }