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.component.dataset;
018    
019    import java.util.HashMap;
020    import java.util.Map;
021    
022    import org.apache.camel.Exchange;
023    import org.apache.camel.Message;
024    import org.apache.camel.Processor;
025    import org.apache.camel.util.ExchangeHelper;
026    
027    /**
028     * @version $Revision: 37863 $
029     */
030    public abstract class DataSetSupport implements DataSet {
031        private Map<String, Object> defaultHeaders;
032        private Processor outputTransformer;
033        private long size = 10;
034        private long reportCount = -1;
035    
036        public DataSetSupport() {
037        }
038    
039        public DataSetSupport(int size) {
040            setSize(size);
041        }
042    
043        public void populateMessage(Exchange exchange, long messageIndex) throws Exception {
044            Message in = exchange.getIn();
045            in.setBody(createMessageBody(messageIndex));
046            in.setHeaders(getDefaultHeaders());
047            applyHeaders(exchange, messageIndex);
048    
049            if (outputTransformer != null) {
050                outputTransformer.process(exchange);
051            }
052        }
053    
054        public void assertMessageExpected(DataSetEndpoint dataSetEndpoint, Exchange expected, Exchange actual, long index) throws Exception {
055            Object expectedBody = expected.getIn().getBody();
056            Object actualBody = actual.getIn().getBody();
057            if (expectedBody != null) {
058                // lets coerce to the correct type
059                actualBody = ExchangeHelper.getMandatoryInBody(actual, expectedBody.getClass());
060            }
061            DataSetEndpoint.assertEquals("message body", expectedBody, actualBody, actual);
062        }
063    
064        // Properties
065        //-------------------------------------------------------------------------
066    
067        public long getSize() {
068            return size;
069        }
070    
071        public void setSize(long size) {
072            this.size = size;
073        }
074    
075        public long getReportCount() {
076            if (reportCount <= 0) {
077                reportCount = getSize() / 5;
078            }
079            return reportCount;
080        }
081    
082        /**
083         * Sets the number of messages in a group on which we will report that messages have been received.
084         */
085        public void setReportCount(long reportCount) {
086            this.reportCount = reportCount;
087        }
088    
089        public Map<String, Object> getDefaultHeaders() {
090            if (defaultHeaders == null) {
091                defaultHeaders = new HashMap<String, Object>();
092                populateDefaultHeaders(defaultHeaders);
093            }
094            return defaultHeaders;
095        }
096    
097        public void setDefaultHeaders(Map<String, Object> defaultHeaders) {
098            this.defaultHeaders = defaultHeaders;
099        }
100    
101        public Processor getOutputTransformer() {
102            return outputTransformer;
103        }
104    
105        public void setOutputTransformer(Processor outputTransformer) {
106            this.outputTransformer = outputTransformer;
107        }
108    
109        // Implementation methods
110        //-------------------------------------------------------------------------
111    
112        protected abstract Object createMessageBody(long messageIndex);
113    
114        /**
115         * Allows derived classes to add some custom headers for a given message
116         */
117        protected void applyHeaders(Exchange exchange, long messageIndex) {
118        }
119    
120        /**
121         * Allows derived classes to customize a default set of properties
122         */
123        protected void populateDefaultHeaders(Map<String, Object> map) {
124        }
125    }