/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo Framework
* Version: 1.4
*
* This file is part of Qcadoo.
*
* Qcadoo is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.view.internal.internal;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Maps;
import com.qcadoo.plugin.api.PluginUtils;
import com.qcadoo.view.api.ComponentState;
import com.qcadoo.view.api.ViewDefinitionState;
import com.qcadoo.view.internal.hooks.ViewEventListenerHook;
public final class EventHandlerHolder {
private final ComponentState owner;
public EventHandlerHolder(final ComponentState owner) {
this.owner = owner;
}
private final Map<String, List<EventHandler>> eventHandlers = Maps.newHashMap();
public void registerCustomEvent(final ViewEventListenerHook eventListenerHook) {
registerEvent(eventListenerHook.getEventName(), eventListenerHook);
}
public void registerEvent(final String event, final Object obj, final String method) {
registerEvent(event, new DefaultEventHandler(obj, method, null));
}
private void registerEvent(final String event, final EventHandler eventHandler) {
if (!eventHandlers.containsKey(event)) {
eventHandlers.put(event, new ArrayList<EventHandler>());
}
eventHandlers.get(event).add(eventHandler);
}
public void performEvent(final ViewDefinitionState viewDefinitionState, final String event, final String... args) {
if (!eventHandlers.containsKey(event)) {
return;
}
for (EventHandler eventHandler : eventHandlers.get(event)) {
eventHandler.invokeEvent(viewDefinitionState, owner, args);
}
}
public interface EventHandler {
void invokeEvent(final ViewDefinitionState viewDefinitionState, final ComponentState eventPerformer, final String[] args);
}
private class DefaultEventHandler implements EventHandler {
private final Method method;
private final Object obj;
private final String pluginIdentifier;
public DefaultEventHandler(final Object obj, final String method, final String pluginIdentifier) {
this.obj = obj;
this.pluginIdentifier = pluginIdentifier;
try {
this.method = obj.getClass().getDeclaredMethod(method, String[].class);
} catch (SecurityException e) {
throw new IllegalStateException(e.getMessage(), e);
} catch (NoSuchMethodException e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
@Override
public void invokeEvent(final ViewDefinitionState viewDefinitionState, final ComponentState eventPerformer,
final String[] args) {
if (pluginIdentifier != null && !PluginUtils.isEnabled(pluginIdentifier)) {
return;
}
try {
method.invoke(obj, new Object[] { args });
} catch (IllegalArgumentException e) {
throw new IllegalStateException(e.getMessage(), e);
} catch (IllegalAccessException e) {
throw new IllegalStateException(e.getMessage(), e);
} catch (InvocationTargetException e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
}
}