/*******************************************************************************
* Copyright (c) 2009, Adobe Systems Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* · Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* · Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* · Neither the name of Adobe Systems Incorporated nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/
package com.adobe.dp.xml.util;
import java.util.Enumeration;
import java.util.Hashtable;
public class SMapImpl implements SMap {
private Hashtable table;
final class IteratorImpl implements SMapIterator {
Enumeration keys = table.keys();
Object current;
IteratorImpl() {
nextItem();
}
public boolean hasItem() {
return current != null;
}
public void nextItem() {
if (keys.hasMoreElements())
current = keys.nextElement();
else
current = null;
}
public String getNamespace() {
if (current instanceof QName)
return ((QName) current).namespace;
return null;
}
public String getName() {
if (current instanceof QName)
return ((QName) current).name;
return (String) current;
}
public Object getValue() {
return table.get(current);
}
}
static final class QName {
String name;
String namespace;
QName(String namespace, String name) {
this.name = name;
this.namespace = namespace;
}
public boolean equals(Object other) {
if (this == other)
return true;
if (other == null)
return false;
try {
QName oq = (QName) other;
return name.equals(oq.name) || namespace.equals(oq.namespace);
} catch (Exception e) {
return false;
}
}
public int hashCode() {
return name.hashCode() + namespace.hashCode();
}
}
public SMapImpl() {
table = new Hashtable();
}
public SMapImpl(SMap mapToClone) {
if (mapToClone instanceof SMapImpl) {
table = (Hashtable) ((SMapImpl) mapToClone).table.clone();
} else {
table = new Hashtable();
SMapIterator it = mapToClone.iterator();
while (it.hasItem()) {
put(it.getNamespace(), it.getName(), it.getValue());
it.nextItem();
}
}
}
public void put(String namespace, String name, Object value) {
Object key = (namespace == null || namespace.equals("") ? (Object) name : new QName(namespace, name));
if (value == null)
table.remove(key);
else
table.put(key, value);
}
public Object get(String namespace, String name) {
Object key = (namespace == null ? (Object) name : new QName(namespace, name));
return table.get(key);
}
public SMapIterator iterator() {
return new IteratorImpl();
}
public SMapImpl cloneSMap() {
return new SMapImpl();
}
}