/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.lucene.dependencies;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Parse a properties file, performing non-recursive Ant-like
* property value interpolation, and return the resulting Properties.
*/
public class InterpolatedProperties extends Properties {
private static final Pattern PROPERTY_REFERENCE_PATTERN = Pattern.compile("\\$\\{([^}]+)\\}");
/**
* Loads the properties file via {@link Properties#load(InputStream)},
* then performs non-recursive Ant-like property value interpolation.
*/
@Override
public void load(InputStream inStream) throws IOException {
throw new UnsupportedOperationException("InterpolatedProperties.load(InputStream) is not supported.");
}
/**
* Loads the properties file via {@link Properties#load(Reader)},
* then performs non-recursive Ant-like property value interpolation.
*/
@Override
public void load(Reader reader) throws IOException {
super.load(reader);
interpolate();
}
/**
* Perform non-recursive Ant-like property value interpolation
*/
private void interpolate() {
StringBuffer buffer = new StringBuffer();
for (Map.Entry<?,?> entry : entrySet()) {
buffer.setLength(0);
Matcher matcher = PROPERTY_REFERENCE_PATTERN.matcher(entry.getValue().toString());
while (matcher.find()) {
String interpolatedValue = getProperty(matcher.group(1));
if (null != interpolatedValue) {
matcher.appendReplacement(buffer, interpolatedValue);
}
}
matcher.appendTail(buffer);
setProperty((String) entry.getKey(), buffer.toString());
}
}
}