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 }