001 package com.thaiopensource.relaxng.impl;
002
003 import org.relaxng.datatype.DatatypeLibrary;
004 import org.relaxng.datatype.DatatypeLibraryFactory;
005
006 import java.util.Hashtable;
007
008 import com.thaiopensource.xml.util.WellKnownNamespaces;
009
010 class BuiltinDatatypeLibraryFactory implements DatatypeLibraryFactory {
011 private final Hashtable cache = new Hashtable();
012 private final DatatypeLibraryFactory factory;
013 private final DatatypeLibrary builtinDatatypeLibrary
014 = new BuiltinDatatypeLibrary();
015 private DatatypeLibrary lastDatatypeLibrary = null;
016 private String lastDatatypeLibraryUri = null;
017
018 BuiltinDatatypeLibraryFactory(DatatypeLibraryFactory factory) {
019 this.factory = factory;
020 cache.put(WellKnownNamespaces.RELAX_NG_COMPATIBILITY_DATATYPES,
021 new CompatibilityDatatypeLibrary(this));
022 }
023
024 public DatatypeLibrary createDatatypeLibrary(String uri) {
025 if (uri.equals(""))
026 return builtinDatatypeLibrary;
027 if (uri.equals(lastDatatypeLibraryUri))
028 return lastDatatypeLibrary;
029 DatatypeLibrary library = (DatatypeLibrary)cache.get(uri);
030 if (library == null) {
031 if (factory == null)
032 return null;
033 library = factory.createDatatypeLibrary(uri);
034 if (library == null)
035 return null;
036 cache.put(uri, library);
037 }
038 lastDatatypeLibraryUri = uri;
039 return lastDatatypeLibrary = library;
040 }
041 }