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.mock;
019    
020    import org.apache.camel.Exchange;
021    import org.apache.camel.Expression;
022    import org.apache.camel.Predicate;
023    import static org.apache.camel.builder.ExpressionBuilder.bodyExpression;
024    import static org.apache.camel.builder.ExpressionBuilder.headerExpression;
025    import org.apache.camel.builder.Fluent;
026    import org.apache.camel.builder.FluentArg;
027    import org.apache.camel.builder.ValueBuilder;
028    
029    import java.util.ArrayList;
030    import java.util.List;
031    
032    /**
033     * A builder of assertions on message exchanges
034     *
035     * @version $Revision: 1.1 $
036     */
037    public abstract class AssertionClause<E extends Exchange> implements Runnable {
038    
039        private List<Predicate<E>> predicates = new ArrayList<Predicate<E>>();
040    
041        // Builder methods
042        //-------------------------------------------------------------------------
043    
044        /**
045         * Adds the given predicate to this assertion clause
046         */
047        public AssertionClause<E> predicate(Predicate<E> predicate) {
048            addPredicate(predicate);
049            return this;
050        }
051    
052        /**
053         * Returns a predicate and value builder for headers on an exchange
054         */
055        @Fluent
056        public ValueBuilder<E> header(@FluentArg("name")String name) {
057            Expression<E> expression = headerExpression(name);
058            return new PredicateValueBuilder(expression);
059        }
060    
061        /**
062         * Returns a predicate and value builder for the inbound body on an exchange
063         */
064        @Fluent
065        public PredicateValueBuilder body() {
066            Expression<E> expression = bodyExpression();
067            return new PredicateValueBuilder(expression);
068        }
069    
070        /**
071         * Returns a predicate and value builder for the inbound message body as a specific type
072         */
073        @Fluent
074        public <T> PredicateValueBuilder bodyAs(@FluentArg("class")Class<T> type) {
075            Expression<E> expression = bodyExpression(type);
076            return new PredicateValueBuilder(expression);
077        }
078    
079        /**
080         * Returns a predicate and value builder for the outbound body on an exchange
081         */
082        @Fluent
083        public PredicateValueBuilder outBody() {
084            Expression<E> expression = bodyExpression();
085            return new PredicateValueBuilder(expression);
086        }
087    
088        /**
089         * Returns a predicate and value builder for the outbound message body as a specific type
090         */
091        @Fluent
092        public <T> PredicateValueBuilder outBody(@FluentArg("class")Class<T> type) {
093            Expression<E> expression = bodyExpression(type);
094            return new PredicateValueBuilder(expression);
095        }
096    
097        /**
098         * Performs any assertions on the given exchange
099         */
100        protected void applyAssertionOn(MockEndpoint endpoint, int index, E exchange) {
101            for (Predicate<E> predicate : predicates) {
102                predicate.assertMatches(endpoint.getEndpointUri() + " ", exchange);
103            }
104        }
105    
106        protected void addPredicate(Predicate<E> predicate) {
107            predicates.add(predicate);
108        }
109    
110        public class PredicateValueBuilder extends ValueBuilder<E> {
111    
112            public PredicateValueBuilder(Expression<E> expression) {
113                super(expression);
114            }
115    
116            protected Predicate<E> onNewPredicate(Predicate<E> predicate) {
117                addPredicate(predicate);
118                return predicate;
119            }
120        }
121    }