package org.rzo.yajsw.util; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.beanutils.PropertyUtils; import org.rzo.yajsw.srvmgr.client.Host; import ca.odell.glazedlists.EventList; public class ObservableList<E> { EventList<ObservableObject> _list; String[] _idProperty; String[] _propertyNames; Map<Object, ObservableObject> _currentList = new HashMap<Object, ObservableObject>(); public ObservableList(EventList<ObservableObject> list, String[] propertyNames, String[] idProperty) { _list = list; _idProperty = idProperty; _propertyNames = propertyNames; } private String getId(Object obj) { String result = ""; try { for (String prop : _idProperty) result += PropertyUtils.getSimpleProperty(obj, prop) + "$$"; return result; } catch (Exception e) { e.printStackTrace(); } return null; } public void update(Collection<E> newList) { Set<Object> updated = new HashSet<Object>(); for (Object obj : newList) { updated.add(updateObject(obj)); } Set<Object> toRemove = new HashSet<Object>(_currentList.keySet()); toRemove.removeAll(updated); for (Object id : toRemove) { _list.remove(_currentList.remove(id)); } } public Object updateObject(Object obj) { Object id = getId(obj); ObservableObject current = _currentList.get(id); if (current == null) { current = new ObservableObject(obj, _propertyNames); _currentList.put(id, current); _list.add(current); } else current.update(obj); return id; } public void removeObject(E obj) { Object id = getId(obj); ObservableObject current = _currentList.remove(id); if (current != null) _list.remove(current); } public boolean containsObject(E obj) { return _currentList.containsKey(getId(obj)); } public E getObject(E obj) { Object id = getId(obj); ObservableObject current = _currentList.get(id); if (current == null) return null; return (E) current.getRoot(); } public Collection<E> getObjectList() { List<E> result = new ArrayList<E>(); for (ObservableObject obj : _currentList.values()) { result.add((E) obj.getRoot()); } return result; } }