package com.WazaBe.HoloEverywhere.Builder; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Processer { private static final Pattern DEFINE = Pattern.compile( "<define\\sname=\"([a-zA-Z]+)\">(.*?)</define>", Pattern.MULTILINE | Pattern.DOTALL); private static final Pattern DEFINE_FILE = Pattern.compile( "<define\\sfile=\"([a-zA-Z\\.]+)\"\\s/>", Pattern.MULTILINE | Pattern.DOTALL); private static final Pattern INCLUDE = Pattern .compile("<include\\sname=\"([a-zA-Z]+)\"\\s/>"); private final String xml; public Processer(String xml) { this.xml = xml; } public static String process(String xml) { Processer processer = new Processer(xml); Matcher matcher = DEFINE_FILE.matcher(xml); while (matcher.find()) { Matcher matcher2 = DEFINE.matcher(readFile(matcher.group(1))); while (matcher2.find()) { processer.defineBlock(matcher2.group(1), matcher2.group(2)); } } matcher = DEFINE.matcher(xml); while (matcher.find()) { processer.defineBlock(matcher.group(1), matcher.group(2)); } return processer.toString(); } private static String readFile(String fileName) { try { File file = new File(fileName); InputStream is = new FileInputStream(file); Reader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8192); char[] buffer = new char[8192]; int read; StringBuilder builder = new StringBuilder(); while ((read = reader.read(buffer)) > 0) { builder.append(buffer, 0, read); } reader.close(); return builder.toString(); } catch (Exception e) { return ""; } } private final Map<String, String> blockMap = new HashMap<String, String>(); private void defineBlock(String name, String value) { blockMap.put(name, value); invalidate(); } private boolean valid = false; private void invalidate() { valid = false; } @Override public synchronized String toString() { if (!valid) { rebuild(); valid = true; } return data; } private String data; private synchronized void rebuild() { data = new String(xml); data = DEFINE.matcher(data).replaceAll(""); data = DEFINE_FILE.matcher(data).replaceAll(""); for (int i = 0; i < 3; i++) { Matcher matcher = INCLUDE.matcher(data); while (matcher.find()) { String replacement = blockMap.get(matcher.group(1)); data = data.replace(matcher.group(), replacement); } } data = data.replaceAll("\\s{1,}", " ").replace("> <", "><"); data = XMLFormatter.format(data); } }