All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jboss.pressgang.ccms.wrapper.collection.DBCollectionWrapper Maven / Gradle / Ivy

There is a newer version: 1.9
Show newest version
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);
        }
    }
}