Author: vsiveton
Date: Sat Dec 6 06:41:44 2008
New Revision: 723989
URL: http://svn.apache.org/viewvc?rev=723989&view=rev
Log:
DOXIA-265: Add an EntityResolver in AbstractXmlParser#getXmlReader()
o added a simple cached file mechanism
Modified:
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java
Modified:
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java?rev=723989&r1=723988&r2=723989&view=diff
==============================================================================
---
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java
(original)
+++
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java
Sat Dec 6 06:41:44 2008
@@ -21,9 +21,12 @@
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
+import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
+import java.net.URL;
+import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
@@ -35,11 +38,15 @@
import org.apache.maven.doxia.markup.XmlMarkup;
import org.apache.maven.doxia.sink.Sink;
import org.apache.maven.doxia.sink.SinkEventAttributeSet;
+import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.ReaderFactory;
import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.WriterFactory;
import org.codehaus.plexus.util.xml.pull.MXParser;
import org.codehaus.plexus.util.xml.pull.XmlPullParser;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
@@ -570,8 +577,50 @@
xmlReader.setFeature( "http://xml.org/sax/features/validation",
true );
xmlReader.setFeature(
"http://apache.org/xml/features/validation/schema", true );
xmlReader.setErrorHandler( errorHandler );
+ xmlReader.setEntityResolver( new CachedFileEntityResolver() );
}
return xmlReader;
}
+
+ /**
+ * Implementation of the callback mechanism <code>EntityResolver</code>.
+ * Using a mechanism of cached files in temp dir to improve performance
when using the <code>XMLReader</code>.
+ */
+ public static class CachedFileEntityResolver
+ implements EntityResolver
+ {
+ private static final Map cache = new Hashtable();
+
+ /** [EMAIL PROTECTED] */
+ public InputSource resolveEntity( String publicId, String systemId )
+ throws SAXException, IOException
+ {
+ byte[] res = (byte[]) cache.get( systemId );
+ // already cached?
+ if ( res == null )
+ {
+ File temp =
+ new File( System.getProperty( "java.io.tmpdir" ),
FileUtils.getFile( systemId ).getName() );
+ // maybe already as a temp file?
+ if ( !temp.exists() )
+ {
+ res = IOUtil.toByteArray( new URL( systemId ).openStream()
);
+ IOUtil.copy( res, WriterFactory.newPlatformWriter( temp )
);
+ }
+ else
+ {
+ res = IOUtil.toByteArray( ReaderFactory.newPlatformReader(
temp ) );
+ }
+
+ cache.put( systemId, res );
+ }
+
+ InputSource is = new InputSource( new ByteArrayInputStream( res )
);
+ is.setPublicId( publicId );
+ is.setSystemId( systemId );
+
+ return is;
+ }
+ }
}