/* The contents of this file are subject to the terms * of the Common Development and Distribution License * (the License). You may not use this file except in * compliance with the License. * * You can obtain a copy of the License at * https://faban.dev.java.net/public/CDDLv1.0.html or * install_dir/license.txt * See the License for the specific language governing * permission and limitations under the License. * * When distributing Covered Code, include this CDDL * Header Notice in each file and include the License file * at faban/src/legal/CDDLv1.0.txt. * If applicable, add the following below the CDDL Header, * with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * * $Id$ * * Copyright 2005-2009 Sun Microsystems Inc. All Rights Reserved */ package com.sun.faban.common; import javax.xml.namespace.NamespaceContext; import javax.xml.XMLConstants; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.ArrayList; import java.util.Collections; import java.util.logging.Logger; /** * A NamespaceContext with Faban namespace conventions precoded. * The Faban prefixes and namespace URIs are as follows:<br> * <table> * <tr><th>Prefix</th><th>Namespace URI</th></tr> * <tr><td>fa</td><td>http://faban.sunsource.net/ns/faban</td></tr> * <tr><td>fd</td><td>http://faban.sunsource.net/ns/fabandriver</td></tr> * <tr><td>fh</td><td>http://faban.sunsource.net/ns/fabanharness</td></tr> * </table> * <br>You can add additional namespace prefixes using the addNamespace method. * * @author Akara Sucharitakul */ public class FabanNamespaceContext implements NamespaceContext { private static Logger logger = Logger.getLogger( FabanNamespaceContext.class.getName()); LinkedHashMap<String, String> nsMap = new LinkedHashMap<String, String>(); LinkedHashMap<String, ArrayList<String>> prefixMap = new LinkedHashMap<String, ArrayList<String>>(); /** * Constructs the Faban namespace context that contains all Faban * namespaces to start with. */ public FabanNamespaceContext() { addNamespace(XMLConstants.XML_NS_URI, XMLConstants.XML_NS_PREFIX); addNamespace(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, XMLConstants.XMLNS_ATTRIBUTE); addNamespace("http://faban.sunsource.net/ns/faban", "fa"); addNamespace("http://faban.sunsource.net/ns/fabandriver","fd"); addNamespace("http://faban.sunsource.net/ns/fabanharness", "fh"); } /** * Adds a namespace prefix to the NamespaceContext. * @param namespaceURI The namespace URI * @param prefix The prefix we use for referring to the elements/attributes */ public void addNamespace(String namespaceURI, String prefix) { logger.finer("Adding " + namespaceURI + ", " + prefix); if (namespaceURI == null || prefix == null) throw new IllegalArgumentException("prefix or namespaceURI is null!"); nsMap.put(prefix, namespaceURI); ArrayList<String> prefixList = prefixMap.get(namespaceURI); if (prefixList == null) { prefixList = new ArrayList<String>(); prefixList.add(prefix); prefixMap.put(namespaceURI, prefixList); } else { if (!prefixList.contains(prefix)) prefixList.add(prefix); } } public String getNamespaceURI(String prefix) { if (prefix == null) throw new IllegalArgumentException("prefix is null!"); String namespaceURI = nsMap.get(prefix); if (namespaceURI == null) namespaceURI = XMLConstants.NULL_NS_URI; logger.finer("getNamespaceURI(\"" + prefix + "\") = " + namespaceURI); return namespaceURI; } public String getPrefix(String namespaceURI) { if (namespaceURI == null) throw new IllegalArgumentException("namespaceURI is null!"); ArrayList<String> prefixList = prefixMap.get(namespaceURI); String prefix = null; if (prefixList != null) prefix = prefixList.get(0); logger.finer("getPrefix(\"" + namespaceURI + "\") = " + prefix); return prefix; } public Iterator getPrefixes(String namespaceURI) { logger.finer("getPrefixes(\"" + namespaceURI + "\")"); if (namespaceURI == null) throw new IllegalArgumentException("namespaceURI is null!"); ArrayList<String> prefixList = prefixMap.get(namespaceURI); if (prefixList == null) prefixList = new ArrayList<String>(); return Collections.unmodifiableList(prefixList).iterator(); } }