From 3640e411075b336b7f7a48476ba66b42caaac4aa Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Sat, 4 Jul 2009 19:21:26 +0000 Subject: [PATCH] HeaderBasedDestinationProvider now supports URI typed header values (in addition to String). --- .../HeaderBasedDestinationProvider.java | 91 +++++++++++-------- 1 file changed, 53 insertions(+), 38 deletions(-) diff --git a/org.springframework.integration.ws/src/main/java/org/springframework/integration/ws/destination/HeaderBasedDestinationProvider.java b/org.springframework.integration.ws/src/main/java/org/springframework/integration/ws/destination/HeaderBasedDestinationProvider.java index 71388800ab..4ea3d4dea8 100644 --- a/org.springframework.integration.ws/src/main/java/org/springframework/integration/ws/destination/HeaderBasedDestinationProvider.java +++ b/org.springframework.integration.ws/src/main/java/org/springframework/integration/ws/destination/HeaderBasedDestinationProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 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. @@ -17,55 +17,70 @@ package org.springframework.integration.ws.destination; import org.springframework.integration.core.Message; -import org.springframework.integration.message.MessageDeliveryException; import org.springframework.integration.message.MessageHandlingException; import org.springframework.util.StringUtils; import org.springframework.util.Assert; import java.net.URI; - /** - * Determines URI based + * Determines a Web Service destination based on a URI provided in a header + * value. The header value's type may be either a {@link URI} or a String. + * + * @author Jonas Partner + * @author Mark Fisher + * @since 1.0.3 */ public class HeaderBasedDestinationProvider implements MessageAwareDestinationProvider { - private final URI defaultUri; + private final URI defaultUri; - private final String headerName; - - public HeaderBasedDestinationProvider(URI defaultUri, String headerName) { - Assert.isTrue(!(defaultUri == null && headerName ==null), "At least one of defaultURI or headerName must be provided"); - this.defaultUri = defaultUri; - this.headerName = headerName; - } - - public HeaderBasedDestinationProvider(URI defaultUri) { - this.defaultUri = defaultUri; - this.headerName = null; - } - - public HeaderBasedDestinationProvider( String headerName) { - this.defaultUri = null; - this.headerName = headerName; - } + private final String headerName; - public URI getDestination(Message message) { - URI uri = null; - if(StringUtils.hasText(headerName)) { - String headerValue = message.getHeaders().get(headerName, String.class); - if(StringUtils.hasText(headerValue)){ - uri = URI.create(headerValue); - } - } - if(uri == null){ - uri = defaultUri; - } + public HeaderBasedDestinationProvider(URI defaultUri, String headerName) { + Assert.isTrue(!(defaultUri == null && headerName == null), + "At least one of headerName or defaultUri must be provided"); + this.defaultUri = defaultUri; + this.headerName = headerName; + } + + public HeaderBasedDestinationProvider(URI defaultUri) { + this(defaultUri, null); + } + + public HeaderBasedDestinationProvider(String headerName) { + this(null, headerName); + } + + + public URI getDestination(Message message) { + URI uri = null; + if (StringUtils.hasText(this.headerName)) { + Object headerValue = message.getHeaders().get(this.headerName); + if (headerValue instanceof URI) { + uri = (URI) headerValue; + } + else if (headerValue instanceof String && StringUtils.hasText((String) headerValue)) { + uri = URI.create((String) headerValue); + } + else if (headerValue != null) { + throw new MessageHandlingException( + message, + "Invalid type for Web Service destination URI header '" + + this.headerName + + "', expected java.net.URI or java.lang.String, but received [" + + headerValue.getClass() + "]."); + } + } + if (uri == null) { + uri = defaultUri; + } + if (uri == null) { + throw new MessageHandlingException(message, + "Unable to determine URI for message and no default has been set."); + } + return uri; + } - if(uri == null){ - throw new MessageHandlingException(message,"Could not determine URI for message and no default set"); - } - return uri; - } }