/* * Copyright 2001-2004 The Apache Software Foundation. * * Licensed 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. */ /* * $Id: AttributeSet.java,v 1.17 2004/02/24 03:55:47 zongaro Exp $ */ package com.sun.org.apache.xalan.internal.xsltc.compiler; import java.util.Enumeration; import java.util.Vector; 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.AttributeSetMethodGenerator; 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 com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util; import com.sun.org.apache.xml.internal.utils.XMLChar; /** * @author Jacek Ambroziak * @author Santiago Pericas-Geertsen * @author Morten Jorgensen */ final class AttributeSet extends TopLevelElement { // This prefix is used for the method name of attribute set methods private static final String AttributeSetPrefix = "$as$"; // Element contents private QName _name; private UseAttributeSets _useSets; private AttributeSet _mergeSet; private String _method; private boolean _ignore = false; /** * Returns the QName of this attribute set */ public QName getName() { return _name; } /** * Returns the method name of this attribute set. This method name is * generated by the compiler (XSLTC) */ public String getMethodName() { return _method; } /** * Call this method to prevent a method for being compiled for this set. * This is used in case several elements constitute * a single set (with one name). The last element will merge itself with * any previous set(s) with the same name and disable the other set(s). */ public void ignore() { _ignore = true; } /** * Parse the contents of this attribute set. Recognised attributes are * "name" (required) and "use-attribute-sets" (optional). */ public void parseContents(Parser parser) { // Get this attribute set's name final String name = getAttribute("name"); if (!XMLChar.isValidQName(name)) { ErrorMsg err = new ErrorMsg(ErrorMsg.INVALID_QNAME_ERR, name, this); parser.reportError(Constants.ERROR, err); } _name = parser.getQNameIgnoreDefaultNs(name); if ((_name == null) || (_name.equals(EMPTYSTRING))) { ErrorMsg msg = new ErrorMsg(ErrorMsg.UNNAMED_ATTRIBSET_ERR, this); parser.reportError(Constants.ERROR, msg); } // Get any included attribute sets (similar to inheritance...) final String useSets = getAttribute("use-attribute-sets"); if (useSets.length() > 0) { if (!Util.isValidQNames(useSets)) { ErrorMsg err = new ErrorMsg(ErrorMsg.INVALID_QNAME_ERR, useSets, this); parser.reportError(Constants.ERROR, err); } _useSets = new UseAttributeSets(useSets, parser); } // Parse the contents of this node. All child elements must be // elements. Other elements cause an error. final Vector contents = getContents(); final int count = contents.size(); for (int i=0; i