001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/framework/xml/DOMPrinter.java $
002 package org.deegree.framework.xml;
003
004 import java.io.PrintWriter;
005
006 import org.deegree.framework.util.StringTools;
007 import org.w3c.dom.Document;
008 import org.w3c.dom.NamedNodeMap;
009 import org.w3c.dom.Node;
010 import org.w3c.dom.NodeList;
011
012 public class DOMPrinter {
013
014 public static void printNode(PrintWriter out, Node node) {
015 switch (node.getNodeType()) {
016 case Node.DOCUMENT_NODE: {
017 out.print("<?xml version=\"1.0\"?>");
018 Document doc = (Document) node;
019 printNode(out, doc.getDocumentElement());
020 break;
021 }
022 case Node.ELEMENT_NODE: {
023 String name = node.getNodeName();
024 out.print("<" + name);
025 NamedNodeMap attributes = node.getAttributes();
026 for (int i = 0; i < attributes.getLength(); i++) {
027 Node current = attributes.item(i);
028 String value = current.getNodeValue();
029 value = StringTools.replace(value, "&", "&", true);
030 out.print(" " + current.getNodeName() + "=\"" + value + "\"");
031 }
032 out.print(">");
033
034 // Kinder durchgehen
035 NodeList children = node.getChildNodes();
036 if (children != null) {
037 for (int i = 0; i < children.getLength(); i++) {
038 printNode(out, children.item(i));
039 }
040 }
041
042 out.print("</" + name + ">");
043 break;
044 }
045 case Node.TEXT_NODE:
046 case Node.CDATA_SECTION_NODE: {
047 String trimmed = node.getNodeValue().trim();
048 if (!trimmed.equals(""))
049 out.print(validateCDATA(trimmed));
050 break;
051 }
052 case Node.PROCESSING_INSTRUCTION_NODE: {
053 break;
054 }
055 case Node.ENTITY_REFERENCE_NODE: {
056 break;
057 }
058 case Node.DOCUMENT_TYPE_NODE: {
059 break;
060 }
061 }
062 }
063
064 public static void printNode(Node node, String indent) {
065 if (node == null) {
066 return;
067 }
068
069 switch (node.getNodeType()) {
070 case Node.DOCUMENT_NODE: {
071 System.out.println("<?xml version=\"1.0\"?>");
072 Document doc = (Document) node;
073 printNode(doc.getDocumentElement(), "");
074 break;
075 }
076 case Node.ELEMENT_NODE: {
077 String name = node.getNodeName();
078 System.out.print(indent + "<" + name);
079 NamedNodeMap attributes = node.getAttributes();
080 for (int i = 0; i < attributes.getLength(); i++) {
081 Node current = attributes.item(i);
082 String value = current.getNodeValue();
083 if ( value != null ) {
084 value = StringTools.replace(value, "&", "&", true);
085 System.out.print(" " + current.getNodeName() + "=\"" + value + "\"");
086 }
087 }
088 // Kinder durchgehen
089 NodeList children = node.getChildNodes();
090 if (children != null && children.getLength() != 0) {
091 boolean complexContent = false;
092 for (int i = 0; i < children.getLength(); i++) {
093 if (children.item(i).getNodeType() != Node.TEXT_NODE
094 && children.item(i).getNodeType() != Node.CDATA_SECTION_NODE) {
095 complexContent = true;
096 }
097 }
098 if (complexContent) {
099 System.out.println(">");
100 } else {
101 System.out.print(">");
102 }
103
104 for (int i = 0; i < children.getLength(); i++) {
105 printNode(children.item(i), indent + " ");
106 }
107
108 if (complexContent) {
109 System.out.println(indent + "</" + name + ">");
110 } else {
111 System.out.println("</" + name + ">");
112 }
113 } else {
114 System.out.println("/>");
115 }
116 break;
117 }
118 case Node.TEXT_NODE:
119 case Node.CDATA_SECTION_NODE: {
120 if (node.getNodeValue() != null) {
121 String trimmed = node.getNodeValue().trim();
122 if (!trimmed.equals(""))
123 System.out.print(trimmed);
124 }
125 break;
126 }
127 case Node.PROCESSING_INSTRUCTION_NODE: {
128 break;
129 }
130 case Node.ENTITY_REFERENCE_NODE: {
131 break;
132 }
133 case Node.DOCUMENT_TYPE_NODE: {
134 break;
135 }
136 }
137 }
138
139 public static String nodeToString(Node node, String encoding) {
140 StringBuffer sb = new StringBuffer(10000);
141
142 switch (node.getNodeType()) {
143 case Node.DOCUMENT_NODE: {
144 sb.append("<?xml version=\"1.0\" encoding=\"" + encoding + "\" ?>");
145 Document doc = (Document) node;
146 sb.append(nodeToString(doc.getDocumentElement(), ""));
147 break;
148 }
149 case Node.ELEMENT_NODE: {
150 String name = node.getNodeName();
151 sb.append("\n<" + name);
152 NamedNodeMap attributes = node.getAttributes();
153 for (int i = 0; i < attributes.getLength(); i++) {
154 Node current = attributes.item(i);
155 String value = current.getNodeValue();
156 if ( value != null ) {
157 value = StringTools.replace( value, "&", "&", true);
158 sb.append(" " + current.getNodeName() + "=\"" + value + "\"");
159 }
160 }
161 sb.append(">");
162
163 // Kinder durchgehen
164 NodeList children = node.getChildNodes();
165 if (children != null) {
166 for (int i = 0; i < children.getLength(); i++) {
167 sb.append(nodeToString(children.item(i), encoding));
168 }
169 }
170
171 sb.append("</" + name + ">");
172 break;
173 }
174 case Node.CDATA_SECTION_NODE: {
175 String trimmed = node.getNodeValue().trim();
176 if (!trimmed.equals(""))
177 sb.append("<![CDATA[" + trimmed + "]]>");
178 break;
179 }
180 case Node.TEXT_NODE: {
181 String trimmed = node.getNodeValue();
182 if ( trimmed != null ) {
183 trimmed = trimmed.trim();
184 if (!trimmed.equals("")) {
185 sb.append(validateCDATA(trimmed));
186 }
187 }
188 break;
189 }
190 case Node.PROCESSING_INSTRUCTION_NODE: {
191 break;
192 }
193 case Node.ENTITY_REFERENCE_NODE: {
194 break;
195 }
196 case Node.DOCUMENT_TYPE_NODE: {
197 break;
198 }
199 }
200 return sb.toString();
201 }
202
203 /**
204 * Checks if a given CDATA-value has to be escaped if it is used as a text value in an XML
205 * element. If the submitted string contains a character that have to be escaped or if the
206 * string is made of more than 1500 characters it is encapsulated into a CDATA-section. Returns
207 * a version that is safe to be used.
208 * <p>
209 * The method is just proofed for the UTF-8 character encoding.
210 *
211 * @param cdata
212 * value to be used
213 * @return the very same value (but escaped if necessary)
214 * @todo refactoring required
215 */
216 public static StringBuffer validateCDATA( String cdata ) {
217 StringBuffer sb = null;
218 if ( cdata != null
219 && ( cdata.length() > 1000
220 || cdata.indexOf( '<' ) >= 0 || cdata.indexOf( '>' ) >= 0
221 || cdata.indexOf( '&' ) >= 0 || cdata.indexOf( '"' ) >= 0
222 || cdata.indexOf( "'" ) >= 0 ) ) {
223 sb = new StringBuffer( cdata.length() + 15 );
224 sb.append( "<![CDATA[" ).append( cdata ).append( "]]>" );
225 } else {
226 if ( cdata != null ) {
227 sb = new StringBuffer( cdata );
228 }
229 }
230 return sb;
231 }
232 }/* ********************************************************************
233 Changes to this class. What the people have been up to:
234 $Log$
235 Revision 1.7 2006/07/12 14:46:16 poth
236 comment footer added
237
238 ********************************************************************** */