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            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    }