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("<"); 97 break; 98 99 case '>': 100 writer.write(">"); 101 break; 102 103 case '&': 104 writer.write("&"); 105 break; 106 107 case '"': 108 writer.write("""); 109 break; 110 111 case '\'': 112 writer.write("'"); 113 break; 114 115 default: 116 writer.write(ch); 117 } 118 } 119 } 120 } 121