Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2003-2007 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 groovy.text;
 
 
 import java.io.Reader;
 import java.io.Writer;
 import java.util.Map;

Template engine for xml data input.

Author(s):
Christian Stein
Paul King
 
 public class XmlTemplateEngine extends TemplateEngine {
 
     private static int counter = 1;
     private static class GspPrinter extends XmlNodePrinter {
 
         public GspPrinter(PrintWriter outString indent) {
             this(new IndentPrinter(outindent));
         }
 
         public GspPrinter(IndentPrinter out) {
             super(out"\\\"");
             setQuote("'");
         }
 
         protected void printGroovyTag(String tagString text) {
             if (tag.equals("scriptlet")) {
                 .print(text);
                 .print("\n");
                 return;
             }
             if (tag.equals("expression")) {
                 printLineBegin();
                 .print("${");
                 .print(text);
                 .print("}");
                 printLineEnd();
                 return;
             }
             throw new RuntimeException("Unsupported 'gsp:' tag named \"" + tag + "\".");
         }
 
         protected void printSimpleItem(Object value) {
             this.printLineBegin();
             .print(escapeSpecialChars(InvokerHelper.toString(value)));
             printLineEnd();
         }
 
         private String escapeSpecialChars(String s) {
             StringBuilder sb = new StringBuilder();
             boolean inGString = false;
             for (int i = 0; i < s.length(); i++) {
                 final char c = s.charAt(i);
                 switch (c) {
                     case '$':
                         sb.append("$");
                         if (i < s.length() - 1 && s.charAt(i + 1) == '{'inGString = true;
                         break;
                     case '<':
                         append(sbc"&lt;"inGString);
                         break;
                     case '>':
                        append(sbc"&gt;"inGString);
                        break;
                    case '"':
                        append(sbc"&quot;"inGString);
                        break;
                    case '\'':
                        append(sbc"&apos;"inGString);
                        break;
                    case '}':
                        sb.append(c);
                        inGString = false;
                        break;
                    default:
                        sb.append(c);
                }
            }
            return sb.toString();
        }
        private void append(StringBuilder sbchar plainCharString xmlStringboolean inGString) {
            if (inGString) {
                sb.append(plainChar);
            } else {
                sb.append(xmlString);
            }
        }
        protected void printLineBegin() {
            .print("out.print(\"");
            .printIndent();
        }
        protected void printLineEnd(String comment) {
            .print("\\n\");");
            if (comment != null) {
                .print(" // ");
                .print(comment);
            }
            .print("\n");
        }
        protected boolean printSpecialNode(Node node) {
            Object name = node.name();
            if (name != null && name instanceof QName) {
                QName qn = (QNamename;
                if (qn.getPrefix().equals("gsp")) {
                    String s = qn.getLocalPart();
                    if (s.length() == 0) {
                        throw new RuntimeException("No local part after 'gsp:' given in node " + node);
                    }
                    printGroovyTag(snode.text());
                    return true;
                }
            }
            return false;
        }
    }
    private static class XmlTemplate implements Template {
        private final Script script;
        public XmlTemplate(Script script) {
            this. = 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(new Binding(map));
        }
    }
    private static class XmlWritable implements Writable {
        private final Binding binding;
        private final Script script;
        private WeakReference result;
        public XmlWritable(Script scriptBinding binding) {
            this. = script;
            this. = binding;
            this. = new WeakReference(null);
        }
        public Writer writeTo(Writer out) {
            Script scriptObject = InvokerHelper.createScript(.getClass(), );
            PrintWriter pw = new PrintWriter(out);
            scriptObject.setProperty("out"pw);
            scriptObject.run();
            pw.flush();
            return out;
        }
        public String toString() {
            if (.get() != null) {
                return .get().toString();
            }
            String string = writeTo(new StringWriter(1024)).toString();
             = new WeakReference(string);
            return string;
        }
    }
    public static final String DEFAULT_INDENTATION = "  ";
    private final GroovyShell groovyShell;
    private final XmlParser xmlParser;
    private String indentation;
        this(false);
    }
    public XmlTemplateEngine(String indentationboolean validatingthrows SAXExceptionParserConfigurationException {
        this(new XmlParser(validatingtrue), new GroovyShell());
        setIndentation(indentation);
    }
    public XmlTemplateEngine(XmlParser xmlParserClassLoader parentLoader) {
        this(xmlParsernew GroovyShell(parentLoader));
    }
    public XmlTemplateEngine(XmlParser xmlParserGroovyShell groovyShell) {
        this. = groovyShell;
        this. = xmlParser;
    }
        Node root = null;
        try {
            root = .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.");
        }
        StringWriter writer = new StringWriter(1024);
        writer.write("/* Generated by XmlTemplateEngine */\n");
        new GspPrinter(new PrintWriter(writer), ).print(root);
        Script script;
        try {
            script = .parse(writer.toString(), "XmlTemplateScript" + ++ + ".groovy");
        } catch (Exception e) {
            throw new GroovyRuntimeException("Failed to parse template script (your template may contain an error or be trying to use expressions not currently supported): " + e.getMessage());
        }
        return new XmlTemplate(script);
    }
    public String getIndentation() {
        return ;
    }
    public void setIndentation(String indentation) {
        if (indentation == null) {
            indentation = ;
        }
        this. = indentation;
    }
    public String toString() {
        return "XmlTemplateEngine";
    }
New to GrepCode? Check out our FAQ X