⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmltemplateengine.java

📁 大名鼎鼎的java动态脚本语言。已经通过了sun的认证
💻 JAVA
字号:
package groovy.text;import groovy.lang.Binding;import groovy.lang.GroovyShell;import groovy.lang.Script;import groovy.lang.Writable;import groovy.util.IndentPrinter;import groovy.util.Node;import groovy.util.XmlNodePrinter;import groovy.util.XmlParser;import groovy.xml.QName;import java.io.IOException;import java.io.PrintWriter;import java.io.Reader;import java.io.StringWriter;import java.io.Writer;import java.lang.ref.WeakReference;import java.util.HashMap;import java.util.Map;import javax.xml.parsers.ParserConfigurationException;import org.codehaus.groovy.control.CompilationFailedException;import org.codehaus.groovy.runtime.InvokerHelper;import org.xml.sax.SAXException;/** * Template engine for xml data input. * * @author Christian Stein */public class XmlTemplateEngine extends TemplateEngine {    private static class GspPrinter extends XmlNodePrinter {        public GspPrinter(PrintWriter out, String indent) {            this(new IndentPrinter(out, indent));        }        public GspPrinter(IndentPrinter out) {            super(out, "\\\"");        }        protected void printGroovyTag(String tag, String text) {            if (tag.equals("scriptlet")) {                out.print(text);                out.print("\n");                return;            }            if (tag.equals("expression")) {                printLineBegin();                out.print("${");                out.print(text);                out.print("}");                printLineEnd();                return;            }            throw new RuntimeException("Unsupported tag named \"" + tag + "\".");        }        protected void printLineBegin() {            out.print("out.print(\"");            out.printIndent();        }        protected void printLineEnd(String comment) {            out.print("\\n\");");            if (comment != null) {                out.print(" // ");                out.print(comment);            }            out.print("\n");        }        protected boolean printSpecialNode(Node node) {            Object name = node.name();            if (name != null && name instanceof QName) {                /*                 * FIXME Somethings wrong with the SAX- or XMLParser. Prefix should only contain 'gsp'?!                 */                String s = ((QName) name).getPrefix();                if (s.startsWith("gsp:")) {                    s = s.substring(4); // 4 = "gsp:".length()                    if (s.length() == 0) {                        throw new RuntimeException("No local part after 'gsp:' given in node " + node);                    }                    printGroovyTag(s, node.text());                    return true;                }            }            return false;        }    }    private static class XmlTemplate implements Template {        private final Script script;        public XmlTemplate(Script script) {            this.script = script;        }        public Writable make() {            return make(new HashMap());        }        public Writable make(Map map) {            if (map == null) {                throw new IllegalArgumentException("map must not be null");            }            return new XmlWritable(script, new Binding(map));        }    }    private static class XmlWritable implements Writable {        private final Binding binding;        private final Script script;        private WeakReference result;        public XmlWritable(Script script, Binding binding) {            this.script = script;            this.binding = binding;            this.result = new WeakReference(null);        }        public Writer writeTo(Writer out) {            Script scriptObject = InvokerHelper.createScript(script.getClass(), binding);            PrintWriter pw = new PrintWriter(out);            scriptObject.setProperty("out", pw);            scriptObject.run();            pw.flush();            return out;        }        public String toString() {            if (result.get() != null) {                return result.get().toString();            }            String string = writeTo(new StringWriter(1024)).toString();            result = new WeakReference(string);            return string;        }    }    public static final String DEFAULT_INDENTION = "  ";    private final GroovyShell groovyShell;    private final XmlParser xmlParser;    private String indention;    public XmlTemplateEngine() throws SAXException, ParserConfigurationException {        this(DEFAULT_INDENTION, false);    }    public XmlTemplateEngine(String indention, boolean validating) throws SAXException, ParserConfigurationException {        this(new XmlParser(validating, true), new GroovyShell(), indention);    }    public XmlTemplateEngine(XmlParser xmlParser, GroovyShell groovyShell, String indention) {        this.groovyShell = groovyShell;        this.xmlParser = xmlParser;        this.indention = indention;    }    public Template createTemplate(Reader reader) throws CompilationFailedException, ClassNotFoundException, IOException {        Node root = null;        try {            root = xmlParser.parse(reader);        } catch (SAXException e) {            throw new RuntimeException("Parsing XML source failed.", e);        }        if (root == null) {            throw new IOException("Parsing XML source failed: root node is null.");        }        // new NodePrinter().print(root);        // new XmlNodePrinter().print(root);        StringWriter writer = new StringWriter(1024);        writer.write("/* Generated by XmlTemplateEngine */\n");        new GspPrinter(new PrintWriter(writer), DEFAULT_INDENTION).print(root);        String scriptText = writer.toString();        // System.err.println("\n-\n" + scriptText + "\n-\n");        Script script = groovyShell.parse(scriptText);        Template template = new XmlTemplate(script);        return template;    }    public String getIndention() {        return indention;    }    public void setIndention(String indention) {        if (indention == null) {            indention = DEFAULT_INDENTION;        }        this.indention = indention;    }    public String toString() {        return "XmlTemplateEngine";    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -