blob: f8a5e601b84ab9aa73538d4ab39b1c8e014e6309 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.html.core.internal.contentmodel;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Locale;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
/**
* An implementation of the CMNamedNodeMap interface. This class is intented
* to be used as a container of attribute declarations. If someone wants to
* use this class for other purpose, he must pay attention to the fact that
* this class is tolerant of the key name case. That is, this class does not
* distinguish "name", "NAME", and "Name" as a key name.
*/
class CMNamedNodeMapImpl implements CMNamedNodeMap {
private Hashtable items = null;
/**
*/
public CMNamedNodeMapImpl() {
super();
items = new Hashtable();
}
/**
* getLength method
*
* @return int
*/
public int getLength() {
return items.size();
}
/**
* getNamedItem method
*
* @return CMNode <code>null</code> for unknown keys.
* @param name
* java.lang.String
*/
public CMNode getNamedItem(String name) {
String cookedName = makeCanonicalForm(name);
if (!items.containsKey(cookedName))
return null;
return (CMNode) items.get(cookedName);
}
/**
* item method
*
* @return CMNode
* @param index
* int
*/
public CMNode item(int index) {
Iterator iter = iterator();
while (iter.hasNext()) {
CMNode node = (CMNode) iter.next();
if (--index < 0)
return node;
}
return null;
}
/**
* @return java.util.Iterator
*/
public Iterator iterator() {
return items.values().iterator();
}
/**
* @return java.lang.String
* @param rawForm
* java.lang.String
*/
private String makeCanonicalForm(String raw) {
// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=100152
// we are able to "cheat" here a little and use US Locale
// to get a good cononical form, since we are using this only
// for HTML and JSP standard tags.
// Long term, for similar needs with XML 1.1 (for example)
// we should use a class such as com.ibm.icu.text.Normalizer
return raw.toUpperCase(Locale.US);
}
/**
* @param key
* java.lang.String
* @param item
* java.lang.String
*/
void putNamedItem(String name, CMNode item) {
String cookedName = makeCanonicalForm(name);
if (items.containsKey(cookedName))
return; // already registered.
items.put(cookedName, item);
}
}