Hi, It's much clearer after the discussion, I will head to clean up the CamelTransportContants.CONTENT_TYPE later today.
Thanks, Willem Claus Ibsen wrote: > On Thu, May 7, 2009 at 6:29 AM, William Tam <email.w...@gmail.com> wrote: >> On Wed, May 6, 2009 at 11:55 PM, Claus Ibsen <claus.ib...@gmail.com> wrote: >>> On Thu, May 7, 2009 at 5:02 AM, William Tam <email.w...@gmail.com> wrote: >>>> On Wed, May 6, 2009 at 9:57 PM, Willem Jiang <willem.ji...@gmail.com> >>>> wrote: >>>>> Hi William, >>>>> >>>>> Since the JMS can't accept the header which's name has the '-' >>>>> character, we introduce the CamelTransportContants.CONTENT_TYPE for it. >>>> I thought JMS could not handle dots in header names (that's why we >>>> went from org.apache.camel convention to CamelHeaderName "case" >>>> convention). My memory may be wrong. >>> Hi >>> >>> In Camel 2.0 we have added to the JMS component so it will be able to >>> transfer Content-Type with the hyphen, as its a common header. >>> If you use Camel on both sides then it will automatic revert it back >>> to normal again. It replaces - with a _HYPHEN_ constant. So its >>> transfered as Content_HYPHEN_Type. >> In 2.0, does that mean it is OK to have hyphen in header? If so, we >> could clean up CamelTransportContants.CONTENT_TYPE? > Yes the default JmsKeyFormatStrategy in Camel 2.0 is for the JMS component: > > public class DefaultJmsKeyFormatStrategy implements JmsKeyFormatStrategy { > > public String encodeKey(String key) { > String answer = key.replace(".", "_"); > answer = answer.replaceAll("-", "_HYPHEN_"); > return answer; > } > > public String decodeKey(String key) { > String answer = key.replaceAll("_HYPHEN_", "-"); > answer = answer.replace("_", "."); > return answer; > } > > } > > > >>>>> After checking the on wire message between the client and CXF consumer, >>>>> I found there are two lines of "content-type" in the http header. >>>>> One is "content-type", the other is "Content-Type". >>>> The comment in code is kinda off. >>>> >>>>> So I added the filter of "content-type", and keep using "content.type" >>>>> in the Camel message. >>>>> >>>>> Willem >>>>> >>>>> >>>>> William Tam wrote: >>>>>> Hi Willem, >>>>>> >>>>>> I don't think adding "content-type" to the filters is necessary. >>>>>> 1. The header is "Content-Type" not "content-type", so the change >>>>>> does not really affect anything. >>>>>> 2. Putting that aside. If we add filters for "Content-Type", it stops >>>>>> the propagating from Camel header to/from CXF header, which we don't >>>>>> want. >>>>>> >>>>>> We probably should clean up the use of >>>>>> CamelTransportContants.CONTENT_TYPE (value = content.type) and just >>>>>> use Message.CONTENT_TYPE (value = Content-Type). >>>>>> >>>>>> In DefaultCxfBinding.java, I don't see why we need to invent a header >>>>>> constant (CamelTransportContants.CONTENT_TYPE) only used by camel-cxf >>>>>> and have to map it back and forth. >>>>>> >>>>>> >>>>>> That is, we can eliminate CamelTransportContants.CONTENT_TYPE and use >>>>>> Message.CONTENT_TYPE consistently in: >>>>>> >>>>>> // propagate content type >>>>>> String key = Message.CONTENT_TYPE; >>>>>> Object value = cxfMessage.get(key); >>>>>> if (value != null && >>>>>> !headerFilterStrategy.applyFilterToExternalHeaders(key, value, >>>>>> exchange)) { >>>>>> camelHeaders.put(CamelTransportConstants.CONTENT_TYPE, >>>>>> value); >>>>>> if (LOG.isTraceEnabled()) { >>>>>> LOG.trace("Populate header from CXF header=" + key + " >>>>>> value=" + value); >>>>>> } >>>>>> } >>>>>> >>>>>> ... >>>>>> // put content type in exchange >>>>>> if >>>>>> (CamelTransportConstants.CONTENT_TYPE.equals(entry.getKey())) { >>>>>> cxfExchange.put(Message.CONTENT_TYPE, entry.getValue()); >>>>>> continue; >>>>>> } >>>>>> >>>>>> Thoughts? >>>>>> >>>>>> ============================================================================== >>>>>>> --- >>>>>>> camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfHeaderFilterStrategy.java >>>>>>> (original) >>>>>>> +++ >>>>>>> camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfHeaderFilterStrategy.java >>>>>>> Wed May 6 04:56:14 2009 >>>>>>> @@ -63,6 +63,11 @@ >>>>>>> getOutFilter().add(Message.PROTOCOL_HEADERS); >>>>>>> getInFilter().add(Message.PROTOCOL_HEADERS); >>>>>>> >>>>>>> + // Since the DefaultCxfBinding deal with the content-type >>>>>>> separately. >>>>>>> + // We need to filter this header >>>>>>> + getOutFilter().add("content-type"); >>>>>>> + getInFilter().add("content-type"); >>>>>>> + >>>>>>> // initialize message header filter map with default SOAP filter >>>>>>> messageHeaderFiltersMap = new HashMap<String, >>>>>>> MessageHeaderFilter>(); >>>>>>> addToMessageHeaderFilterMap(new SoapMessageHeaderFilter()); >>>>>>> >>>>> >>> >>> >>> -- >>> Claus Ibsen >>> Apache Camel Committer >>> >>> Open Source Integration: http://fusesource.com >>> Blog: http://davsclaus.blogspot.com/ >>> Twitter: http://twitter.com/davsclaus >>> Apache Camel Reference Card: >>> http://refcardz.dzone.com/refcardz/enterprise-integration >>> Interview with me: >>> http://architects.dzone.com/articles/interview-claus-ibsen-about?mz=7893-progress >>> > > >