DataFormat's should allow url query like parameters
---------------------------------------------------

                 Key: CAMEL-2921
                 URL: https://issues.apache.org/activemq/browse/CAMEL-2921
             Project: Apache Camel
          Issue Type: Improvement
          Components: camel-core
            Reporter: Mark Proctor


It would be nice if we could customise DataFormatDefinitions inline:
marshal( "jaxb?contextPath=org.domain.package" )

Here is an outline of some code I think that would achieve this, however to be 
safe (imho) the resolver should only ever returned "cloned" copies of any 
registered DataFormatDefinition; to save the originally source from being 
altered.

DataFormatDefinition
    public static DataFormat getDataFormat(RouteContext routeContext, 
DataFormatDefinition type, String ref) {
        if (type == null) {
            ObjectHelper.notNull(ref, "ref or type");
            
            int pos = ref.indexOf( '?' );
            if ( pos < 0 ) {                                
                type = 
routeContext.getCamelContext().resolveDataFormatDefinition( ref );
            } else {
                type = 
routeContext.getCamelContext().resolveDataFormatDefinition( ref.substring(0, 
pos -1 ) );
            }        

            // try to let resolver see if it can resolve it, its not always 
possible
            type = 
routeContext.getCamelContext().resolveDataFormatDefinition(ref);

            if (type != null &&  pos >= 0 ) {
                try {
                    Map<String, Object> parameters = URISupport.parseQuery( 
ref.substring( pos ) ); // 1 to skip the leading ?
                    try {
                        
IntrospectionSupport.setProperties(routeContext.getCamelContext().getTypeConverter(),
 type, parameters);
                    } catch (Exception e) {
                        throw new RuntimeException( "Unable to set 
DataFormatDefinition properties '" + ref + "'", e);
                    }
                } catch (URISyntaxException e) {
                    throw new RuntimeException( "Unable to parse parameters " + 
ref, e);
                }
                
                return type.getDataFormat(routeContext);
            }

            DataFormat dataFormat = 
routeContext.getCamelContext().resolveDataFormat(ref);
            if (dataFormat == null) {
                throw new IllegalArgumentException("Cannot find data format in 
registry with ref: " + ref);
            }

            return dataFormat;
        } else {
            return type.getDataFormat(routeContext);
        }
    }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to