001/**
002 *   GRANITE DATA SERVICES
003 *   Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004 *
005 *   This file is part of the Granite Data Services Platform.
006 *
007 *   Granite Data Services is free software; you can redistribute it and/or
008 *   modify it under the terms of the GNU Lesser General Public
009 *   License as published by the Free Software Foundation; either
010 *   version 2.1 of the License, or (at your option) any later version.
011 *
012 *   Granite Data Services is distributed in the hope that it will be useful,
013 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
014 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
015 *   General Public License for more details.
016 *
017 *   You should have received a copy of the GNU Lesser General Public
018 *   License along with this library; if not, write to the Free Software
019 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
020 *   USA, or see <http://www.gnu.org/licenses/>.
021 */
022/**
023 * www.openamf.org
024 *
025 * Distributable under LGPL license. See terms of license at gnu.org.
026 */
027
028package flex.messaging.io;
029
030import java.util.HashMap;
031
032/**
033 * Implementation of MM's flashgateway.io.ASObject so that we can use
034 * ASTranslator
035 *
036 * @author Jason Calabrese <mail@jasoncalabrese.com>
037 * @author Sean C. Sullivan
038 *
039 * @version $Revision: 1.11 $, $Date: 2004/02/06 02:48:59 $
040 */
041public class ASObject extends HashMap<String, Object> {
042
043    /**
044     *
045     */
046    private static final long serialVersionUID = 1L;
047
048    /**
049     * Object type
050     */
051    private String type;
052
053    public ASObject() {
054        super();
055    }
056
057    /**
058     * Creates ASObject with type
059     *
060     * @param type
061     */
062    public ASObject(String type) {
063        super();
064        this.type = type;
065    }
066
067    /**
068     * Gets object type
069     *
070     * @return type 
071     * @see #setType(String)
072     */
073    public String getType() {
074        return type;
075    }
076
077    /**
078     * Sets object type
079     *
080     * @param type
081     *
082     * @see #getType()
083     *
084     */
085    public void setType(String type) {
086        this.type = type;
087    }
088
089    /**
090     * Returns <tt>true</tt> if this map contains a mapping for the specified
091     * key. <br>
092     *
093     * @param key
094     *                The key whose presence in this map is to be tested
095     * @return <tt>true</tt> if this map contains a mapping for the specified
096     *            key.
097     */
098    @Override
099    public boolean containsKey(Object key) {
100        return super.containsKey(toLowerCase(key));
101    }
102
103    /**
104     * Returns the value to which the specified key is mapped in this identity
105     * hash map, or <tt>null</tt> if the map contains no mapping for this
106     * key. A return value of <tt>null</tt> does not <i>necessarily</i>
107     * indicate that the map contains no mapping for the key; it is also
108     * possible that the map explicitly maps the key to <tt>null</tt>. The
109     * <tt>containsKey</tt> method may be used to distinguish these two
110     * cases.
111     *
112     * @param key
113     *                the key whose associated value is to be returned.
114     * @return the value to which this map maps the specified key, or <tt>null</tt>
115     *            if the map contains no mapping for this key.
116     * @see #put(Object, Object)
117     */
118    @Override
119    public Object get(Object key) {
120        return super.get(toLowerCase(key));
121    }
122
123    /**
124     * Associates the specified value with the specified key in this map. If
125     * the map previously contained a mapping for this key, the old value is
126     * replaced.
127     *
128     * @param key
129     *                key with which the specified value is to be associated.
130     * @param value
131     *                value to be associated with the specified key.
132     * @return previous value associated with specified key, or <tt>null</tt>
133     *            if there was no mapping for key. A <tt>null</tt> return can
134     *            also indicate that the HashMap previously associated <tt>null</tt>
135     *            with the specified key.
136     */
137    @Override
138    public Object put(String key, Object value) {
139        return super.put((String)toLowerCase(key), value);
140    }
141
142    /**
143     * Removes the mapping for this key from this map if present.
144     *
145     * @param key
146     *                key whose mapping is to be removed from the map.
147     * @return previous value associated with specified key, or <tt>null</tt>
148     *            if there was no mapping for key. A <tt>null</tt> return can
149     *            also indicate that the map previously associated <tt>null</tt>
150     *            with the specified key.
151     */
152    @Override
153    public Object remove(Object key) {
154        return super.remove(toLowerCase(key));
155    }
156
157    /**
158     * Gets lower case object if object was instance of String
159     *
160     * @param key
161     * @return lower case
162     */
163    private Object toLowerCase(Object key) {
164        /*if (key != null
165            && key instanceof String
166            && amfSerializerConfig.forceLowerCaseKeys()) {
167            key = ((String) key).toLowerCase();
168        }*/
169        return key;
170    }
171
172    /**
173     * @return this method may return null
174     *
175     * @see #setType(String)
176     * @see #getType()
177     *
178     */
179    public Object instantiate() {
180        Object ret;
181        try {
182            ClassLoader loader = Thread.currentThread().getContextClassLoader();
183            Class<?> clazz = loader.loadClass(type);
184            ret = clazz.newInstance();
185        } catch (Exception e) {
186            ret = null;
187        }
188        return ret;
189    }
190
191    @Override
192    public String toString() {
193        return "ASObject[type=" + getType() + "," + super.toString() + "]";
194    }
195}