[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