File: NokogiriNamespaceContext.java

package info (click to toggle)
ruby-nokogiri 1.13.10%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 7,416 kB
  • sloc: ansic: 38,198; xml: 28,086; ruby: 22,271; java: 15,517; cpp: 7,037; yacc: 244; sh: 148; makefile: 136
file content (110 lines) | stat: -rw-r--r-- 2,763 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package nokogiri.internals;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;

/**
 * Holder of each node's namespace.
 *
 * @author Yoko Harada <yokolet@gmail.com>
 *
 */
public final class NokogiriNamespaceContext implements NamespaceContext
{

  /*
   * these constants have matching declarations in
   * ext/nokogiri/xml_xpath_context.c
   */
  public static final String NOKOGIRI_PREFIX = "nokogiri";
  public static final String NOKOGIRI_URI = "http://www.nokogiri.org/default_ns/ruby/extensions_functions";

  public static final String NOKOGIRI_BUILTIN_PREFIX = "nokogiri-builtin";
  public static final String NOKOGIRI_BUILTIN_URI = "https://www.nokogiri.org/default_ns/ruby/builtins";

  private final Map<String, String> register;

  public static NokogiriNamespaceContext
  create()
  {
    return new NokogiriNamespaceContext();
  }

  private
  NokogiriNamespaceContext()
  {
    register = new HashMap<String, String>(6, 1);
    register.put(NOKOGIRI_PREFIX, NOKOGIRI_URI);
    register.put(NOKOGIRI_BUILTIN_PREFIX, NOKOGIRI_BUILTIN_URI);
    register.put("xml", "http://www.w3.org/XML/1998/namespace");
    register.put("xhtml", "http://www.w3.org/1999/xhtml");
  }

  public String
  getNamespaceURI(String prefix)
  {
    if (prefix == null) {
      throw new IllegalArgumentException();
    }
    String uri = this.register.get(prefix);
    if (uri != null) {
      return uri;
    }

    if (prefix.equals(XMLConstants.XMLNS_ATTRIBUTE)) {
      uri = this.register.get(XMLConstants.XMLNS_ATTRIBUTE);
      return (uri == null) ? XMLConstants.XMLNS_ATTRIBUTE_NS_URI : uri;
    }

    return XMLConstants.NULL_NS_URI;
  }

  public String
  getPrefix(String uri)
  {
    if (uri == null) {
      throw new IllegalArgumentException("uri is null");
    }
    Set<Entry<String, String>> entries = register.entrySet();
    for (Entry<String, String> entry : entries) {
      if (uri.equals(entry.getValue())) {
        return entry.getKey();
      }
    }
    return null;
  }

  public Iterator<String>
  getPrefixes(String uri)
  {
    Set<Entry<String, String>> entries = register.entrySet();
    ArrayList<String> list = new ArrayList<String>(entries.size());
    for (Entry<String, String> entry : entries) {
      if (uri.equals(entry.getValue())) {
        list.add(entry.getKey());
      }
    }
    return list.iterator();
  }

  public Set<String>
  getAllPrefixes()
  {
    return register.keySet();
  }

  public void
  registerNamespace(String prefix, String uri)
  {
    if ("xmlns".equals(prefix)) { prefix = ""; }
    register.put(prefix, uri);
  }

}