/src/main/java/org/exoplatform/social/client/api/model/Model.java
http://github.com/exosocial/exo.social.client · Java · 211 lines · 79 code · 23 blank · 109 comment · 5 complexity · ddb861dcc9be7c5f6365305fead2b29e MD5 · raw file
- /*
- * Copyright (C) 2003-2011 eXo Platform SAS.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- package org.exoplatform.social.client.api.model;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import org.exoplatform.social.client.api.event.PropertyChangeListener;
- import org.exoplatform.social.client.api.util.PropertyChangeSupport;
- import org.json.simple.JSONAware;
- import org.json.simple.JSONObject;
- import org.json.simple.JSONStreamAware;
- /**
- * The general model extends {@link org.json.simple.JSONObject}'s interfaces.
- * <p/>
- * Inspiration taken from: http://code.google.com/p/opensocial-java-client/source/browse/trunk/java/src/org/opensocial/models/Model.java
- *
- * @author <a href="http://hoatle.net">hoatle (hoatlevan at gmail dot com)</a>
- * @since May 19, 2011
- */
- public abstract class Model extends JSONObject implements Map, JSONAware, JSONStreamAware {
- /**
- * The property change event support for this model.
- */
- protected PropertyChangeSupport propertyChanges = new PropertyChangeSupport(this);
-
- /**
- * Returns the complete set of properties associated with the model instance.
- *
- * @return a string array
- */
- public String[] getFieldNames() {
- int i = 0;
- String[] fieldNames = new String[size()];
- Set<Map.Entry<String, Object>> fields = entrySet();
- for (Map.Entry<String, Object> field : fields) {
- fieldNames[i] = field.getKey();
- i++;
- }
- return fieldNames;
- }
- /**
- * Returns {@code true} if a value is associated with the specified field name, {@code false} otherwise.
- *
- * @param fieldName name of field to look up
- * @return a boolean value
- */
- public boolean hasField(String fieldName) {
- return containsKey(fieldName);
- }
- /**
- * Returns the value of the specified field as an Object.
- *
- * @param fieldName name of field whose value is to be returned
- * @return an object associated with fieldName
- */
- public Object getField(String fieldName) {
- return get(fieldName);
- }
- /**
- * Returns the value of the specified field as a {@link Map}. Equivalent to {@code (Map) getField(fieldName)}, hence
- * this method will throw a ClassCastException if the field does not implement Map.
- *
- * @param fieldName name of field whose value is to be returned
- * @return a map associated with fieldName
- * @see ClassCastException
- */
- public Map getFieldAsMap(String fieldName) {
- return (Map) get(fieldName);
- }
- /**
- * Returns the value of the specified field as a {@link java.util.List}. Equivalent to {@code (List)
- * getField(fieldName)}, hence this method will throw a ClassCastException if the field does not implement List.
- *
- * @param fieldName name of field whose value is to be returned
- * @return a list associated with fieldName
- * @see ClassCastException
- */
- public List getFieldAsList(String fieldName) {
- return (List) get(fieldName);
- }
- /**
- * Returns the value of the specified field as a {@link String}. Equivalent to {@code (String) getField(fieldName)},
- * hence this method will throw a ClassCastException if the field is not of type String.
- *
- * @param fieldName name of field whose value is to be returned
- * @return a string associated with fieldName
- * @see ClassCastException
- */
- public String getFieldAsString(String fieldName) {
- try {
- return (String) get(fieldName);
- } catch (ClassCastException e) {
- return "" + get(fieldName);
- }
- }
- /**
- * Returns {@code true} if the value of the specified field implements {@link Map}, {@code false} otherwise.
- *
- * @param fieldName name of field to look up
- * @return a boolean value
- */
- public boolean isFieldMultikeyed(String fieldName) {
- Object field = get(fieldName);
- if (field instanceof Map) {
- return true;
- }
- return false;
- }
- /**
- * Returns {@code true} if the value of the specified field implements {@link List}, {@code false} otherwise.
- *
- * @param fieldName name of field to look up
- * @return a boolean value
- */
- public boolean isFieldMultivalued(String fieldName) {
- Object field = get(fieldName);
- if (field instanceof List) {
- return true;
- }
- return false;
- }
- /**
- * Sets the value of the specified field to the passed Object.
- *
- * @param fieldName name of field to set
- * @param value object to associate with passed field name
- */
- public void setField(String fieldName, Object value) {
- //Raise event when change value of property.
- propertyChanges.propertyChange(fieldName, get(fieldName), value);
- put(fieldName, value);
- }
- /**
- * Adds the passed Object to the list field with the specified name.
- *
- * @param fieldName name of list field for which the passed item should be added
- * @param item item to add
- */
- public void addToListField(String fieldName, Object item) {
- List<Object> listField;
- if (containsKey(fieldName)) {
- listField = getFieldAsList(fieldName);
- } else {
- listField = new ArrayList<Object>();
- }
- listField.add(item);
- put(fieldName, listField);
- }
-
- /**
- * Adds a property change event listener to this model
- *
- * @param listener The listener to be added
- */
- public void addPropertyChangeListener(PropertyChangeListener listener) {
- propertyChanges.addPropertyChangeListener(listener);
- }
-
- /**
- * Removes a property change event listener which was added to this model.
- *
- * @param listener The listener to be removed.
- */
- public void removePropertyChangeListener(PropertyChangeListener listener) {
- propertyChanges.removeLifecycleListener(listener);
- }
-
- /**
- * Gets the property change listeners registered and associated with this property change listener. If this
- * property change has no listeners registered, a zero-length array is returned.
- *
- * @return an array of listeners
- */
- public PropertyChangeListener[] findPropertyChangeListeners() {
- return propertyChanges.findPropertyChangeListeners();
- }
- }