[Yanel-commits] rev 30758 -
public/yanel/trunk/src/impl/java/org/wyona/yanel/impl/resources
michi at wyona.com
michi at wyona.com
Fri Jan 25 11:00:20 CET 2008
Author: michi
Date: 2008-01-25 11:00:19 +0100 (Fri, 25 Jan 2008)
New Revision: 30758
Modified:
public/yanel/trunk/src/impl/java/org/wyona/yanel/impl/resources/BasicXMLResource.java
Log:
javadoc added and obsolete stuff removed and pass parameters started, but it's not clear yet what this method does
Modified: 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 2008-01-25 09:46:46 UTC (rev 30757)
+++ public/yanel/trunk/src/impl/java/org/wyona/yanel/impl/resources/BasicXMLResource.java 2008-01-25 10:00:19 UTC (rev 30758)
@@ -21,6 +21,8 @@
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
import java.util.Properties;
import javax.xml.transform.Transformer;
@@ -31,12 +33,12 @@
import javax.xml.transform.stream.StreamSource;
import org.apache.avalon.framework.configuration.Configuration;
-import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.ConfigurationUtil;
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
import org.apache.xml.resolver.tools.CatalogResolver;
import org.apache.xml.serializer.Serializer;
import org.w3c.dom.Document;
+import org.wyona.commons.io.MimeTypeUtil;
import org.wyona.security.core.api.Identity;
import org.wyona.yanel.core.Resource;
import org.wyona.yanel.core.api.attributes.ViewableV2;
@@ -48,26 +50,65 @@
import org.wyona.yanel.core.transformation.XIncludeTransformer;
import org.wyona.yanel.core.util.PathUtil;
import org.wyona.yanel.impl.resources.xml.ConfigurableViewDescriptor;
-import org.wyona.yanel.impl.resources.usecase.UsecaseException;
import org.wyona.yarep.core.Repository;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
/**
- *
+ * It is a base class for resources that generate XML. Subclasses must override getContentXML
+ * in order to pass XML for a view.
+ * <p>
+ * The class has its configuration for views ('default' and 'source' are built in). It resides in *.yanel-rc file, e.g.
+ * <pre>
+ * <yanel:custom-config>
+ * <views>
+ * <!-- No parameter needed for getting this view -->
+ * <view id="default">
+ * <mime-type>text/html</mime-type>
+ * <xslt>/xslt/global.xsl</xslt>
+ * <serializer key="HTML_TRANSITIONAL">
+ * </serializer>
+ * </view>
+ *
+ * <view id="beautiful">
+ * <mime-type>application/xhtml+xml</mime-type>
+ * <xslt>/xslt/global.xsl</xslt>
+ * <serializer key="XHTML_STRICT">
+ * </serializer>
+ * </view>
+ *
+ * <view id="atom">
+ * <mime-type>application/atom+xml</mime-type>
+ * <serializer key="XML">
+ * </serializer>
+ * </view>
+ *
+ * <view id="json">
+ * <mime-type>application/json</mime-type>
+ * <serializer key="TEXT">
+ * </serializer>
+ * </view>
+ *
+ * <!-- Skips any provided XSLT-->
+ * <view id="source">
+ * <mime-type>application/xhtml+xml</mime-type>
+ * <serializer key="XML">
+ * </serializer>
+ * </view>
+ *</views>
+ *</yanel:custom-config>
+ * </pre>
+ * <p>
+ * A view is accessed through a request parameter <b>yanel.resource.viewid</b>
*/
public class BasicXMLResource extends Resource implements ViewableV2 {
- private static Category log = Category.getInstance(BasicXMLResource.class);
+ private static Logger log = Logger.getLogger(BasicXMLResource.class);
protected static String DEFAULT_VIEW_ID = "default";
protected static String SOURCE_VIEW_ID = "source";
- protected static String SERIALIZER_OMIT_XML_DECLARATION = "serializer-omit-xml-declaration";
- protected static String SERIALIZER_DOCTYPE_PUBLIC = "serializer-doctype-public";
- protected static String SERIALIZER_DOCTYPE_SYSTEM = "serializer-doctype-system";
-
protected HashMap viewDescriptors;
public ViewDescriptor getViewDescriptor(String viewId) {
@@ -195,10 +236,13 @@
if (xsltPaths == null || xsltPaths.length == 0) {
xsltPaths = getXSLTPath(getPath());
}
+
+ SourceResolver uriResolver = new SourceResolver(this);
+
TransformerHandler[] xsltHandlers = new TransformerHandler[xsltPaths.length];
for (int i = 0; i < xsltPaths.length; i++) {
xsltHandlers[i] = tf.newTransformerHandler(new StreamSource(repo.getNode(xsltPaths[i]).getInputStream()));
- xsltHandlers[i].getTransformer().setURIResolver(new SourceResolver(this));
+ xsltHandlers[i].getTransformer().setURIResolver(uriResolver);
passTransformerParameters(xsltHandlers[i].getTransformer());
}
@@ -208,8 +252,7 @@
// create xinclude transformer:
XIncludeTransformer xIncludeTransformer = new XIncludeTransformer();
- SourceResolver resolver = new SourceResolver(this);
- xIncludeTransformer.setResolver(resolver);
+ xIncludeTransformer.setResolver(uriResolver);
// create serializer:
Serializer serializer = createSerializer(viewDescriptor);
@@ -260,12 +303,17 @@
} else {
String mimeType = getMimeType(viewDescriptor.getId());
- if (mimeType.equals("text/html")) {
+ if (MimeTypeUtil.isHTML(mimeType) && !MimeTypeUtil.isXML(mimeType)) {
serializer = SerializerFactory.getSerializer(SerializerFactory.HTML_TRANSITIONAL);
- } else if (mimeType.equals("application/xml")) {
+ } else if (MimeTypeUtil.isXML(mimeType)) {
serializer = SerializerFactory.getSerializer(SerializerFactory.XML);
- } else {
+ } else if (MimeTypeUtil.isTextual(mimeType)) {
+ serializer = SerializerFactory.getSerializer(SerializerFactory.TEXT);
+ } else if (MimeTypeUtil.isHTML(mimeType) && MimeTypeUtil.isXML(mimeType)){
serializer = SerializerFactory.getSerializer(SerializerFactory.XHTML_STRICT);
+ } else{
+ // For backwards compatibility leave XHTML as default
+ serializer = SerializerFactory.getSerializer(SerializerFactory.XHTML_STRICT);
}
}
// allow to override xml declaration and doctype:
@@ -302,6 +350,34 @@
* @throws Exception
*/
protected void passTransformerParameters(Transformer transformer) throws Exception {
+/*
+ // TODO: getParameters() are not the Http Request parameters! Let's find out firs out ...
+ // Attach all parameters that came with the request. Templates can make use of them.
+ // NOTE: all parameter values will be of type String. In XSLT: <param name="p" value="'actual_value'"/>
+ for (Iterator i = getParameters().entrySet().iterator(); i.hasNext();) {
+ Map.Entry entry = (Map.Entry) i.next();
+ if (entry.getValue() instanceof String) {
+ String value = (String) entry.getValue();
+ transformer.setParameter(String.valueOf(entry.getKey()), value);
+ } else if(entry.getValue() instanceof String[]){
+ // values separated by a space
+ String separator = " ";
+
+ StringBuffer finalValue = new StringBuffer();
+ String [] values = (String[]) entry.getValue();
+ for (int j = 0; j < values.length; j++) {
+ finalValue.append(values[j]);
+ if(j + 1 != values.length){
+ finalValue.append(separator);
+ }
+ }
+ } else{
+ // Never happens
+ }
+ }
+*/
+
+ // Set general parameters
transformer.setParameter("yanel.path.name", PathUtil.getName(getPath()));
transformer.setParameter("yanel.path", getPath());
transformer.setParameter("yanel.back2context", PathUtil.backToContext(realm, getPath()));
More information about the Yanel-commits
mailing list