001: /***
002: * ASM: a very small and fast Java bytecode manipulation framework
003: * Copyright (c) 2000-2005 INRIA, France Telecom
004: * All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: * 1. Redistributions of source code must retain the above copyright
010: * notice, this list of conditions and the following disclaimer.
011: * 2. Redistributions in binary form must reproduce the above copyright
012: * notice, this list of conditions and the following disclaimer in the
013: * documentation and/or other materials provided with the distribution.
014: * 3. Neither the name of the copyright holders nor the names of its
015: * contributors may be used to endorse or promote products derived from
016: * this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
022: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
024: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
025: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
026: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
027: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
028: * THE POSSIBILITY OF SUCH DAMAGE.
029: */package org.drools.asm.util;
030:
031: import org.drools.asm.AnnotationVisitor;
032:
033: /**
034: * An {@link AnnotationVisitor} that prints the ASM code that generates the
035: * annotations it visits.
036: *
037: * @author Eric Bruneton
038: */
039: public class ASMifierAnnotationVisitor extends AbstractVisitor
040: implements AnnotationVisitor {
041:
042: /**
043: * Identifier of the annotation visitor variable in the produced code.
044: */
045: protected final int id;
046:
047: /**
048: * Constructs a new {@link ASMifierAnnotationVisitor}.
049: *
050: * @param id identifier of the annotation visitor variable in the produced
051: * code.
052: */
053: public ASMifierAnnotationVisitor(final int id) {
054: this .id = id;
055: }
056:
057: // ------------------------------------------------------------------------
058: // Implementation of the AnnotationVisitor interface
059: // ------------------------------------------------------------------------
060:
061: public void visit(final String name, final Object value) {
062: this .buf.setLength(0);
063: this .buf.append("av").append(this .id).append(".visit(");
064: ASMifierAbstractVisitor.appendConstant(this .buf, name);
065: this .buf.append(", ");
066: ASMifierAbstractVisitor.appendConstant(this .buf, value);
067: this .buf.append(");\n");
068: this .text.add(this .buf.toString());
069: }
070:
071: public void visitEnum(final String name, final String desc,
072: final String value) {
073: this .buf.setLength(0);
074: this .buf.append("av").append(this .id).append(".visitEnum(");
075: ASMifierAbstractVisitor.appendConstant(this .buf, name);
076: this .buf.append(", ");
077: ASMifierAbstractVisitor.appendConstant(this .buf, desc);
078: this .buf.append(", ");
079: ASMifierAbstractVisitor.appendConstant(this .buf, value);
080: this .buf.append(");\n");
081: this .text.add(this .buf.toString());
082: }
083:
084: public AnnotationVisitor visitAnnotation(final String name,
085: final String desc) {
086: this .buf.setLength(0);
087: this .buf.append("{\n");
088: this .buf.append("AnnotationVisitor av").append(this .id + 1)
089: .append(" = av");
090: this .buf.append(this .id).append(".visitAnnotation(");
091: ASMifierAbstractVisitor.appendConstant(this .buf, name);
092: this .buf.append(", ");
093: ASMifierAbstractVisitor.appendConstant(this .buf, desc);
094: this .buf.append(");\n");
095: this .text.add(this .buf.toString());
096: final ASMifierAnnotationVisitor av = new ASMifierAnnotationVisitor(
097: this .id + 1);
098: this .text.add(av.getText());
099: this .text.add("}\n");
100: return av;
101: }
102:
103: public AnnotationVisitor visitArray(final String name) {
104: this .buf.setLength(0);
105: this .buf.append("{\n");
106: this .buf.append("AnnotationVisitor av").append(this .id + 1)
107: .append(" = av");
108: this .buf.append(this .id).append(".visitArray(");
109: ASMifierAbstractVisitor.appendConstant(this .buf, name);
110: this .buf.append(");\n");
111: this .text.add(this .buf.toString());
112: final ASMifierAnnotationVisitor av = new ASMifierAnnotationVisitor(
113: this .id + 1);
114: this .text.add(av.getText());
115: this .text.add("}\n");
116: return av;
117: }
118:
119: public void visitEnd() {
120: this .buf.setLength(0);
121: this .buf.append("av").append(this .id).append(".visitEnd();\n");
122: this.text.add(this.buf.toString());
123: }
124: }
|