KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > util > transformers > Xml


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.util.transformers;
11
12 import java.util.HashMap JavaDoc;
13 import java.util.Map JavaDoc;
14
15 /**
16  * Transformations related to escaping in XML.
17  * @author Michiel Meeuwissen
18  * @author Kees Jongenburger
19  * @version $Id: Xml.java,v 1.17 2005/12/21 08:05:01 michiel Exp $
20  */

21
22 public class Xml extends ConfigurableStringTransformer implements CharTransformer {
23
24     public final static int ESCAPE = 1;
25     public final static int ESCAPE_ATTRIBUTE = 2;
26     public final static int ESCAPE_ATTRIBUTE_DOUBLE = 3;
27     public final static int ESCAPE_ATTRIBUTE_SINGLE = 4;
28     public final static int ESCAPE_ATTRIBUTE_HTML = 5;
29
30
31
32     public Xml() {
33         super();
34     }
35     public Xml(int c) {
36         super(c);
37     }
38
39     //public final static int BODYTAG = 20;
40

41     /**
42      * Used when registering this class as a possible Transformer
43      */

44
45     public Map JavaDoc transformers() {
46         HashMap JavaDoc h = new HashMap JavaDoc();
47         h.put("escape_xml".toUpperCase(), new Config(Xml.class, ESCAPE, "Escapes >, < & and \""));
48         h.put("escape_html".toUpperCase(), new Config(Xml.class, ESCAPE, "Like ESCAPE_XML now."));
49         h.put("escape_wml".toUpperCase(), new Config(Xml.class, ESCAPE, "Like ESCAPE_XML now."));
50         h.put("escape_xml_attribute".toUpperCase(), new Config(Xml.class, ESCAPE_ATTRIBUTE, "Escaping in attributes only involves quotes. This simply escapes both types (which is little too much)."));
51         h.put("escape_xml_attribute_double".toUpperCase(), new Config(Xml.class, ESCAPE_ATTRIBUTE_DOUBLE, "Escaping in attributes only involves quotes. This is for double quotes."));
52         h.put("escape_xml_attribute_single".toUpperCase(), new Config(Xml.class, ESCAPE_ATTRIBUTE_SINGLE, "Escaping in attributes only involves quotes. This is for single quotes."));
53         h.put("escape_html_attribute".toUpperCase(), new Config(Xml.class, ESCAPE_ATTRIBUTE_HTML, "This escapes all quotes, and also newlines. Handly in some html tags."));
54         return h;
55     }
56
57
58
59     /**
60      * Attributes of XML tags cannot contain quotes, and also &amp; must be escaped
61      * @param att String representing the attribute
62      * @param quot Which quote (either ' or ")
63      */

64     public static String JavaDoc XMLAttributeEscape(String JavaDoc att, char quot) {
65         if (att == null) return "";
66         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
67         char[] data = att.toCharArray();
68         char c;
69         for (int i =0 ; i < data.length; i++){
70             c = data[i];
71             if (c == quot){
72                 if (quot == '"') {
73                     sb.append("&quot;");
74                 } else {
75                     sb.append("&apos;");
76                 }
77
78             } else if (c == '&') {
79                 sb.append("&amp;");
80             } else {
81                 sb.append(c);
82             }
83         }
84         return sb.toString();
85     }
86     /**
87      * Attributes of XML tags cannot contain quotes, and also &amp; must be escaped
88      * @param att String representing the attribute
89      */

90     public static String JavaDoc XMLAttributeEscape(String JavaDoc att) {
91         if (att == null) return "";
92         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
93         char[] data = att.toCharArray();
94         char c;
95         for (int i =0 ; i < data.length; i++){
96             c = data[i];
97             if (c == '"') {
98                 sb.append("&quot;");
99             } else if (c == '\'') {
100                 sb.append("&apos;");
101             } else if (c == '&') {
102                 sb.append("&amp;");
103             } else {
104                 sb.append(c);
105             }
106         }
107         return sb.toString();
108     }
109
110     /**
111      * Utility class for escaping and unescaping
112      * (XML)data
113      * @param xml the xml to encode
114      * @return the encoded xml data
115      * <UL>
116      * <LI>& is replaced by &amp;amp;</LI>
117      * <LI>" is replaced by &amp;quot;</LI>
118      * <LI>&lt; is replaced by &amp;lt;</LI>
119      * <LI>&gt; is replaced by &amp;gt;</LI>
120      * </UL>
121      **/

122     public static String JavaDoc XMLEscape(String JavaDoc xml){
123         if (xml == null) return "";
124         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
125         XMLEscape(xml, sb);
126         return sb.toString();
127     }
128
129     /**
130      * @since MMBase-1.8
131      */

132     public static void XMLEscape(String JavaDoc xml, StringBuffer JavaDoc sb) {
133         char[] data = xml.toCharArray();
134         char c;
135         for (int i =0 ; i < data.length; i++){
136             c = data[i];
137             if (c =='&'){
138                 sb.append("&amp;");
139             }
140             else if (c =='<'){
141                 sb.append("&lt;");
142             }
143             else if (c =='>'){
144                 sb.append("&gt;");
145             }
146             else if (c =='"'){
147                 sb.append("&quot;");
148             }
149             else {
150                 sb.append(c);
151             }
152         }
153     }
154
155     private static String JavaDoc removeNewlines(String JavaDoc incoming) {
156         String JavaDoc ret = incoming.replace('\n', ' ');
157         return ret.replace('\r', ' ');
158     }
159
160     /**
161      * Utility class for escaping and unescaping
162      * (XML)data
163      * @param data the data to decode to (html/xml) where
164      * <UL>
165      * <LI>& was replaced by &amp;amp;</LI>
166      * <LI>" was replaced by &amp;quot;</LI>
167      * <LI>&lt; was replaced by &amp;lt;</LI>
168      * <LI>&gt; was replaced by &amp;gt;</LI>
169      * </UL>
170      * @return the decoded xml data
171      **/

172     public static String JavaDoc XMLUnescape(String JavaDoc data){
173         if (data == null) return "";
174         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
175         int i;
176         for (i =0; i < data.length();i++){
177             char c = data.charAt(i);
178             if (c == '&'){
179                 int end = data.indexOf(';',i+1);
180                 //if we found no amperstand then we are done
181
if (end == -1){
182                     sb.append(c);
183                     continue;
184                 }
185                 String JavaDoc entity = data.substring(i+1,end);
186                 i+= entity.length() + 1;
187                 if (entity.equals("amp")){
188                     sb.append('&');
189                 }
190                 else if (entity.equals("lt")){
191                     sb.append('<');
192                 }
193                 else if (entity.equals("gt")){
194                     sb.append('>');
195                 }
196                 else if (entity.equals("quot")){
197                     sb.append('"');
198                 }
199                 else if (entity.equals("apos")){
200                     sb.append('\'');
201                 }
202                 else {
203                     sb.append("&" + entity + ";");
204                 }
205             }
206             else {
207                 sb.append(c);
208             }
209         }
210         return sb.toString();
211     }
212
213
214     public String JavaDoc transform(String JavaDoc r) {
215         switch(to){
216         case ESCAPE: return XMLEscape(r);
217         case ESCAPE_ATTRIBUTE: return XMLAttributeEscape(r);
218         case ESCAPE_ATTRIBUTE_DOUBLE: return XMLAttributeEscape(r, '"');
219         case ESCAPE_ATTRIBUTE_SINGLE: return XMLAttributeEscape(r, '\'');
220         case ESCAPE_ATTRIBUTE_HTML: return removeNewlines(XMLAttributeEscape(r));
221         default: throw new UnknownCodingException(getClass(), "transform", to);
222         }
223     }
224     public String JavaDoc transformBack(String JavaDoc r) {
225         // the attribute unescape will do a little to much, I think.
226
switch(to){
227         case ESCAPE:
228         case ESCAPE_ATTRIBUTE:
229         case ESCAPE_ATTRIBUTE_DOUBLE:
230         case ESCAPE_ATTRIBUTE_SINGLE: return XMLUnescape(r);
231         case ESCAPE_ATTRIBUTE_HTML:
232             // we can only try, the removing of newlines cannot be undone.
233
return XMLUnescape(r);
234         default: throw new UnknownCodingException(getClass(), "transformBack", to);
235         }
236     }
237     public String JavaDoc getEncoding() {
238         switch(to){
239         case ESCAPE: return "ESCAPE_XML";
240         case ESCAPE_ATTRIBUTE: return "ESCAPE_XML_ATTRIBUTE";
241         case ESCAPE_ATTRIBUTE_DOUBLE: return "ESCAPE_XML_ATTRIBUTE_DOUBLE";
242         case ESCAPE_ATTRIBUTE_SINGLE: return "ESCAPE_XML_ATTRIBUTE_SINGLE";
243         case ESCAPE_ATTRIBUTE_HTML: return "ESCAPE_HTML_ATTRIBUTE";
244         default: throw new UnknownCodingException(getClass(), "getEncoding", to);
245         }
246     }
247 }
248
Popular Tags