http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/Processor.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/Processor.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/Processor.java deleted file mode 100644 index a04930f..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/Processor.java +++ /dev/null @@ -1,1044 +0,0 @@ -/*** - * ASM XML Adapter - * Copyright (c) 2004-2011, Eugene Kuleshov - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.xml; - -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; - -import javax.xml.transform.Source; -import javax.xml.transform.Templates; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.sax.SAXResult; -import javax.xml.transform.sax.SAXSource; -import javax.xml.transform.sax.SAXTransformerFactory; -import javax.xml.transform.sax.TransformerHandler; -import javax.xml.transform.stream.StreamSource; - -import org.apache.tapestry5.internal.plastic.asm.ClassReader; -import org.apache.tapestry5.internal.plastic.asm.ClassWriter; -import org.xml.sax.Attributes; -import org.xml.sax.ContentHandler; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; -import org.xml.sax.ext.LexicalHandler; -import org.xml.sax.helpers.AttributesImpl; -import org.xml.sax.helpers.DefaultHandler; -import org.xml.sax.helpers.XMLReaderFactory; - -/** - * Processor is a command line tool that can be used for bytecode waving - * directed by XSL transformation. - * <p> - * In order to use a concrete XSLT engine, system property - * <tt>javax.xml.transform.TransformerFactory</tt> must be set to one of the - * following values. - * - * <blockquote> - * <table border="1" cellspacing="0" cellpadding="3"> - * <tr> - * <td>jd.xslt</td> - * <td>jd.xml.xslt.trax.TransformerFactoryImpl</td> - * </tr> - * - * <tr> - * <td>Saxon</td> - * <td>net.sf.saxon.TransformerFactoryImpl</td> - * </tr> - * - * <tr> - * <td>Caucho</td> - * <td>com.caucho.xsl.Xsl</td> - * </tr> - * - * <tr> - * <td>Xalan interpeter</td> - * <td>org.apache.xalan.processor.TransformerFactory</td> - * </tr> - * - * <tr> - * <td>Xalan xsltc</td> - * <td>org.apache.xalan.xsltc.trax.TransformerFactoryImpl</td> - * </tr> - * </table> - * </blockquote> - * - * @author Eugene Kuleshov - */ -public class Processor { - - public static final int BYTECODE = 1; - - public static final int MULTI_XML = 2; - - public static final int SINGLE_XML = 3; - - private static final String SINGLE_XML_NAME = "classes.xml"; - - private final int inRepresentation; - - private final int outRepresentation; - - private final InputStream input; - - private final OutputStream output; - - private final Source xslt; - - private int n = 0; - - public Processor(final int inRepresenation, final int outRepresentation, - final InputStream input, final OutputStream output, - final Source xslt) { - this.inRepresentation = inRepresenation; - this.outRepresentation = outRepresentation; - this.input = input; - this.output = output; - this.xslt = xslt; - } - - public int process() throws TransformerException, IOException, SAXException { - ZipInputStream zis = new ZipInputStream(input); - final ZipOutputStream zos = new ZipOutputStream(output); - final OutputStreamWriter osw = new OutputStreamWriter(zos); - - Thread.currentThread().setContextClassLoader( - getClass().getClassLoader()); - - TransformerFactory tf = TransformerFactory.newInstance(); - if (!tf.getFeature(SAXSource.FEATURE) - || !tf.getFeature(SAXResult.FEATURE)) { - return 0; - } - - SAXTransformerFactory saxtf = (SAXTransformerFactory) tf; - Templates templates = null; - if (xslt != null) { - templates = saxtf.newTemplates(xslt); - } - - // configuring outHandlerFactory - // /////////////////////////////////////////////////////// - - EntryElement entryElement = getEntryElement(zos); - - ContentHandler outDocHandler = null; - switch (outRepresentation) { - case BYTECODE: - outDocHandler = new OutputSlicingHandler( - new ASMContentHandlerFactory(zos), entryElement, false); - break; - - case MULTI_XML: - outDocHandler = new OutputSlicingHandler(new SAXWriterFactory(osw, - true), entryElement, true); - break; - - case SINGLE_XML: - ZipEntry outputEntry = new ZipEntry(SINGLE_XML_NAME); - zos.putNextEntry(outputEntry); - outDocHandler = new SAXWriter(osw, false); - break; - - } - - // configuring inputDocHandlerFactory - // ///////////////////////////////////////////////// - ContentHandler inDocHandler; - if (templates == null) { - inDocHandler = outDocHandler; - } else { - inDocHandler = new InputSlicingHandler("class", outDocHandler, - new TransformerHandlerFactory(saxtf, templates, - outDocHandler)); - } - ContentHandlerFactory inDocHandlerFactory = new SubdocumentHandlerFactory( - inDocHandler); - - if (inDocHandler != null && inRepresentation != SINGLE_XML) { - inDocHandler.startDocument(); - inDocHandler.startElement("", "classes", "classes", - new AttributesImpl()); - } - - int i = 0; - ZipEntry ze; - while ((ze = zis.getNextEntry()) != null) { - update(ze.getName(), n++); - if (isClassEntry(ze)) { - processEntry(zis, ze, inDocHandlerFactory); - } else { - OutputStream os = entryElement.openEntry(getName(ze)); - copyEntry(zis, os); - entryElement.closeEntry(); - } - - i++; - } - - if (inDocHandler != null && inRepresentation != SINGLE_XML) { - inDocHandler.endElement("", "classes", "classes"); - inDocHandler.endDocument(); - } - - if (outRepresentation == SINGLE_XML) { - zos.closeEntry(); - } - zos.flush(); - zos.close(); - - return i; - } - - private void copyEntry(final InputStream is, final OutputStream os) - throws IOException { - if (outRepresentation == SINGLE_XML) { - return; - } - - byte[] buff = new byte[2048]; - int i; - while ((i = is.read(buff)) != -1) { - os.write(buff, 0, i); - } - } - - private boolean isClassEntry(final ZipEntry ze) { - String name = ze.getName(); - return inRepresentation == SINGLE_XML && name.equals(SINGLE_XML_NAME) - || name.endsWith(".class") || name.endsWith(".class.xml"); - } - - private void processEntry(final ZipInputStream zis, final ZipEntry ze, - final ContentHandlerFactory handlerFactory) { - ContentHandler handler = handlerFactory.createContentHandler(); - try { - - // if (CODE2ASM.equals(command)) { // read bytecode and process it - // // with TraceClassVisitor - // ClassReader cr = new ClassReader(readEntry(zis, ze)); - // cr.accept(new TraceClassVisitor(null, new PrintWriter(os)), - // false); - // } - - boolean singleInputDocument = inRepresentation == SINGLE_XML; - if (inRepresentation == BYTECODE) { // read bytecode and process it - // with handler - ClassReader cr = new ClassReader(readEntry(zis, ze)); - cr.accept(new SAXClassAdapter(handler, singleInputDocument), 0); - - } else { // read XML and process it with handler - XMLReader reader = XMLReaderFactory.createXMLReader(); - reader.setContentHandler(handler); - reader.parse(new InputSource( - singleInputDocument ? (InputStream) new ProtectedInputStream( - zis) : new ByteArrayInputStream(readEntry(zis, - ze)))); - - } - } catch (Exception ex) { - update(ze.getName(), 0); - update(ex, 0); - } - } - - private EntryElement getEntryElement(final ZipOutputStream zos) { - if (outRepresentation == SINGLE_XML) { - return new SingleDocElement(zos); - } - return new ZipEntryElement(zos); - } - - // private ContentHandlerFactory getHandlerFactory( - // OutputStream os, - // SAXTransformerFactory saxtf, - // Templates templates) - // { - // ContentHandlerFactory factory = null; - // if (templates == null) { - // if (outputRepresentation == BYTECODE) { // factory used to write - // // bytecode - // factory = new ASMContentHandlerFactory(os, computeMax); - // } else { // factory used to write XML - // factory = new SAXWriterFactory(os, true); - // } - // } else { - // if (outputRepresentation == BYTECODE) { // factory used to transform - // // and then write bytecode - // factory = new ASMTransformerHandlerFactory(saxtf, - // templates, - // os, - // computeMax); - // } else { // factory used to transformand then write XML - // factory = new TransformerHandlerFactory(saxtf, - // templates, - // os, - // outputRepresentation == SINGLE_XML); - // } - // } - // return factory; - // } - - private String getName(final ZipEntry ze) { - String name = ze.getName(); - if (isClassEntry(ze)) { - if (inRepresentation != BYTECODE && outRepresentation == BYTECODE) { - name = name.substring(0, name.length() - 4); // .class.xml to - // .class - } else if (inRepresentation == BYTECODE - && outRepresentation != BYTECODE) { - name += ".xml"; // .class to .class.xml - } - // } else if( CODE2ASM.equals( command)) { - // name = name.substring( 0, name.length()-6).concat( ".asm"); - } - return name; - } - - private static byte[] readEntry(final InputStream zis, final ZipEntry ze) - throws IOException { - long size = ze.getSize(); - if (size > -1) { - byte[] buff = new byte[(int) size]; - int k = 0; - int n; - while ((n = zis.read(buff, k, buff.length - k)) > 0) { - k += n; - } - return buff; - } - - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] buff = new byte[4096]; - int i; - while ((i = zis.read(buff)) != -1) { - bos.write(buff, 0, i); - } - return bos.toByteArray(); - } - - /* - * (non-Javadoc) - * - * @see java.util.Observer#update(java.util.Observable, java.lang.Object) - */ - protected void update(final Object arg, final int n) { - if (arg instanceof Throwable) { - ((Throwable) arg).printStackTrace(); - } else { - if (n % 100 == 0) { - System.err.println(n + " " + arg); - } - } - } - - public static void main(final String[] args) throws Exception { - if (args.length < 2) { - showUsage(); - return; - } - - int inRepresentation = getRepresentation(args[0]); - int outRepresentation = getRepresentation(args[1]); - - InputStream is = System.in; - OutputStream os = new BufferedOutputStream(System.out); - - Source xslt = null; - // boolean computeMax = true; - - for (int i = 2; i < args.length; i++) { - if ("-in".equals(args[i])) { - is = new FileInputStream(args[++i]); - - } else if ("-out".equals(args[i])) { - os = new BufferedOutputStream(new FileOutputStream(args[++i])); - - } else if ("-xslt".equals(args[i])) { - xslt = new StreamSource(new FileInputStream(args[++i])); - - // } else if( "-computemax".equals( args[ i].toLowerCase())) { - // computeMax = true; - - } else { - showUsage(); - return; - - } - } - - if (inRepresentation == 0 || outRepresentation == 0) { - showUsage(); - return; - } - - Processor m = new Processor(inRepresentation, outRepresentation, is, - os, xslt); - - long l1 = System.currentTimeMillis(); - int n = m.process(); - long l2 = System.currentTimeMillis(); - System.err.println(n); - System.err.println((l2 - l1) + "ms " + 1000f * n / (l2 - l1) - + " resources/sec"); - } - - private static int getRepresentation(final String s) { - if ("code".equals(s)) { - return BYTECODE; - } else if ("xml".equals(s)) { - return MULTI_XML; - } else if ("singlexml".equals(s)) { - return SINGLE_XML; - } - return 0; - } - - private static void showUsage() { - System.err - .println("Usage: Main <in format> <out format> [-in <input jar>] [-out <output jar>] [-xslt <xslt fiel>]"); - System.err - .println(" when -in or -out is omitted sysin and sysout would be used"); - System.err - .println(" <in format> and <out format> - code | xml | singlexml"); - } - - /** - * IputStream wrapper class used to protect input streams from being closed - * by some stupid XML parsers. - */ - private static final class ProtectedInputStream extends InputStream { - private final InputStream is; - - ProtectedInputStream(final InputStream is) { - this.is = is; - } - - @Override - public final void close() throws IOException { - } - - @Override - public final int read() throws IOException { - return is.read(); - } - - @Override - public final int read(final byte[] b, final int off, final int len) - throws IOException { - return is.read(b, off, len); - } - - @Override - public final int available() throws IOException { - return is.available(); - } - } - - /** - * A {@link ContentHandlerFactory ContentHandlerFactory} is used to create - * {@link org.xml.sax.ContentHandler ContentHandler} instances for concrete - * context. - */ - private static interface ContentHandlerFactory { - - /** - * Creates an instance of the content handler. - * - * @return content handler - */ - ContentHandler createContentHandler(); - - } - - /** - * SAXWriterFactory - */ - private static final class SAXWriterFactory implements - ContentHandlerFactory { - private final Writer w; - - private final boolean optimizeEmptyElements; - - SAXWriterFactory(final Writer w, final boolean optimizeEmptyElements) { - this.w = w; - this.optimizeEmptyElements = optimizeEmptyElements; - } - - public final ContentHandler createContentHandler() { - return new SAXWriter(w, optimizeEmptyElements); - } - - } - - /** - * ASMContentHandlerFactory - */ - private static final class ASMContentHandlerFactory implements - ContentHandlerFactory { - final OutputStream os; - - ASMContentHandlerFactory(final OutputStream os) { - this.os = os; - } - - public final ContentHandler createContentHandler() { - final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); - return new ASMContentHandler(cw) { - @Override - public void endDocument() throws SAXException { - try { - os.write(cw.toByteArray()); - } catch (IOException e) { - throw new SAXException(e); - } - } - }; - } - - } - - /** - * TransformerHandlerFactory - */ - private static final class TransformerHandlerFactory implements - ContentHandlerFactory { - private SAXTransformerFactory saxtf; - - private final Templates templates; - - private ContentHandler outputHandler; - - TransformerHandlerFactory(final SAXTransformerFactory saxtf, - final Templates templates, final ContentHandler outputHandler) { - this.saxtf = saxtf; - this.templates = templates; - this.outputHandler = outputHandler; - } - - public final ContentHandler createContentHandler() { - try { - TransformerHandler handler = saxtf - .newTransformerHandler(templates); - handler.setResult(new SAXResult(outputHandler)); - return handler; - } catch (TransformerConfigurationException ex) { - throw new RuntimeException(ex.toString()); - } - } - } - - /** - * SubdocumentHandlerFactory - */ - private static final class SubdocumentHandlerFactory implements - ContentHandlerFactory { - private final ContentHandler subdocumentHandler; - - SubdocumentHandlerFactory(final ContentHandler subdocumentHandler) { - this.subdocumentHandler = subdocumentHandler; - } - - public final ContentHandler createContentHandler() { - return subdocumentHandler; - } - - } - - /** - * A {@link org.xml.sax.ContentHandler ContentHandler} and - * {@link org.xml.sax.ext.LexicalHandler LexicalHandler} that serializes XML - * from SAX 2.0 events into {@link java.io.Writer Writer}. - * - * <i><blockquote> This implementation does not support namespaces, entity - * definitions (uncluding DTD), CDATA and text elements. </blockquote></i> - */ - private static final class SAXWriter extends DefaultHandler implements - LexicalHandler { - private static final char[] OFF = " " - .toCharArray(); - - private Writer w; - - private final boolean optimizeEmptyElements; - - private boolean openElement = false; - - private int ident = 0; - - /** - * Creates <code>SAXWriter</code>. - * - * @param w - * writer - * @param optimizeEmptyElements - * if set to <code>true</code>, short XML syntax will be used - * for empty elements - */ - SAXWriter(final Writer w, final boolean optimizeEmptyElements) { - this.w = w; - this.optimizeEmptyElements = optimizeEmptyElements; - } - - @Override - public final void startElement(final String ns, final String localName, - final String qName, final Attributes atts) throws SAXException { - try { - closeElement(); - - writeIdent(); - w.write('<' + qName); - if (atts != null && atts.getLength() > 0) { - writeAttributes(atts); - } - - if (optimizeEmptyElements) { - openElement = true; - } else { - w.write(">\n"); - } - ident += 2; - - } catch (IOException ex) { - throw new SAXException(ex); - - } - } - - @Override - public final void endElement(final String ns, final String localName, - final String qName) throws SAXException { - ident -= 2; - try { - if (openElement) { - w.write("/>\n"); - openElement = false; - } else { - writeIdent(); - w.write("</" + qName + ">\n"); - } - - } catch (IOException ex) { - throw new SAXException(ex); - - } - } - - @Override - public final void endDocument() throws SAXException { - try { - w.flush(); - - } catch (IOException ex) { - throw new SAXException(ex); - - } - } - - public final void comment(final char[] ch, final int off, final int len) - throws SAXException { - try { - closeElement(); - - writeIdent(); - w.write("<!-- "); - w.write(ch, off, len); - w.write(" -->\n"); - - } catch (IOException ex) { - throw new SAXException(ex); - - } - } - - public final void startDTD(final String arg0, final String arg1, - final String arg2) throws SAXException { - } - - public final void endDTD() throws SAXException { - } - - public final void startEntity(final String arg0) throws SAXException { - } - - public final void endEntity(final String arg0) throws SAXException { - } - - public final void startCDATA() throws SAXException { - } - - public final void endCDATA() throws SAXException { - } - - private final void writeAttributes(final Attributes atts) - throws IOException { - StringBuilder sb = new StringBuilder(); - int len = atts.getLength(); - for (int i = 0; i < len; i++) { - sb.append(' ').append(atts.getLocalName(i)).append("=\"") - .append(esc(atts.getValue(i))).append('\"'); - } - w.write(sb.toString()); - } - - /** - * Encode string with escaping. - * - * @param str - * string to encode. - * @return encoded string - */ - private static final String esc(final String str) { - StringBuilder sb = new StringBuilder(str.length()); - for (int i = 0; i < str.length(); i++) { - char ch = str.charAt(i); - switch (ch) { - case '&': - sb.append("&"); - break; - - case '<': - sb.append("<"); - break; - - case '>': - sb.append(">"); - break; - - case '\"': - sb.append("""); - break; - - default: - if (ch > 0x7f) { - sb.append("&#").append(Integer.toString(ch)) - .append(';'); - } else { - sb.append(ch); - } - - } - } - return sb.toString(); - } - - private final void writeIdent() throws IOException { - int n = ident; - while (n > 0) { - if (n > OFF.length) { - w.write(OFF); - n -= OFF.length; - } else { - w.write(OFF, 0, n); - n = 0; - } - } - } - - private final void closeElement() throws IOException { - if (openElement) { - w.write(">\n"); - } - openElement = false; - } - - } - - /** - * A {@link org.xml.sax.ContentHandler ContentHandler} that splits XML - * documents into smaller chunks. Each chunk is processed by the nested - * {@link org.xml.sax.ContentHandler ContentHandler} obtained from - * {@link java.net.ContentHandlerFactory ContentHandlerFactory}. This is - * useful for running XSLT engine against large XML document that will - * hardly fit into the memory all together. - * <p> - * TODO use complete path for subdocumentRoot - */ - private static final class InputSlicingHandler extends DefaultHandler { - private String subdocumentRoot; - - private final ContentHandler rootHandler; - - private ContentHandlerFactory subdocumentHandlerFactory; - - private boolean subdocument = false; - - private ContentHandler subdocumentHandler; - - /** - * Constructs a new {@link InputSlicingHandler SubdocumentHandler} - * object. - * - * @param subdocumentRoot - * name/path to the root element of the subdocument - * @param rootHandler - * content handler for the entire document (subdocument - * envelope). - * @param subdocumentHandlerFactory - * a {@link ContentHandlerFactory ContentHandlerFactory} used - * to create {@link ContentHandler ContentHandler} instances - * for subdocuments. - */ - InputSlicingHandler(final String subdocumentRoot, - final ContentHandler rootHandler, - final ContentHandlerFactory subdocumentHandlerFactory) { - this.subdocumentRoot = subdocumentRoot; - this.rootHandler = rootHandler; - this.subdocumentHandlerFactory = subdocumentHandlerFactory; - } - - @Override - public final void startElement(final String namespaceURI, - final String localName, final String qName, - final Attributes list) throws SAXException { - if (subdocument) { - subdocumentHandler.startElement(namespaceURI, localName, qName, - list); - } else if (localName.equals(subdocumentRoot)) { - subdocumentHandler = subdocumentHandlerFactory - .createContentHandler(); - subdocumentHandler.startDocument(); - subdocumentHandler.startElement(namespaceURI, localName, qName, - list); - subdocument = true; - } else if (rootHandler != null) { - rootHandler.startElement(namespaceURI, localName, qName, list); - } - } - - @Override - public final void endElement(final String namespaceURI, - final String localName, final String qName) throws SAXException { - if (subdocument) { - subdocumentHandler.endElement(namespaceURI, localName, qName); - if (localName.equals(subdocumentRoot)) { - subdocumentHandler.endDocument(); - subdocument = false; - } - } else if (rootHandler != null) { - rootHandler.endElement(namespaceURI, localName, qName); - } - } - - @Override - public final void startDocument() throws SAXException { - if (rootHandler != null) { - rootHandler.startDocument(); - } - } - - @Override - public final void endDocument() throws SAXException { - if (rootHandler != null) { - rootHandler.endDocument(); - - } - } - - @Override - public final void characters(final char[] buff, final int offset, - final int size) throws SAXException { - if (subdocument) { - subdocumentHandler.characters(buff, offset, size); - } else if (rootHandler != null) { - rootHandler.characters(buff, offset, size); - } - } - - } - - /** - * A {@link org.xml.sax.ContentHandler ContentHandler} that splits XML - * documents into smaller chunks. Each chunk is processed by the nested - * {@link org.xml.sax.ContentHandler ContentHandler} obtained from - * {@link java.net.ContentHandlerFactory ContentHandlerFactory}. This is - * useful for running XSLT engine against large XML document that will - * hardly fit into the memory all together. - * - * <p> - * TODO use complete path for subdocumentRoot - */ - private static final class OutputSlicingHandler extends DefaultHandler { - private final String subdocumentRoot; - - private ContentHandlerFactory subdocumentHandlerFactory; - - private final EntryElement entryElement; - - private boolean isXml; - - private boolean subdocument = false; - - private ContentHandler subdocumentHandler; - - /** - * Constructs a new {@link OutputSlicingHandler SubdocumentHandler} - * object. - * - * @param subdocumentHandlerFactory - * a {@link ContentHandlerFactory ContentHandlerFactory} used - * to create {@link ContentHandler ContentHandler} instances - * for subdocuments. - * @param entryElement - * TODO. - * @param isXml - * TODO. - */ - OutputSlicingHandler( - final ContentHandlerFactory subdocumentHandlerFactory, - final EntryElement entryElement, final boolean isXml) { - this.subdocumentRoot = "class"; - this.subdocumentHandlerFactory = subdocumentHandlerFactory; - this.entryElement = entryElement; - this.isXml = isXml; - } - - @Override - public final void startElement(final String namespaceURI, - final String localName, final String qName, - final Attributes list) throws SAXException { - if (subdocument) { - subdocumentHandler.startElement(namespaceURI, localName, qName, - list); - } else if (localName.equals(subdocumentRoot)) { - String name = list.getValue("name"); - if (name == null || name.length() == 0) { - throw new SAXException( - "Class element without name attribute."); - } - try { - entryElement.openEntry(isXml ? name + ".class.xml" : name - + ".class"); - } catch (IOException ex) { - throw new SAXException(ex.toString(), ex); - } - subdocumentHandler = subdocumentHandlerFactory - .createContentHandler(); - subdocumentHandler.startDocument(); - subdocumentHandler.startElement(namespaceURI, localName, qName, - list); - subdocument = true; - } - } - - @Override - public final void endElement(final String namespaceURI, - final String localName, final String qName) throws SAXException { - if (subdocument) { - subdocumentHandler.endElement(namespaceURI, localName, qName); - if (localName.equals(subdocumentRoot)) { - subdocumentHandler.endDocument(); - subdocument = false; - try { - entryElement.closeEntry(); - } catch (IOException ex) { - throw new SAXException(ex.toString(), ex); - } - } - } - } - - @Override - public final void startDocument() throws SAXException { - } - - @Override - public final void endDocument() throws SAXException { - } - - @Override - public final void characters(final char[] buff, final int offset, - final int size) throws SAXException { - if (subdocument) { - subdocumentHandler.characters(buff, offset, size); - } - } - - } - - private static interface EntryElement { - - OutputStream openEntry(String name) throws IOException; - - void closeEntry() throws IOException; - - } - - private static final class SingleDocElement implements EntryElement { - private final OutputStream os; - - SingleDocElement(final OutputStream os) { - this.os = os; - } - - public OutputStream openEntry(final String name) throws IOException { - return os; - } - - public void closeEntry() throws IOException { - os.flush(); - } - - } - - private static final class ZipEntryElement implements EntryElement { - private ZipOutputStream zos; - - ZipEntryElement(final ZipOutputStream zos) { - this.zos = zos; - } - - public OutputStream openEntry(final String name) throws IOException { - ZipEntry entry = new ZipEntry(name); - zos.putNextEntry(entry); - return zos; - } - - public void closeEntry() throws IOException { - zos.flush(); - zos.closeEntry(); - } - - } - -}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXAdapter.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXAdapter.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXAdapter.java deleted file mode 100644 index 2f49c24..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXAdapter.java +++ /dev/null @@ -1,89 +0,0 @@ -/*** - * ASM XML Adapter - * Copyright (c) 2004-2011, Eugene Kuleshov - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.xml; - -import org.xml.sax.Attributes; -import org.xml.sax.ContentHandler; -import org.xml.sax.SAXException; - -/** - * SAXAdapter - * - * @author Eugene Kuleshov - */ -public class SAXAdapter { - - private final ContentHandler h; - - protected SAXAdapter(final ContentHandler h) { - this.h = h; - } - - protected ContentHandler getContentHandler() { - return h; - } - - protected void addDocumentStart() { - try { - h.startDocument(); - } catch (SAXException ex) { - throw new RuntimeException(ex.getMessage(), ex.getException()); - } - } - - protected void addDocumentEnd() { - try { - h.endDocument(); - } catch (SAXException ex) { - throw new RuntimeException(ex.getMessage(), ex.getException()); - } - } - - protected final void addStart(final String name, final Attributes attrs) { - try { - h.startElement("", name, name, attrs); - } catch (SAXException ex) { - throw new RuntimeException(ex.getMessage(), ex.getException()); - } - } - - protected final void addEnd(final String name) { - try { - h.endElement("", name, name); - } catch (SAXException ex) { - throw new RuntimeException(ex.getMessage(), ex.getException()); - } - } - - protected final void addElement(final String name, final Attributes attrs) { - addStart(name, attrs); - addEnd(name); - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXAnnotationAdapter.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXAnnotationAdapter.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXAnnotationAdapter.java deleted file mode 100644 index 76ad91e..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXAnnotationAdapter.java +++ /dev/null @@ -1,242 +0,0 @@ -/*** - * ASM XML Adapter - * Copyright (c) 2004-2011, Eugene Kuleshov - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.xml; - -import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor; -import org.apache.tapestry5.internal.plastic.asm.Opcodes; -import org.apache.tapestry5.internal.plastic.asm.Type; -import org.apache.tapestry5.internal.plastic.asm.TypePath; -import org.xml.sax.helpers.AttributesImpl; - -/** - * SAXAnnotationAdapter - * - * @author Eugene Kuleshov - */ -public final class SAXAnnotationAdapter extends AnnotationVisitor { - - SAXAdapter sa; - - private final String elementName; - - public SAXAnnotationAdapter(final SAXAdapter sa, final String elementName, - final int visible, final String name, final String desc) { - this(Opcodes.ASM6, sa, elementName, visible, desc, name, -1, -1, null, - null, null, null); - } - - public SAXAnnotationAdapter(final SAXAdapter sa, final String elementName, - final int visible, final int parameter, final String desc) { - this(Opcodes.ASM6, sa, elementName, visible, desc, null, parameter, -1, - null, null, null, null); - } - - public SAXAnnotationAdapter(final SAXAdapter sa, final String elementName, - final int visible, final String name, final String desc, - final int typeRef, final TypePath typePath) { - this(Opcodes.ASM6, sa, elementName, visible, desc, name, -1, typeRef, - typePath, null, null, null); - } - - public SAXAnnotationAdapter(final SAXAdapter sa, final String elementName, - final int visible, final String name, final String desc, - int typeRef, TypePath typePath, final String[] start, - final String[] end, final int[] index) { - this(Opcodes.ASM6, sa, elementName, visible, desc, name, -1, typeRef, - typePath, start, end, index); - } - - protected SAXAnnotationAdapter(final int api, final SAXAdapter sa, - final String elementName, final int visible, final String desc, - final String name, final int parameter) { - this(api, sa, elementName, visible, desc, name, parameter, -1, null, - null, null, null); - } - - protected SAXAnnotationAdapter(final int api, final SAXAdapter sa, - final String elementName, final int visible, final String desc, - final String name, final int parameter, final int typeRef, - final TypePath typePath, final String[] start, final String[] end, - final int[] index) { - super(api); - this.sa = sa; - this.elementName = elementName; - - AttributesImpl att = new AttributesImpl(); - if (name != null) { - att.addAttribute("", "name", "name", "", name); - } - if (visible != 0) { - att.addAttribute("", "visible", "visible", "", visible > 0 ? "true" - : "false"); - } - if (parameter != -1) { - att.addAttribute("", "parameter", "parameter", "", - Integer.toString(parameter)); - } - if (desc != null) { - att.addAttribute("", "desc", "desc", "", desc); - } - if (typeRef != -1) { - att.addAttribute("", "typeRef", "typeRef", "", - Integer.toString(typeRef)); - } - if (typePath != null) { - att.addAttribute("", "typePath", "typePath", "", - typePath.toString()); - } - if (start != null) { - StringBuilder value = new StringBuilder(start[0]); - for (int i = 1; i < start.length; ++i) { - value.append(" ").append(start[i]); - } - att.addAttribute("", "start", "start", "", value.toString()); - } - if (end != null) { - StringBuilder value = new StringBuilder(end[0]); - for (int i = 1; i < end.length; ++i) { - value.append(" ").append(end[i]); - } - att.addAttribute("", "end", "end", "", value.toString()); - } - if (index != null) { - StringBuilder value = new StringBuilder(); - value.append(index[0]); - for (int i = 1; i < index.length; ++i) { - value.append(" ").append(index[i]); - } - att.addAttribute("", "index", "index", "", value.toString()); - } - - sa.addStart(elementName, att); - } - - @Override - public void visit(final String name, final Object value) { - Class<?> c = value.getClass(); - if (c.isArray()) { - AnnotationVisitor av = visitArray(name); - if (value instanceof byte[]) { - byte[] b = (byte[]) value; - for (int i = 0; i < b.length; i++) { - av.visit(null, b[i]); - } - - } else if (value instanceof char[]) { - char[] b = (char[]) value; - for (int i = 0; i < b.length; i++) { - av.visit(null, b[i]); - } - - } else if (value instanceof short[]) { - short[] b = (short[]) value; - for (int i = 0; i < b.length; i++) { - av.visit(null, b[i]); - } - - } else if (value instanceof boolean[]) { - boolean[] b = (boolean[]) value; - for (int i = 0; i < b.length; i++) { - av.visit(null, Boolean.valueOf(b[i])); - } - - } else if (value instanceof int[]) { - int[] b = (int[]) value; - for (int i = 0; i < b.length; i++) { - av.visit(null, b[i]); - } - - } else if (value instanceof long[]) { - long[] b = (long[]) value; - for (int i = 0; i < b.length; i++) { - av.visit(null, b[i]); - } - - } else if (value instanceof float[]) { - float[] b = (float[]) value; - for (int i = 0; i < b.length; i++) { - av.visit(null, b[i]); - } - - } else if (value instanceof double[]) { - double[] b = (double[]) value; - for (int i = 0; i < b.length; i++) { - av.visit(null, b[i]); - } - - } - av.visitEnd(); - } else { - addValueElement("annotationValue", name, Type.getDescriptor(c), - value.toString()); - } - } - - @Override - public void visitEnum(final String name, final String desc, - final String value) { - addValueElement("annotationValueEnum", name, desc, value); - } - - @Override - public AnnotationVisitor visitAnnotation(final String name, - final String desc) { - return new SAXAnnotationAdapter(sa, "annotationValueAnnotation", 0, - name, desc); - } - - @Override - public AnnotationVisitor visitArray(final String name) { - return new SAXAnnotationAdapter(sa, "annotationValueArray", 0, name, - null); - } - - @Override - public void visitEnd() { - sa.addEnd(elementName); - } - - private void addValueElement(final String element, final String name, - final String desc, final String value) { - AttributesImpl att = new AttributesImpl(); - if (name != null) { - att.addAttribute("", "name", "name", "", name); - } - if (desc != null) { - att.addAttribute("", "desc", "desc", "", desc); - } - if (value != null) { - att.addAttribute("", "value", "value", "", - SAXClassAdapter.encode(value)); - } - - sa.addElement(element, att); - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXClassAdapter.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXClassAdapter.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXClassAdapter.java deleted file mode 100644 index 8e41508..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXClassAdapter.java +++ /dev/null @@ -1,381 +0,0 @@ -/*** - * ASM XML Adapter - * Copyright (c) 2004-2011, Eugene Kuleshov - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.xml; - -import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor; -import org.apache.tapestry5.internal.plastic.asm.ClassVisitor; -import org.apache.tapestry5.internal.plastic.asm.FieldVisitor; -import org.apache.tapestry5.internal.plastic.asm.MethodVisitor; -import org.apache.tapestry5.internal.plastic.asm.ModuleVisitor; -import org.apache.tapestry5.internal.plastic.asm.Opcodes; -import org.apache.tapestry5.internal.plastic.asm.TypePath; -import org.xml.sax.ContentHandler; -import org.xml.sax.helpers.AttributesImpl; - -/** - * A {@link org.objectweb.asm.ClassVisitor ClassVisitor} that generates SAX 2.0 - * events from the visited class. It can feed any kind of - * {@link org.xml.sax.ContentHandler ContentHandler}, e.g. XML serializer, XSLT - * or XQuery engines. - * - * @see org.objectweb.asm.xml.Processor - * @see org.objectweb.asm.xml.ASMContentHandler - * - * @author Eugene Kuleshov - */ -public final class SAXClassAdapter extends ClassVisitor { - - SAXAdapter sa; - - private final boolean singleDocument; - - /** - * Pseudo access flag used to distinguish class access flags. - */ - private static final int ACCESS_CLASS = 262144; - - /** - * Pseudo access flag used to distinguish field access flags. - */ - private static final int ACCESS_FIELD = 524288; - - /** - * Pseudo access flag used to distinguish inner class flags. - */ - private static final int ACCESS_INNER = 1048576; - - /** - * Pseudo access flag used to distinguish module flags. - */ - static final int ACCESS_MODULE = 2097152; - - /** - * Pseudo access flag used to distinguish module requires flags. - */ - static final int ACCESS_MODULE_REQUIRES = 4194304; - - /** - * Constructs a new {@link SAXClassAdapter SAXClassAdapter} object. - * - * @param h - * content handler that will be used to send SAX 2.0 events. - * @param singleDocument - * if <tt>true</tt> adapter will not produce - * {@link ContentHandler#startDocument() startDocument()} and - * {@link ContentHandler#endDocument() endDocument()} events. - */ - public SAXClassAdapter(final ContentHandler h, boolean singleDocument) { - super(Opcodes.ASM6); - this.sa = new SAXAdapter(h); - this.singleDocument = singleDocument; - if (!singleDocument) { - sa.addDocumentStart(); - } - } - - @Override - public void visitSource(final String source, final String debug) { - AttributesImpl att = new AttributesImpl(); - if (source != null) { - att.addAttribute("", "file", "file", "", encode(source)); - } - if (debug != null) { - att.addAttribute("", "debug", "debug", "", encode(debug)); - } - - sa.addElement("source", att); - } - - @Override - public ModuleVisitor visitModule(final String name, final int access, - final String version) { - AttributesImpl att = new AttributesImpl(); - att.addAttribute("", "name", "name", "", name); - StringBuilder sb = new StringBuilder(); - appendAccess(access | ACCESS_MODULE, sb); - att.addAttribute("", "access", "access", "", sb.toString()); - if (version != null) { - att.addAttribute("", "version", "version", "", encode(version)); - } - sa.addStart("module", att); - return new SAXModuleAdapter(sa); - } - - @Override - public void visitOuterClass(final String owner, final String name, - final String desc) { - AttributesImpl att = new AttributesImpl(); - att.addAttribute("", "owner", "owner", "", owner); - if (name != null) { - att.addAttribute("", "name", "name", "", name); - } - if (desc != null) { - att.addAttribute("", "desc", "desc", "", desc); - } - - sa.addElement("outerclass", att); - } - - @Override - public AnnotationVisitor visitAnnotation(final String desc, - final boolean visible) { - return new SAXAnnotationAdapter(sa, "annotation", visible ? 1 : -1, - null, desc); - } - - @Override - public AnnotationVisitor visitTypeAnnotation(int typeRef, - TypePath typePath, String desc, boolean visible) { - return new SAXAnnotationAdapter(sa, "typeAnnotation", visible ? 1 : -1, - null, desc, typeRef, typePath); - } - - @Override - public void visit(final int version, final int access, final String name, - final String signature, final String superName, - final String[] interfaces) { - StringBuilder sb = new StringBuilder(); - appendAccess(access | ACCESS_CLASS, sb); - - AttributesImpl att = new AttributesImpl(); - att.addAttribute("", "access", "access", "", sb.toString()); - if (name != null) { - att.addAttribute("", "name", "name", "", name); - } - if (signature != null) { - att.addAttribute("", "signature", "signature", "", - encode(signature)); - } - if (superName != null) { - att.addAttribute("", "parent", "parent", "", superName); - } - att.addAttribute("", "major", "major", "", - Integer.toString(version & 0xFFFF)); - att.addAttribute("", "minor", "minor", "", - Integer.toString(version >>> 16)); - sa.addStart("class", att); - - sa.addStart("interfaces", new AttributesImpl()); - if (interfaces != null && interfaces.length > 0) { - for (int i = 0; i < interfaces.length; i++) { - AttributesImpl att2 = new AttributesImpl(); - att2.addAttribute("", "name", "name", "", interfaces[i]); - sa.addElement("interface", att2); - } - } - sa.addEnd("interfaces"); - } - - @Override - public FieldVisitor visitField(final int access, final String name, - final String desc, final String signature, final Object value) { - StringBuilder sb = new StringBuilder(); - appendAccess(access | ACCESS_FIELD, sb); - - AttributesImpl att = new AttributesImpl(); - att.addAttribute("", "access", "access", "", sb.toString()); - att.addAttribute("", "name", "name", "", name); - att.addAttribute("", "desc", "desc", "", desc); - if (signature != null) { - att.addAttribute("", "signature", "signature", "", - encode(signature)); - } - if (value != null) { - att.addAttribute("", "value", "value", "", encode(value.toString())); - } - - return new SAXFieldAdapter(sa, att); - } - - @Override - public MethodVisitor visitMethod(final int access, final String name, - final String desc, final String signature, final String[] exceptions) { - StringBuilder sb = new StringBuilder(); - appendAccess(access, sb); - - AttributesImpl att = new AttributesImpl(); - att.addAttribute("", "access", "access", "", sb.toString()); - att.addAttribute("", "name", "name", "", name); - att.addAttribute("", "desc", "desc", "", desc); - if (signature != null) { - att.addAttribute("", "signature", "signature", "", signature); - } - sa.addStart("method", att); - - sa.addStart("exceptions", new AttributesImpl()); - if (exceptions != null && exceptions.length > 0) { - for (int i = 0; i < exceptions.length; i++) { - AttributesImpl att2 = new AttributesImpl(); - att2.addAttribute("", "name", "name", "", exceptions[i]); - sa.addElement("exception", att2); - } - } - sa.addEnd("exceptions"); - - return new SAXCodeAdapter(sa, access); - } - - @Override - public final void visitInnerClass(final String name, - final String outerName, final String innerName, final int access) { - StringBuilder sb = new StringBuilder(); - appendAccess(access | ACCESS_INNER, sb); - - AttributesImpl att = new AttributesImpl(); - att.addAttribute("", "access", "access", "", sb.toString()); - if (name != null) { - att.addAttribute("", "name", "name", "", name); - } - if (outerName != null) { - att.addAttribute("", "outerName", "outerName", "", outerName); - } - if (innerName != null) { - att.addAttribute("", "innerName", "innerName", "", innerName); - } - sa.addElement("innerclass", att); - } - - @Override - public final void visitEnd() { - sa.addEnd("class"); - if (!singleDocument) { - sa.addDocumentEnd(); - } - } - - static final String encode(final String s) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - if (c == '\\') { - sb.append("\\\\"); - } else if (c < 0x20 || c > 0x7f) { - sb.append("\\u"); - if (c < 0x10) { - sb.append("000"); - } else if (c < 0x100) { - sb.append("00"); - } else if (c < 0x1000) { - sb.append('0'); - } - sb.append(Integer.toString(c, 16)); - } else { - sb.append(c); - } - } - return sb.toString(); - } - - static void appendAccess(final int access, final StringBuilder sb) { - if ((access & Opcodes.ACC_PUBLIC) != 0) { - sb.append("public "); - } - if ((access & Opcodes.ACC_PRIVATE) != 0) { - sb.append("private "); - } - if ((access & Opcodes.ACC_PROTECTED) != 0) { - sb.append("protected "); - } - if ((access & Opcodes.ACC_FINAL) != 0) { - if ((access & ACCESS_MODULE) == 0) { - sb.append("final "); - } else { - sb.append("transitive "); - } - } - if ((access & Opcodes.ACC_STATIC) != 0) { - sb.append("static "); - } - if ((access & Opcodes.ACC_SUPER) != 0) { - if ((access & ACCESS_CLASS) == 0) { - if ((access & ACCESS_MODULE_REQUIRES) != 0) { - sb.append("transitive "); - } else { - if ((access & ACCESS_MODULE) == 0) { - sb.append("synchronized "); - } else { - sb.append("open "); - } - } - } else { - sb.append("super "); - } - } - if ((access & Opcodes.ACC_VOLATILE) != 0) { - if ((access & ACCESS_FIELD) == 0) { - sb.append("bridge "); - } else { - if ((access & ACCESS_MODULE_REQUIRES) == 0) { - sb.append("volatile "); - } else { - sb.append("static "); - } - } - } - if ((access & Opcodes.ACC_TRANSIENT) != 0) { - if ((access & ACCESS_FIELD) == 0) { - sb.append("varargs "); - } else { - sb.append("transient "); - } - } - if ((access & Opcodes.ACC_NATIVE) != 0) { - sb.append("native "); - } - if ((access & Opcodes.ACC_STRICT) != 0) { - sb.append("strict "); - } - if ((access & Opcodes.ACC_INTERFACE) != 0) { - sb.append("interface "); - } - if ((access & Opcodes.ACC_ABSTRACT) != 0) { - sb.append("abstract "); - } - if ((access & Opcodes.ACC_SYNTHETIC) != 0) { - sb.append("synthetic "); - } - if ((access & Opcodes.ACC_ANNOTATION) != 0) { - sb.append("annotation "); - } - if ((access & Opcodes.ACC_ENUM) != 0) { - sb.append("enum "); - } - if ((access & Opcodes.ACC_DEPRECATED) != 0) { - sb.append("deprecated "); - } - if ((access & Opcodes.ACC_MANDATED) != 0) { - if ((access & ACCESS_CLASS) == 0) { - sb.append("module "); - } else { - sb.append("mandated "); - } - } - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXCodeAdapter.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXCodeAdapter.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXCodeAdapter.java deleted file mode 100644 index 3b96007..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXCodeAdapter.java +++ /dev/null @@ -1,415 +0,0 @@ -/*** - * ASM XML Adapter - * Copyright (c) 2004-2011, Eugene Kuleshov - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.xml; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor; -import org.apache.tapestry5.internal.plastic.asm.Handle; -import org.apache.tapestry5.internal.plastic.asm.Label; -import org.apache.tapestry5.internal.plastic.asm.MethodVisitor; -import org.apache.tapestry5.internal.plastic.asm.Opcodes; -import org.apache.tapestry5.internal.plastic.asm.Type; -import org.apache.tapestry5.internal.plastic.asm.TypePath; -import org.apache.tapestry5.internal.plastic.asm.util.Printer; -import org.xml.sax.helpers.AttributesImpl; - -/** - * A {@link MethodVisitor} that generates SAX 2.0 events from the visited - * method. - * - * @see org.objectweb.asm.xml.SAXClassAdapter - * @see org.objectweb.asm.xml.Processor - * - * @author Eugene Kuleshov - */ -public final class SAXCodeAdapter extends MethodVisitor { - - static final String[] TYPES = { "top", "int", "float", "double", "long", - "null", "uninitializedThis" }; - - SAXAdapter sa; - - int access; - - private final Map<Label, String> labelNames; - - /** - * Constructs a new {@link SAXCodeAdapter SAXCodeAdapter} object. - * - * @param sa - * content handler that will be used to send SAX 2.0 events. - */ - public SAXCodeAdapter(final SAXAdapter sa, final int access) { - super(Opcodes.ASM6); - this.sa = sa; - this.access = access; - this.labelNames = new HashMap<Label, String>(); - } - - @Override - public void visitParameter(String name, int access) { - AttributesImpl attrs = new AttributesImpl(); - if (name != null) { - attrs.addAttribute("", "name", "name", "", name); - } - StringBuilder sb = new StringBuilder(); - SAXClassAdapter.appendAccess(access, sb); - attrs.addAttribute("", "access", "access", "", sb.toString()); - sa.addElement("parameter", attrs); - } - - @Override - public final void visitCode() { - if ((access & (Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE | Opcodes.ACC_NATIVE)) == 0) { - sa.addStart("code", new AttributesImpl()); - } - } - - @Override - public void visitFrame(final int type, final int nLocal, - final Object[] local, final int nStack, final Object[] stack) { - AttributesImpl attrs = new AttributesImpl(); - switch (type) { - case Opcodes.F_NEW: - case Opcodes.F_FULL: - if (type == Opcodes.F_NEW) { - attrs.addAttribute("", "type", "type", "", "NEW"); - } else { - attrs.addAttribute("", "type", "type", "", "FULL"); - } - sa.addStart("frame", attrs); - appendFrameTypes(true, nLocal, local); - appendFrameTypes(false, nStack, stack); - break; - case Opcodes.F_APPEND: - attrs.addAttribute("", "type", "type", "", "APPEND"); - sa.addStart("frame", attrs); - appendFrameTypes(true, nLocal, local); - break; - case Opcodes.F_CHOP: - attrs.addAttribute("", "type", "type", "", "CHOP"); - attrs.addAttribute("", "count", "count", "", - Integer.toString(nLocal)); - sa.addStart("frame", attrs); - break; - case Opcodes.F_SAME: - attrs.addAttribute("", "type", "type", "", "SAME"); - sa.addStart("frame", attrs); - break; - case Opcodes.F_SAME1: - attrs.addAttribute("", "type", "type", "", "SAME1"); - sa.addStart("frame", attrs); - appendFrameTypes(false, 1, stack); - break; - } - sa.addEnd("frame"); - } - - private void appendFrameTypes(final boolean local, final int n, - final Object[] types) { - for (int i = 0; i < n; ++i) { - Object type = types[i]; - AttributesImpl attrs = new AttributesImpl(); - if (type instanceof String) { - attrs.addAttribute("", "type", "type", "", (String) type); - } else if (type instanceof Integer) { - attrs.addAttribute("", "type", "type", "", - TYPES[((Integer) type).intValue()]); - } else { - attrs.addAttribute("", "type", "type", "", "uninitialized"); - attrs.addAttribute("", "label", "label", "", - getLabel((Label) type)); - } - sa.addElement(local ? "local" : "stack", attrs); - } - } - - @Override - public final void visitInsn(final int opcode) { - sa.addElement(Printer.OPCODES[opcode], new AttributesImpl()); - } - - @Override - public final void visitIntInsn(final int opcode, final int operand) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "value", "value", "", Integer.toString(operand)); - sa.addElement(Printer.OPCODES[opcode], attrs); - } - - @Override - public final void visitVarInsn(final int opcode, final int var) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "var", "var", "", Integer.toString(var)); - sa.addElement(Printer.OPCODES[opcode], attrs); - } - - @Override - public final void visitTypeInsn(final int opcode, final String type) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "desc", "desc", "", type); - sa.addElement(Printer.OPCODES[opcode], attrs); - } - - @Override - public final void visitFieldInsn(final int opcode, final String owner, - final String name, final String desc) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "owner", "owner", "", owner); - attrs.addAttribute("", "name", "name", "", name); - attrs.addAttribute("", "desc", "desc", "", desc); - sa.addElement(Printer.OPCODES[opcode], attrs); - } - - @Override - public final void visitMethodInsn(final int opcode, final String owner, - final String name, final String desc, final boolean itf) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "owner", "owner", "", owner); - attrs.addAttribute("", "name", "name", "", name); - attrs.addAttribute("", "desc", "desc", "", desc); - attrs.addAttribute("", "itf", "itf", "", itf ? "true" : "false"); - sa.addElement(Printer.OPCODES[opcode], attrs); - } - - @Override - public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, - Object... bsmArgs) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "name", "name", "", name); - attrs.addAttribute("", "desc", "desc", "", desc); - attrs.addAttribute("", "bsm", "bsm", "", - SAXClassAdapter.encode(bsm.toString())); - sa.addStart("INVOKEDYNAMIC", attrs); - for (int i = 0; i < bsmArgs.length; i++) { - sa.addElement("bsmArg", getConstantAttribute(bsmArgs[i])); - } - sa.addEnd("INVOKEDYNAMIC"); - } - - @Override - public final void visitJumpInsn(final int opcode, final Label label) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "label", "label", "", getLabel(label)); - sa.addElement(Printer.OPCODES[opcode], attrs); - } - - @Override - public final void visitLabel(final Label label) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "name", "name", "", getLabel(label)); - sa.addElement("Label", attrs); - } - - @Override - public final void visitLdcInsn(final Object cst) { - sa.addElement(Printer.OPCODES[Opcodes.LDC], getConstantAttribute(cst)); - } - - private static AttributesImpl getConstantAttribute(final Object cst) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "cst", "cst", "", - SAXClassAdapter.encode(cst.toString())); - attrs.addAttribute("", "desc", "desc", "", - Type.getDescriptor(cst.getClass())); - return attrs; - } - - @Override - public final void visitIincInsn(final int var, final int increment) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "var", "var", "", Integer.toString(var)); - attrs.addAttribute("", "inc", "inc", "", Integer.toString(increment)); - sa.addElement(Printer.OPCODES[Opcodes.IINC], attrs); - } - - @Override - public final void visitTableSwitchInsn(final int min, final int max, - final Label dflt, final Label... labels) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "min", "min", "", Integer.toString(min)); - attrs.addAttribute("", "max", "max", "", Integer.toString(max)); - attrs.addAttribute("", "dflt", "dflt", "", getLabel(dflt)); - String o = Printer.OPCODES[Opcodes.TABLESWITCH]; - sa.addStart(o, attrs); - for (int i = 0; i < labels.length; i++) { - AttributesImpl att2 = new AttributesImpl(); - att2.addAttribute("", "name", "name", "", getLabel(labels[i])); - sa.addElement("label", att2); - } - sa.addEnd(o); - } - - @Override - public final void visitLookupSwitchInsn(final Label dflt, final int[] keys, - final Label[] labels) { - AttributesImpl att = new AttributesImpl(); - att.addAttribute("", "dflt", "dflt", "", getLabel(dflt)); - String o = Printer.OPCODES[Opcodes.LOOKUPSWITCH]; - sa.addStart(o, att); - for (int i = 0; i < labels.length; i++) { - AttributesImpl att2 = new AttributesImpl(); - att2.addAttribute("", "name", "name", "", getLabel(labels[i])); - att2.addAttribute("", "key", "key", "", Integer.toString(keys[i])); - sa.addElement("label", att2); - } - sa.addEnd(o); - } - - @Override - public final void visitMultiANewArrayInsn(final String desc, final int dims) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "desc", "desc", "", desc); - attrs.addAttribute("", "dims", "dims", "", Integer.toString(dims)); - sa.addElement(Printer.OPCODES[Opcodes.MULTIANEWARRAY], attrs); - } - - @Override - public final void visitTryCatchBlock(final Label start, final Label end, - final Label handler, final String type) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "start", "start", "", getLabel(start)); - attrs.addAttribute("", "end", "end", "", getLabel(end)); - attrs.addAttribute("", "handler", "handler", "", getLabel(handler)); - if (type != null) { - attrs.addAttribute("", "type", "type", "", type); - } - sa.addElement("TryCatch", attrs); - } - - @Override - public final void visitMaxs(final int maxStack, final int maxLocals) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "maxStack", "maxStack", "", - Integer.toString(maxStack)); - attrs.addAttribute("", "maxLocals", "maxLocals", "", - Integer.toString(maxLocals)); - sa.addElement("Max", attrs); - - sa.addEnd("code"); - } - - @Override - public void visitLocalVariable(final String name, final String desc, - final String signature, final Label start, final Label end, - final int index) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "name", "name", "", name); - attrs.addAttribute("", "desc", "desc", "", desc); - if (signature != null) { - attrs.addAttribute("", "signature", "signature", "", - SAXClassAdapter.encode(signature)); - } - attrs.addAttribute("", "start", "start", "", getLabel(start)); - attrs.addAttribute("", "end", "end", "", getLabel(end)); - attrs.addAttribute("", "var", "var", "", Integer.toString(index)); - sa.addElement("LocalVar", attrs); - } - - @Override - public final void visitLineNumber(final int line, final Label start) { - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "line", "line", "", Integer.toString(line)); - attrs.addAttribute("", "start", "start", "", getLabel(start)); - sa.addElement("LineNumber", attrs); - } - - @Override - public AnnotationVisitor visitAnnotationDefault() { - return new SAXAnnotationAdapter(sa, "annotationDefault", 0, null, null); - } - - @Override - public AnnotationVisitor visitAnnotation(final String desc, - final boolean visible) { - return new SAXAnnotationAdapter(sa, "annotation", visible ? 1 : -1, - null, desc); - } - - @Override - public AnnotationVisitor visitTypeAnnotation(int typeRef, - TypePath typePath, String desc, boolean visible) { - return new SAXAnnotationAdapter(sa, "typeAnnotation", visible ? 1 : -1, - null, desc, typeRef, typePath); - } - - @Override - public AnnotationVisitor visitParameterAnnotation(final int parameter, - final String desc, final boolean visible) { - return new SAXAnnotationAdapter(sa, "parameterAnnotation", visible ? 1 - : -1, parameter, desc); - } - - @Override - public AnnotationVisitor visitInsnAnnotation(int typeRef, - TypePath typePath, String desc, boolean visible) { - return new SAXAnnotationAdapter(sa, "insnAnnotation", visible ? 1 : -1, - null, desc, typeRef, typePath); - } - - @Override - public AnnotationVisitor visitTryCatchAnnotation(int typeRef, - TypePath typePath, String desc, boolean visible) { - return new SAXAnnotationAdapter(sa, "tryCatchAnnotation", visible ? 1 - : -1, null, desc, typeRef, typePath); - } - - @Override - public AnnotationVisitor visitLocalVariableAnnotation(int typeRef, - TypePath typePath, Label[] start, Label[] end, int[] index, - String desc, boolean visible) { - String[] s = new String[start.length]; - String[] e = new String[end.length]; - for (int i = 0; i < s.length; ++i) { - s[i] = getLabel(start[i]); - } - for (int i = 0; i < e.length; ++i) { - e[i] = getLabel(end[i]); - } - return new SAXAnnotationAdapter(sa, "localVariableAnnotation", - visible ? 1 : -1, null, desc, typeRef, typePath, s, e, index); - } - - @Override - public void visitEnd() { - sa.addEnd("method"); - } - - private final String getLabel(final Label label) { - String name = labelNames.get(label); - if (name == null) { - name = Integer.toString(labelNames.size()); - labelNames.put(label, name); - } - return name; - } - -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXFieldAdapter.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXFieldAdapter.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXFieldAdapter.java deleted file mode 100644 index 7f0b90e..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/xml/SAXFieldAdapter.java +++ /dev/null @@ -1,71 +0,0 @@ -/*** - * ASM XML Adapter - * Copyright (c) 2004-2011, Eugene Kuleshov - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.xml; - -import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor; -import org.apache.tapestry5.internal.plastic.asm.FieldVisitor; -import org.apache.tapestry5.internal.plastic.asm.Opcodes; -import org.apache.tapestry5.internal.plastic.asm.TypePath; -import org.xml.sax.Attributes; - -/** - * SAXFieldAdapter - * - * @author Eugene Kuleshov - */ -public final class SAXFieldAdapter extends FieldVisitor { - - SAXAdapter sa; - - public SAXFieldAdapter(final SAXAdapter sa, final Attributes att) { - super(Opcodes.ASM6); - this.sa = sa; - sa.addStart("field", att); - } - - @Override - public AnnotationVisitor visitAnnotation(final String desc, - final boolean visible) { - return new SAXAnnotationAdapter(sa, "annotation", visible ? 1 : -1, - null, desc); - } - - @Override - public AnnotationVisitor visitTypeAnnotation(int typeRef, - TypePath typePath, String desc, boolean visible) { - return new SAXAnnotationAdapter(sa, "typeAnnotation", visible ? 1 : -1, - null, desc, typeRef, typePath); - } - - @Override - public void visitEnd() { - sa.addEnd("field"); - } -}
