[Yanel-dev] BasicXMLResource patch

Evaldas Taroza etaroza at optaros.com
Fri Jan 18 18:39:47 CET 2008


Hi,
I tried to beautify the BasicXMLResource class, because I think it is =

one of the most important ones.

This patch depends on MimeTypeUtil patch that I sent earlier.

Evaldas

-- =

+41 79 616 53 76
Optaros - www.optaros.com
-------------- next part --------------
Index: java/org/wyona/yanel/impl/resources/BasicXMLResource.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- java/org/wyona/yanel/impl/resources/BasicXMLResource.java	(revision 304=
67)
+++ java/org/wyona/yanel/impl/resources/BasicXMLResource.java	(working copy)
@@ -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;
@@ -37,6 +39,7 @@
 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;
@@ -64,10 +67,6 @@
     protected static String DEFAULT_VIEW_ID =3D "default";
     protected static String SOURCE_VIEW_ID =3D "source";
 =

-    protected static String SERIALIZER_OMIT_XML_DECLARATION =3D "serialize=
r-omit-xml-declaration";
-    protected static String SERIALIZER_DOCTYPE_PUBLIC =3D "serializer-doct=
ype-public";
-    protected static String SERIALIZER_DOCTYPE_SYSTEM =3D "serializer-doct=
ype-system";
-
     protected HashMap viewDescriptors;
 =

     public ViewDescriptor getViewDescriptor(String viewId) {
@@ -195,10 +194,13 @@
             if (xsltPaths =3D=3D null || xsltPaths.length =3D=3D 0) {
                 xsltPaths =3D getXSLTPath(getPath());
             }
+            =

+            SourceResolver uriResolver =3D new SourceResolver(this);
+            =

             TransformerHandler[] xsltHandlers =3D new TransformerHandler[x=
sltPaths.length];
             for (int i =3D 0; i < xsltPaths.length; i++) {
                 xsltHandlers[i] =3D tf.newTransformerHandler(new StreamSou=
rce(repo.getNode(xsltPaths[i]).getInputStream()));
-                xsltHandlers[i].getTransformer().setURIResolver(new Source=
Resolver(this));
+                xsltHandlers[i].getTransformer().setURIResolver(uriResolve=
r);
                 passTransformerParameters(xsltHandlers[i].getTransformer()=
);
             }
 =

@@ -208,8 +210,7 @@
 =

             // create xinclude transformer:
             XIncludeTransformer xIncludeTransformer =3D new XIncludeTransf=
ormer();
-            SourceResolver resolver =3D new SourceResolver(this);
-            xIncludeTransformer.setResolver(resolver);
+            xIncludeTransformer.setResolver(uriResolver);
 =

             // create serializer:
             Serializer serializer =3D createSerializer(viewDescriptor);
@@ -260,12 +261,17 @@
         } else {
             String mimeType =3D getMimeType(viewDescriptor.getId());
 =

-            if (mimeType.equals("text/html")) {
+            if (MimeTypeUtil.isHTML(mimeType) && !MimeTypeUtil.isXML(mimeT=
ype)) {
                 serializer =3D SerializerFactory.getSerializer(SerializerF=
actory.HTML_TRANSITIONAL);
-            } else if (mimeType.equals("application/xml")) {
+            } else if (MimeTypeUtil.isXML(mimeType)) {
                 serializer =3D SerializerFactory.getSerializer(SerializerF=
actory.XML);
-            } else {
+            } else if (MimeTypeUtil.isTextual(mimeType)) {
+                serializer =3D SerializerFactory.getSerializer(SerializerF=
actory.TEXT);
+            }else if (MimeTypeUtil.isHTML(mimeType) && MimeTypeUtil.isXML(=
mimeType)){
                 serializer =3D SerializerFactory.getSerializer(SerializerF=
actory.XHTML_STRICT);
+            }else{
+                // For backwards compatibility leave XHTML as default
+                serializer =3D SerializerFactory.getSerializer(SerializerF=
actory.XHTML_STRICT);
             }
         }
         // allow to override xml declaration and doctype:
@@ -302,6 +308,31 @@
      * @throws Exception
      */
     protected void passTransformerParameters(Transformer transformer) thro=
ws Exception {
+        // Attach all paramters that came with the request. Templates can =
make use of them.
+        // NOTE: all parameter values will be of type String. In XSLT: <pa=
ram name=3D"p" value=3D"'actual_value'"/>
+        for (Iterator i =3D getParameters().entrySet().iterator(); i.hasNe=
xt();) {
+            Map.Entry entry =3D (Map.Entry) i.next();
+            if (entry.getValue() instanceof String) {
+                String value =3D (String) entry.getValue();
+                transformer.setParameter(String.valueOf(entry.getKey()), v=
alue);
+            }else if(entry.getValue() instanceof String[]){
+                // values separated by a space
+                String separator =3D " ";
+                =

+                StringBuffer finalValue =3D new StringBuffer();
+                String [] values =3D (String[]) entry.getValue();
+                for (int j =3D 0; j < values.length; j++) {
+                    finalValue.append(values[j]);
+                    if(j + 1 !=3D values.length){
+                        finalValue.append(separator);
+                    }
+                }
+            }else{
+                // Never happens
+            }
+        }
+        =

+        // Set general parameters
         transformer.setParameter("yanel.path.name", PathUtil.getName(getPa=
th()));
         transformer.setParameter("yanel.path", getPath());
         transformer.setParameter("yanel.back2context", PathUtil.backToCont=
ext(realm, getPath()));
@@ -390,4 +421,4 @@
         return new String[0];
     }
 =

-}
+}
\ No newline at end of file


More information about the Yanel-development mailing list