Details
-
New Feature
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
None
-
None
Description
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.
I found this library (BSD license) that provides for reflection based cloning:
http://commonj.googlecode.com/svn/trunk/src/org/jcommon/clone/
Based on a blog I read here:
http://www.matthicks.com/2008/05/fastest-deep-cloning.html
DataFormatDefinition
public static DataFormat getDataFormat(RouteContext routeContext, DataFormatDefinition type, String ref) { if (type == null) { ObjectHelper.notNull(ref, "ref or type"); // try to let resolver see if it can resolve it, its not always possible int pos = ref.indexOf( '?' ); if ( pos < 0 ) { type = routeContext.getCamelContext().resolveDataFormatDefinition( ref ); } else { type = routeContext.getCamelContext().resolveDataFormatDefinition( ref.substring(0, pos -1 ) ); } if (type != null && pos >= 0 ) { try { Map<String, Object> parameters = URISupport.parseQuery( ref.substring( pos ) ); 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); } }