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]

Reply via email to