001    // Copyright 2004, 2005 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    //     http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.tapestry.contrib.table.model.common;
016    
017    import java.lang.ref.WeakReference;
018    import java.util.ArrayList;
019    import java.util.Iterator;
020    import java.util.List;
021    
022    import org.apache.tapestry.contrib.table.model.CTableDataModelEvent;
023    import org.apache.tapestry.contrib.table.model.ITableDataModel;
024    import org.apache.tapestry.contrib.table.model.ITableDataModelListener;
025    
026    /**
027     * An implementation of the listener support in the ITableDataModel interface.
028     * 
029     * @author mindbridge
030     */
031    public abstract class AbstractTableDataModel implements ITableDataModel
032    {
033    
034        private List m_arrListeners;
035    
036        public AbstractTableDataModel()
037        {
038            m_arrListeners = new ArrayList();
039        }
040    
041        /**
042         * Method fireTableDataModelEvent. Fires a change event to all listeners.
043         * 
044         * @param objEvent
045         *            the event to pass to the listeners
046         */
047        protected void fireTableDataModelEvent(CTableDataModelEvent objEvent)
048        {
049            synchronized(m_arrListeners)
050            {
051                List arrEmptyReferences = null;
052    
053                for(Iterator it = m_arrListeners.iterator(); it.hasNext();)
054                {
055                    WeakReference objRef = (WeakReference) it.next();
056                    ITableDataModelListener objListener = (ITableDataModelListener) objRef
057                            .get();
058                    if (objListener != null)
059                        objListener.tableDataChanged(objEvent);
060                    else
061                    {
062                        if (arrEmptyReferences == null)
063                            arrEmptyReferences = new ArrayList();
064                        arrEmptyReferences.add(objRef);
065                    }
066                }
067    
068                if (arrEmptyReferences != null)
069                    m_arrListeners.removeAll(arrEmptyReferences);
070            }
071        }
072    
073        /**
074         * @see org.apache.tapestry.contrib.table.model.ITableDataModel#addTableDataModelListener(ITableDataModelListener) .
075         */
076        public void addTableDataModelListener(ITableDataModelListener objListener)
077        {
078            synchronized(m_arrListeners)
079            {
080                m_arrListeners.add(new WeakReference(objListener));
081            }
082        }
083    
084        /**
085         * @see org.apache.tapestry.contrib.table.model.ITableDataModel#removeTableDataModelListener(ITableDataModelListener) .
086         */
087        public void removeTableDataModelListener(ITableDataModelListener objListener)
088        {
089            synchronized(m_arrListeners)
090            {
091                List arrEmptyReferences = null;
092    
093                for(Iterator it = m_arrListeners.iterator(); it.hasNext();)
094                {
095                    WeakReference objRef = (WeakReference) it.next();
096                    ITableDataModelListener objStoredListener = (ITableDataModelListener) objRef
097                            .get();
098                    if (objListener == objStoredListener
099                            || objStoredListener == null)
100                    {
101                        if (arrEmptyReferences == null)
102                            arrEmptyReferences = new ArrayList();
103                        arrEmptyReferences.add(objRef);
104                    }
105                }
106    
107                if (arrEmptyReferences != null)
108                    m_arrListeners.removeAll(arrEmptyReferences);
109            }
110        }
111    
112    }