// --------------------------------------------------------------------------- // jWebSocket - Token Implementation // Copyright (c) 2010 Alexander Schulze, Innotrade GmbH // --------------------------------------------------------------------------- // This program is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License as published by the // Free Software Foundation; either version 3 of the License, or (at your // option) any later version. // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for // more details. // You should have received a copy of the GNU Lesser General Public License along // with this program; if not, see <http://www.gnu.org/licenses/lgpl.html>. // --------------------------------------------------------------------------- package org.jwebsocket.token; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.jwebsocket.api.WebSocketToken; /** * A token is ... * @author aschulze */ public class Token extends BaseToken implements WebSocketToken { private JSONObject mData = new JSONObject(); /** * Creates a new empty instance of a token. * The token does not contain any items. */ public Token() { } /** * * @param aType */ public Token(String aType) { setType(aType); } /** * * @param aJSON */ public Token(JSONObject aJSON) { mData = aJSON; } /** * * @param aNS * @param aType */ public Token(String aNS, String aType) { setNS(aNS); setType(aType); } /** * * @param aJSON */ public void setJSONObject(JSONObject aJSON) { mData = aJSON; } /** * * * @return */ public JSONObject getJSONObject() { return mData; } private Object getValue(Object aValue) { if (aValue instanceof Token) { aValue = ((Token) aValue).getJSONObject(); } else if (aValue instanceof Collection) { JSONArray lJA = new JSONArray(); for (Object lItem : (Collection) aValue) { lJA.put(getValue(lItem)); } aValue = lJA; } else if (aValue instanceof Map) { JSONObject lJO = new JSONObject(); for (Entry<Object, Object> lItem : ((Map<Object, Object>) aValue).entrySet()) { try { lJO.put(lItem.getKey().toString(), getValue(lItem.getValue())); } catch (JSONException ex) { } } aValue = lJO; } else if (aValue instanceof Object[]) { JSONArray lJA = new JSONArray(); Object[] lOA = (Object[]) aValue; for (int i = 0; i < lOA.length; i++) { lJA.put(getValue(lOA[i])); } aValue = lJA; } return aValue; } /** * puts a new key/value pair into the token, in other words it adds a * new item to the token. * @param aKey key of the the token item. * @param aValue value of the token item. */ public void put(String aKey, Object aValue) { try { mData.put(aKey, getValue(aValue)); } catch (JSONException ex) { // TODO: handle exception } } /** * * @param aKey * @return */ public Object get(String aKey) { try { return mData.get(aKey); } catch (JSONException ex) { return null; } } /** * * @param aKey * @return */ @Override public void remove(String aKey) { mData.remove(aKey); } /** * * @return */ public Iterator<String> getKeys() { return mData.keys(); } /** * * @param aKey * @param aDefault * @return */ @Override public String getString(String aKey, String aDefault) { String lResult; try { lResult = mData.getString(aKey); } catch (JSONException ex) { lResult = aDefault; } return lResult; } /** * * @param aKey */ @Override public void setString(String aKey, String aValue) { try { mData.put(aKey, aValue); } catch (JSONException ex) { // TODO: handle exception } } /** * * @param aKey * @return */ @Override public String getString(String aKey) { return getString(aKey, null); } /** * * @param aKey * @param aDefault * @return */ @Override public Integer getInteger(String aKey, Integer aDefault) { Integer lResult; try { lResult = mData.getInt(aKey); } catch (JSONException ex) { lResult = aDefault; } return lResult; } /** * * @param aKey * @return */ @Override public Integer getInteger(String aKey) { return getInteger(aKey, null); } @Override public void setInteger(String aKey, Integer aValue) { try { mData.put(aKey, aValue); } catch (JSONException ex) { // TODO: handle exception } } /** * * @param aKey * @param aDefault * @return */ @Override public Boolean getBoolean(String aKey, Boolean aDefault) { Boolean lResult; try { lResult = mData.getBoolean(aKey); } catch (JSONException ex) { lResult = aDefault; } return lResult; } /** * * @param aArg * @return */ @Override public Boolean getBoolean(String aArg) { return getBoolean(aArg, null); } /** * * @param aKey */ @Override public void setBoolean(String aKey, Boolean aValue) { try { mData.put(aKey, aValue); } catch (JSONException ex) { // TODO: handle exception } } /** * * @param aKey * @param aDefault * @return */ @Override public List getList(String aKey, Boolean aDefault) { // TODO: Implement this return null; } /** * * @param aKey * @return */ @Override public List getList(String aKey) { // TODO: Implement this return null; } /** * * @param aKey * @param aDefault * @return */ @Override public Map getMap(String aKey, Boolean aDefault) { // TODO: Implement this return null; } /** * * @param aKey * @return */ @Override public Map getMap(String aKey) { // TODO: Implement this return null; } /** * * @return */ public final String getType() { return getString("type"); } /** * * @param aType */ public final void setType(String aType) { put("type", aType); } /** * Returns the name space of the token. If you have the same token type * interpreted by multiple different plug-ins the name space allows to * uniquely address a certain plug-in. Each plug-in has its own name space. * @return the name space. */ public final String getNS() { return getString("ns"); } /** * Sets the name space of the token. If you have the same token type * interpreted by multiple different plug-ins the namespace allows to * uniquely address a certain plug-in. Each plug-in has its own namespace. * @param aNS the namespace to be set for the token. */ public final void setNS(String aNS) { put("ns", aNS); } /** * * @return */ @Override public String toString() { return mData.toString(); } }