001: package org.araneaframework.uilib.event;
002:
003: import java.lang.reflect.Method;
004: import org.apache.commons.logging.Log;
005: import org.apache.commons.logging.LogFactory;
006: import org.araneaframework.InputData;
007: import org.araneaframework.Widget;
008: import org.araneaframework.core.ApplicationWidget;
009: import org.araneaframework.core.Assert;
010: import org.araneaframework.core.EventListener;
011: import org.araneaframework.core.util.ProxiedHandlerUtil;
012: import org.araneaframework.uilib.form.BeanFormWidget;
013: import org.araneaframework.uilib.form.FormWidget;
014: import org.araneaframework.uilib.form.reader.BeanFormReader;
015:
016: public final class ValidatingProxyEventListener implements
017: EventListener {
018: public static final Log log = LogFactory
019: .getLog(ValidatingProxyEventListener.class);
020:
021: private Widget eventTarget;
022: private FormWidget form;
023: private Class modelType;
024:
025: public ValidatingProxyEventListener(Widget eventTarget,
026: FormWidget form, Class modelType) {
027: Assert.notNullParam(form, "form");
028: Assert.notNullParam(eventTarget, "eventTarget");
029: Assert.notNullParam(modelType, "modelType");
030:
031: this .eventTarget = eventTarget;
032: this .form = form;
033: this .modelType = modelType;
034: }
035:
036: public ValidatingProxyEventListener(Widget eventTarget,
037: BeanFormWidget form) {
038: Assert.notNullParam(form, "form");
039: Assert.notNullParam(eventTarget, "eventTarget");
040:
041: this .eventTarget = eventTarget;
042: this .form = form;
043: this .modelType = form.getBeanClass();
044: }
045:
046: public void processEvent(Object eventId, InputData input)
047: throws Exception {
048: if (!form.convertAndValidate())
049: return;
050:
051: BeanFormReader reader = new BeanFormReader(form);
052: Object bean = reader.getBean(modelType);
053:
054: String eventParameter = (String) input.getGlobalData().get(
055: ApplicationWidget.EVENT_PARAMETER_KEY);
056: String eventHandlerName = "handleEvent"
057: + ((String) eventId).substring(0, 1).toUpperCase()
058: + ((String) eventId).substring(1);
059:
060: Method eventHandler;
061: // lets try to find a handle method with a bean argument
062: try {
063: eventHandler = ProxiedHandlerUtil.getEventHandler(
064: (String) eventId, eventTarget,
065: new Class[] { modelType });
066:
067: if (log.isDebugEnabled()) {
068: log.debug("Calling method '" + eventHandlerName + "("
069: + modelType.getName() + ")' of class '"
070: + eventTarget.getClass().getName() + "'.");
071: }
072: eventHandler.invoke(eventTarget, new Object[] { bean });
073:
074: return;
075: } catch (NoSuchMethodException e) {/* OK */
076: }
077:
078: // lets try to find a method with a bean and a String type argument
079: try {
080: eventHandler = ProxiedHandlerUtil.getEventHandler(
081: (String) eventId, eventTarget, new Class[] {
082: modelType, String.class });
083:
084: if (log.isDebugEnabled()) {
085: log.debug("Calling method '" + eventHandlerName + "("
086: + modelType.getName() + ", String)' of class '"
087: + eventTarget.getClass().getName() + "'.");
088: }
089: eventHandler.invoke(eventTarget, new Object[] { bean,
090: eventParameter });
091:
092: return;
093: } catch (NoSuchMethodException e) {/* OK */
094: }
095:
096: if (log.isWarnEnabled()) {
097: log
098: .warn("Widget '"
099: + eventTarget.getScope()
100: + "' cannot deliver event as no event listeners were registered for the event id '"
101: + eventId + "'!"
102: + Assert.thisToString(eventTarget));
103: }
104: }
105: }
|