package org.oddjob.tools;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.oddjob.doclet.CustomTagNames;
import org.oddjob.tools.includes.IncludeLoader;
import org.oddjob.tools.includes.JavaCodeFileLoader;
import org.oddjob.tools.includes.PlainTextFileLoader;
import org.oddjob.tools.includes.PlainTextResourceLoader;
import org.oddjob.tools.includes.XMLFileLoader;
import org.oddjob.tools.includes.XMLResourceLoader;
public class DocPostProcessor implements Runnable {
private File baseDir;
private InputStream input;
private OutputStream output;
@Override
public void run() {
Injector[] injectors = new Injector[] {
new JavaCodeInjector(),
new XMLResourceInjector(),
new XMLFileInjector(),
new GenericInjector(CustomTagNames.TEXT_FILE_TAG,
new PlainTextFileLoader(baseDir)),
new GenericInjector(CustomTagNames.TEXT_RESOURCE_TAG,
new PlainTextResourceLoader())
};
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(input));
PrintWriter writer = new PrintWriter(
new OutputStreamWriter(output));
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
boolean replaced = false;
for (Injector injector : injectors) {
if (injector.parse(line, writer)) {
replaced = true;
break;
}
}
if (!replaced) {
writer.println(line);
}
}
reader.close();
writer.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public File getBaseDir() {
return baseDir;
}
public void setBaseDir(File baseDir) {
this.baseDir = baseDir;
}
public InputStream getInput() {
return input;
}
public void setInput(InputStream input) {
this.input = input;
}
public OutputStream getOutput() {
return output;
}
public void setOutput(OutputStream output) {
this.output = output;
}
interface Injector {
public boolean parse(String line, PrintWriter out);
}
class JavaCodeInjector implements Injector {
final Pattern pattern = Pattern.compile("\\{\\s*" +
JavaCodeFileLoader.JAVA_FILE_TAG + "\\s*(\\S+)\\s*\\}");
@Override
public boolean parse(String line, PrintWriter out) {
Matcher matcher = pattern.matcher(line);
if (!matcher.find()) {
return false;
}
out.println(new JavaCodeFileLoader(baseDir).load(matcher.group(1)));
return true;
}
}
static class XMLResourceInjector implements Injector {
final Pattern pattern = Pattern.compile("\\{\\s*" +
XMLResourceLoader.XML_RESOURCE_TAG + "\\s*(\\S+)\\s*\\}");
@Override
public boolean parse(String line, PrintWriter out) {
Matcher matcher = pattern.matcher(line);
if (!matcher.find()) {
return false;
}
out.println(new XMLResourceLoader().load(matcher.group(1)));
return true;
}
}
class XMLFileInjector implements Injector {
final Pattern pattern = Pattern.compile("\\{\\s*" +
XMLFileLoader.XML_FILE_TAG + "\\s*(\\S+)\\s*\\}");
@Override
public boolean parse(String line, PrintWriter out) {
Matcher matcher = pattern.matcher(line);
if (!matcher.find()) {
return false;
}
out.println(new XMLFileLoader(baseDir).load(matcher.group(1)));
return true;
}
}
static class GenericInjector implements Injector {
final Pattern pattern;
private final IncludeLoader loader;
public GenericInjector(String tag, IncludeLoader loader) {
this.pattern = Pattern.compile("\\{\\s*" +
tag + "\\s*(\\S+)\\s*\\}");
this.loader = loader;
}
@Override
public boolean parse(String line, PrintWriter out) {
Matcher matcher = pattern.matcher(line);
if (!matcher.find()) {
return false;
}
out.println(loader.load(matcher.group(1)));
return true;
}
}
}