[Yanel-commits] rev 22849 -
public/yanel/trunk/src/resources/xml/src/java/org/wyona/yanel/impl/resources
josias at wyona.com
josias at wyona.com
Wed Feb 21 22:12:08 CET 2007
Author: josias
Date: 2007-02-21 22:12:06 +0100 (Wed, 21 Feb 2007)
New Revision: 22849
Modified:
public/yanel/trunk/src/resources/xml/src/java/org/wyona/yanel/impl/resources/XMLResource.java
Log:
convert xml processing to sax pipeline and use new sax-based i18n transformer and serializer. this should reduce memory consumption, increase performance, and improve SoC.
Modified: public/yanel/trunk/src/resources/xml/src/java/org/wyona/yanel/impl/resources/XMLResource.java
===================================================================
--- public/yanel/trunk/src/resources/xml/src/java/org/wyona/yanel/impl/resources/XMLResource.java 2007-02-21 21:08:33 UTC (rev 22848)
+++ public/yanel/trunk/src/resources/xml/src/java/org/wyona/yanel/impl/resources/XMLResource.java 2007-02-21 21:12:06 UTC (rev 22849)
@@ -30,7 +30,10 @@
import org.wyona.yanel.core.attributes.viewable.View;
import org.wyona.yanel.core.attributes.viewable.ViewDescriptor;
+import org.wyona.yanel.core.serialization.HTMLSerializer;
+import org.wyona.yanel.core.serialization.SerializerFactory;
import org.wyona.yanel.core.transformation.I18nTransformer;
+import org.wyona.yanel.core.transformation.I18nTransformer2;
import org.wyona.yanel.core.util.PathUtil;
import org.wyona.yanel.core.util.ResourceAttributeHelper;
@@ -39,6 +42,9 @@
import org.wyona.yarep.core.RepositoryFactory;
import org.wyona.yarep.core.Revision;
import org.wyona.yarep.util.RepoPath;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -47,12 +53,16 @@
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -60,11 +70,13 @@
import java.io.Reader;
import java.io.Writer;
import java.util.Date;
+import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import org.apache.log4j.Category;
import org.apache.xml.resolver.tools.CatalogResolver;
+import org.apache.xml.serializer.Serializer;
/**
*
@@ -118,37 +130,40 @@
String xsltPath = getXSLTPath(getPath());
if (xsltPath != null) {
- TransformerFactory tf = TransformerFactory.newInstance();
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ CatalogResolver catalogResolver = new CatalogResolver();
+ xmlReader.setEntityResolver(catalogResolver);
+
+ SAXTransformerFactory tf = (SAXTransformerFactory)TransformerFactory.newInstance();
//tf.setURIResolver(null);
- Transformer transformer = tf.newTransformer(new StreamSource(repo.getNode(xsltPath).getInputStream()));
- transformer.setParameter("yanel.path.name", PathUtil.getName(getPath()));
- transformer.setParameter("yanel.path", getPath());
- transformer.setParameter("yanel.back2context", PathUtil.backToContext(realm, getPath()));
- transformer.setParameter("yarep.back2realm", PathUtil.backToRealm(getPath()));
+ TransformerHandler xsltHandler = tf.newTransformerHandler(new StreamSource(repo.getNode(xsltPath).getInputStream()));
+ xsltHandler.getTransformer().setParameter("yanel.path.name", PathUtil.getName(getPath()));
+ xsltHandler.getTransformer().setParameter("yanel.path", getPath());
+ xsltHandler.getTransformer().setParameter("yanel.back2context", PathUtil.backToContext(realm, getPath()));
+ xsltHandler.getTransformer().setParameter("yarep.back2realm", PathUtil.backToRealm(getPath()));
String userAgent = getRequest().getHeader("User-Agent");
String os = getOS(userAgent);
- if (os != null) transformer.setParameter("os", os);
+ if (os != null) xsltHandler.getTransformer().setParameter("os", os);
String client = getClient(userAgent);
- if (client != null) transformer.setParameter("client", client);
- transformer.setParameter("language", getLanguage());
+ if (client != null) xsltHandler.getTransformer().setParameter("client", client);
+ xsltHandler.getTransformer().setParameter("language", getLanguage());
- // TODO: Is this the best way to generate an InputStream from an OutputStream?
- java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
-
- org.xml.sax.XMLReader xmlReader = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
- CatalogResolver catalogResolver = new CatalogResolver();
- xmlReader.setEntityResolver(catalogResolver);
- transformer.transform(new SAXSource(xmlReader, new org.xml.sax.InputSource(getContentXML(repo, yanelPath, revisionName))), new StreamResult(baos));
+ xmlReader.setContentHandler(xsltHandler);
- InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
- defaultView.setInputStream(inputStream);
-
- I18nTransformer i18nTransformer = new I18nTransformer("global", getLanguage());
+ I18nTransformer2 i18nTransformer = new I18nTransformer2("global", getLanguage());
i18nTransformer.setEntityResolver(catalogResolver);
- SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
- saxParser.parse(inputStream, i18nTransformer);
- defaultView.setInputStream(i18nTransformer.getInputStream());
-
+
+ xsltHandler.setResult(new SAXResult(i18nTransformer));
+
+ Serializer serializer = SerializerFactory.getSerializer(SerializerFactory.XHTML_STRICT);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ serializer.setOutputStream(baos);
+
+ i18nTransformer.setResult(new SAXResult(serializer.asContentHandler()));
+
+ xmlReader.parse(new InputSource(getContentXML(repo, yanelPath, revisionName)));
+
+ defaultView.setInputStream(new ByteArrayInputStream(baos.toByteArray()));
return defaultView;
} else {
log.debug("Mime-Type: " + mimeType);
More information about the Yanel-commits
mailing list