• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 Esmertec AG.
3  * Copyright (C) 2007 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package com.android.im.imps;
19 
20 import java.io.BufferedWriter;
21 import java.io.IOException;
22 import java.io.OutputStream;
23 import java.io.OutputStreamWriter;
24 import java.io.UnsupportedEncodingException;
25 import java.io.Writer;
26 import java.util.Map;
27 
28 public class XmlPrimitiveSerializer implements PrimitiveSerializer {
29     private String mVersionNs;
30     private String mTransacNs;
31 
XmlPrimitiveSerializer(String versionNs, String transacNs)32     public XmlPrimitiveSerializer(String versionNs, String transacNs) {
33         mVersionNs = versionNs;
34         mTransacNs = transacNs;
35     }
36 
serialize(Primitive primitive, OutputStream out)37     public void serialize(Primitive primitive, OutputStream out) throws IOException {
38         try {
39             Writer writer =
40                 new BufferedWriter(new OutputStreamWriter(out, "UTF-8"), 8192);
41 
42             PrimitiveElement elem = primitive.createMessage(mVersionNs,
43                     mTransacNs);
44             writeElement(writer, elem);
45             writer.flush();
46         } catch (UnsupportedEncodingException e) {
47             // Impossible. UTF-8 is always supported
48             ImpsLog.logError(e);
49         }
50     }
51 
writeElement(Writer writer, PrimitiveElement element)52     private void writeElement(Writer writer, PrimitiveElement element)
53             throws IOException {
54         writer.write('<');
55         writer.write(element.getTagName());
56 
57         Map<String, String> attrMap = element.getAttributes();
58         if(attrMap != null && attrMap.size() > 0) {
59             for (Map.Entry<String, String> entry : attrMap.entrySet()) {
60                 writer.write(' ');
61                 writer.write(entry.getKey());
62                 writer.write("=\"");
63                 writeEncoded(writer, entry.getValue());
64                 writer.write('"');
65             }
66         }
67 
68         if (element.getContents() != null) {
69             writer.write('>');
70             writeEncoded(writer, element.getContents());
71 
72             writer.write("</");
73             writer.write(element.getTagName());
74             writer.write('>');
75         } else if (element.getChildCount() > 0) {
76             writer.write('>');
77 
78             for (PrimitiveElement child : element.getChildren()) {
79                 writeElement(writer, child);
80             }
81             writer.write("</");
82             writer.write(element.getTagName());
83             writer.write('>');
84         } else {
85             writer.write("/>");
86         }
87     }
88 
writeEncoded(Writer writer, String str)89     private void writeEncoded(Writer writer, String str) throws IOException {
90         int len = str.length();
91         for (int i = 0; i < len; i++) {
92             char ch = str.charAt(i);
93 
94             switch (ch) {
95                 case '<':
96                     writer.write("&lt;");
97                     break;
98 
99                 case '>':
100                     writer.write("&gt;");
101                     break;
102 
103                 case '&':
104                     writer.write("&amp;");
105                     break;
106 
107                 case '"':
108                     writer.write("&quot;");
109                     break;
110 
111                 case '\'':
112                     writer.write("&apos;");
113                     break;
114 
115                 default:
116                     writer.write(ch);
117             }
118         }
119     }
120 }
121