/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at
* src/com/vodafone360/people/VODAFONE.LICENSE.txt or
* http://github.com/360/360-Engine-for-Android
* See the License for the specific language governing permissions and
* limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each file and
* include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt.
* If applicable, add the following below this CDDL HEADER, with the fields
* enclosed by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
* Copyright 2010 Vodafone Sales & Services Ltd. All rights reserved.
* Use is subject to license terms.
*/
package com.vodafone360.people.datatypes;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import com.vodafone360.people.utils.LogUtils;
/**
* BaseDataType encapsulating an Identity issued to or retrieved from server
*/
public class Identity extends BaseDataType implements Parcelable {
/**
* The parameter in Identities#getAvailableIdentities() filter
* that indicates available type of authentication for the identity.
*/
public static final String AUTH_TYPE = "authtype";
/**
* The parameter in Identities#getAvailableIdentities() filter
* that indicates available type of authentication for the identity.
*/
public static final String CAPABILITY = "capability";
/**
* Type of authentication for identity.
*/
public static final String AUTH_TYPE_URL = "url";
/**
* Type of authentication for identity.
*/
public static final String AUTH_TYPE_CREDENTIALS = "credentials";
/**
* Tags associated with Identity item.
*/
private enum Tags {
IDENTITY_MAIN_TAG("availableidentity"),
IDENTITY_CAPABILITY_LIST("identitycapabilitylist"),
PLUGIN_ID("pluginid"),
NETWORK_URL("networkurl"),
AUTH_TYPE("authtype"),
ICON_MIME("iconmime"),
ICON2_MIME("icon2mime"),
ORDER("order"),
NAME("name"),
ICON_URL("iconurl"),
ICON2_URL("icon2url"),
NETWORK("network"), // Properties below are only present after
// GetMyIdentities.
ACTIVE("active"),
CREATED("created"),
IDENTITY_ID("identityid"),
UPDATED("updated"),
IDENTITY_TYPE("identitytype"),
USER_ID("userid"),
USER_NAME("username"),
DISPLAY_NAME("displayname"),
COUNTRY_LIST("countrylist");
private final String tag;
/**
* Construct Tags item from supplied String
*
* @param s String value for Tags item.
*/
private Tags(String s) {
tag = s;
}
/**
* String value for Tags item.
*
* @return String value for Tags item.
*/
private String tag() {
return tag;
}
/**
* Find Tags item for specified String.
*
* @param tag String value to find in Tags items.
* @return Tags item for specified String, NULL otherwise.
*/
private static Tags findTag(String tag) {
for (Tags tags : Tags.values()) {
if (tag.compareTo(tags.tag()) == 0) {
return tags;
}
}
return null;
}
}
public String mPluginId;
public String mNetwork;
public URL mNetworkUrl;
public URL mIconUrl;
public URL mIcon2Url;
public String mAuthType;
public String mIconMime;
public int mOrder;
public String mName;
public List<IdentityCapability> mCapabilities;
/** Properties below are only present after GetMyIdentities. */
public boolean mActive;
public long mCreated;
public long mUpdated;
public String mIdentityId;
public int mUserId;
public String mUserName;
public String mDisplayName;
public List<String> mCountryList;
public String mIdentityType;
private int mType;
/**
* Comparator class used to compare Identities retrieved from server to
* remove duplicates from list passed to People client UI.
*/
public static class IdentityComparator implements Comparator<Identity> {
@Override
public int compare(Identity object1, Identity object2) {
return new Integer(object1.mOrder).compareTo(new Integer(object2.mOrder));
}
}
/**
* Test whether current Identity is identical to supplied Identity.
*
* @param id Identity to compare against.
* @return true if Identities match, false otherwise.
*/
public boolean isSameAs(Identity id) {
boolean isSame = true;
if (!areStringValuesSame(mPluginId, id.mPluginId)
|| !areStringValuesSame(mNetwork, id.mNetwork)
|| !areStringValuesSame(mIdentityId, id.mIdentityId)
|| !areStringValuesSame(mDisplayName, id.mDisplayName)) {
isSame = false;
}
if (mNetworkUrl != null && id.mNetworkUrl != null) {
if (!mNetworkUrl.sameFile(id.mNetworkUrl)) {
isSame = false;
}
} else if (mNetworkUrl == null && id.mNetworkUrl == null) {
// Do nothing.
} else {
isSame = false;
}
if (mIconUrl != null && id.mIconUrl != null) {
if (!mIconUrl.sameFile(id.mIconUrl)) {
isSame = false;
}
} else if (mIconUrl == null && id.mIconUrl == null) {
// Do nothing.
} else {
isSame = false;
}
return isSame;
}
/**
* Test whether identity name or network is empty or null.
*
* @return true if identity name or network is empty or null, false otherwise.
*/
public boolean isIdentityFieldBlankorNull() {
return (TextUtils.isEmpty(mName) || TextUtils.isEmpty(mNetwork));
}
/**
* String values comparison
*
* @param s1 First String to test.
* @param s2 Second String to test.
* @return true if Strings match (or both are null), false otherwise.
*/
private boolean areStringValuesSame(String s1, String s2) {
boolean isSame = true;
if (s1 == null && s2 == null) {
// Do nothing.
} else if (s1 != null && s2 != null) {
if (s1.compareTo(s2) != 0) {
isSame = false;
}
} else {
isSame = false;
}
return isSame;
}
/**
* Default constructor.
*/
public Identity() {
// Do nothing.
}
public Identity(int type) {
mType = type;
}
/**
* Create Identity from Parcel.
*
* @param in Parcel containing Identity.
*/
private Identity(Parcel in) {
readFromParcel(in);
}
/** {@inheritDoc} */
@Override
public int getType() {
return mType;
}
/**
* Populate Identity from supplied Hashtable.
*
* @param hash Hashtable containing identity details.
* @return Identity instance.
*/
public Identity createFromHashtable(Hashtable<String, Object> hash) {
Enumeration<String> e = hash.keys();
while (e.hasMoreElements()) {
String key = e.nextElement();
Object value = hash.get(key);
Tags tag = Tags.findTag(key);
if (tag != null)
setValue(tag, value);
}
return this;
}
/**
* Sets the value of the member data item associated with the specified tag.
*
* @param tag Current tag.
* @param val Value associated with the tag.
*/
private void setValue(Tags tag, Object val) {
switch (tag) {
case AUTH_TYPE:
mAuthType = (String)val;
break;
case ICON_MIME:
mIconMime = (String)val;
break;
case ICON2_MIME:
// TODO: Remove TAG value?
// mIcon2Mime = (String)val;
break;
case ICON_URL:
try {
mIconUrl = new URL((String)val);
} catch (MalformedURLException e) {
LogUtils.logE("Wrong icon url: '" + val + "'");
mIconUrl = null;
}
break;
case ICON2_URL:
try {
mIcon2Url = new URL((String)val);
} catch (MalformedURLException e) {
LogUtils.logE("Wrong icon url: '" + val + "'");
mIcon2Url = null;
}
break;
case IDENTITY_CAPABILITY_LIST:
/** Create id capability list. */
@SuppressWarnings("unchecked")
Vector<Hashtable<String, Object>> v = (Vector<Hashtable<String, Object>>)val;
if (mCapabilities == null) {
mCapabilities = new ArrayList<IdentityCapability>();
}
for (Hashtable<String, Object> obj : v) {
IdentityCapability cap = new IdentityCapability();
cap.createFromHashtable(obj);
mCapabilities.add(cap);
}
break;
case IDENTITY_MAIN_TAG:
// Not currently handled.
break;
case NAME:
mName = (String)val;
break;
case NETWORK:
mNetwork = (String)val;
break;
case NETWORK_URL:
try {
mNetworkUrl = new URL((String)val);
} catch (MalformedURLException e) {
LogUtils.logE("Wrong network url: '" + val + "'");
mNetworkUrl = null;
}
break;
case ORDER:
mOrder = (Integer)val;
break;
case PLUGIN_ID:
mPluginId = (String)val;
break;
case ACTIVE:
mActive = (Boolean)val;
break;
case CREATED:
mCreated = (Long)val;
break;
case DISPLAY_NAME:
mDisplayName = (String)val;
break;
case IDENTITY_ID:
mIdentityId = (String)val;
break;
case IDENTITY_TYPE:
mIdentityType = (String)val;
break;
case UPDATED:
mUpdated = (Long)val;
break;
case USER_ID:
mUserId = ((Long)val).intValue();
break;
case USER_NAME:
mUserName = (String)val;
break;
case COUNTRY_LIST:
if (mCountryList == null) {
mCountryList = new ArrayList<String>();
}
break;
default:
// Do nothing.
break;
}
}
/** {@inheritDoc} */
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Name:");
sb.append(mName);
sb.append("\nPluginID:"); sb.append(mPluginId);
sb.append("\nNetwork:"); sb.append(mNetwork);
sb.append("\nNetworkURL:"); sb.append(mNetworkUrl);
sb.append("\nAuthType:"); sb.append(mAuthType);
sb.append("\nIcon mime:"); sb.append(mIconMime);
sb.append("\nIconURL:"); sb.append(mIconUrl);
sb.append("\nOrder:"); sb.append(mOrder);
sb.append("\nActive:"); sb.append(mActive);
sb.append("\nCreated:"); sb.append(mCreated);
sb.append("\nUpdated:"); sb.append(mUpdated);
sb.append("\nIdentityId:"); sb.append(mIdentityId);
sb.append("\nUserId:"); sb.append(mUserId);
sb.append("\nUserName:"); sb.append(mUserName);
sb.append("\nDisplayName:"); sb.append(mDisplayName);
sb.append("\nIdentityType:"); sb.append(mIdentityType);
if (mCountryList != null) {
sb.append("\nCountry List: (");
sb.append(mCountryList.size());
sb.append(") = [");
for (int i = 0; i < mCountryList.size(); i++) {
sb.append(mCountryList.get(i));
if (i < mCountryList.size() - 1)
sb.append(", ");
}
sb.append("]");
}
if (mCapabilities != null) {
sb.append("\nCapabilities (");
sb.append(mCapabilities.size());
sb.append(")");
for (int i = 0; i < mCapabilities.size(); i++) {
sb.append("\n" + mCapabilities.get(i).toString());
if (i < mCapabilities.size() - 1) {
sb.append("\n\t---");
}
}
}
return sb.toString();
}
/** {@inheritDoc} */
@Override
public int describeContents() {
return 1;
}
/**
* Enumeration containing items contained within Identity Parcel.
*/
private enum MemberData {
PLUGIN_ID,
NETWORK,
NETWORK_URL,
ICON_URL,
AUTH_TYPE,
ICON_MIME,
ORDER,
NAME;
}
/**
* Read Identity item from Parcel.
*
* @param in Parcel containing Identity information.
*/
private void readFromParcel(Parcel in) {
mPluginId = null;
mNetwork = null;
mNetworkUrl = null;
mIconUrl = null;
mAuthType = null;
mIconMime = null;
mOrder = -1;
mName = null;
mCapabilities = null;
boolean[] validDataList = new boolean[MemberData.values().length];
in.readBooleanArray(validDataList);
if (validDataList[MemberData.PLUGIN_ID.ordinal()]) {
mPluginId = in.readString();
}
if (validDataList[MemberData.NETWORK.ordinal()]) {
mNetwork = in.readString();
}
if (validDataList[MemberData.NETWORK_URL.ordinal()]) {
try {
mNetworkUrl = new URL(in.readString());
} catch (MalformedURLException e) {
LogUtils.logW("Identity.readFromParcel() "
+ "MalformedURLException on MemberData.NETWORK_URL");
}
}
if (validDataList[MemberData.ICON_URL.ordinal()]) {
try {
mIconUrl = new URL(in.readString());
} catch (MalformedURLException e) {
LogUtils.logW("Identity.readFromParcel() "
+ "MalformedURLException on MemberData.ICON_URL");
}
}
if (validDataList[MemberData.AUTH_TYPE.ordinal()]) {
mAuthType = in.readString();
}
if (validDataList[MemberData.ICON_MIME.ordinal()]) {
mIconMime = in.readString();
}
if (validDataList[MemberData.ORDER.ordinal()]) {
mOrder = in.readInt();
}
if (validDataList[MemberData.NAME.ordinal()]) {
mName = in.readString();
}
int noOfCapabilities = in.readInt();
if (noOfCapabilities > 0) {
mCapabilities = new ArrayList<IdentityCapability>(noOfCapabilities);
for (int i = 0; i < noOfCapabilities; i++) {
IdentityCapability cap = IdentityCapability.CREATOR.createFromParcel(in);
mCapabilities.add(cap);
}
}
}
/** {@inheritDoc} */
@Override
public void writeToParcel(Parcel dest, int flags) {
boolean[] validDataList = new boolean[MemberData.values().length];
int validDataPos = dest.dataPosition();
dest.writeBooleanArray(validDataList); // Placeholder for real array.
if (mPluginId != null) {
validDataList[MemberData.PLUGIN_ID.ordinal()] = true;
dest.writeString(mPluginId);
}
if (mNetwork != null) {
validDataList[MemberData.NETWORK.ordinal()] = true;
dest.writeString(mNetwork);
}
if (mNetworkUrl != null) {
validDataList[MemberData.NETWORK_URL.ordinal()] = true;
dest.writeString(mNetworkUrl.toString());
}
if (mIconUrl != null) {
validDataList[MemberData.ICON_URL.ordinal()] = true;
dest.writeString(mIconUrl.toString());
}
if (mAuthType != null) {
validDataList[MemberData.AUTH_TYPE.ordinal()] = true;
dest.writeString(mAuthType);
}
if (mIconMime != null) {
validDataList[MemberData.ICON_MIME.ordinal()] = true;
dest.writeString(mIconMime);
}
if (mOrder != -1) {
validDataList[MemberData.ORDER.ordinal()] = true;
dest.writeInt(mOrder);
}
if (mName != null) {
validDataList[MemberData.NAME.ordinal()] = true;
dest.writeString(mName);
}
if (mCapabilities != null) {
dest.writeInt(mCapabilities.size());
for (IdentityCapability cap : mCapabilities) {
cap.writeToParcel(dest, 0);
}
} else {
dest.writeInt(0);
}
int currentPos = dest.dataPosition();
dest.setDataPosition(validDataPos);
dest.writeBooleanArray(validDataList); // Real array.
dest.setDataPosition(currentPos);
}
/** Interface to allow Identity to be written and restored from a Parcel. */
public static final Parcelable.Creator<Identity> CREATOR = new Parcelable.Creator<Identity>() {
public Identity createFromParcel(Parcel in) {
return new Identity(in);
}
public Identity[] newArray(int size) {
return new Identity[size];
}
};
}