/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onebusaway.webapp.gwt.common.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ModelEventsImpl implements ModelEventsSourceAndSink {
private Map<Class<?>, List<ModelListener<?>>> _listenersByType = new HashMap<Class<?>, List<ModelListener<?>>>();
/*****************************************************************************
* {@link ModelEventsSource} Interface
****************************************************************************/
public <T> void addModelListener(Class<T> modelType, ModelListener<T> listener) {
List<ModelListener<?>> listeners = _listenersByType.get(modelType);
if (listeners == null) {
listeners = new ArrayList<ModelListener<?>>();
_listenersByType.put(modelType, listeners);
}
listeners.add(listener);
}
public <T> void removeModelListener(Class<T> modelType, ModelListener<T> listener) {
List<ModelListener<?>> listeners = _listenersByType.get(modelType);
if (listeners != null)
listeners.remove(listener);
}
/*****************************************************************************
* {@link ModelEventsSink} Interface
****************************************************************************/
@SuppressWarnings("unchecked")
public <T> void fireChange(T model) {
fireChange((Class<T>) model.getClass(), model);
}
@SuppressWarnings("unchecked")
public <T, T2 extends T> void fireChange(Class<T> modelType, T2 model) {
List<ModelListener<?>> listeners = _listenersByType.get(modelType);
if (listeners != null) {
for (ModelListener<?> listener : listeners) {
ModelListener<T> m = (ModelListener<T>) listener;
m.handleUpdate(model);
}
}
}
public <T> ModelEventSourceAndSink<T> getEventSourceAndSink(Class<T> modelType) {
return new ModelImpl<T>(modelType);
}
public <T> ModelEventSource<T> getEventSource(Class<T> modelType) {
return getEventSourceAndSink(modelType);
}
public <T> ModelEventSink<T> getEventSink(Class<T> modelType) {
return getEventSourceAndSink(modelType);
}
private class ModelImpl<T> implements ModelEventSourceAndSink<T> {
private Class<T> _modelType;
public ModelImpl(Class<T> modelType) {
_modelType = modelType;
}
public void addModelListener(ModelListener<T> listener) {
ModelEventsImpl.this.addModelListener(_modelType, listener);
}
public void removeModelListener(ModelListener<T> listener) {
ModelEventsImpl.this.removeModelListener(_modelType, listener);
}
public void fireModelChange(T model) {
ModelEventsImpl.this.fireChange(_modelType, model);
}
}
}