1 /*
2 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
3 */
4 /*
5 * Licensed to the Apache Software Foundation (ASF) under one or more
6 * contributor license agreements. See the NOTICE file distributed with
7 * this work for additional information regarding copyright ownership.
8 * The ASF licenses this file to You under the Apache License, Version 2.0
9 * (the "License"); you may not use this file except in compliance with
10 * the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20
21 package com.sun.org.apache.xalan.internal.xsltc.compiler;
22
23 import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
24 import com.sun.org.apache.bcel.internal.generic.INVOKESPECIAL;
25 import com.sun.org.apache.bcel.internal.generic.InstructionList;
26 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator;
27 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;
28 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator;
29 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;
30 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
31 import java.util.ArrayList;
32 import java.util.List;
33 import java.util.StringTokenizer;
34
35 /**
36 * @author Jacek Ambroziak
37 * @author Santiago Pericas-Geertsen
38 * @author Morten Jorgensen
39 * @LastModified: Oct 2017
40 */
41 final class UseAttributeSets extends Instruction {
42
43 // Only error that can occur:
44 private final static String ATTR_SET_NOT_FOUND =
45 "";
46
47 // Contains the names of all references attribute sets
48 private final List<QName> _sets = new ArrayList<>(2);
49
50 /**
51 * Constructur - define initial attribute sets to use
52 */
53 public UseAttributeSets(String setNames, Parser parser) {
54 setParser(parser);
55 addAttributeSets(setNames);
56 }
57
58 /**
59 * This method is made public to enable an AttributeSet object to merge
60 * itself with another AttributeSet (including any other AttributeSets
61 * the two may inherit from).
62 */
63 public void addAttributeSets(String setNames) {
64 if ((setNames != null) && (!setNames.equals(Constants.EMPTYSTRING))) {
65 final StringTokenizer tokens = new StringTokenizer(setNames);
66 while (tokens.hasMoreTokens()) {
67 final QName qname =
68 getParser().getQNameIgnoreDefaultNs(tokens.nextToken());
69 _sets.add(qname);
70 }
71 }
72 }
73
74 /**
75 * Do nada.
76 */
77 public Type typeCheck(SymbolTable stable) throws TypeCheckError {
78 return Type.Void;
79 }
80
81 /**
82 * Generate a call to the method compiled for this attribute set
83 */
84 public void translate(ClassGenerator classGen, MethodGenerator methodGen) {
85
86 final ConstantPoolGen cpg = classGen.getConstantPool();
87 final InstructionList il = methodGen.getInstructionList();
88 final SymbolTable symbolTable = getParser().getSymbolTable();
89
90 for (QName name : _sets) {
91 // Get the AttributeSet reference from the symbol table
92 final AttributeSet attrs = symbolTable.lookupAttributeSet(name);
93 // Compile the call to the set's method if the set exists
94 if (attrs != null) {
95 final String methodName = attrs.getMethodName();
96 il.append(classGen.loadTranslet());
97 il.append(methodGen.loadDOM());
98 il.append(methodGen.loadIterator());
99 il.append(methodGen.loadHandler());
100 il.append(methodGen.loadCurrentNode());
101 final int method = cpg.addMethodref(classGen.getClassName(),
102 methodName, ATTR_SET_SIG);
103 il.append(new INVOKESPECIAL(method));
104 }
105 // Generate an error if the attribute set does not exist
106 else {
107 final Parser parser = getParser();
108 final String atrs = name.toString();
109 reportError(this, parser, ErrorMsg.ATTRIBSET_UNDEF_ERR, atrs);
110 }
111 }
112 }
113 }
--- EOF ---