package com.thaiopensource.datatype.xsd;
import com.thaiopensource.xml.util.StringSplitter;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
class ListDatatype extends DatatypeBase implements Measure {
private final DatatypeBase itemType;
ListDatatype(DatatypeBase itemType) {
this.itemType = itemType;
}
String getLexicalSpaceKey() {
return "list_" + itemType.getLexicalSpaceKey();
}
// For a blank string, we want to say we must have
// "a whitespace-delimited list with length greater than or equal to 1"
// rather than
// "a list of XML NMTOKENs with length greater than or equal to 1"
String getDescriptionForRestriction() {
return getLexicalSpaceDescription("list");
}
Object getValue(String str, ValidationContext vc) throws DatatypeException {
String[] tokens = StringSplitter.split(str);
Object[] items = new Object[tokens.length];
for (int i = 0; i < items.length; i++)
items[i] = itemType.getValue(tokens[i], vc);
return items;
}
boolean lexicallyAllows(String str) {
String[] tokens = StringSplitter.split(str);
for (int i = 0; i < tokens.length; i++)
if (!itemType.lexicallyAllows(tokens[i]))
return false;
return true;
}
Measure getMeasure() {
return this;
}
public int getLength(Object obj) {
return ((Object[])obj).length;
}
public boolean isContextDependent() {
return itemType.isContextDependent();
}
public int getIdType() {
if (itemType.getIdType() == ID_TYPE_IDREF)
return ID_TYPE_IDREFS;
else
return ID_TYPE_NULL;
}
public int valueHashCode(Object obj) {
Object[] items = (Object[])obj;
int hc = 0;
for (int i = 0; i < items.length; i++)
hc ^= itemType.valueHashCode(items[i]);
return hc;
}
public boolean sameValue(Object obj1, Object obj2) {
Object[] items1 = (Object[])obj1;
Object[] items2 = (Object[])obj2;
if (items1.length != items2.length)
return false;
for (int i = 0; i < items1.length; i++)
if (!itemType.sameValue(items1[i], items2[i]))
return false;
return true;
}
}