/* * * 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 org.apache.flex.compiler.common; import org.apache.flex.compiler.constants.IMXMLCoreConstants; import org.apache.flex.compiler.internal.mxml.MXMLData; /** * A subclass of XMLName used by clients that need to manipulate the actual * syntactic form of the element name (including its prefix). Most clients of * codemodel/mxmlmodel should use XMLName instead, and rely on the full * namespace URI; the specific namespace prefix that's on a given element in a * given document has no meaning outside that document. In particular, no one * should ever assume that "mx:" is the prefix being used for the Flex * namespace. */ public class PrefixedXMLName extends XMLName { /** * Constructor This version will parse the containingDocument on the fly (or * use an existing parse, if there is already one in the MXMLDataProvider). * * @param rawName full element name (e.g. mx:Button) * @param mxmlData MXMLData containing the element */ public PrefixedXMLName(String rawName, MXMLData mxmlData) { name = splitName(rawName); assert name != null; xmlNamespace = resolvePrefix(prefix, mxmlData); if (xmlNamespace == null) xmlNamespace = IMXMLCoreConstants.emptyString; } /** * Constructor * * @param rawName full element name (e.g. mx:Button) * @param prefixMap map of element prefixes to XML namespaces */ public PrefixedXMLName(String rawName, PrefixMap prefixMap) { name = splitName(rawName); assert name != null; xmlNamespace = prefixMap.getNamespaceForPrefix(prefix); if (xmlNamespace == null) xmlNamespace = IMXMLCoreConstants.emptyString; } public PrefixedXMLName(String rawName, String uri) { name = splitName(rawName); xmlNamespace = uri; } /** * Constructor used when we already know the specific namespace and prefix * being used by a particular instance of an XML element. * * @param xmlNamespace the namespace URI * @param name the unprefixed element name * @param rawName the prefixed element name (e.g. mx:Button) */ public PrefixedXMLName(String xmlNamespace, String name, String rawName) { splitName(rawName); this.name = name; assert name != null; this.xmlNamespace = (xmlNamespace == null) ? IMXMLCoreConstants.emptyString : xmlNamespace; } /** * Prefix from the intial lookup. Only accurate when in the context of a * document. */ private String prefix; /** * Cached value of the full name. It's ok to cache this because we can't * ever change the name, namespace, or prefix after this object is * constructed. */ private String prefixedName; /** * Split a raw tag name (e.g. mx:Button) into a prefix (mx) and short name * (Button). The prefix is stored in fPrefix, and the short name is * returned. For use in constructors. * * @param rawName full element name (e.g. mx:Button) * @return short name (e.g. Button) */ private String splitName(String rawName) { String name; if (rawName == null) { prefix = IMXMLCoreConstants.emptyString; return IMXMLCoreConstants.emptyString; } int colonIndex = rawName.indexOf(IMXMLCoreConstants.colon); if (colonIndex > -1) { prefix = rawName.substring(0, colonIndex); name = rawName.substring(colonIndex + 1); } else { prefix = IMXMLCoreConstants.emptyString; name = rawName; } return name; } /** * Determine which XML namespace is appropriate for the given prefix in the * given document * * @param prefix element prefix * @param mxmlData containing MXMLData * @return XML namespaces */ protected String resolvePrefix(String prefix, MXMLData mxmlData) { return resolvePrefix(prefix, mxmlData.getRootTagPrefixMap()); } /** * Determine which XML namespace is appropriate for the given prefix in the * given prefix map */ protected String resolvePrefix(String prefix, PrefixMap prefixMap) { if (prefixMap.containsPrefix(prefix)) return prefixMap.getNamespaceForPrefix(prefix); return IMXMLCoreConstants.emptyString; } /** * Get the prefix for the element * * @return the prefix */ public String getPrefix() { return prefix; } /** * Return the prefixed version of the name. */ public String getPrefixedName() { if (prefixedName != null) return prefixedName; if (prefix != null && !prefix.equals(IMXMLCoreConstants.emptyString)) prefixedName = (prefix + IMXMLCoreConstants.colon + getName()).intern(); else prefixedName = getName(); return prefixedName; } }