org.jboss.pressgang.ccms.wrapper.collection.DBCollectionWrapper Maven / Gradle / Ivy
package org.jboss.pressgang.ccms.wrapper.collection;
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.jboss.pressgang.ccms.wrapper.DBWrapperFactory;
import org.jboss.pressgang.ccms.wrapper.base.BaseWrapper;
import org.jboss.pressgang.ccms.wrapper.collection.base.CollectionEventListener;
import org.jboss.pressgang.ccms.wrapper.collection.handler.DBCollectionHandler;
import org.jboss.pressgang.ccms.wrapper.collection.handler.DBDefaultCollectionHandler;
public abstract class DBCollectionWrapper, U> implements CollectionWrapper {
private static final Integer NO_STATE = 0;
private static final Integer ADD_STATE = 1;
private static final Integer REMOVE_STATE = 2;
private final Map wrapperItems = new HashMap();
private final Collection items;
private final DBWrapperFactory wrapperFactory;
private final boolean isRevisionList;
private DBCollectionHandler handler;
private final Set> listeners = new HashSet>();
protected DBCollectionWrapper(final DBWrapperFactory wrapperFactory, final Collection items, boolean isRevisionList,
final Class wrapperClass) {
this(wrapperFactory, items, isRevisionList, wrapperClass, new DBDefaultCollectionHandler());
}
protected DBCollectionWrapper(final DBWrapperFactory wrapperFactory, final Collection items, boolean isRevisionList,
final Class wrapperClass, final DBCollectionHandler handler) {
this.wrapperFactory = wrapperFactory;
for (final U item : items) {
wrapperItems.put((T) wrapperFactory.create(item, isRevisionList, wrapperClass), NO_STATE);
}
this.items = items;
this.isRevisionList = isRevisionList;
this.handler = handler;
}
protected DBWrapperFactory getWrapperFactory() {
return wrapperFactory;
}
protected Map getCollection() {
return wrapperItems;
}
protected Collection getCollectionItems() {
return items;
}
public DBCollectionHandler getHandler() {
return handler;
}
public void setHandler(final DBCollectionHandler handler) {
this.handler = handler;
}
public void registerEventListener(CollectionEventListener listener) {
listeners.add(listener);
}
public void resetEventListeners() {
listeners.clear();
}
protected Set> getEventListeners() {
return listeners;
}
@Override
public void addItem(T entity) {
getCollection().put(entity, NO_STATE);
}
@Override
@SuppressWarnings("unchecked")
public void addNewItem(T entity) {
getCollection().put(entity, ADD_STATE);
if (!isRevisionList()) {
final U unwrappedEntity = (U) entity.unwrap();
if (!getCollectionItems().contains(unwrappedEntity)) {
notifyOnAddEvent(unwrappedEntity);
}
}
}
@Override
@SuppressWarnings("unchecked")
public void addRemoveItem(T entity) {
getCollection().put(entity, REMOVE_STATE);
if (!isRevisionList()) {
final U unwrappedEntity = (U) entity.unwrap();
notifyOnRemoveEvent(unwrappedEntity);
}
}
@Override
public void remove(T entity) {
getCollection().remove(entity);
}
public List getItems() {
return new ArrayList(getCollection().keySet());
}
@Override
public List getUnchangedItems() {
final List unchangedItems = new ArrayList();
for (final Map.Entry entity : getCollection().entrySet()) {
if (NO_STATE.equals(entity.getValue())) {
unchangedItems.add(entity.getKey());
}
}
return unchangedItems;
}
@Override
public List getAddItems() {
final List newItems = new ArrayList();
for (final Map.Entry entity : getCollection().entrySet()) {
if (ADD_STATE.equals(entity.getValue())) {
newItems.add(entity.getKey());
}
}
return newItems;
}
@Override
public List getRemoveItems() {
final List removeItems = new ArrayList();
for (final Map.Entry entity : getCollection().entrySet()) {
if (REMOVE_STATE.equals(entity.getValue())) {
removeItems.add(entity.getKey());
}
}
return removeItems;
}
@Override
public Collection unwrap() {
return items;
}
@Override
public int size() {
return wrapperItems.size();
}
@Override
public boolean isEmpty() {
return wrapperItems.isEmpty();
}
protected boolean isRevisionList() {
return isRevisionList;
}
private void notifyOnAddEvent(U entity) {
handler.addItem(items, entity);
for (final CollectionEventListener listener : getEventListeners()) {
listener.onAddItem(entity);
}
}
private void notifyOnRemoveEvent(U entity) {
handler.removeItem(items, entity);
for (final CollectionEventListener listener : getEventListeners()) {
listener.onRemoveItem(entity);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy