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    }