001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 /* 019 * $Id: ClassGenerator.java 468649 2006-10-28 07:00:55Z minchau $ 020 */ 021 022 package org.apache.xalan.xsltc.compiler.util; 023 024 import org.apache.bcel.classfile.Method; 025 import org.apache.bcel.generic.ALOAD; 026 import org.apache.bcel.generic.ClassGen; 027 import org.apache.bcel.generic.Instruction; 028 import org.apache.xalan.xsltc.compiler.Constants; 029 import org.apache.xalan.xsltc.compiler.Parser; 030 import org.apache.xalan.xsltc.compiler.Stylesheet; 031 032 /** 033 * The class that implements any class that inherits from 034 * <tt>AbstractTranslet</tt>, i.e. any translet. Methods in this 035 * class may be of the following kinds: 036 * 037 * 1. Main method: applyTemplates, implemented by intances of 038 * <tt>MethodGenerator</tt>. 039 * 040 * 2. Named methods: for named templates, implemented by instances 041 * of <tt>NamedMethodGenerator</tt>. 042 * 043 * 3. Rt methods: for result tree fragments, implemented by 044 * instances of <tt>RtMethodGenerator</tt>. 045 * @author Jacek Ambroziak 046 * @author Santiago Pericas-Geertsen 047 */ 048 public class ClassGenerator extends ClassGen { 049 protected final static int TRANSLET_INDEX = 0; 050 051 private Stylesheet _stylesheet; 052 private final Parser _parser; // --> can be moved to XSLT 053 // a single instance cached here 054 private final Instruction _aloadTranslet; 055 private final String _domClass; 056 private final String _domClassSig; 057 private final String _applyTemplatesSig; 058 private final String _applyTemplatesSigForImport; 059 060 public ClassGenerator(String class_name, String super_class_name, 061 String file_name, 062 int access_flags, String[] interfaces, 063 Stylesheet stylesheet) { 064 super(class_name, super_class_name, file_name, 065 access_flags, interfaces); 066 _stylesheet = stylesheet; 067 _parser = stylesheet.getParser(); 068 _aloadTranslet = new ALOAD(TRANSLET_INDEX); 069 070 if (stylesheet.isMultiDocument()) { 071 _domClass = "org.apache.xalan.xsltc.dom.MultiDOM"; 072 _domClassSig = "Lorg/apache/xalan/xsltc/dom/MultiDOM;"; 073 } 074 else { 075 _domClass = "org.apache.xalan.xsltc.dom.DOMAdapter"; 076 _domClassSig = "Lorg/apache/xalan/xsltc/dom/DOMAdapter;"; 077 } 078 _applyTemplatesSig = "(" 079 + Constants.DOM_INTF_SIG 080 + Constants.NODE_ITERATOR_SIG 081 + Constants.TRANSLET_OUTPUT_SIG 082 + ")V"; 083 084 _applyTemplatesSigForImport = "(" 085 + Constants.DOM_INTF_SIG 086 + Constants.NODE_ITERATOR_SIG 087 + Constants.TRANSLET_OUTPUT_SIG 088 + Constants.NODE_FIELD_SIG 089 + ")V"; 090 } 091 092 public final Parser getParser() { 093 return _parser; 094 } 095 096 public final Stylesheet getStylesheet() { 097 return _stylesheet; 098 } 099 100 /** 101 * Pretend this is the stylesheet class. Useful when compiling 102 * references to global variables inside a predicate. 103 */ 104 public final String getClassName() { 105 return _stylesheet.getClassName(); 106 } 107 108 public Instruction loadTranslet() { 109 return _aloadTranslet; 110 } 111 112 public final String getDOMClass() { 113 return _domClass; 114 } 115 116 public final String getDOMClassSig() { 117 return _domClassSig; 118 } 119 120 public final String getApplyTemplatesSig() { 121 return _applyTemplatesSig; 122 } 123 124 public final String getApplyTemplatesSigForImport() { 125 return _applyTemplatesSigForImport; 126 } 127 128 /** 129 * Returns <tt>true</tt> or <tt>false</tt> depending on whether 130 * this class inherits from <tt>AbstractTranslet</tt> or not. 131 */ 132 public boolean isExternal() { 133 return false; 134 } 135 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 }