1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.vcard.tests.testutils; 17 18 import com.android.vcard.VCardConfig; 19 import com.android.vcard.VCardInterpreter; 20 import com.android.vcard.VCardProperty; 21 import com.android.vcard.VCardUtils; 22 23 import android.content.ContentValues; 24 import android.util.Base64; 25 import android.util.CharsetUtils; 26 import android.util.Log; 27 28 import java.io.UnsupportedEncodingException; 29 import java.nio.ByteBuffer; 30 import java.nio.charset.Charset; 31 import java.util.ArrayList; 32 import java.util.Collection; 33 import java.util.List; 34 import java.util.Map; 35 36 /** 37 * <p> 38 * The class storing the parse result to custom datastruct: 39 * {@link VNode}, and {@link PropertyNode}. 40 * Maybe several vcard instance, so use vNodeList to store. 41 * </p> 42 * <p> 43 * This is called VNode, not VCardNode, since it was used for expressing vCalendar (iCal). 44 * </p> 45 */ 46 public class VNodeBuilder implements VCardInterpreter { 47 private static String LOG_TAG = "VNodeBuilder"; 48 49 private List<VNode> mVNodeList = new ArrayList<VNode>(); 50 private VNode mCurrentVNode; 51 52 /** 53 * The charset using which VParser parses the text. 54 */ 55 private String mSourceCharset; 56 57 /** 58 * The charset with which byte array is encoded to String. 59 */ 60 private String mTargetCharset; 61 62 private boolean mStrictLineBreakParsing; 63 64 public VNodeBuilder() { 65 this(VCardConfig.DEFAULT_IMPORT_CHARSET, false); 66 } 67 68 public VNodeBuilder(String targetCharset, boolean strictLineBreakParsing) { 69 mSourceCharset = VCardConfig.DEFAULT_INTERMEDIATE_CHARSET; 70 if (targetCharset != null) { 71 mTargetCharset = targetCharset; 72 } else { 73 mTargetCharset = VCardConfig.DEFAULT_IMPORT_CHARSET; 74 } 75 mStrictLineBreakParsing = strictLineBreakParsing; 76 } 77 78 @Override 79 public void onVCardStarted() { 80 } 81 82 @Override 83 public void onVCardEnded() { 84 } 85 86 @Override 87 public void onEntryStarted() { 88 mCurrentVNode = new VNode(); 89 mVNodeList.add(mCurrentVNode); 90 } 91 92 @Override 93 public void onEntryEnded() { 94 int lastIndex = mVNodeList.size() - 1; 95 mVNodeList.remove(lastIndex--); 96 mCurrentVNode = lastIndex >= 0 ? mVNodeList.get(lastIndex) : null; 97 } 98 99 @Override 100 public void onPropertyCreated(VCardProperty property) { 101 // TODO: remove PropertyNode. 102 PropertyNode propNode = new PropertyNode(); 103 propNode.propName = property.getName(); 104 List<String> groupList = property.getGroupList(); 105 if (groupList != null) { 106 propNode.propGroupSet.addAll(groupList); 107 } 108 Map<String, Collection<String>> propertyParameterMap = property.getParameterMap(); 109 for (String paramType : propertyParameterMap.keySet()) { 110 Collection<String> paramValueList = propertyParameterMap.get(paramType); 111 if (paramType.equalsIgnoreCase("TYPE")) { 112 propNode.paramMap_TYPE.addAll(paramValueList); 113 } else { 114 for (String paramValue : paramValueList) { 115 propNode.paramMap.put(paramType, paramValue); 116 } 117 } 118 } 119 120 // TODO: just redundant 121 122 if (property.getRawValue() == null) { 123 propNode.propValue_bytes = null; 124 propNode.propValue_vector.clear(); 125 propNode.propValue_vector.add(""); 126 propNode.propValue = ""; 127 return; 128 } 129 130 final List<String> values = property.getValueList(); 131 if (values == null || values.size() == 0) { 132 propNode.propValue_vector.clear(); 133 propNode.propValue_vector.add(""); 134 propNode.propValue = ""; 135 } else { 136 propNode.propValue_vector.addAll(values); 137 propNode.propValue = listToString(propNode.propValue_vector); 138 } 139 propNode.propValue_bytes = property.getByteValue(); 140 141 mCurrentVNode.propList.add(propNode); 142 } 143 144 private String listToString(List<String> list){ 145 int size = list.size(); 146 if (size > 1) { 147 StringBuilder typeListB = new StringBuilder(); 148 for (String type : list) { 149 typeListB.append(type).append(";"); 150 } 151 int len = typeListB.length(); 152 if (len > 0 && typeListB.charAt(len - 1) == ';') { 153 return typeListB.substring(0, len - 1); 154 } 155 return typeListB.toString(); 156 } else if (size == 1) { 157 return list.get(0); 158 } else { 159 return ""; 160 } 161 } 162 163 public String getResult(){ 164 throw new RuntimeException("Not supported"); 165 } 166 167 public List<VNode> getVNodeList() { 168 return mVNodeList; 169 } 170 171 public VNode getCurrentVNode() { 172 return mCurrentVNode; 173 } 174 } 175