/* * 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 android.content.ContentValues; import com.android.vcard.VCardEntry; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; /** *

* The class representing one property (e.g. "N;ENCODING=UTF-8:family:given:middle:prefix:suffix"). *

*

* Previously used in main vCard handling code but now exists only for testing. *

*

* Especially useful for testing parser code (VCardParser), since all properties can be * checked via this class unlike {@link VCardEntry}, which only emits the result of * interpretation of the content of each vCard. We cannot know whether vCard parser or * {@link VCardEntry} is wrong without this class. *

*/ public class PropertyNode { public String propName; public String propValue; public List propValue_vector; /** Store value as byte[],after decode. * Used when propValue is encoded by something like BASE64, QUOTED-PRINTABLE, etc. */ public byte[] propValue_bytes; /** * param store: key=paramType, value=paramValue * Note that currently PropertyNode class does not support multiple param-values * defined in vCard 3.0 (See also RFC 2426). multiple-values are stored as * one String value like "A,B", not ["A", "B"]... * TODO: fix this. */ public ContentValues paramMap; /** Only for TYPE=??? param store. */ public Set paramMap_TYPE; /** Store group values. Used only in VCard. */ public Set propGroupSet; public PropertyNode() { propName = ""; propValue = ""; propValue_vector = new ArrayList(); paramMap = new ContentValues(); paramMap_TYPE = new HashSet(); propGroupSet = new HashSet(); } public PropertyNode( String propName, String propValue, List propValue_vector, byte[] propValue_bytes, ContentValues paramMap, Set paramMap_TYPE, Set propGroupSet) { if (propName != null) { this.propName = propName; } else { this.propName = ""; } if (propValue != null) { this.propValue = propValue; } else { this.propValue = ""; } if (propValue_vector != null) { this.propValue_vector = propValue_vector; } else { this.propValue_vector = new ArrayList(); } this.propValue_bytes = propValue_bytes; if (paramMap != null) { this.paramMap = paramMap; } else { this.paramMap = new ContentValues(); } if (paramMap_TYPE != null) { this.paramMap_TYPE = paramMap_TYPE; } else { this.paramMap_TYPE = new HashSet(); } if (propGroupSet != null) { this.propGroupSet = propGroupSet; } else { this.propGroupSet = new HashSet(); } } @Override public int hashCode() { // vCard may contain more than one same line in one entry, while HashSet or any other // library which utilize hashCode() does not honor that, so intentionally throw an // Exception. throw new UnsupportedOperationException( "PropertyNode does not provide hashCode() implementation intentionally."); } @Override public boolean equals(Object obj) { if (!(obj instanceof PropertyNode)) { return false; } PropertyNode node = (PropertyNode)obj; if (propName == null || !propName.equals(node.propName)) { return false; } else if (!paramMap_TYPE.equals(node.paramMap_TYPE)) { return false; } else if (!paramMap_TYPE.equals(node.paramMap_TYPE)) { return false; } else if (!propGroupSet.equals(node.propGroupSet)) { return false; } if (propValue_bytes != null && Arrays.equals(propValue_bytes, node.propValue_bytes)) { return true; } else { if (!propValue.equals(node.propValue)) { return false; } // The value in propValue_vector is not decoded even if it should be // decoded by BASE64 or QUOTED-PRINTABLE. When the size of propValue_vector // is 1, the encoded value is stored in propValue, so we do not have to // check it. return (propValue_vector.equals(node.propValue_vector) || propValue_vector.size() == 1 || node.propValue_vector.size() == 1); } } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("propName: "); builder.append(propName); builder.append(", paramMap: "); builder.append(paramMap.toString()); builder.append(", paramMap_TYPE: ["); boolean first = true; for (String elem : paramMap_TYPE) { if (first) { first = false; } else { builder.append(", "); } builder.append('"'); builder.append(elem); builder.append('"'); } builder.append("]"); if (!propGroupSet.isEmpty()) { builder.append(", propGroupSet: ["); first = true; for (String elem : propGroupSet) { if (first) { first = false; } else { builder.append(", "); } builder.append('"'); builder.append(elem); builder.append('"'); } builder.append("]"); } if (propValue_vector != null && propValue_vector.size() > 1) { builder.append(", propValue_vector size: "); builder.append(propValue_vector.size()); } if (propValue_bytes != null) { builder.append(", propValue_bytes size: "); builder.append(propValue_bytes.length); } builder.append(", propValue: \""); builder.append(propValue); builder.append("\""); return builder.toString(); } }