1 10 package org.mmbase.datatypes; 11 12 import java.util.*; 13 import org.mmbase.bridge.*; 14 import org.mmbase.util.Casting; 15 16 24 public class ListDataType extends AbstractLengthDataType { 25 private static final long serialVersionUID = 1L; 27 protected ItemRestriction itemRestriction = new ItemRestriction(Constants.DATATYPE_UNKNOWN); 28 29 32 public ListDataType(String name) { 33 super(name, List.class); 34 } 35 36 37 protected void inheritRestrictions(BasicDataType origin) { 38 super.inheritRestrictions(origin); 39 if (origin instanceof ListDataType) { 40 ListDataType dataType = (ListDataType)origin; 41 itemRestriction.inherit(dataType.itemRestriction); 42 } 43 } 44 protected void cloneRestrictions(BasicDataType origin) { 45 super.cloneRestrictions(origin); 46 if (origin instanceof ListDataType) { 47 ListDataType dataType = (ListDataType)origin; 48 itemRestriction = new ItemRestriction(dataType.itemRestriction); 49 } 50 } 51 52 public long getLength(Object value) { 53 return ((Collection) value).size(); 54 } 55 56 60 public DataType getItemDataType() { 61 return itemRestriction.getItemDataType(); 62 } 63 64 68 public DataType.Restriction getItemDataTypeRestriction() { 69 return itemRestriction; 70 } 71 72 76 public void setItemDataType(DataType value) { 77 itemRestriction.setValue(value); 78 } 79 80 protected Collection validateCastValue(Collection errors, Object castValue, Object value, Node node, Field field) { 81 errors = super.validateCastValue(errors, castValue, value, node, field); 82 errors = itemRestriction.validate(errors, castValue, node, field); 83 return errors; 84 } 85 86 protected StringBuffer toStringBuffer() { 87 StringBuffer buf = super.toStringBuffer(); 88 buf.append("items: " + getItemDataType()); 89 return buf; 90 } 91 92 protected class ItemRestriction extends AbstractRestriction { 93 ItemRestriction(ItemRestriction me) { 94 super(me); 95 } 96 ItemRestriction(DataType v) { 97 super("itemDataType", v); 98 } 99 DataType getItemDataType() { 100 return (DataType) value; 101 } 102 103 protected boolean simpleValid(Object v, Node node, Field field) { 104 DataType itemDataType = getItemDataType(); 105 if (itemDataType == Constants.DATATYPE_UNKNOWN) return true; 106 List listValue = Casting.toList(v); 107 for (Iterator i = listValue.iterator(); i.hasNext(); ) { 108 try { 109 Collection col = itemDataType.validate(i.next()); 110 if (col != VALID) return false; 111 } catch (ClassCastException cce) { 112 return false; 113 } 114 } 115 return true; 116 } 117 118 protected Collection validate(Collection errors, Object v, Node node, Field field) { 119 if (! enforce(node, field)) { 120 return errors; 121 } 122 DataType itemDataType = getItemDataType(); 123 if (itemDataType == Constants.DATATYPE_UNKNOWN) return errors; 124 List listValue = Casting.toList(v); 125 for (Iterator i = listValue.iterator(); i.hasNext(); ) { 126 Collection col = itemDataType.validate(i.next()); 127 try { 128 if (col != VALID) { 129 if (errors == VALID) errors = new ArrayList(); 130 errors.addAll(col); 131 } 132 } catch (ClassCastException cce) { 133 errors = addError(errors, v, node, field); 134 } 135 } 136 return errors; 137 } 138 139 } 140 141 } 142 | Popular Tags |