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
015package org.apache.tapestry.contrib.table.model.common;
016
017import java.lang.ref.WeakReference;
018import java.util.ArrayList;
019import java.util.Iterator;
020import java.util.List;
021
022import org.apache.tapestry.contrib.table.model.CTableDataModelEvent;
023import org.apache.tapestry.contrib.table.model.ITableDataModel;
024import 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 */
031public abstract class AbstractTableDataModel implements ITableDataModel
032{
033        private List m_arrListeners;
034
035        public AbstractTableDataModel()
036        {
037                m_arrListeners = new ArrayList();
038        }
039
040        /**
041         * Method fireTableDataModelEvent.
042         * Fires a change event to all listeners
043         * @param objEvent the event to pass to the listeners
044         */
045        protected void fireTableDataModelEvent(CTableDataModelEvent objEvent)
046        {
047        synchronized (m_arrListeners) {
048            List arrEmptyReferences = null;
049        
050                for (Iterator it = m_arrListeners.iterator(); it.hasNext();)
051                {
052                WeakReference objRef = (WeakReference) it.next();
053                        ITableDataModelListener objListener =
054                                (ITableDataModelListener) objRef.get();
055                if (objListener != null) 
056                    objListener.tableDataChanged(objEvent);
057                else {
058                    if (arrEmptyReferences == null)
059                        arrEmptyReferences = new ArrayList();
060                    arrEmptyReferences.add(objRef);
061                }
062                }
063
064            if (arrEmptyReferences != null)
065                m_arrListeners.removeAll(arrEmptyReferences);
066        }
067        }
068
069        /**
070         * @see org.apache.tapestry.contrib.table.model.ITableDataModel#addTableDataModelListener(ITableDataModelListener)
071         */
072        public void addTableDataModelListener(ITableDataModelListener objListener)
073        {
074        synchronized (m_arrListeners) {
075                m_arrListeners.add(new WeakReference(objListener));
076        }
077        }
078
079        /**
080         * @see org.apache.tapestry.contrib.table.model.ITableDataModel#removeTableDataModelListener(ITableDataModelListener)
081         */
082        public void removeTableDataModelListener(ITableDataModelListener objListener)
083        {
084        synchronized (m_arrListeners) {
085            List arrEmptyReferences = null;
086        
087            for (Iterator it = m_arrListeners.iterator(); it.hasNext();)
088            {
089                WeakReference objRef = (WeakReference) it.next();
090                ITableDataModelListener objStoredListener =
091                    (ITableDataModelListener) objRef.get();
092                if (objListener == objStoredListener || objStoredListener == null) { 
093                    if (arrEmptyReferences == null)
094                        arrEmptyReferences = new ArrayList();
095                    arrEmptyReferences.add(objRef);
096                }
097            }
098
099            if (arrEmptyReferences != null)
100                m_arrListeners.removeAll(arrEmptyReferences);
101        }
102        }
103
104}