package com.dubture.getcomposer.core.entities;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public abstract class AbstractJsonArray<V> extends JsonEntity implements JsonCollection, Iterable<V> {
protected List<V> values = new LinkedList<V>();
private transient PropertyChangeListener propListener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
int index = values.indexOf(e.getSource());
firePropertyChange("#" + index + "." + e.getPropertyName(), e.getOldValue(), e.getNewValue());
}
};
@SuppressWarnings("unchecked")
protected void doParse(Object obj) {
clear();
if (obj instanceof List) {
for (Object item : (List<Object>)obj) {
add((V)item);
}
}
}
@Override
protected Object buildJson() {
LinkedList<Object> out = new LinkedList<Object>();
for (V val : values) {
if (val == null) {
continue;
}
out.add(getJsonValue(val));
}
return out;
}
/*
* (non-Javadoc)
* @see com.dubture.getcomposer.core.entities.JsonCollection#size()
*/
public int size() {
return values.size();
}
/*
* (non-Javadoc)
* @see com.dubture.getcomposer.core.entities.JsonCollection#clear()
*/
public void clear() {
while (values.size() > 0) {
remove(get(0));
}
}
/**
* Checks whether the value is present.
*
* @param value the value to check
* @return true if present, false if not
*/
public boolean has(V value) {
return values.contains(value);
}
/**
* Returns the passed object
*
* @param packageName
* @return the dependency
*/
public V get(int index) {
return values.get(index);
}
public int indexOf(V value) {
return values.indexOf(value);
}
/**
* Adds a value to the receiver's collection
*
* @param value the new value
*/
public void add(V value) {
values.add(value);
if (value instanceof JsonEntity) {
((JsonEntity)value).addPropertyChangeListener(propListener);
}
firePropertyChange("#" + (values.size() - 1), null, value);
}
/**
* Removes a value from the receiver's collection
*
* @param value the value to remove
*/
public void remove(V value) {
int index = values.indexOf(value);
values.remove(value);
if (value instanceof JsonEntity) {
((JsonEntity)value).removePropertyChangeListener(propListener);
}
firePropertyChange("#" + index, value, null);
}
/**
* If oldValue exists, replaces with newValue
*
* @param oldValue
* @param newValue
*/
public void replace(V oldValue, V newValue) {
if (values.contains(oldValue)) {
int index = values.indexOf(oldValue);
values.remove(oldValue);
values.add(index, newValue);
if (oldValue instanceof JsonEntity) {
((JsonEntity)oldValue).removePropertyChangeListener(propListener);
}
if (newValue instanceof JsonEntity) {
((JsonEntity)newValue).removePropertyChangeListener(propListener);
}
firePropertyChange("#" + index, oldValue, newValue);
}
}
public Object[] toArray() {
return values.toArray();
}
public <T> T[] toArray(T[] a) {
return values.toArray(a);
}
public List<V> toList() {
return values;
}
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object obj) {
if (obj instanceof AbstractJsonArray) {
return values.equals(((AbstractJsonArray<V>)obj).toList());
}
return false;
}
/*
* (non-Javadoc)
* @see java.lang.Iterable#iterator()
*/
public Iterator<V> iterator() {
return values.iterator();
}
}