[Yanel-commits] rev 26148 -
public/yanel/trunk/src/impl/java/org/wyona/yanel/impl/resources
michi at wyona.com
michi at wyona.com
Thu Jul 19 15:30:07 CEST 2007
Author: michi
Date: 2007-07-19 15:30:07 +0200 (Thu, 19 Jul 2007)
New Revision: 26148
Added:
public/yanel/trunk/src/impl/java/org/wyona/yanel/impl/resources/BasicXMLResource.java
Log:
XML Basic Resource added
Added: public/yanel/trunk/src/impl/java/org/wyona/yanel/impl/resources/BasicXMLResource.java
===================================================================
--- public/yanel/trunk/src/impl/java/org/wyona/yanel/impl/resources/BasicXMLResource.java (rev 0)
+++ public/yanel/trunk/src/impl/java/org/wyona/yanel/impl/resources/BasicXMLResource.java 2007-07-19 13:30:07 UTC (rev 26148)
@@ -0,0 +1,253 @@
+/*
+ * Copyright 2006 Wyona
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.wyona.org/licenses/APACHE-LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.wyona.yanel.impl.resources;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXResult;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.log4j.Category;
+import org.apache.xml.resolver.tools.CatalogResolver;
+import org.apache.xml.serializer.Serializer;
+import org.wyona.security.core.api.Identity;
+import org.wyona.yanel.core.Resource;
+import org.wyona.yanel.core.api.attributes.ViewableV2;
+import org.wyona.yanel.core.attributes.viewable.View;
+import org.wyona.yanel.core.attributes.viewable.ViewDescriptor;
+import org.wyona.yanel.core.serialization.SerializerFactory;
+import org.wyona.yanel.core.source.ResourceResolver;
+import org.wyona.yanel.core.transformation.I18nTransformer2;
+import org.wyona.yanel.core.transformation.XIncludeTransformer;
+import org.wyona.yanel.core.util.PathUtil;
+import org.wyona.yarep.core.Repository;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ *
+ */
+public class BasicXMLResource extends Resource implements ViewableV2 {
+
+ private static Category log = Category.getInstance(BasicXMLResource.class);
+
+ /**
+ * @see org.wyona.yanel.core.api.attributes.ViewableV2#getViewDescriptors()
+ */
+ public ViewDescriptor[] getViewDescriptors() {
+ ViewDescriptor[] vd = new ViewDescriptor[2];
+ vd[0] = new ViewDescriptor("default");
+ vd[0].setMimeType("application/xhtml+xml");
+ vd[1] = new ViewDescriptor("source");
+ vd[1].setMimeType("application/xml");
+ return vd;
+ }
+
+ /**
+ * @see org.wyona.yanel.core.api.attributes.ViewableV2#getView(java.lang.String)
+ */
+ public View getView(String viewId) throws Exception {
+ InputStream xmlInputStream = getContentXML();
+ return getXMLView(viewId, xmlInputStream);
+ }
+
+ /**
+ * @see org.wyona.yanel.core.api.attributes.ViewableV2#getMimeType(java.lang.String)
+ */
+ public String getMimeType(String viewId) throws Exception {
+ String mimeType = getResourceConfigProperty("mime-type");
+ if (mimeType != null) return mimeType;
+ mimeType = "application/xhtml+xml";
+ return mimeType;
+ }
+
+ /**
+ * @see org.wyona.yanel.core.api.attributes.ViewableV2#exists()
+ */
+ public boolean exists() throws Exception {
+ return getRealm().getRepository().existsNode(getPath());
+ }
+
+ /**
+ * @see org.wyona.yanel.core.api.attributes.ViewableV2#getSize()
+ */
+ public long getSize() throws Exception {
+ return -1;
+ }
+
+
+ public View getXMLView(String viewId, InputStream xmlInputStream) throws Exception {
+ View view = new View();
+ String mimeType = getMimeType(viewId);
+ view.setMimeType(mimeType);
+
+ try {
+ Repository repo = getRealm().getRepository();
+
+ if (viewId != null && viewId.equals("source")) {
+ view.setInputStream(xmlInputStream);
+ view.setMimeType("application/xml");
+ return view;
+ }
+
+ String[] xsltPath = getXSLTPath(getPath());
+
+ // create reader:
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ CatalogResolver catalogResolver = new CatalogResolver();
+ xmlReader.setEntityResolver(catalogResolver);
+
+ // create xslt transformer:
+ SAXTransformerFactory tf = (SAXTransformerFactory)TransformerFactory.newInstance();
+
+ TransformerHandler[] xsltHandlers = new TransformerHandler[xsltPath.length];
+ for (int i = 0; i < xsltPath.length; i++) {
+ xsltHandlers[i] = tf.newTransformerHandler(new StreamSource(repo.getNode(xsltPath[i]).getInputStream()));
+ passTransformerParameters(xsltHandlers[i].getTransformer());
+ }
+
+ // create i18n transformer:
+ I18nTransformer2 i18nTransformer = new I18nTransformer2("global", getRequestedLanguage(), getRealm().getDefaultLanguage());
+ i18nTransformer.setEntityResolver(catalogResolver);
+
+ // create xinclude transformer:
+ XIncludeTransformer xIncludeTransformer = new XIncludeTransformer();
+ ResourceResolver resolver = new ResourceResolver(this);
+ xIncludeTransformer.setResolver(resolver);
+
+ // create serializer:
+ Serializer serializer = SerializerFactory.getSerializer(SerializerFactory.XHTML_STRICT);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ // chain everything together (create a pipeline):
+ if (xsltHandlers.length > 0) {
+ xmlReader.setContentHandler(xsltHandlers[0]);
+ for (int i=0; i<xsltHandlers.length-1; i++) {
+ xsltHandlers[i].setResult(new SAXResult(xsltHandlers[i+1]));
+ }
+ xsltHandlers[xsltHandlers.length-1].setResult(new SAXResult(xIncludeTransformer));
+ } else {
+ xmlReader.setContentHandler(new SAXResult(xIncludeTransformer).getHandler());
+ }
+ xIncludeTransformer.setResult(new SAXResult(i18nTransformer));
+ i18nTransformer.setResult(new SAXResult(serializer.asContentHandler()));
+ serializer.setOutputStream(baos);
+
+ // execute pipeline:
+ xmlReader.parse(new InputSource(xmlInputStream));
+
+ // write result into view:
+ view.setInputStream(new ByteArrayInputStream(baos.toByteArray()));
+ return view;
+ } catch(Exception e) {
+ log.error(e + " (" + getPath() + ", " + getRealm() + ")", e);
+ throw new Exception(e);
+ }
+
+ }
+
+ /**
+ * Pass parameters to xslt transformer.
+ * @param transformer
+ * @throws Exception
+ */
+ protected void passTransformerParameters(Transformer transformer) throws Exception {
+ 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()));
+ String userAgent = getEnvironment().getRequest().getHeader("User-Agent");
+ transformer.setParameter("language", getRequestedLanguage());
+ String os = getOS(userAgent);
+ if (os != null) transformer.setParameter("os", os);
+ String client = getClient(userAgent);
+ if (client != null) transformer.setParameter("client", client);
+ // localization
+ transformer.setParameter("language", getRequestedLanguage());
+ // language of this translation
+ transformer.setParameter("content-language", getContentLanguage());
+ // username
+ String username = getUsername();
+ if (username != null) transformer.setParameter("username", username);
+ }
+
+ /**
+ * Gets the XML content which will be fed into the processing pipeline.
+ * @return xml stream
+ * @throws Exception
+ */
+ protected InputStream getContentXML() throws Exception {
+ return getRealm().getRepository().getNode(getPath()).getInputStream();
+ }
+
+ /**
+ * Get operating system
+ */
+ protected String getOS(String userAgent) {
+ if (userAgent.indexOf("Linux") > 0) {
+ return "unix";
+ } else if (userAgent.indexOf("Mac OS X") > 0) {
+ return "unix";
+ } else if (userAgent.indexOf("Windows") > 0) {
+ return "windows";
+ } else {
+ log.warn("Operating System could not be recognized: " + userAgent);
+ return null;
+ }
+ }
+
+ /**
+ * Get client
+ */
+ protected String getClient(String userAgent) {
+ if (userAgent.indexOf("Firefox") > 0) {
+ return "firefox";
+ } else if (userAgent.indexOf("MSIE") > 0) {
+ return "msie";
+ } else {
+ log.warn("Client could not be recognized: " + userAgent);
+ return null;
+ }
+ }
+
+ /**
+ * Get username from session
+ */
+ protected String getUsername() {
+ Identity identity = getEnvironment().getIdentity();
+ if (identity != null) return identity.getUsername();
+ return null;
+ }
+
+ /**
+ * Get XSLT path
+ */
+ protected String[] getXSLTPath(String path) throws Exception {
+ String[] xsltPath = getResourceConfigProperties("xslt");
+ if (xsltPath != null) return xsltPath;
+ log.info("No XSLT Path within: " + path);
+ return new String[0];
+ }
+
+}
More information about the Yanel-commits
mailing list