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 }