/*
* Copyright 2002-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.messaging.Message;
import org.springframework.integration.core.MessageSelector;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.integration.selector.MessageSelectorChain;
import org.springframework.integration.selector.MessageSelectorChain.VotingStrategy;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Mark Fisher
* @author Iwein Fuld
*/
@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class SelectorChainParserTests {
@Autowired
ApplicationContext context;
@Test
public void selectorChain() {
MessageSelector selector1 = (MessageSelector) context.getBean("selector1");
MessageSelector selector2 = (MessageSelector) context.getBean("selector2");
MessageSelectorChain chain = (MessageSelectorChain) context.getBean("selectorChain");
List<MessageSelector> selectors = this.getSelectors(chain);
assertEquals(VotingStrategy.ALL, this.getStrategy(chain));
assertEquals(selector1, selectors.get(0));
assertEquals(selector2, selectors.get(1));
assertTrue(chain.accept(new GenericMessage<String>("test")));
assertTrue(this.context.containsBean("pojoSelector"));
}
@Test
public void nestedSelectorChain() {
MessageSelector selector1 = (MessageSelector) context.getBean("selector1");
MessageSelector selector2 = (MessageSelector) context.getBean("selector2");
MessageSelector selector3 = (MessageSelector) context.getBean("selector3");
MessageSelector selector4 = (MessageSelector) context.getBean("selector4");
MessageSelector selector5 = (MessageSelector) context.getBean("selector5");
MessageSelector selector6 = (MessageSelector) context.getBean("selector6");
MessageSelectorChain chain1 = (MessageSelectorChain) context.getBean("nestedSelectorChain");
assertEquals(VotingStrategy.MAJORITY, this.getStrategy(chain1));
List<MessageSelector> selectorList1 = this.getSelectors(chain1);
assertEquals(selector1, selectorList1.get(0));
assertTrue(selectorList1.get(1) instanceof MessageSelectorChain);
MessageSelectorChain chain2 = (MessageSelectorChain) selectorList1.get(1);
assertEquals(VotingStrategy.ALL, this.getStrategy(chain2));
List<MessageSelector> selectorList2 = this.getSelectors(chain2);
assertEquals(selector2, selectorList2.get(0));
assertTrue(selectorList2.get(1) instanceof MessageSelectorChain);
MessageSelectorChain chain3 = (MessageSelectorChain) selectorList2.get(1);
assertEquals(VotingStrategy.ANY, this.getStrategy(chain3));
List<MessageSelector> selectorList3 = this.getSelectors(chain3);
assertEquals(selector3, selectorList3.get(0));
assertEquals(selector4, selectorList3.get(1));
assertEquals(selector5, selectorList2.get(2));
assertTrue(selectorList1.get(2) instanceof MessageSelectorChain);
MessageSelectorChain chain4 = (MessageSelectorChain) selectorList1.get(2);
assertEquals(VotingStrategy.MAJORITY_OR_TIE, this.getStrategy(chain4));
List<MessageSelector> selectorList4 = this.getSelectors(chain4);
assertEquals(selector6, selectorList4.get(0));
assertTrue(chain1.accept(new GenericMessage<String>("test1")));
assertTrue(chain2.accept(new GenericMessage<String>("test2")));
assertTrue(chain3.accept(new GenericMessage<String>("test3")));
assertTrue(chain4.accept(new GenericMessage<String>("test4")));
}
@SuppressWarnings("unchecked")
private List<MessageSelector> getSelectors(MessageSelectorChain chain) {
DirectFieldAccessor accessor = new DirectFieldAccessor(chain);
return (List<MessageSelector>) accessor.getPropertyValue("selectors");
}
private VotingStrategy getStrategy(MessageSelectorChain chain) {
return (VotingStrategy) new DirectFieldAccessor(chain).getPropertyValue("votingStrategy");
}
public static class StubMessageSelector implements MessageSelector {
public boolean accept(Message<?> message) {
return true;
}
}
public static class StubPojoSelector {
public boolean accept(Message<?> message) {
return true;
}
}
}