1 10 11 package org.mmbase.datatypes; 12 13 import java.net.*; 14 import java.util.*; 15 import javax.xml.parsers.DocumentBuilder ; 16 import org.xml.sax.InputSource ; 17 import org.w3c.dom.*; 18 19 import org.mmbase.bridge.Node; 20 import org.mmbase.bridge.Field; 21 import org.mmbase.core.util.Fields; 22 import org.mmbase.datatypes.util.xml.*; 23 import org.mmbase.util.*; 24 import org.mmbase.util.xml.DocumentReader; 25 import org.mmbase.util.logging.*; 26 27 45 46 public class DataTypes { 47 48 private static final Logger log = Logging.getLoggerInstance(DataTypes.class); 49 50 private static final DataTypeCollector dataTypeCollector = DataTypeCollector.createSystemDataTypeCollector(); 52 53 public static void initialize() { 54 log.trace("" + Constants.class); 62 log.debug("Reading datatypes " + dataTypeCollector); 63 readDataTypes(ResourceLoader.getConfigurationRoot(), "datatypes.xml"); 64 65 79 80 } 81 82 85 private static void readDataTypes(ResourceLoader loader, String resource) { 86 List resources = loader.getResourceList(resource); 87 if (log.isDebugEnabled()) log.debug("Using " + resources); 88 ListIterator i = resources.listIterator(); 89 while (i.hasNext()) i.next(); 90 while (i.hasPrevious()) { 91 try { 92 URL u = (URL) i.previous(); 93 URLConnection con = u.openConnection(); 94 if (con.getDoInput()) { 95 InputSource dataTypesSource = new InputSource (con.getInputStream()); 96 dataTypesSource.setSystemId(u.toExternalForm()); 97 DocumentBuilder db = DocumentReader.getDocumentBuilder(true, true, new XMLErrorHandler(), new XMLEntityResolver(true, DataTypeReader.class)); 98 Document doc = db.parse(dataTypesSource); 99 Element dataTypesElement = doc.getDocumentElement(); DataTypeReader.readDataTypes(dataTypesElement, dataTypeCollector); 101 } 102 } catch (Exception e) { 103 log.error(e.getMessage(), e); 104 } 105 } 106 if (log.isDebugEnabled()) log.debug(dataTypeCollector.toString()); 107 } 108 109 118 public static BasicDataType createDataType(String name, Class classType) { 119 int type = Fields.classToType(classType); 120 if (name == null && classType != null) { 121 name = classType.getName(); 122 } 123 if (type != Field.TYPE_UNKNOWN || classType == null) { 124 return createDataType(name, type, classType.isPrimitive()); 125 } else { 126 return new BasicDataType(name, classType); 127 } 128 } 129 130 137 private static BasicDataType createDataType(String name, int type, boolean primitive) { 138 switch (type) { 139 case Field.TYPE_BINARY: return new BinaryDataType(name); 140 case Field.TYPE_INTEGER : return new IntegerDataType(name, primitive); 141 case Field.TYPE_LONG: return new LongDataType(name, primitive); 142 case Field.TYPE_FLOAT: return new FloatDataType(name, primitive); 143 case Field.TYPE_DOUBLE: return new DoubleDataType(name, primitive); 144 case Field.TYPE_BOOLEAN: return new BooleanDataType(name, primitive); 145 case Field.TYPE_STRING : return new StringDataType(name); 146 case Field.TYPE_XML: return new XmlDataType(name); 147 case Field.TYPE_NODE: return new NodeDataType(name); 148 case Field.TYPE_DATETIME: return new DateTimeDataType(name); 149 case Field.TYPE_LIST: return new ListDataType(name); 150 default: return new BasicDataType(name); 151 } 152 } 153 158 private static BasicDataType createDataType(String name, int type) { 159 return createDataType(name, type, false); 160 } 161 162 170 public static DataType addFinalDataType(BasicDataType dataType) { 171 String name = dataType.getName(); 172 if (name == null) { 173 throw new IllegalArgumentException ("Passed datatype " + dataType + " does not have a name assigned."); 174 } 175 if (dataTypeCollector.contains(name)) { 176 throw new IllegalArgumentException ("The datatype " + dataType + " was passed, but a type with the same name occurs as : " + 177 getDataType(name)); 178 } 179 dataTypeCollector.finish(dataType); 180 dataTypeCollector.addDataType(dataType); 181 return dataType; 182 } 183 184 190 public static synchronized BasicDataType getDataType(String name) { 191 return dataTypeCollector.getDataType(name); 192 } 193 194 205 public static synchronized BasicDataType getDataTypeInstance(String name, BasicDataType baseDataType) { 206 return dataTypeCollector.getDataTypeInstance(name, baseDataType); 207 } 208 209 219 public static synchronized BasicDataType getDataTypeInstance(String name, int type) { 220 return getDataTypeInstance(name, getDataType(type)); 221 } 222 223 234 public static synchronized ListDataType getListDataTypeInstance(String name, int listItemType) { 235 return (ListDataType)getDataTypeInstance(name, getListDataType(listItemType)); 236 } 237 238 246 public static synchronized BasicDataType getDataType(int type) { 247 String name = Fields.getTypeDescription(type).toLowerCase(); 248 BasicDataType dataType = getDataType(name); 249 if (dataType == null) { 250 if (type == Field.TYPE_LIST) { 251 dataType = getListDataType(Field.TYPE_UNKNOWN); 252 } else { 253 dataType = createDataType(name, type); 254 dataTypeCollector.addDataType(dataType); 256 } 257 } 258 return dataType; 259 } 260 261 269 public static ListDataType getListDataType(int listItemType) { 270 String name = Fields.getTypeDescription(Field.TYPE_LIST).toLowerCase() + 271 "[" + Fields.getTypeDescription(listItemType).toLowerCase() + "]"; 272 ListDataType dataType = (ListDataType) getDataType(name); 273 if (dataType == null) { 274 dataType = (ListDataType)createDataType(name, Field.TYPE_LIST); 275 dataType.setItemDataType(getDataType(listItemType)); 276 dataTypeCollector.finish(dataType); 277 dataTypeCollector.addDataType(dataType); 278 } 279 return dataType; 280 } 281 282 public static DataTypeCollector getSystemCollector() { 283 return dataTypeCollector; 284 } 285 286 287 291 public static Document toXml(DataType dataType) { 292 List stack = new ArrayList(); 294 stack.add(dataType); 295 while (dataType.getOrigin() != null) { 296 dataType = dataType.getOrigin(); 297 stack.add(0, dataType); 298 } 299 300 Document doc = DocumentReader.getDocumentBuilder().newDocument(); 302 303 Iterator i = stack.iterator(); 305 dataType = (DataType) i.next(); 306 Element e = (Element) doc.importNode(dataType.toXml(), true); 307 doc.appendChild(e); 308 while (i.hasNext()) { 309 dataType = (DataType) i.next(); 310 dataType.toXml(e); 311 } 312 return doc; 313 } 314 315 } 316
| Popular Tags
|