/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.vcard.tests.testutils;
import com.android.vcard.VCardConfig;
import com.android.vcard.VCardInterpreter;
import com.android.vcard.VCardProperty;
import com.android.vcard.VCardUtils;
import android.content.ContentValues;
import android.util.Base64;
import android.util.Log;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* <p>
* The class storing the parse result to custom datastruct:
* {@link VNode}, and {@link PropertyNode}.
* Maybe several vcard instance, so use vNodeList to store.
* </p>
* <p>
* This is called VNode, not VCardNode, since it was used for expressing vCalendar (iCal).
* </p>
*/
public class VNodeBuilder implements VCardInterpreter {
private static String LOG_TAG = "VNodeBuilder";
private List<VNode> mVNodeList = new ArrayList<VNode>();
private VNode mCurrentVNode;
/**
* The charset using which VParser parses the text.
*/
private String mSourceCharset;
/**
* The charset with which byte array is encoded to String.
*/
private String mTargetCharset;
private boolean mStrictLineBreakParsing;
public VNodeBuilder() {
this(VCardConfig.DEFAULT_IMPORT_CHARSET, false);
}
public VNodeBuilder(String targetCharset, boolean strictLineBreakParsing) {
mSourceCharset = VCardConfig.DEFAULT_INTERMEDIATE_CHARSET;
if (targetCharset != null) {
mTargetCharset = targetCharset;
} else {
mTargetCharset = VCardConfig.DEFAULT_IMPORT_CHARSET;
}
mStrictLineBreakParsing = strictLineBreakParsing;
}
@Override
public void onVCardStarted() {
}
@Override
public void onVCardEnded() {
}
@Override
public void onEntryStarted() {
mCurrentVNode = new VNode();
mVNodeList.add(mCurrentVNode);
}
@Override
public void onEntryEnded() {
int lastIndex = mVNodeList.size() - 1;
mVNodeList.remove(lastIndex--);
mCurrentVNode = lastIndex >= 0 ? mVNodeList.get(lastIndex) : null;
}
@Override
public void onPropertyCreated(VCardProperty property) {
// TODO: remove PropertyNode.
PropertyNode propNode = new PropertyNode();
propNode.propName = property.getName();
List<String> groupList = property.getGroupList();
if (groupList != null) {
propNode.propGroupSet.addAll(groupList);
}
Map<String, Collection<String>> propertyParameterMap = property.getParameterMap();
for (String paramType : propertyParameterMap.keySet()) {
Collection<String> paramValueList = propertyParameterMap.get(paramType);
if (paramType.equalsIgnoreCase("TYPE")) {
propNode.paramMap_TYPE.addAll(paramValueList);
} else {
for (String paramValue : paramValueList) {
propNode.paramMap.put(paramType, paramValue);
}
}
}
// TODO: just redundant
if (property.getRawValue() == null) {
propNode.propValue_bytes = null;
propNode.propValue_vector.clear();
propNode.propValue_vector.add("");
propNode.propValue = "";
return;
}
final List<String> values = property.getValueList();
if (values == null || values.size() == 0) {
propNode.propValue_vector.clear();
propNode.propValue_vector.add("");
propNode.propValue = "";
} else {
propNode.propValue_vector.addAll(values);
propNode.propValue = listToString(propNode.propValue_vector);
}
propNode.propValue_bytes = property.getByteValue();
mCurrentVNode.propList.add(propNode);
}
private String listToString(List<String> list){
int size = list.size();
if (size > 1) {
StringBuilder typeListB = new StringBuilder();
for (String type : list) {
typeListB.append(type).append(";");
}
int len = typeListB.length();
if (len > 0 && typeListB.charAt(len - 1) == ';') {
return typeListB.substring(0, len - 1);
}
return typeListB.toString();
} else if (size == 1) {
return list.get(0);
} else {
return "";
}
}
public String getResult(){
throw new RuntimeException("Not supported");
}
public List<VNode> getVNodeList() {
return mVNodeList;
}
public VNode getCurrentVNode() {
return mCurrentVNode;
}
}