public static void augmentNodes(RouteContext routeContext, ProcessorDefinition nav, Set visited) {
if ( !nav.getOutputs().isEmpty() ) {
List<ProcessorDefinition> outputs = nav.getOutputs();
for ( int i = 0; i < outputs.size(); i++ ) {
ProcessorDefinition child = outputs.get( i );//it.next();
if ( child instanceof ToDefinition) {
ToDefinition to = ( ToDefinition ) child;
if (to.getUri().startsWith( "cxfrs" ) && !visited.contains( to ) ) {
BeanDefinition beanDef = new BeanDefinition();
beanDef.setBeanType( PreCxfrs.class );
outputs.add( i, beanDef ); // insert before cxfrs
beanDef = new BeanDefinition();
beanDef.setBeanType( PostCxfrs.class );
outputs.add( i+2, beanDef ); // insert after cxfrs
i = i + 2;// adjust for the two inserts
}
} else if ( child instanceof MarshalDefinition ) {
MarshalDefinition m = (MarshalDefinition) child;
DataFormatDefinition dformatDefinition = m.getDataFormatType();
if ( dformatDefinition == null ) {
String ref = m.getRef();
if ( "json".equals( ref ) ) {
dformatDefinition = new XStreamDataFormat();
((XStreamDataFormat)dformatDefinition).setDriver( "json" );
} else if ( "xstream".equals( ref ) ) {
dformatDefinition = new XStreamDataFormat();
} else if ( "jaxb".equals( ref ) ) {
dformatDefinition = new JaxbDataFormat();
} else {
dformatDefinition = routeContext.getCamelContext().resolveDataFormatDefinition(ref);
}
}
// always clone before changing
dformatDefinition = new FastCloner().deepClone( dformatDefinition );
if ( dformatDefinition instanceof JaxbDataFormat ) {
dformatDefinition = augmentJaxbDataFormatDefinition( (JaxbDataFormat) dformatDefinition );
} else if ( dformatDefinition instanceof XStreamDataFormat ) {
XStreamDataFormat xstreamDataFormat = ( XStreamDataFormat )dformatDefinition;
if ( "json".equals( xstreamDataFormat.getDriver() )) {
dformatDefinition = XStreamJson.newJSonMarshaller( xstreamDataFormat );;
} else {
dformatDefinition = XStreamXml.newXStreamMarshaller( (XStreamDataFormat) dformatDefinition );
}
}
m.setDataFormatType( dformatDefinition ); // repoint the marshaller, if it was cloned
} else if ( child instanceof UnmarshalDefinition ) {
UnmarshalDefinition m = (UnmarshalDefinition) child;
DataFormatDefinition dformatDefinition = m.getDataFormatType();
if ( dformatDefinition == null ) {
String ref = m.getRef();
if ( "json".equals( ref ) ) {
dformatDefinition = new XStreamDataFormat();
((XStreamDataFormat)dformatDefinition).setDriver( "json" );
} else if ( "xstream".equals( ref ) ) {
dformatDefinition = new XStreamDataFormat();
} else if ( "jaxb".equals( ref ) ) {
dformatDefinition = new JaxbDataFormat();
} else {
dformatDefinition = routeContext.getCamelContext().resolveDataFormatDefinition(ref);
}
}
// always clone before changing
dformatDefinition = new FastCloner().deepClone( dformatDefinition );
// Augment the Jaxb DataFormatDefinition, but clone first so we don't alter the original.
if ( dformatDefinition instanceof JaxbDataFormat ) {
dformatDefinition = augmentJaxbDataFormatDefinition( (JaxbDataFormat) dformatDefinition );
} else if ( dformatDefinition instanceof XStreamDataFormat ) {
XStreamDataFormat xstreamDataFormat = ( XStreamDataFormat )dformatDefinition;
if ( "json".equals( xstreamDataFormat.getDriver() )) {
dformatDefinition = XStreamJson.newJSonMarshaller( xstreamDataFormat );;
} else {
dformatDefinition = XStreamXml.newXStreamMarshaller( (XStreamDataFormat) dformatDefinition );
}
}
m.setDataFormatType( dformatDefinition ); // repoint the marshaller, if it was cloned
}
}
for ( Iterator<ProcessorDefinition> it = nav.getOutputs().iterator(); it.hasNext(); ) {
ProcessorDefinition child = it.next();
augmentNodes( routeContext,
child,
visited );
}
}