1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.openehealth.ipf.platform.camel.core.model;
17
18 import static org.apache.camel.util.ObjectHelper.notNull;
19 import groovy.lang.Closure;
20
21 import groovy.transform.stc.ClosureParams;
22 import groovy.transform.stc.SimpleType;
23 import org.apache.camel.Expression;
24 import org.apache.camel.Processor;
25 import org.apache.camel.model.OutputDefinition;
26 import org.apache.camel.model.RouteDefinition;
27 import org.apache.camel.model.language.ExpressionDefinition;
28 import org.apache.camel.processor.aggregate.AggregationStrategy;
29 import org.apache.camel.processor.aggregate.UseLatestAggregationStrategy;
30 import org.apache.camel.spi.Metadata;
31 import org.apache.camel.spi.RouteContext;
32 import org.openehealth.ipf.platform.camel.core.closures.DelegatingAggregationStrategy;
33 import org.openehealth.ipf.platform.camel.core.process.splitter.Splitter;
34
35 import javax.xml.bind.annotation.*;
36
37
38
39
40
41
42
43
44
45
46
47
48 @Metadata(label = "ipf,eip")
49 @XmlRootElement(name = "splitter")
50 @XmlType(name = "CoreSplitterDefinitionType")
51 @XmlAccessorType(XmlAccessType.FIELD)
52 public class SplitterDefinition extends OutputDefinition<RouteDefinition> {
53
54 @XmlTransient
55 private AggregationStrategy aggregationStrategy;
56 @XmlElementRef
57 private ExpressionDefinition expressionDefinition;
58 @XmlAttribute
59 private String expressionBean;
60
61 public SplitterDefinition() {
62 }
63
64
65
66
67
68
69
70 public SplitterDefinition(Expression expression) {
71 notNull(expression, "expression");
72 expressionDefinition = new ExpressionDefinition(expression);
73 }
74
75
76
77
78
79
80
81 public SplitterDefinition(String expressionBean) {
82 notNull(expressionBean, "expressionBean");
83 this.expressionBean = expressionBean;
84 }
85
86 @Override
87 public Processor createProcessor(RouteContext routeContext) throws Exception {
88 Processor childProcessor = createChildProcessor(routeContext, false);
89 if (aggregationStrategy == null) {
90 aggregationStrategy = new UseLatestAggregationStrategy();
91 }
92 if (expressionBean != null) {
93 expressionDefinition = new ExpressionDefinition(routeContext.lookup(expressionBean, Expression.class));
94 }
95 Expression expression = expressionDefinition.createExpression(routeContext);
96 Splitter splitter = createSplitterInstance(expression, childProcessor);
97
98 splitter.aggregate(aggregationStrategy);
99
100 return splitter;
101 }
102
103 protected Splitter createSplitterInstance(Expression expression, Processor processor) {
104 return new Splitter(expression, processor);
105 }
106
107 @Override
108 public String getShortName() {
109 return "split";
110 }
111
112 @Override
113 public String toString() {
114 return "Splitter[" + expressionDefinition + " -> " + getOutputs() + "]";
115 }
116
117
118
119
120
121
122 public SplitterDefinition aggregationStrategy(@ClosureParams(value = SimpleType.class, options = { "org.apache.camel.Exchange", "org.apache.camel.Exchange"})
123 Closure aggregationStrategy) {
124 return aggregationStrategy(new DelegatingAggregationStrategy(aggregationStrategy));
125 }
126
127
128
129
130
131
132 public SplitterDefinition aggregationStrategy(AggregationStrategy aggregationStrategy) {
133 notNull(aggregationStrategy, "aggregationStrategy");
134 this.aggregationStrategy = aggregationStrategy;
135 return this;
136 }
137
138 }