KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > richtext > processors > xml > MmxfGetString


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10 package org.mmbase.richtext.processors.xml;
11 import org.mmbase.datatypes.processors.xml.Modes;
12 import org.mmbase.datatypes.processors.*;
13 import org.mmbase.bridge.*;
14 import org.mmbase.bridge.Node;
15 import org.mmbase.bridge.util.xml.Generator;
16 import org.mmbase.util.logging.*;
17 import org.mmbase.util.*;
18 import org.mmbase.richtext.transformers.XmlField;
19 import org.mmbase.util.xml.XMLWriter;
20 import javax.xml.transform.dom.DOMSource JavaDoc;
21 import javax.xml.transform.stream.StreamResult JavaDoc;
22 import javax.xml.parsers.*;
23
24 import java.util.*;
25 import java.io.*;
26 import org.w3c.dom.*;
27
28
29 /**
30  * This class implements the `get' for `mmxf' fields.
31  *
32  * @author Michiel Meeuwissen
33  * @version $Id: MmxfGetString.java,v 1.5 2006/03/12 19:52:15 michiel Exp $
34  * @since MMBase-1.8
35  */

36
37 public class MmxfGetString implements Processor {
38     private static final Logger log = Logging.getLoggerInstance(MmxfGetString.class);
39
40     private static final int serialVersionUID = 1;
41
42     static DocumentBuilder getDocumentBuilder() {
43         try {
44             DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
45             dfactory.setNamespaceAware(true);
46             DocumentBuilder documentBuilder = dfactory.newDocumentBuilder();
47             org.xml.sax.ErrorHandler JavaDoc handler = new XMLErrorHandler();
48             documentBuilder.setErrorHandler(handler);
49             documentBuilder.setEntityResolver( new XMLEntityResolver());
50             return documentBuilder;
51         } catch (ParserConfigurationException pce) {
52             throw new RuntimeException JavaDoc(pce.getMessage(), pce);
53         }
54     }
55     /**
56      * Returns a 'objects' Document containing the node with the mmxf field plus all idrelated objects
57      */

58     public static Document getDocument(final Node node, final Field field) {
59
60         log.debug("Getting document for node " + node.getNumber());
61         Generator generator = new Generator(getDocumentBuilder(), node.getCloud());
62         generator.setNamespaceAware(true);
63         generator.add(node, field);
64         org.mmbase.bridge.NodeList relatedNodes = node.getRelatedNodes("object", "idrel", "destination");
65         if (log.isDebugEnabled()) {
66             log.debug("Idrelated " + relatedNodes);
67         }
68         generator.add(relatedNodes);
69         org.mmbase.bridge.NodeList relationsNodes = node.getRelations("idrel", node.getCloud().getNodeManager("object"), "destination");
70         if (log.isDebugEnabled()) {
71             log.debug("Idrelations " + relationsNodes);
72         }
73         generator.add(relationsNodes);
74
75         // TODO. With advent of 'blocks' one deeper level must be queried here (see node.body.jspx)
76
return generator.getDocument();
77     }
78
79
80     public Object JavaDoc process(Node node, Field field, Object JavaDoc value) {
81         if (log.isDebugEnabled()) {
82             log.debug("Getting " + field + " from " + node + " as a String");
83             log.debug("Received value as " + value.getClass());
84         }
85
86         try {
87             String JavaDoc stringMode = (String JavaDoc) node.getCloud().getProperty(Cloud.PROP_XMLMODE);
88             int mode = stringMode == null ? Modes.XML : Modes.getMode(stringMode);
89             switch(mode) {
90             case Modes.KUPU: {
91                 // this is actually not really used, at the moment is done on node.body.jspx
92
log.debug("Generating kupu-compatible XML for " + value);
93                 Document xml = getDocument(node, field);
94                 java.net.URL JavaDoc u = ResourceLoader.getConfigurationRoot().getResource("xslt/mmxf2kupu.xslt");
95                 StringWriter res = new StringWriter();
96                 // TODO: XSL transformation parameter stuff must be generalized (not only cloud, but only e.g. request specific stuff must be dealt with).
97
Map params = new HashMap();
98                 params.put("cloud", node.getCloud());
99                 XSLTransformer.transform(new DOMSource JavaDoc(xml), u, new StreamResult JavaDoc(res), params);
100                 return res.toString();
101             }
102             case Modes.WIKI: {
103                 log.debug("Generating 'wiki' for " + value);
104                 Document xml = getDocument(node, field);
105                 java.net.URL JavaDoc u = ResourceLoader.getConfigurationRoot().getResource("xslt/2rich.xslt");
106                 StringWriter res = new StringWriter();
107                 Map params = new HashMap();
108                 params.put("cloud", node.getCloud());
109                 XSLTransformer.transform(new DOMSource JavaDoc(xml), u, new StreamResult JavaDoc(res), params);
110                 return res.toString();
111             }
112             case Modes.FLAT: {
113                 Generator generator = new Generator(getDocumentBuilder(), node.getCloud());
114                 generator.setNamespaceAware(true);
115                 generator.add(node, field);
116                 Document xml = generator.getDocument();
117                 java.net.URL JavaDoc u = ResourceLoader.getConfigurationRoot().getResource("xslt/mmxf2rich.xslt");
118                 StringWriter res = new StringWriter();
119                 Map params = new HashMap();
120                 params.put("cloud", node.getCloud());
121                 XSLTransformer.transform(new DOMSource JavaDoc(xml), u, new StreamResult JavaDoc(res), params);
122                 return res.toString();
123             }
124             case Modes.PRETTYXML: {
125                 // get the XML from this thing....
126
// javax.xml.parsers.DocumentBuilderFactory dfactory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
127
// javax.xml.parsers.DocumentBuilder dBuilder = dfactory.newDocumentBuilder();
128
// org.w3c.dom.Element xml = node.getXMLValue(field.getName(), dBuilder.newDocument());
129
Document xml = node.getXMLValue(field.getName());
130
131                 if(xml != null) {
132                     return XMLWriter.write(xml, true, true);
133                 }
134                 return "";
135
136             }
137             case Modes.DOCBOOK:
138                 // not implemented..
139
return value;
140             case Modes.XML:
141             default:
142                 Document xml = node.getXMLValue(field.getName());
143
144                 if(xml != null) {
145                     // make a string from the XML
146
return XMLWriter.write(xml, false, true);
147                 }
148                 return "";
149             }
150         } catch (Exception JavaDoc e) {
151             log.error(e.getMessage(), e);
152             return value;
153         }
154     }
155
156     public String JavaDoc toString() {
157         return "get_MMXF";
158     }
159
160 }
161
Popular Tags