001 package fi.iki.hsivonen.xml; 002 003 import java.io.File; 004 import java.io.FileInputStream; 005 import java.io.IOException; 006 import java.util.Map; 007 008 import org.xml.sax.EntityResolver; 009 import org.xml.sax.InputSource; 010 import org.xml.sax.SAXException; 011 012 /** 013 * @version $Id: LocalCacheEntityResolver.java,v 1.4 2006/11/14 22:32:44 hsivonen Exp $ 014 * @author hsivonen 015 */ 016 public class LocalCacheEntityResolver implements EntityResolver { 017 018 private Map pathMap; 019 020 private EntityResolver delegate; 021 022 private boolean allowRnc = false; 023 024 /** 025 * @param pathMap 026 * @param delegate 027 */ 028 public LocalCacheEntityResolver(Map pathMap, EntityResolver delegate) { 029 this.pathMap = pathMap; 030 this.delegate = delegate; 031 } 032 /** 033 * @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String, 034 * java.lang.String) 035 */ 036 public InputSource resolveEntity(String publicId, String systemId) 037 throws SAXException, IOException { 038 String path; 039 synchronized(pathMap) { 040 path = (String) pathMap.get(systemId); 041 } 042 if(path != null) { 043 File f = new File(path); 044 if (f.exists()) { 045 TypedInputSource is = new TypedInputSource(); 046 is.setByteStream(new FileInputStream(f)); 047 is.setSystemId(systemId); 048 is.setPublicId(publicId); 049 if(systemId.endsWith(".rnc")) { 050 is.setType("application/relax-ng-compact-syntax"); 051 if(!allowRnc) { 052 throw new IOException("Not an XML resource: " + systemId); 053 } 054 } else if(systemId.endsWith(".dtd")) { 055 is.setType("application/xml-dtd"); 056 } else if(systemId.endsWith(".ent")) { 057 is.setType("application/xml-external-parsed-entity"); 058 } else { 059 is.setType("application/xml"); 060 } 061 return is; 062 } 063 } 064 return delegate.resolveEntity(publicId, systemId); 065 } 066 067 /** 068 * @return Returns the allowRnc. 069 */ 070 public boolean isAllowRnc() { 071 return allowRnc; 072 } 073 /** 074 * @param allowRnc The allowRnc to set. 075 */ 076 public void setAllowRnc(boolean allowRnc) { 077 this.allowRnc = allowRnc; 078 } 079 }