1 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 ; 21 import javax.xml.transform.stream.StreamResult ; 22 import javax.xml.parsers.*; 23 24 import java.util.*; 25 import java.io.*; 26 import org.w3c.dom.*; 27 28 29 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 handler = new XMLErrorHandler(); 48 documentBuilder.setErrorHandler(handler); 49 documentBuilder.setEntityResolver( new XMLEntityResolver()); 50 return documentBuilder; 51 } catch (ParserConfigurationException pce) { 52 throw new RuntimeException (pce.getMessage(), pce); 53 } 54 } 55 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 return generator.getDocument(); 77 } 78 79 80 public Object process(Node node, Field field, Object 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 stringMode = (String ) node.getCloud().getProperty(Cloud.PROP_XMLMODE); 88 int mode = stringMode == null ? Modes.XML : Modes.getMode(stringMode); 89 switch(mode) { 90 case Modes.KUPU: { 91 log.debug("Generating kupu-compatible XML for " + value); 93 Document xml = getDocument(node, field); 94 java.net.URL u = ResourceLoader.getConfigurationRoot().getResource("xslt/mmxf2kupu.xslt"); 95 StringWriter res = new StringWriter(); 96 Map params = new HashMap(); 98 params.put("cloud", node.getCloud()); 99 XSLTransformer.transform(new DOMSource (xml), u, new StreamResult (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 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 (xml), u, new StreamResult (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 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 (xml), u, new StreamResult (res), params); 122 return res.toString(); 123 } 124 case Modes.PRETTYXML: { 125 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 return value; 140 case Modes.XML: 141 default: 142 Document xml = node.getXMLValue(field.getName()); 143 144 if(xml != null) { 145 return XMLWriter.write(xml, false, true); 147 } 148 return ""; 149 } 150 } catch (Exception e) { 151 log.error(e.getMessage(), e); 152 return value; 153 } 154 } 155 156 public String toString() { 157 return "get_MMXF"; 158 } 159 160 } 161 | Popular Tags |