You are viewing a plain text version of this content. The canonical link for it is here.
Posted to doxia-commits@maven.apache.org by vs...@apache.org on 2009/01/28 12:48:21 UTC
svn commit: r738458 -
/maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java
Author: vsiveton
Date: Wed Jan 28 11:48:21 2009
New Revision: 738458
URL: http://svn.apache.org/viewvc?rev=738458&view=rev
Log:
o improved the CachedFileEntityResolver:
- if the systemId is a file, try to get it as a classpath resource (due to r736924)
- wrap IOException into SAXException
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=738458&r1=738457&r2=738458&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 Wed Jan 28 11:48:21 2009
@@ -22,14 +22,16 @@
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
-import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.io.Reader;
import java.io.StringReader;
import java.net.URL;
import java.util.Hashtable;
import java.util.LinkedHashMap;
+import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -695,17 +697,38 @@
// already cached?
if ( res == null )
{
- File temp =
- new File( System.getProperty( "java.io.tmpdir" ), FileUtils.getFile( systemId ).getName() );
+ String systemName = FileUtils.getFile( systemId ).getName();
+ File temp = new File( System.getProperty( "java.io.tmpdir" ), systemName );
// maybe already as a temp file?
if ( !temp.exists() )
{
- res = IOUtil.toByteArray( new URL( systemId ).openStream() );
- IOUtil.copy( res, new FileOutputStream( temp ) );
+ // is systemId a file or an url?
+ if ( systemId.toLowerCase( Locale.ENGLISH ).startsWith( "file" ) )
+ {
+ // Doxia XSDs are included in the jars, so try to find the resource systemName from
+ // the classpath...
+ URL url = getClass().getResource( "/" + systemName );
+ if ( url != null )
+ {
+ res = toByteArray( url );
+ }
+ else
+ {
+ throw new SAXException( "Could not find the SYSTEM entity: " + systemId );
+ }
+ }
+ else
+ {
+ res = toByteArray( new URL( systemId ) );
+ }
+
+ // write systemId as temp file
+ copy( res, temp );
}
else
{
- res = IOUtil.toByteArray( new FileInputStream( temp ) );
+ // TODO How to refresh Doxia XSDs from temp dir?
+ res = toByteArray( temp.toURL() );
}
cache.put( systemId, res );
@@ -717,5 +740,68 @@
return is;
}
+
+ /**
+ * Wrap {@link IOUtil#toByteArray(java.io.InputStream)} to throw SAXException.
+ *
+ * @param url not null
+ * @return return an array of byte
+ * @throws SAXException if any
+ * @see {@link IOUtil#toByteArray(java.io.InputStream)}
+ */
+ private static byte[] toByteArray( URL url )
+ throws SAXException
+ {
+ InputStream is = null;
+ try
+ {
+ is = url.openStream();
+ if ( is == null )
+ {
+ throw new SAXException( "Cannot open stream from the url: " + url.toString() );
+ }
+ return IOUtil.toByteArray( is );
+ }
+ catch ( IOException e )
+ {
+ throw new SAXException( "IOException: " + e.getMessage(), e );
+ }
+ finally
+ {
+ IOUtil.close( is );
+ }
+ }
+
+ /**
+ * Wrap {@link IOUtil#copy(byte[], OutputStream)} to throw SAXException.
+ *
+ * @param res not null array of byte
+ * @param f the file where to write the bytes
+ * @throws SAXException if any
+ * @see {@link IOUtil#copy(byte[], OutputStream)}
+ */
+ private void copy( byte[] res, File f )
+ throws SAXException
+ {
+ if ( f.isDirectory() )
+ {
+ throw new SAXException( "'" + f.getAbsolutePath() + "' is a directory, can not write it." );
+ }
+
+ OutputStream os = null;
+ try
+ {
+ os = new FileOutputStream( f );
+ IOUtil.copy( res, os );
+ }
+ catch ( IOException e )
+ {
+ throw new SAXException( "IOException: " + e.getMessage(), e );
+ }
+ finally
+ {
+ IOUtil.close( os );
+ }
+ }
}
}