001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.impl;
018    
019    import java.util.HashMap;
020    import java.util.Map;
021    
022    import org.apache.camel.CamelContext;
023    import org.apache.camel.Component;
024    import org.apache.camel.Consumer;
025    import org.apache.camel.ResolveEndpointFailedException;
026    import org.apache.camel.util.IntrospectionSupport;
027    
028    /**
029     * A base class for {@link org.apache.camel.Endpoint} which creates a {@link ScheduledPollConsumer}
030     *
031     * @version $Revision: 751655 $
032     */
033    public abstract class ScheduledPollEndpoint extends DefaultEndpoint {
034        private Map consumerProperties;
035    
036        protected ScheduledPollEndpoint(String endpointUri, Component component) {
037            super(endpointUri, component);
038        }
039    
040        protected ScheduledPollEndpoint(String endpointUri, CamelContext context) {
041            super(endpointUri, context);
042        }
043    
044        protected ScheduledPollEndpoint(String endpointUri) {
045            super(endpointUri);
046        }
047    
048        protected ScheduledPollEndpoint() {
049        }
050    
051        public Map getConsumerProperties() {
052            return consumerProperties;
053        }
054    
055        public void setConsumerProperties(Map consumerProperties) {
056            this.consumerProperties = consumerProperties;
057        }
058    
059        protected void configureConsumer(Consumer consumer) throws Exception {
060            if (consumerProperties != null) {
061                IntrospectionSupport.setProperties(getCamelContext().getTypeConverter(), consumer, consumerProperties);
062                if (!this.isLenientProperties() && consumerProperties.size() > 0) {
063                    throw new ResolveEndpointFailedException(this.getEndpointUri(), "There are " + consumerProperties.size()
064                        + " parameters that couldn't be set on the endpoint consumer."
065                        + " Check the uri if the parameters are spelt correctly and that they are properties of the endpoint."
066                        + " Unknown consumer parameters=[" + consumerProperties + "]");
067                }
068            }
069        }
070    
071        public void configureProperties(Map options) {
072            Map consumerProperties = IntrospectionSupport.extractProperties(options, "consumer.");
073            if (consumerProperties != null) {
074                setConsumerProperties(consumerProperties);
075            }
076            configureScheduledPollConsumerProperties(options, consumerProperties);
077        }
078    
079        @SuppressWarnings("unchecked")
080        private void configureScheduledPollConsumerProperties(Map options, Map consumerProperties) {
081            // special for scheduled poll consumers as we want to allow end users to configure its options
082            // from the URI parameters without the consumer. prefix
083            Object initialDelay = options.remove("initialDelay");
084            Object delay = options.remove("delay");
085            Object timeUnit = options.remove("timeUnit");
086            Object useFixedDelay = options.remove("useFixedDelay");
087            if (initialDelay != null || delay != null || timeUnit != null || useFixedDelay != null) {
088                if (consumerProperties == null) {
089                    consumerProperties = new HashMap();
090                }
091                if (initialDelay != null) {
092                    consumerProperties.put("initialDelay", initialDelay);
093                }
094                if (delay != null) {
095                    consumerProperties.put("delay", delay);
096                }
097                if (timeUnit != null) {
098                    consumerProperties.put("timeUnit", timeUnit);
099                }
100                if (useFixedDelay != null) {
101                    consumerProperties.put("useFixedDelay", useFixedDelay);
102                }
103            }
104        }
105    
106    }