1 /*
2  * reserved comment block
3  * DO NOT REMOVE OR ALTER!
4  */
5 /*
6  * Licensed to the Apache Software Foundation (ASF) under one or more
7  * contributor license agreements.  See the NOTICE file distributed with
8  * this work for additional information regarding copyright ownership.
9  * The ASF licenses this file to You under the Apache License, Version 2.0
10  * (the "License"); you may not use this file except in compliance with
11  * the License.  You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21 
22 package com.sun.org.apache.xalan.internal.xsltc.compiler.util;
23 
24 import com.sun.org.apache.bcel.internal.classfile.Method;
25 import com.sun.org.apache.bcel.internal.generic.ALOAD;
26 import com.sun.org.apache.bcel.internal.generic.ClassGen;
27 import com.sun.org.apache.bcel.internal.generic.Instruction;
28 import com.sun.org.apache.xalan.internal.xsltc.compiler.Constants;
29 import com.sun.org.apache.xalan.internal.xsltc.compiler.Parser;
30 import com.sun.org.apache.xalan.internal.xsltc.compiler.Stylesheet;
31 
32 /**
33  * The class that implements any class that inherits from
34  * <tt>AbstractTranslet</tt>, i.e. any translet. Methods in this
35  * class may be of the following kinds:
36  *
37  * 1. Main method: applyTemplates, implemented by intances of
38  * <tt>MethodGenerator</tt>.
39  *
40  * 2. Named methods: for named templates, implemented by instances
41  * of <tt>NamedMethodGenerator</tt>.
42  *
43  * 3. Rt methods: for result tree fragments, implemented by
44  * instances of <tt>RtMethodGenerator</tt>.
45  * @author Jacek Ambroziak
46  * @author Santiago Pericas-Geertsen
47  */
48 public class ClassGenerator extends ClassGen {
49     protected final static int TRANSLET_INDEX = 0;
50     protected static int INVALID_INDEX  = -1;
51 
52     private Stylesheet _stylesheet;
53     private final Parser _parser;               // --> can be moved to XSLT
54     // a  single instance cached here
55     private final Instruction _aloadTranslet;
56     private final String _domClass;
57     private final String _domClassSig;
58     private final String _applyTemplatesSig;
59         private final String _applyTemplatesSigForImport;
60 
ClassGenerator(String class_name, String super_class_name, String file_name, int access_flags, String[] interfaces, Stylesheet stylesheet)61     public ClassGenerator(String class_name, String super_class_name,
62                           String file_name,
63                           int access_flags, String[] interfaces,
64                           Stylesheet stylesheet) {
65         super(class_name, super_class_name, file_name,
66               access_flags, interfaces);
67         _stylesheet = stylesheet;
68         _parser = stylesheet.getParser();
69         _aloadTranslet = new ALOAD(TRANSLET_INDEX);
70 
71         if (stylesheet.isMultiDocument()) {
72             _domClass = "com.sun.org.apache.xalan.internal.xsltc.dom.MultiDOM";
73             _domClassSig = "Lcom/sun/org/apache/xalan/internal/xsltc/dom/MultiDOM;";
74         }
75         else {
76             _domClass = "com.sun.org.apache.xalan.internal.xsltc.dom.DOMAdapter";
77             _domClassSig = "Lcom/sun/org/apache/xalan/internal/xsltc/dom/DOMAdapter;";
78         }
79         _applyTemplatesSig = "("
80             + Constants.DOM_INTF_SIG
81             + Constants.NODE_ITERATOR_SIG
82             + Constants.TRANSLET_OUTPUT_SIG
83             + ")V";
84 
85     _applyTemplatesSigForImport = "("
86         + Constants.DOM_INTF_SIG
87         + Constants.NODE_ITERATOR_SIG
88         + Constants.TRANSLET_OUTPUT_SIG
89         + Constants.NODE_FIELD_SIG
90         + ")V";
91     }
92 
getParser()93     public final Parser getParser() {
94         return _parser;
95     }
96 
getStylesheet()97     public final Stylesheet getStylesheet() {
98         return _stylesheet;
99     }
100 
101     /**
102      * Pretend this is the stylesheet class. Useful when compiling
103      * references to global variables inside a predicate.
104      */
getClassName()105     public final String getClassName() {
106         return _stylesheet.getClassName();
107     }
108 
loadTranslet()109     public Instruction loadTranslet() {
110         return _aloadTranslet;
111     }
112 
getDOMClass()113     public final String getDOMClass() {
114         return _domClass;
115     }
116 
getDOMClassSig()117     public final String getDOMClassSig() {
118         return _domClassSig;
119     }
120 
getApplyTemplatesSig()121     public final String getApplyTemplatesSig() {
122         return _applyTemplatesSig;
123     }
124 
getApplyTemplatesSigForImport()125     public final String getApplyTemplatesSigForImport() {
126     return _applyTemplatesSigForImport;
127     }
128 
129     /**
130      * Returns <tt>true</tt> or <tt>false</tt> depending on whether
131      * this class inherits from <tt>AbstractTranslet</tt> or not.
132      */
isExternal()133     public boolean isExternal() {
134         return false;
135     }
addMethod(MethodGenerator methodGen)136     public void addMethod(MethodGenerator methodGen) {
137         Method[] methodsToAdd = methodGen.getGeneratedMethods(this);
138         for (int i = 0; i < methodsToAdd.length; i++) {
139             addMethod(methodsToAdd[i]);
140 }
141     }
142 }
143