/* * Copyright 2000-2016 Vaadin Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.vaadin.v7.data.util; import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.EventObject; import java.util.LinkedList; import com.vaadin.data.provider.DataProvider; import com.vaadin.v7.data.Container; /** * Abstract container class that manages event listeners and sending events to * them ({@link PropertySetChangeNotifier}, {@link ItemSetChangeNotifier}). * * Note that this class provides the internal implementations for both types of * events and notifiers as protected methods, but does not implement the * {@link PropertySetChangeNotifier} and {@link ItemSetChangeNotifier} * interfaces directly. This way, subclasses can choose not to implement them. * Subclasses implementing those interfaces should also override the * corresponding {@link #addListener()} and {@link #removeListener()} methods to * make them public. * * @since 6.6 * * @deprecated As of 8.0, replaced by {@link DataProvider} */ @Deprecated public abstract class AbstractContainer implements Container { /** * List of all Property set change event listeners. */ private Collection<Container.PropertySetChangeListener> propertySetChangeListeners = null; /** * List of all container Item set change event listeners. */ private Collection<Container.ItemSetChangeListener> itemSetChangeListeners = null; /** * An <code>event</code> object specifying the container whose Property set * has changed. * * This class does not provide information about which properties were * concerned by the change, but subclasses can provide additional * information about the changes. */ @Deprecated protected static class BasePropertySetChangeEvent extends EventObject implements Container.PropertySetChangeEvent, Serializable { protected BasePropertySetChangeEvent(Container source) { super(source); } @Override public Container getContainer() { return (Container) getSource(); } } /** * An <code>event</code> object specifying the container whose Item set has * changed. * * This class does not provide information about the exact changes * performed, but subclasses can add provide additional information about * the changes. */ @Deprecated protected static class BaseItemSetChangeEvent extends EventObject implements Container.ItemSetChangeEvent, Serializable { protected BaseItemSetChangeEvent(Container source) { super(source); } @Override public Container getContainer() { return (Container) getSource(); } } // PropertySetChangeNotifier /** * Implementation of the corresponding method in * {@link PropertySetChangeNotifier}, override with the corresponding public * method and implement the interface to use this. * * @see PropertySetChangeNotifier#addListener(Container.PropertySetChangeListener) */ protected void addPropertySetChangeListener( Container.PropertySetChangeListener listener) { if (getPropertySetChangeListeners() == null) { setPropertySetChangeListeners( new LinkedList<Container.PropertySetChangeListener>()); } getPropertySetChangeListeners().add(listener); } /** * @deprecated As of 7.0, replaced by * {@link #addPropertySetChangeListener(Container.PropertySetChangeListener)} **/ @Deprecated protected void addListener(Container.PropertySetChangeListener listener) { addPropertySetChangeListener(listener); } /** * Implementation of the corresponding method in * {@link PropertySetChangeNotifier}, override with the corresponding public * method and implement the interface to use this. * * @see PropertySetChangeNotifier#removeListener(Container. * PropertySetChangeListener) */ protected void removePropertySetChangeListener( Container.PropertySetChangeListener listener) { if (getPropertySetChangeListeners() != null) { getPropertySetChangeListeners().remove(listener); } } /** * @deprecated As of 7.0, replaced by * {@link #removePropertySetChangeListener(Container.PropertySetChangeListener)} **/ @Deprecated protected void removeListener( Container.PropertySetChangeListener listener) { removePropertySetChangeListener(listener); } // ItemSetChangeNotifier /** * Implementation of the corresponding method in * {@link ItemSetChangeNotifier}, override with the corresponding public * method and implement the interface to use this. * * @see ItemSetChangeNotifier#addListener(Container.ItemSetChangeListener) */ protected void addItemSetChangeListener( Container.ItemSetChangeListener listener) { if (getItemSetChangeListeners() == null) { setItemSetChangeListeners( new LinkedList<Container.ItemSetChangeListener>()); } getItemSetChangeListeners().add(listener); } /** * @deprecated As of 7.0, replaced by * {@link #addItemSetChangeListener(Container.ItemSetChangeListener)} **/ @Deprecated protected void addListener(Container.ItemSetChangeListener listener) { addItemSetChangeListener(listener); } /** * Implementation of the corresponding method in * {@link ItemSetChangeNotifier}, override with the corresponding public * method and implement the interface to use this. * * @see ItemSetChangeNotifier#removeListener(Container.ItemSetChangeListener) */ protected void removeItemSetChangeListener( Container.ItemSetChangeListener listener) { if (getItemSetChangeListeners() != null) { getItemSetChangeListeners().remove(listener); } } /** * @deprecated As of 7.0, replaced by * {@link #addItemSetChangeListener(Container.ItemSetChangeListener)} **/ @Deprecated protected void removeListener(Container.ItemSetChangeListener listener) { removeItemSetChangeListener(listener); } /** * Sends a simple Property set change event to all interested listeners. */ protected void fireContainerPropertySetChange() { fireContainerPropertySetChange(new BasePropertySetChangeEvent(this)); } /** * Sends a Property set change event to all interested listeners. * * Use {@link #fireContainerPropertySetChange()} instead of this method * unless additional information about the exact changes is available and * should be included in the event. * * @param event * the property change event to send, optionally with additional * information */ protected void fireContainerPropertySetChange( Container.PropertySetChangeEvent event) { if (getPropertySetChangeListeners() != null) { final Object[] l = getPropertySetChangeListeners().toArray(); for (int i = 0; i < l.length; i++) { ((Container.PropertySetChangeListener) l[i]) .containerPropertySetChange(event); } } } /** * Sends a simple Item set change event to all interested listeners, * indicating that anything in the contents may have changed (items added, * removed etc.). */ protected void fireItemSetChange() { fireItemSetChange(new BaseItemSetChangeEvent(this)); } /** * Sends an Item set change event to all registered interested listeners. * * @param event * the item set change event to send, optionally with additional * information */ protected void fireItemSetChange(ItemSetChangeEvent event) { if (getItemSetChangeListeners() != null) { final Object[] l = getItemSetChangeListeners().toArray(); for (int i = 0; i < l.length; i++) { ((Container.ItemSetChangeListener) l[i]) .containerItemSetChange(event); } } } /** * Sets the property set change listener collection. For internal use only. * * @param propertySetChangeListeners */ protected void setPropertySetChangeListeners( Collection<Container.PropertySetChangeListener> propertySetChangeListeners) { this.propertySetChangeListeners = propertySetChangeListeners; } /** * Returns the property set change listener collection. For internal use * only. */ protected Collection<Container.PropertySetChangeListener> getPropertySetChangeListeners() { return propertySetChangeListeners; } /** * Sets the item set change listener collection. For internal use only. * * @param itemSetChangeListeners */ protected void setItemSetChangeListeners( Collection<Container.ItemSetChangeListener> itemSetChangeListeners) { this.itemSetChangeListeners = itemSetChangeListeners; } /** * Returns the item set change listener collection. For internal use only. */ protected Collection<Container.ItemSetChangeListener> getItemSetChangeListeners() { return itemSetChangeListeners; } public Collection<?> getListeners(Class<?> eventType) { if (Container.PropertySetChangeEvent.class .isAssignableFrom(eventType)) { if (propertySetChangeListeners == null) { return Collections.EMPTY_LIST; } else { return Collections .unmodifiableCollection(propertySetChangeListeners); } } else if (Container.ItemSetChangeEvent.class .isAssignableFrom(eventType)) { if (itemSetChangeListeners == null) { return Collections.EMPTY_LIST; } else { return Collections .unmodifiableCollection(itemSetChangeListeners); } } return Collections.EMPTY_LIST; } }