in dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java [122:313]
protected RouteBuilder builder(final YamlDeserializationContext ctx, final Node root) {
// we need to keep track of already configured items as the yaml-dsl returns a
// RouteConfigurationBuilder that is capable of both route and route
// configurations
// which can lead to the same items being processed twice
final Set<Integer> indexes = new HashSet<>();
return new RouteConfigurationBuilder() {
@Override
public void configure() throws Exception {
setDeserializationContext(root, ctx);
Object target = preConfigureNode(root, ctx, false);
if (target == null) {
return;
}
Iterator<?> it = ObjectHelper.createIterator(target);
while (it.hasNext()) {
target = it.next();
if (target instanceof Node && isSequenceNode((Node) target)) {
SequenceNode seq = asSequenceNode((Node) target);
for (Node node : seq.getValue()) {
int idx = -1;
if (node.getStartMark().isPresent()) {
idx = node.getStartMark().get().getIndex();
}
if (idx == -1 || !indexes.contains(idx)) {
Object item = ctx.mandatoryResolve(node).construct(node);
boolean accepted = doConfigure(item);
if (accepted && idx != -1) {
indexes.add(idx);
}
}
}
} else {
doConfigure(target);
}
}
// knowing this is the last time an YAML may have been parsed, we can clear the
// cache
// (route may get reloaded later)
Resource resource = ctx.getResource();
if (resource != null) {
preparseDone.remove(resource.getLocation());
}
beansDeserializer.clearCache();
}
private boolean doConfigure(Object item) throws Exception {
if (item instanceof OutputAwareFromDefinition) {
RouteDefinition route = new RouteDefinition();
route.setInput(((OutputAwareFromDefinition) item).getDelegate());
route.setOutputs(((OutputAwareFromDefinition) item).getOutputs());
CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
getRouteCollection().route(route);
return true;
} else if (item instanceof RouteDefinition) {
CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
getRouteCollection().route((RouteDefinition) item);
return true;
} else if (item instanceof CamelContextCustomizer) {
((CamelContextCustomizer) item).configure(getCamelContext());
return true;
} else if (item instanceof InterceptFromDefinition) {
if (!getRouteCollection().getRoutes().isEmpty()) {
throw new IllegalArgumentException(
"interceptFrom must be defined before any routes in the RouteBuilder");
}
CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
getRouteCollection().getInterceptFroms().add((InterceptFromDefinition) item);
return true;
} else if (item instanceof InterceptDefinition) {
if (!getRouteCollection().getRoutes().isEmpty()) {
throw new IllegalArgumentException(
"intercept must be defined before any routes in the RouteBuilder");
}
CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
getRouteCollection().getIntercepts().add((InterceptDefinition) item);
return true;
} else if (item instanceof InterceptSendToEndpointDefinition) {
if (!getRouteCollection().getRoutes().isEmpty()) {
throw new IllegalArgumentException(
"interceptSendToEndpoint must be defined before any routes in the RouteBuilder");
}
CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
getRouteCollection().getInterceptSendTos().add((InterceptSendToEndpointDefinition) item);
return true;
} else if (item instanceof OnCompletionDefinition) {
if (!getRouteCollection().getRoutes().isEmpty()) {
throw new IllegalArgumentException(
"onCompletion must be defined before any routes in the RouteBuilder");
}
CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
getRouteCollection().getOnCompletions().add((OnCompletionDefinition) item);
return true;
} else if (item instanceof OnExceptionDefinition) {
if (!getRouteCollection().getRoutes().isEmpty()) {
throw new IllegalArgumentException(
"onException must be defined before any routes in the RouteBuilder");
}
CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
getRouteCollection().getOnExceptions().add((OnExceptionDefinition) item);
return true;
} else if (item instanceof ErrorHandlerFactory) {
if (!getRouteCollection().getRoutes().isEmpty()) {
throw new IllegalArgumentException(
"errorHandler must be defined before any routes in the RouteBuilder");
}
errorHandler((ErrorHandlerFactory) item);
return true;
} else if (item instanceof RouteTemplateDefinition) {
CamelContextAware.trySetCamelContext(getRouteTemplateCollection(), getCamelContext());
getRouteTemplateCollection().routeTemplate((RouteTemplateDefinition) item);
return true;
} else if (item instanceof TemplatedRouteDefinition) {
CamelContextAware.trySetCamelContext(getTemplatedRouteCollection(), getCamelContext());
getTemplatedRouteCollection().templatedRoute((TemplatedRouteDefinition) item);
return true;
} else if (item instanceof RestDefinition) {
RestDefinition definition = (RestDefinition) item;
for (VerbDefinition verb : definition.getVerbs()) {
verb.setRest(definition);
}
CamelContextAware.trySetCamelContext(getRestCollection(), getCamelContext());
getRestCollection().rest(definition);
return true;
} else if (item instanceof RestConfigurationDefinition) {
((RestConfigurationDefinition) item).asRestConfiguration(
getCamelContext(),
getCamelContext().getRestConfiguration());
return true;
}
return false;
}
@Override
public void configuration() throws Exception {
setDeserializationContext(root, ctx);
Object target = preConfigureNode(root, ctx, false);
if (target == null) {
return;
}
Iterator<?> it = ObjectHelper.createIterator(target);
while (it.hasNext()) {
target = it.next();
if (target instanceof Node && isSequenceNode((Node) target)) {
SequenceNode seq = asSequenceNode((Node) target);
for (Node node : seq.getValue()) {
int idx = -1;
if (node.getStartMark().isPresent()) {
idx = node.getStartMark().get().getIndex();
}
if (idx == -1 || !indexes.contains(idx)) {
if (node.getNodeType() == NodeType.MAPPING) {
MappingNode mn = asMappingNode(node);
for (NodeTuple nt : mn.getValue()) {
String key = asText(nt.getKeyNode());
// only accept route-configuration
if ("route-configuration".equals(key) || "routeConfiguration".equals(key)) {
Object item = ctx.mandatoryResolve(node).construct(node);
boolean accepted = doConfiguration(item);
if (accepted && idx != -1) {
indexes.add(idx);
}
}
}
}
}
}
} else {
doConfiguration(target);
}
}
}
private boolean doConfiguration(Object item) {
if (item instanceof RouteConfigurationDefinition) {
CamelContextAware.trySetCamelContext(getRouteConfigurationCollection(), getCamelContext());
getRouteConfigurationCollection().routeConfiguration((RouteConfigurationDefinition) item);
return true;
}
return false;
}
};
}