/*
* Copyright (c) 2011-2014 Fernando Petrola
*
* 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 com.dragome.guia.components;
import java.lang.reflect.Proxy;
import java.util.EventListener;
import java.util.HashMap;
import java.util.Map;
import com.dragome.guia.events.listeners.interfaces.ListenerChanged;
import com.dragome.guia.events.listeners.interfaces.ListenerMultiplexer;
import com.dragome.model.interfaces.EventProducer;
public class DefaultEventProducer implements EventProducer
{
protected Map<Class<? extends EventListener>, EventListener> listeners= new HashMap<Class<? extends EventListener>, EventListener>();
protected Map<Object, EventListener> owners= new HashMap<Object, EventListener>();
public DefaultEventProducer()
{
super();
}
public <T extends EventListener> void addListener(Class<T> aType, T aListener)
{
EventListener listener= listeners.get(aType);
if (listener == null || (!(listener instanceof ListenerMultiplexer) && !Proxy.isProxyClass(listener.getClass())))
{
listeners.put(aType, listener= ProxyBasedListenerMultiplexer.createListenerMultiplexer(aType));
}
ListenerMultiplexer<T> listenerMultiplexer= (ListenerMultiplexer<T>) listener;
listenerMultiplexer.add(aListener); //TODO compilador
if (!aType.equals(ListenerChanged.class))
if (hasListener(ListenerChanged.class))
getListener(ListenerChanged.class).listenerAdded(aType, aListener);
}
public <T extends EventListener> void removeListener(Class<T> aType, T aListener)
{
EventListener listener= listeners.get(aType);
if (listener instanceof ListenerMultiplexer)
{
ListenerMultiplexer<T> listenerMultiplexer= (ListenerMultiplexer<T>) listener;
listenerMultiplexer.remove(aListener);
}
else
{
listeners.remove(aType);
}
if (!aType.equals(ListenerChanged.class))
if (hasListener(ListenerChanged.class))
getListener(ListenerChanged.class).listenerRemoved(aType, aListener);
}
public <T extends EventListener> boolean hasListener(Class<T> aType)
{
return listeners.containsKey(aType);
}
public <T extends EventListener> T getListener(Class<T> aType)
{
return (T) listeners.get(aType);
}
public <T extends EventListener> void addListenerForOwner(Class<T> aType, T aListener, Object owner)
{
// T eventListener= (T) owners.get(owner);
// if (eventListener != null)
// {
// removeListener(aType, eventListener);
// owners.remove(owner);
// }
//
// owners.put(owner, aListener);
addListener(aType, aListener);
}
}