/*
* Copyright 2007 - 2017 the original author or authors.
*
* 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 net.sf.jailer.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sf.jailer.datamodel.Table;
/**
* Utility for printing.
*
* @author Ralf Wisser
*/
public class PrintUtil {
/**
* Converts a set of tables into a string.
*
* @param tables the set
*/
public String tableSetAsString(Set<Table> tables) {
return tableSetAsString(tables, " ");
}
/**
* Converts a set of tables into a string.
*
* @param tables the set
*/
public String tableSetAsString(Set<Table> tables, String linePrefix) {
List<String> tableNames = new ArrayList<String>();
for (Table table: tables) {
tableNames.add(table.getName());
}
Collections.sort(tableNames);
StringBuffer str = new StringBuffer();
str.append(" { ");
int i = 1;
for (String tableName: tableNames) {
if (i > 1) {
str.append(", ");
}
if (i % 5 == 0 && linePrefix != null) {
str.append("\n" + linePrefix);
}
str.append(tableName);
++i;
}
str.append(" }");
return str.toString();
}
/**
* Cache for {@link #applyTemplate(String, Object[])}.
*/
private Map<String, String> templateCache = new HashMap<String, String>();
/**
* Loads a file.
*
* @param file the file to load
* @return content of file
* @throws FileNotFoundException
* @throws IOException
*/
public String loadResource(String name) throws FileNotFoundException, IOException {
StringBuffer sb;
sb = new StringBuffer();
File newFile = new File(name);
BufferedReader reader;
if (newFile.exists()) {
reader = new BufferedReader(new FileReader(newFile));
} else {
InputStream in = getClass().getResourceAsStream("/net/sf/jailer/" + name.replace('\\', '/'));
if (in == null) {
throw new FileNotFoundException(newFile.getPath());
}
reader = new BufferedReader(new InputStreamReader(in));
}
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
reader.close();
return sb.toString();
}
/**
* Applies arguments to template.
*
* @param template file name of template
* @param arguments the arguments
*
* @return template with arguments filled in
*/
public String applyTemplate(String template, Object[] arguments) throws FileNotFoundException, IOException {
String sb = templateCache.get(template);
if (sb == null) {
sb = loadResource(template);
templateCache.put(template, sb);
}
return MessageFormat.format(sb, arguments);
}
/**
* Applies arguments to template.
*
* @param template file name of template
* @param arguments the arguments (named values)
*
* @return template with arguments filled in
*/
public String applyTemplate(String template, Map<String, String> arguments, Map<String, List<String>> listArguments) throws FileNotFoundException, IOException {
String sb = templateCache.get(template);
if (sb == null) {
sb = loadResource(template);
templateCache.put(template, sb);
}
for (Map.Entry<String, String> e: arguments.entrySet()) {
sb = sb.replaceAll(Pattern.quote("${" + e.getKey() + "}"), Matcher.quoteReplacement(e.getValue()));
}
for (;;) {
int begin = sb.indexOf("${for-each:");
int end = sb.indexOf("${end}");
if (begin >= 0 && end >= 0) {
String pre = sb.substring(0, begin);
String woPre = sb.substring(begin + 11);
int i = woPre.indexOf('}');
String content = woPre.substring(i + 1, end - begin - 11);
String suf = sb.substring(end + 6);
String cContent = "";
int index = 1;
for (String var: listArguments.get(woPre.substring(0, i))) {
cContent += content.replaceAll("\\$i", "" + (index++)).replaceAll("\\$", Matcher.quoteReplacement(var));
}
sb = pre + cContent + suf;
} else {
break;
}
}
return sb;
}
/**
* Loads table list file and fill a list.
*
* @param list
* to fill
* @param fileName
* name of file
*/
public static void loadTableList(List<String> list, String fileName)
throws IOException {
File file = new File(fileName);
if (file.exists()) {
BufferedReader in = new BufferedReader(new FileReader(file));
String line;
while ((line = in.readLine()) != null) {
line = line.trim();
if (line.length() > 0) {
list.add(line);
}
}
in.close();
}
}
/**
* Loads table list file and fill a list.
*
* @param list
* to fill
* @param in to read from
*/
public static void loadTableList(List<String> list, InputStream in)
throws IOException {
if (in != null) {
BufferedReader ir = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = ir.readLine()) != null) {
line = line.trim();
if (line.length() > 0) {
list.add(line);
}
}
ir.close();
}
}
/**
* Loads a file.
*
* @param file the file to load
* @return content of file
* @throws FileNotFoundException
* @throws IOException
*/
public String loadFile(String file) throws FileNotFoundException, IOException {
return loadFile(file, false);
}
/**
* Loads a file.
*
* @param file the file to load
* @return content of file
* @throws FileNotFoundException
* @throws IOException
*/
public String loadFile(String file, boolean ignoreComments) throws FileNotFoundException, IOException {
StringBuffer sb;
sb = new StringBuffer();
BufferedReader reader = new BufferedReader(new FileReader(new File(file)));
String line = null;
while ((line = reader.readLine()) != null) {
if (!ignoreComments || (line.trim().length() > 0 && !line.startsWith("#"))) {
sb.append(line + "\n");
}
}
reader.close();
return sb.toString();
}
}