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