001    /**
002     *
003     * Licensed to the Apache Software Foundation (ASF) under one or more
004     * contributor license agreements.  See the NOTICE file distributed with
005     * this work for additional information regarding copyright ownership.
006     * The ASF licenses this file to You under the Apache License, Version 2.0
007     * (the "License"); you may not use this file except in compliance with
008     * the License.  You may obtain a copy of the License at
009     *
010     * http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    package org.apache.camel.component.pojo;
019    
020    import java.lang.reflect.InvocationHandler;
021    import java.lang.reflect.InvocationTargetException;
022    import java.lang.reflect.Method;
023    import java.lang.reflect.Proxy;
024    
025    import org.apache.camel.Processor;
026    import org.apache.camel.RuntimeCamelException;
027    import org.apache.camel.impl.DefaultConsumer;
028    
029    /**
030     * @version $Revision: 525547 $
031     */
032    public class PojoConsumer extends DefaultConsumer<PojoExchange> implements InvocationHandler {
033    
034        private final PojoEndpoint endpoint;
035    
036            public PojoConsumer(PojoEndpoint endpoint, Processor<PojoExchange> processor) {
037            super(endpoint, processor);
038                    this.endpoint = endpoint;
039        }
040        
041        @Override
042        protected void doStart() throws Exception {
043            PojoComponent component = endpoint.getComponent();
044            PojoConsumer consumer = component.getConsumer(endpoint.getPojoId());
045            if( consumer != null ) {
046                    throw new RuntimeCamelException("There is a consumer already registered for endpoint: "+endpoint.getEndpointUri());
047            }
048            component.addConsumer(endpoint.getPojoId(), this);      
049        }
050    
051        @Override
052        protected void doStop() throws Exception {
053            PojoComponent component = endpoint.getComponent();
054            component.removeConsumer(endpoint.getPojoId());         
055        }
056        
057        /**
058         * Creates a Proxy which generates inbound exchanges on the consumer.
059         */
060        public Object createProxy(ClassLoader cl, Class interfaces[]) {
061            return Proxy.newProxyInstance(cl, interfaces, this);
062        }
063        /**
064         * Creates a Proxy which generates inbound exchanges on the consumer.
065         */
066        public Object createProxy(Class interfaces[]) {
067            if( interfaces.length < 1 ) {
068                    throw new IllegalArgumentException("You must provide at least 1 interface class.");
069            }
070            return createProxy(interfaces[0].getClassLoader(), interfaces);
071        }    
072        /**
073         * Creates a Proxy which generates inbound exchanges on the consumer.
074         */
075        @SuppressWarnings("unchecked")
076            public <T> T createProxy(ClassLoader cl, Class<T> interfaceClass) {
077            return (T) createProxy(cl, new Class[]{interfaceClass});
078        }
079        /**
080         * Creates a Proxy which generates inbound exchanges on the consumer.
081         */
082        @SuppressWarnings("unchecked")
083            public <T> T createProxy(Class<T> interfaceClass) {
084            return (T) createProxy(new Class[]{interfaceClass});
085        }
086    
087    
088            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
089            if (!isStarted()) {
090                throw new IllegalStateException("The endpoint is not active: " + getEndpoint().getEndpointUri());
091            }
092            PojoInvocation invocation = new PojoInvocation(proxy, method, args);
093            PojoExchange exchange = getEndpoint().createExchange();
094            exchange.setInvocation(invocation);
095            getProcessor().process(exchange);
096            Throwable fault = exchange.getException();
097            if (fault != null) {
098                throw new InvocationTargetException(fault);
099            }
100            return exchange.getOut().getBody();
101            }
102    }