Santiago Gala wrote:
> Dave Carlson wrote:
>
>> I need to use the Saxon XSLT processor with Jetspeed for other
>> portlet content
>> (and another application running in the same Tomcat instance).
>> However, I was
>> getting errors when I added saxon as the default XSLT processor. I
>> tracked
>> down a simple bug fix to SimpleTransform.java
>>
>> Short answer:
>> Do a global replace of "getReader" and replace with "getURL"
>>
> It is not this simple. The whole purpose of having getReader() called
> is to abstract Character encoding *and* cache location issues.
> getURL() should be forbiden, as it exposes the internals on how the
> cache works, and is bound to failure as the cache changes. Also, it
> leads to funny character encoding issues.
>
>>
>> When SimpleTransform fetches the stylesheets from the disk cache, it
>> creates a
>> SAX parser based on a Reader for the cached file. However, in Saxon, it
>> requires setSystemId() to be called on the Source so that the parser
>> can use
>> the source's systemId to determine the base URI for resolving
>> relative URLs.
>>
> I think a Entity Resolver can take care of this process. I'm not
> completely sure how, though.
>
> I would like to help with a cleaner fix. I think we could call
> setEntityResolver() on the InputSource with the true URL (not the one
> in the cache), so that, in case there are relative URLs they can be
> resolved.
>
> I imagine something like:
>
> is = new InputSource( cacheEnt.getReader() );
> is.setSystemID( cacheEnt.getSourceURL() );
>
> is.setEntityResolver( new
> org.apache.jetspeed.xml.JetspeedXMLEntityResolver() );
Sorry, this should be applied to the XMLReader(s)
>
>
> patching JetspeedXMLEntityResolver to setSystemID again on the
> resulting InputSource ...
>
> I will try this with saxon and report. What do you think?
I am testing it with saxon.jar instead of xalan in webapps/lib, and it
seems to work all right. So, should I commit the changes for you to test?
Auditing (with grep) for more InputSource occurrences, I found
SAXPIFilter (only user in XMLPortlet). This should be possibly be
cleaned out, to write a better XMLPortlet...
I attach the diffs, waiting for committing them if there is no problem.
Index: src/java/org/apache/jetspeed/portal/portlets/NewRSSPortlet.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/portal/portlets/NewRSSPortlet.java,v
retrieving revision 1.10
diff -c -r1.10 NewRSSPortlet.java
*** src/java/org/apache/jetspeed/portal/portlets/NewRSSPortlet.java 2001/09/10
22:41:01 1.10
--- src/java/org/apache/jetspeed/portal/portlets/NewRSSPortlet.java 2001/09/12
21:02:49
***************
*** 153,158 ****
--- 153,159 ----
parser.setEntityResolver(new JetspeedXMLEntityResolver() );
InputSource isrc = new InputSource( this.cleanse( content ) );
+ isrc.setSystemId( url );
isrc.setEncoding("UTF-8");
this.document = parser.parse( isrc );
Index: src/java/org/apache/jetspeed/portal/portlets/RSSPortlet.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/portal/portlets/RSSPortlet.java,v
retrieving revision 1.44
diff -c -r1.44 RSSPortlet.java
*** src/java/org/apache/jetspeed/portal/portlets/RSSPortlet.java 2001/03/07
06:47:12 1.44
--- src/java/org/apache/jetspeed/portal/portlets/RSSPortlet.java 2001/09/12
21:02:50
***************
*** 119,124 ****
--- 119,125 ----
//SGP Should make no difference ...
is.setEncoding( "UTF8" );
+ is.setSystemId( url );
parser.setFeature(
"http://apache.org/xml/features/allow-java-encodings",
true );
Index: src/java/org/apache/jetspeed/services/registry/CastorRegistryService.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/services/registry/CastorRegistryService.java,v
retrieving revision 1.8
diff -c -r1.8 CastorRegistryService.java
*** src/java/org/apache/jetspeed/services/registry/CastorRegistryService.java
2001/07/29 13:42:00 1.8
--- src/java/org/apache/jetspeed/services/registry/CastorRegistryService.java
2001/09/12 21:02:52
***************
*** 334,340 ****
try
{
mapping = new Mapping();
! mapping.loadMapping( new InputSource( new FileReader(map) ) );
}
catch (Exception e)
{
--- 334,342 ----
try
{
mapping = new Mapping();
! InputSource is = new InputSource( new FileReader(map) );
! is.setSystemId( mapFile );
! mapping.loadMapping( is );
}
catch (Exception e)
{
Index: src/java/org/apache/jetspeed/util/SimpleTransform.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/util/SimpleTransform.java,v
retrieving revision 1.16
diff -c -r1.16 SimpleTransform.java
*** src/java/org/apache/jetspeed/util/SimpleTransform.java 2001/05/29 18:21:37
1.16
--- src/java/org/apache/jetspeed/util/SimpleTransform.java 2001/09/12 21:02:53
***************
*** 101,106 ****
--- 101,107 ----
//Jetspeed stuff
import org.apache.jetspeed.cache.disk.*;
+ import org.apache.jetspeed.xml.JetspeedXMLEntityResolver;
***************
*** 181,190 ****
--- 182,194 ----
// Create an XMLReader and set its ContentHandler.
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler(templatesHandler);
+ // Set it to solve Entities through Jetspeed URL Manager
+ reader.setEntityResolver( new JetspeedXMLEntityResolver() );
// Parse the stylesheet.
final InputSource xstyle = new InputSource(
JetspeedDiskCache.getInstance()
.getEntry( stylesheet_url
).getReader() );
+ xstyle.setSystemId( stylesheet_url );
reader.parse( xstyle );
//Get the Templates object from the ContentHandler.
***************
*** 291,296 ****
--- 295,303 ----
" with stylesheet: " +
stylesheet_url );
+ in.setSystemId( url );
+ style.setSystemId( stylesheet_url );
+
return transform( in,
style,
params );
***************
*** 423,432 ****
// Create an XMLReader and set its ContentHandler.
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler(templatesHandler);
!
// Parse the stylesheet.
! final InputSource xstyle = new InputSource(
JetspeedDiskCache.getInstance()
! .getEntry( stylesheet_url
).getReader() );
reader.parse( xstyle );
//Get the Templates object from the ContentHandler.
--- 430,444 ----
// Create an XMLReader and set its ContentHandler.
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler(templatesHandler);
! // Set it to solve Entities through Jetspeed URL Manager
! reader.setEntityResolver( new JetspeedXMLEntityResolver() );
!
// Parse the stylesheet.
! InputSource style = new InputSource( JetspeedDiskCache.getInstance()
! .getEntry( stylesheet_url
).getReader() );
! style.setSystemId( stylesheet_url );
! final InputSource xstyle = style;
!
reader.parse( xstyle );
//Get the Templates object from the ContentHandler.
***************
*** 469,476 ****
{
final Writer pw = new OutputStreamWriter( pos, "utf-8" );
! final SAXSource xinput = new SAXSource( new InputSource(
JetspeedDiskCache.getInstance().getEntry( content_url ).getReader() ) );
//Perform the transformation on a new thread, using
// PipedStreams
Thread t = new Thread( new Runnable()
--- 481,491 ----
{
final Writer pw = new OutputStreamWriter( pos, "utf-8" );
+ InputSource is = new InputSource( JetspeedDiskCache.getInstance()
+ .getEntry( content_url
+).getReader() );
+ is.setSystemId( content_url );
! final SAXSource xinput = new SAXSource( is );
//Perform the transformation on a new thread, using
// PipedStreams
Thread t = new Thread( new Runnable()
Index: src/java/org/apache/jetspeed/util/servlet/EcsStylesheetElement.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/util/servlet/EcsStylesheetElement.java,v
retrieving revision 1.3
diff -c -r1.3 EcsStylesheetElement.java
*** src/java/org/apache/jetspeed/util/servlet/EcsStylesheetElement.java 2001/05/04
15:51:24 1.3
--- src/java/org/apache/jetspeed/util/servlet/EcsStylesheetElement.java 2001/09/12
21:02:54
***************
*** 63,69 ****
import org.apache.ecs.ConcreteElement;
import java.util.*;
! //import org.apache.xalan.xslt.*;
import org.xml.sax.*;
import org.apache.jetspeed.util.SimpleTransform;
--- 63,69 ----
import org.apache.ecs.ConcreteElement;
import java.util.*;
!
import org.xml.sax.*;
import org.apache.jetspeed.util.SimpleTransform;
Index: src/java/org/apache/jetspeed/xml/JetspeedXMLEntityResolver.java
===================================================================
RCS file:
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/xml/JetspeedXMLEntityResolver.java,v
retrieving revision 1.3
diff -c -r1.3 JetspeedXMLEntityResolver.java
*** src/java/org/apache/jetspeed/xml/JetspeedXMLEntityResolver.java 2001/03/09
12:42:19 1.3
--- src/java/org/apache/jetspeed/xml/JetspeedXMLEntityResolver.java 2001/09/12
21:02:54
***************
*** 66,72 ****
/**
* an entity resolver which tries to lookup DTD files
! * through the URL Manager
*@author <A HREF="mailto:[EMAIL PROTECTED]">Christian Sell</A>
*@author <A HREF="mailto:[EMAIL PROTECTED]">Santiago Gala</A>
*@version $Id: JetspeedXMLEntityResolver.java,v 1.3 2001/03/09 12:42:19 sgala Exp $
--- 66,75 ----
/**
* an entity resolver which tries to lookup DTD files
! * through the URL Manager.
! *
! * TODO: Should be a singleton.
! *
*@author <A HREF="mailto:[EMAIL PROTECTED]">Christian Sell</A>
*@author <A HREF="mailto:[EMAIL PROTECTED]">Santiago Gala</A>
*@version $Id: JetspeedXMLEntityResolver.java,v 1.3 2001/03/09 12:42:19 sgala Exp $
***************
*** 82,88 ****
// " Taking " + systemId + " from cache");
Reader rdr = JetspeedDiskCache.getInstance().
getEntry(systemId).getReader();
! return new InputSource(rdr);
} catch(IOException x) {}
return null;
}
--- 85,94 ----
// " Taking " + systemId + " from cache");
Reader rdr = JetspeedDiskCache.getInstance().
getEntry(systemId).getReader();
! InputSource is = new InputSource(rdr);
! is.setPublicId( publicId );
! is.setSystemId( systemId );
! return is;
} catch(IOException x) {}
return null;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]