/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed 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 com.android.builder.internal;
import static com.google.common.base.Preconditions.checkNotNull;
import com.android.annotations.NonNull;
import com.google.common.base.Charsets;
import com.google.common.io.CharStreams;
import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.Map.Entry;
/**
* Processes a template to generate a file somewhere.
*/
class TemplateProcessor {
private final InputStream mTemplateStream;
private final Map<String, String> mPlaceHolderMap;
/**
* Creates a processor
* @param templateStream the stream to read the template file from
* @param placeHolderMap
*/
public TemplateProcessor(@NonNull InputStream templateStream,
@NonNull Map<String, String> placeHolderMap) {
mTemplateStream = checkNotNull(templateStream);
mPlaceHolderMap = checkNotNull(placeHolderMap);
}
/**
* Generates the file from the template.
* @param outputFile the file to create
*/
public void generate(File outputFile) throws IOException {
String template = readEmbeddedTextFile(mTemplateStream);
String content = replaceParameters(template, mPlaceHolderMap);
writeFile(outputFile, content);
}
/**
* Reads and returns the content of a text file embedded in the jar file.
* @param templateStream the stream to read the template file from
* @return null if the file could not be read
* @throws java.io.IOException
*/
private String readEmbeddedTextFile(InputStream templateStream) throws IOException {
InputStreamReader reader = new InputStreamReader(templateStream, Charsets.UTF_8);
try {
return CharStreams.toString(reader);
} finally {
reader.close();
}
}
private void writeFile(File file, String content) throws IOException {
Files.write(content, file, Charsets.UTF_8);
}
/**
* Replaces placeholders found in a string with values.
*
* @param str the string to search for placeholders.
* @param parameters a map of <placeholder, Value> to search for in the string
* @return A new String object with the placeholder replaced by the values.
*/
private String replaceParameters(String str, Map<String, String> parameters) {
for (Entry<String, String> entry : parameters.entrySet()) {
String value = entry.getValue();
if (value != null) {
str = str.replaceAll(entry.getKey(), value);
}
}
return str;
}
}