1 /** 2 * ServingXML 3 * 4 * Copyright (C) 2006 Daniel Parker 5 * daniel.parker@servingxml.com 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 **/ 20 21 package com.servingxml.util; 22 23 import java.io.PrintStream; 24 25 public class SynchronizedNameTable implements MutableNameTable { 26 private final NameTable parentTable; 27 private final MutableNameTable mutableTable; 28 SynchronizedNameTable(NameTable parentTable)29 public SynchronizedNameTable(NameTable parentTable) { 30 this.parentTable = parentTable; 31 this.mutableTable = new NameTableImpl(parentTable); 32 } 33 size()34 public int size() { 35 return parentTable.size() + mutableTable.size(); 36 } 37 getSymbol(String namespaceUri, String localName)38 public int getSymbol(String namespaceUri, String localName) { 39 int nameSymbol = parentTable.lookupSymbol(namespaceUri, localName); 40 41 if (nameSymbol == -1) { 42 synchronized(mutableTable) { 43 nameSymbol = mutableTable.getSymbol(namespaceUri, localName); 44 } 45 } 46 47 return nameSymbol; 48 } 49 getSymbol(Name name)50 public int getSymbol(Name name) { 51 int nameSymbol = parentTable.lookupSymbol(name); 52 if (nameSymbol == -1) { 53 synchronized(mutableTable) { 54 nameSymbol = mutableTable.getSymbol(name); 55 } 56 } 57 return nameSymbol; 58 } 59 lookupCreateNamespaceIndex(String namespaceUri)60 public int lookupCreateNamespaceIndex(String namespaceUri) { 61 int namespaceIndex = -1; 62 if (namespaceIndex == -1) { 63 synchronized(mutableTable) { 64 namespaceIndex = mutableTable.lookupCreateNamespaceIndex(namespaceUri); 65 } 66 } 67 return namespaceIndex; 68 } 69 getNamespace(int namespaceIndex)70 public String getNamespace(int namespaceIndex) { 71 return parentTable.getNamespace(namespaceIndex); 72 } 73 containsSymbol(int nameSymbol)74 public boolean containsSymbol(int nameSymbol) { 75 return parentTable.containsSymbol(nameSymbol) ? true : mutableTable.containsSymbol(nameSymbol); 76 } 77 lookupName(int nameSymbol)78 public Name lookupName(int nameSymbol) { 79 Name name; 80 81 if (parentTable.containsSymbol(nameSymbol)) { 82 name = parentTable.lookupName(nameSymbol); 83 } else { 84 synchronized(mutableTable) { 85 name = mutableTable.lookupName(nameSymbol); 86 } 87 } 88 return name; 89 } 90 lookupSymbol(String namespaceUri, String localName)91 public int lookupSymbol(String namespaceUri, String localName) { 92 93 int nameSymbol = parentTable.lookupSymbol(namespaceUri, localName); 94 if (nameSymbol == -1) { 95 synchronized(mutableTable) { 96 nameSymbol = mutableTable.lookupSymbol(namespaceUri, localName); 97 } 98 } 99 return nameSymbol; 100 } 101 createName(String namespaceUri, String localName)102 public Name createName(String namespaceUri, String localName) { 103 104 Name name; 105 int symbol = parentTable.lookupSymbol(namespaceUri, localName); 106 if (symbol == -1) { 107 synchronized(mutableTable) { 108 name = mutableTable.createName(namespaceUri, localName); 109 } 110 } else { 111 name = parentTable.lookupName(symbol); 112 } 113 return name; 114 } 115 lookupSymbol(Name name)116 public int lookupSymbol(Name name) { 117 int nameSymbol = parentTable.lookupSymbol(name); 118 if (nameSymbol == -1) { 119 synchronized(mutableTable) { 120 nameSymbol = mutableTable.lookupSymbol(name); 121 } 122 } 123 return nameSymbol; 124 } 125 /* 126 * Returns a shallow copy of names 127 */ getNames()128 public Name[] getNames() { 129 return mutableTable.getNames(); 130 } 131 /* 132 * Returns a shallow copy of namespaces 133 */ getNamespaces()134 public String[] getNamespaces() { 135 return mutableTable.getNamespaces(); 136 } 137 /* 138 * Prints diagnostics for the name table content 139 */ printDiagnostics(PrintStream printStream)140 public void printDiagnostics(PrintStream printStream) { 141 parentTable.printDiagnostics(printStream); 142 mutableTable.printDiagnostics(printStream); 143 } 144 } 145 146