INT-1338, Added support for property placeholder

This commit is contained in:
Oleg Zhurakousky
2010-08-23 18:10:58 +00:00
parent 3d863a1917
commit 2c7b57448b
7 changed files with 36 additions and 54 deletions

View File

@@ -262,22 +262,4 @@ public abstract class IntegrationNamespaceUtils {
+ " are not allowed together.");
return innerComponentDefinition;
}
public static Class<?> convertFqClassNameToClassObject(String fullyQualifiedClassname, ParserContext parserContext){
Assert.isTrue(StringUtils.hasText(fullyQualifiedClassname), "'fullyQualifiedClassname' must be provided");
Assert.notNull(parserContext, "'parserContext' must be provided");
ClassLoader classLoader = parserContext.getReaderContext().getBeanClassLoader();
if (classLoader == null) {
classLoader = ClassUtils.getDefaultClassLoader();
}
if (classLoader != null){
try {
return classLoader.loadClass(fullyQualifiedClassname);
} catch (Exception e) {
// no handling required, method may return null
}
}
return null;
}
}

View File

@@ -42,11 +42,12 @@ public class ApplicationEventInboundChannelAdapter extends MessageProducerSuppor
* this adapter should send to the message channel. By default, all event
* types will be sent.
*/
public void setEventTypes(Set<Class<? extends ApplicationEvent>> eventTypes) {
@SuppressWarnings("unchecked")
public void setEventTypes(Class<? extends ApplicationEvent>[] eventTypes) {
Assert.notEmpty(eventTypes, "at least one event type is required");
synchronized (this.eventTypes) {
this.eventTypes.clear();
this.eventTypes.addAll(eventTypes);
this.eventTypes.addAll(CollectionUtils.arrayToList(eventTypes));
}
}

View File

@@ -15,20 +15,12 @@
*/
package org.springframework.integration.event.config;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.integration.config.xml.AbstractChannelAdapterParser;
import org.springframework.integration.config.xml.IntegrationNamespaceUtils;
import org.springframework.integration.event.ApplicationEventInboundChannelAdapter;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
/**
@@ -37,27 +29,12 @@ import org.w3c.dom.Element;
*/
public class EventInboundChannelAdapterParser extends AbstractChannelAdapterParser{
@SuppressWarnings("unchecked")
@Override
protected AbstractBeanDefinition doParse(Element element,
ParserContext parserContext, String channelName) {
BeanDefinitionBuilder adapterBuilder = BeanDefinitionBuilder.rootBeanDefinition(ApplicationEventInboundChannelAdapter.class);
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(adapterBuilder, element, "channel", "outputChannel");
String stringEventTypes = element.getAttribute("event-types");
if (StringUtils.hasText(stringEventTypes)){
//Set<String> eventTypes = StringUtils.commaDelimitedListToSet(stringEventTypes);
StringTokenizer tokenizer = new StringTokenizer(stringEventTypes, " ,");
Set<Class<? extends ApplicationEvent>> applicationEvents = new HashSet<Class<? extends ApplicationEvent>>();
while (tokenizer.hasMoreTokens()) {
String fullyQualifiedClassname = tokenizer.nextToken();
Class<? extends ApplicationEvent> clazz =
(Class<? extends ApplicationEvent>) IntegrationNamespaceUtils.convertFqClassNameToClassObject(fullyQualifiedClassname, parserContext);
Assert.notNull(clazz, "Class for the event type '" + fullyQualifiedClassname + "' can not be located");
applicationEvents.add(clazz);
}
adapterBuilder.addPropertyValue("eventTypes", applicationEvents);
}
//IntegrationNamespaceUtils.setReferenceIfAttributeDefined(adapterBuilder, element, "event", "eventTypes");
IntegrationNamespaceUtils.setValueIfAttributeDefined(adapterBuilder, element, "event-types");
return adapterBuilder.getBeanDefinition();
}

View File

@@ -16,10 +16,6 @@
package org.springframework.integration.event;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.ContextClosedEvent;
@@ -57,14 +53,13 @@ public class ApplicationEventInboundChannelAdapterTests {
assertEquals("event2", ((ApplicationEvent) message3.getPayload()).getSource());
}
@SuppressWarnings("unchecked")
@Test
public void onlyConfiguredEventTypesAreSent() {
QueueChannel channel = new QueueChannel();
ApplicationEventInboundChannelAdapter adapter = new ApplicationEventInboundChannelAdapter();
adapter.setOutputChannel(channel);
Set<Class<? extends ApplicationEvent>> events = new HashSet<Class<? extends ApplicationEvent>>();
events.add(TestApplicationEvent1.class);
adapter.setEventTypes(events);
adapter.setEventTypes(new Class[]{TestApplicationEvent1.class});
Message<?> message1 = channel.receive(0);
assertNull(message1);
adapter.onApplicationEvent(new TestApplicationEvent1());

View File

@@ -1,11 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-event="http://www.springframework.org/schema/integration/event"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.0.xsd
http://www.springframework.org/schema/integration/event http://www.springframework.org/schema/integration/event/spring-integration-event-2.0.xsd">
http://www.springframework.org/schema/integration/event http://www.springframework.org/schema/integration/event/spring-integration-event-2.0.xsd"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-event="http://www.springframework.org/schema/integration/event">
<int-event:inbound-channel-adapter id="eventAdapterSimple" channel="input"/>
@@ -19,5 +21,14 @@
<int:channel id="inputFiltered">
<int:queue/>
</int:channel>
<int-event:inbound-channel-adapter id="eventAdapterFilteredPlaceHolder" channel="inputFilteredPlaceHolder"
event-types="${event.types}"/>
<int:channel id="inputFilteredPlaceHolder">
<int:queue/>
</int:channel>
<context:property-placeholder location="classpath:org/springframework/integration/event/config/inbound-adapter.properties"/>
</beans>

View File

@@ -74,6 +74,21 @@ public class EventInboundChannelAdapterParserTests {
assertTrue(eventTypes.contains(SampleEvent.class));
assertTrue(eventTypes.contains(AnotherSampleEvent.class));
}
@SuppressWarnings("unchecked")
@Test
public void validateEventParserWithEventTypesAndPlaceholder() {
Object adapter = context.getBean("eventAdapterFilteredPlaceHolder");
Assert.assertNotNull(adapter);
Assert.assertTrue(adapter instanceof ApplicationEventInboundChannelAdapter);
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
Assert.assertEquals(context.getBean("inputFilteredPlaceHolder"), adapterAccessor.getPropertyValue("outputChannel"));
Set<Class<? extends ApplicationEvent>> eventTypes = (Set<Class<? extends ApplicationEvent>>) adapterAccessor.getPropertyValue("eventTypes");
assertNotNull(eventTypes);
assertTrue(eventTypes.size() == 2);
assertTrue(eventTypes.contains(SampleEvent.class));
assertTrue(eventTypes.contains(AnotherSampleEvent.class));
}
@Test
public void validateUsage() {

View File

@@ -0,0 +1 @@
event.types=org.springframework.integration.event.config.EventInboundChannelAdapterParserTests$AnotherSampleEvent, org.springframework.integration.event.config.EventInboundChannelAdapterParserTests$SampleEvent