You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ge...@apache.org on 2007/09/19 23:38:00 UTC

svn commit: r577453 - /incubator/servicemix/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/jaxp/NamespaceContextImpl.java

Author: gertv
Date: Wed Sep 19 14:38:00 2007
New Revision: 577453

URL: http://svn.apache.org/viewvc?rev=577453&view=rev
Log:
Fix for SM-1056: Add NamespaceContextImpl to servicemix-core

Added:
    incubator/servicemix/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/jaxp/NamespaceContextImpl.java

Added: incubator/servicemix/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/jaxp/NamespaceContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/jaxp/NamespaceContextImpl.java?rev=577453&view=auto
==============================================================================
--- incubator/servicemix/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/jaxp/NamespaceContextImpl.java (added)
+++ incubator/servicemix/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/jaxp/NamespaceContextImpl.java Wed Sep 19 14:38:00 2007
@@ -0,0 +1,166 @@
+/*
+ * 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.servicemix.jbi.jaxp;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.XMLConstants;
+import javax.xml.namespace.NamespaceContext;
+
+/**
+ * A simple namespace context with a clean xbean configuration.
+ *
+ * @org.apache.xbean.XBean element="namespace-context"
+ *                         description="A NamespaceContext implementation"
+ * @author gnodet
+ * @version $Revision: 397796 $
+ */
+public class NamespaceContextImpl implements NamespaceContext {
+
+    /**
+     * map containing bound namespaces, keyed by their prefix. A LinkedHashMap
+     * is used to ensure that {@link #getPrefix(String)} always returns the same
+     * prefix, unless that prefix is removed.
+     */
+    private Map<String, String> namespaces;
+    
+    /**
+     * Constructs a SimpleNamespaceContext with no parent context or namespace
+     * declarations.
+     */
+    public NamespaceContextImpl() {
+        this.namespaces = new LinkedHashMap<String, String>();
+    }
+    
+    /**
+     * Constructs a SimpleNamespaceContext with no parent context that contains
+     * the specified prefixes.
+     * 
+     * @param namespaces A Map of namespace URIs, keyed by their prefixes.
+     */
+    public NamespaceContextImpl(Map<String, String> namespaces) {
+        this.namespaces = new LinkedHashMap<String, String>(namespaces);
+    }
+    
+    /**
+     * @org.apache.xbean.Map entryName="namespace" keyName="prefix"
+     * @return Returns the namespaces.
+     */
+    public Map<String, String> getNamespaces() {
+        return namespaces;
+    }
+
+    /**
+     * @param namespaces The namespaces to set.
+     */
+    public void setNamespaces(Map<String, String> namespaces) {
+        this.namespaces.clear();
+        if (namespaces != null) {
+            this.namespaces.putAll(namespaces);
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see javax.xml.namespace.NamespaceContext#getNamespaceURI(java.lang.String)
+     */
+    public String getNamespaceURI(String prefix) {
+        if (prefix == null) {
+            throw new IllegalArgumentException("prefix argument was null");
+        } else if (prefix.equals(XMLConstants.XML_NS_PREFIX)) {
+            return XMLConstants.XML_NS_URI;
+        } else if (prefix.equals(XMLConstants.XMLNS_ATTRIBUTE)) {
+            return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
+        } else if (namespaces.containsKey(prefix)) {
+            String uri = namespaces.get(prefix);
+            if (uri.length() == 0) {
+                return null;
+            } else {
+                return uri;
+            }
+        } else {
+            return null;
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see javax.xml.namespace.NamespaceContext#getPrefix(java.lang.String)
+     */
+    public String getPrefix(String nsURI) {
+        if (nsURI == null) {
+            throw new IllegalArgumentException("nsURI was null");
+        } else if (nsURI.length() == 0) {
+            throw new IllegalArgumentException("nsURI was empty");
+        } else if (nsURI.equals(XMLConstants.XML_NS_URI)) {
+            return XMLConstants.XML_NS_PREFIX;
+        } else if (nsURI.equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI)) {
+            return XMLConstants.XMLNS_ATTRIBUTE;
+        }
+        Iterator iter = namespaces.entrySet().iterator();
+        while (iter.hasNext()) {
+            Map.Entry entry = (Map.Entry) iter.next();
+            String uri = (String) entry.getValue();
+            if (uri.equals(nsURI)) {
+                return (String) entry.getKey();
+            }
+        }
+        if (nsURI.length() == 0) {
+            return "";
+        } else {
+            return null;
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see javax.xml.namespace.NamespaceContext#getPrefixes(java.lang.String)
+     */
+    public Iterator<String> getPrefixes(String nsURI) {
+        if (nsURI == null) {
+            throw new IllegalArgumentException("nsURI was null");
+        } else if (nsURI.length() == 0) {
+            throw new IllegalArgumentException("nsURI was empty");
+        } else if (nsURI.equals(XMLConstants.XML_NS_URI)) {
+            return Collections.singleton(XMLConstants.XML_NS_PREFIX).iterator();
+        } else if (nsURI.equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI)) {
+            return Collections.singleton(XMLConstants.XMLNS_ATTRIBUTE).iterator();
+        }
+        Set<String> prefixes = null;
+        for (Map.Entry<String, String> entry : namespaces.entrySet()) {
+            String uri = entry.getValue();
+            if (uri.equals(nsURI)) {
+                if (prefixes == null) {
+                    prefixes = new HashSet<String>();
+                }
+                prefixes.add(entry.getKey());
+            }
+        }
+        if (prefixes != null) {
+            return Collections.unmodifiableSet(prefixes).iterator();
+        } else if (nsURI.length() == 0) {
+            return Collections.singleton("").iterator();
+        } else {
+            List<String> l = Collections.emptyList();
+            return l.iterator();
+        }
+    }
+    
+}