001: /*
002: * $Id: MuleProxyListener.java 10789 2008-02-12 20:04:43Z dfeist $
003: * --------------------------------------------------------------------------------------
004: * Copyright (c) MuleSource, Inc. All rights reserved. http://www.mulesource.com
005: *
006: * The software in this package is published under the terms of the CPAL v1.0
007: * license, a copy of which has been included with this distribution in the
008: * LICENSE.txt file.
009: */
010:
011: package org.mule.module.client;
012:
013: import org.mule.api.DefaultMuleException;
014: import org.mule.api.MuleException;
015: import org.mule.api.MuleMessage;
016: import org.mule.api.transformer.Transformer;
017: import org.mule.module.client.i18n.ClientMessages;
018:
019: import java.lang.reflect.InvocationHandler;
020: import java.lang.reflect.Method;
021: import java.lang.reflect.Proxy;
022:
023: /**
024: * <code>MuleProxyListener</code> is a generic listent proxy that can be used to
025: * foward calls as Mule events from any Observer/Observerable implementation.
026: */
027:
028: public class MuleProxyListener implements InvocationHandler {
029: private Class listenerClass;
030: private AbstractEventTransformer eventTransformer;
031: private String componentName;
032: private Object proxy;
033: private MuleClient client;
034:
035: public MuleProxyListener(Class listenerClass, String componentName)
036: throws MuleException {
037: setListenerClass(listenerClass);
038: setEventTransformer(new EventObjectTransformer());
039: setComponentName(componentName);
040: setClient(new MuleClient());
041: createProxy();
042: }
043:
044: public MuleProxyListener(Class listenerClass,
045: AbstractEventTransformer eventTransformer,
046: String componentName) throws MuleException {
047: setListenerClass(listenerClass);
048: setEventTransformer(eventTransformer);
049: setComponentName(componentName);
050: setClient(new MuleClient());
051: createProxy();
052: }
053:
054: public MuleProxyListener(Class listenerClass,
055: AbstractEventTransformer eventTransformer,
056: String componentName, MuleClient client) {
057: setListenerClass(listenerClass);
058: setEventTransformer(eventTransformer);
059: setComponentName(componentName);
060: setClient(client);
061: createProxy();
062: }
063:
064: protected void createProxy() {
065: proxy = Proxy.newProxyInstance(listenerClass.getClassLoader(),
066: new Class[] { listenerClass }, this );
067: }
068:
069: public Class getListenerClass() {
070: return listenerClass;
071: }
072:
073: public void setListenerClass(Class listenerClass) {
074: this .listenerClass = listenerClass;
075: }
076:
077: public Transformer getEventTransformer() {
078: return eventTransformer;
079: }
080:
081: public void setEventTransformer(
082: AbstractEventTransformer eventTransformer) {
083: this .eventTransformer = eventTransformer;
084: }
085:
086: public String getComponentName() {
087: return componentName;
088: }
089:
090: public void setComponentName(String componentName) {
091: this .componentName = componentName;
092: }
093:
094: public MuleClient getClient() {
095: return client;
096: }
097:
098: public void setClient(MuleClient client) {
099: this .client = client;
100: }
101:
102: public Object invoke(Object proxy, Method method, Object[] args)
103: throws Throwable {
104: if (args.length == 0) {
105: throw new DefaultMuleException(ClientMessages
106: .noArgsForProxy());
107: }
108: MuleMessage message = eventTransformer.transform(args[0],
109: method);
110: if (!"void".equals(method.getReturnType().getName())) {
111: MuleMessage result = client.sendDirect(componentName, null,
112: message);
113: if (MuleMessage.class.equals(method.getReturnType())) {
114: return result;
115: } else {
116: return (result == null ? null : result.getPayload());
117: }
118: } else {
119: client.dispatchDirect(componentName, message);
120: return null;
121: }
122: }
123:
124: public Object getProxy() {
125: return proxy;
126: }
127: }
|