|
|
|
|
|
*/ |
|
/* |
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
|
* contributor license agreements. See the NOTICE file distributed with |
|
* this work for additional information regarding copyright ownership. |
|
* The ASF licenses this file to You 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 com.sun.org.apache.xalan.internal.xsltc.compiler; |
|
|
|
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen; |
|
import com.sun.org.apache.bcel.internal.generic.INVOKESPECIAL; |
|
import com.sun.org.apache.bcel.internal.generic.InstructionList; |
|
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator; |
|
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg; |
|
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator; |
|
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type; |
|
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError; |
|
import java.util.ArrayList; |
|
import java.util.List; |
|
import java.util.StringTokenizer; |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
final class UseAttributeSets extends Instruction { |
|
|
|
|
|
private final static String ATTR_SET_NOT_FOUND = |
|
""; |
|
|
|
|
|
private final List<QName> _sets = new ArrayList<>(2); |
|
|
|
|
|
|
|
*/ |
|
public UseAttributeSets(String setNames, Parser parser) { |
|
setParser(parser); |
|
addAttributeSets(setNames); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void addAttributeSets(String setNames) { |
|
if ((setNames != null) && (!setNames.equals(Constants.EMPTYSTRING))) { |
|
final StringTokenizer tokens = new StringTokenizer(setNames); |
|
while (tokens.hasMoreTokens()) { |
|
final QName qname = |
|
getParser().getQNameIgnoreDefaultNs(tokens.nextToken()); |
|
_sets.add(qname); |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
*/ |
|
public Type typeCheck(SymbolTable stable) throws TypeCheckError { |
|
return Type.Void; |
|
} |
|
|
|
|
|
|
|
*/ |
|
public void translate(ClassGenerator classGen, MethodGenerator methodGen) { |
|
|
|
final ConstantPoolGen cpg = classGen.getConstantPool(); |
|
final InstructionList il = methodGen.getInstructionList(); |
|
final SymbolTable symbolTable = getParser().getSymbolTable(); |
|
|
|
for (QName name : _sets) { |
|
|
|
final AttributeSet attrs = symbolTable.lookupAttributeSet(name); |
|
|
|
if (attrs != null) { |
|
final String methodName = attrs.getMethodName(); |
|
il.append(classGen.loadTranslet()); |
|
il.append(methodGen.loadDOM()); |
|
il.append(methodGen.loadIterator()); |
|
il.append(methodGen.loadHandler()); |
|
il.append(methodGen.loadCurrentNode()); |
|
final int method = cpg.addMethodref(classGen.getClassName(), |
|
methodName, ATTR_SET_SIG); |
|
il.append(new INVOKESPECIAL(method)); |
|
} |
|
|
|
else { |
|
final Parser parser = getParser(); |
|
final String atrs = name.toString(); |
|
reportError(this, parser, ErrorMsg.ATTRIBSET_UNDEF_ERR, atrs); |
|
} |
|
} |
|
} |
|
} |