package org.yamcs.xtce;
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import org.yamcs.xtce.xml.XtceAliasSet;
/**
* Keeps a list of parameters with corresponding indexes to be able to retrieve them in any namespace.
*
* Currently the name is case sensitive while aliases are not. Is this the correct behavior???
* @author nm
*
*/
public class NamedDescriptionIndex<T extends NameDescription> implements Serializable, Iterable<T>{
private static final long serialVersionUID = 3L;
private LinkedHashMap<String, LinkedHashMap<String,T>> aliasIndex =new LinkedHashMap<String, LinkedHashMap<String,T>>();
private LinkedHashMap<String,T> index =new LinkedHashMap<String,T>();
public void add(T o) {
XtceAliasSet aliases=o.getAliasSet();
if(aliases!=null) {
for(String ns:aliases.getNamespaces()) {
LinkedHashMap<String, T> m=aliasIndex.get(ns);
if(m==null) {
m=new LinkedHashMap<String, T>();
aliasIndex.put(ns, m);
}
m.put(aliases.getAlias(ns).toUpperCase(), o);
}
}
if (o.getQualifiedName() != null) {
index.put(o.getQualifiedName(), o);
} else {
index.put(o.getName(), o); // Happens for Derived Values
}
}
/**
* returns the object based on its qualified name
*/
public T get(String qualifiedName) {
return index.get(qualifiedName);
}
/**
* returns the object in namespace
* @param name
* @param nameSpace
* @return
*/
public T get(String nameSpace, String name) {
Map<String, T>m=aliasIndex.get(nameSpace);
if (m!=null) {
return m.get(name.toUpperCase());
} else {
return null;
}
}
/**
* returns a collection of all the objects (parameters) in the index
* @return
*/
public Collection<T> getObjects() {
return index.values();
}
/**
*
* @return number of objects in index
*/
public int size() {
return index.size();
}
@Override
public Iterator<T> iterator() {
return index.values().iterator();
}
}