001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.camel.model.cloud;
018
019import javax.xml.bind.annotation.XmlAccessType;
020import javax.xml.bind.annotation.XmlAccessorType;
021import javax.xml.bind.annotation.XmlAttribute;
022import javax.xml.bind.annotation.XmlElement;
023import javax.xml.bind.annotation.XmlElements;
024import javax.xml.bind.annotation.XmlRootElement;
025import javax.xml.bind.annotation.XmlTransient;
026
027import org.apache.camel.ExchangePattern;
028import org.apache.camel.Expression;
029import org.apache.camel.builder.ExpressionClause;
030import org.apache.camel.cloud.ServiceChooser;
031import org.apache.camel.cloud.ServiceDiscovery;
032import org.apache.camel.cloud.ServiceFilter;
033import org.apache.camel.cloud.ServiceLoadBalancer;
034import org.apache.camel.model.IdentifiedType;
035import org.apache.camel.spi.Metadata;
036
037/**
038 * Remote service call configuration
039 */
040@Metadata(label = "routing,cloud")
041@XmlRootElement(name = "serviceCallConfiguration")
042@XmlAccessorType(XmlAccessType.FIELD)
043public class ServiceCallConfigurationDefinition extends IdentifiedType {
044    @XmlAttribute
045    private String uri;
046    @XmlAttribute @Metadata(defaultValue = ServiceCallDefinitionConstants.DEFAULT_COMPONENT)
047    private String component;
048    @XmlAttribute
049    private ExchangePattern pattern;
050    @XmlAttribute
051    private String serviceDiscoveryRef;
052    @XmlTransient
053    private ServiceDiscovery serviceDiscovery;
054    @XmlAttribute
055    private String serviceFilterRef;
056    @XmlTransient
057    private ServiceFilter serviceFilter;
058    @XmlAttribute
059    private String serviceChooserRef;
060    @XmlTransient
061    private ServiceChooser serviceChooser;
062    @XmlAttribute
063    private String loadBalancerRef;
064    @XmlTransient
065    private ServiceLoadBalancer loadBalancer;
066    @XmlAttribute
067    private String expressionRef;
068    @XmlTransient
069    private Expression expression;
070    @XmlElements({
071        @XmlElement(name = "cachingServiceDiscovery", type = CachingServiceCallServiceDiscoveryConfiguration.class),
072        @XmlElement(name = "aggregatingServiceDiscovery", type = AggregatingServiceCallServiceDiscoveryConfiguration.class),
073        @XmlElement(name = "consulServiceDiscovery", type = ConsulServiceCallServiceDiscoveryConfiguration.class),
074        @XmlElement(name = "dnsServiceDiscovery", type = DnsServiceCallServiceDiscoveryConfiguration.class),
075        @XmlElement(name = "etcdServiceDiscovery", type = EtcdServiceCallServiceDiscoveryConfiguration.class),
076        @XmlElement(name = "kubernetesServiceDiscovery", type = KubernetesServiceCallServiceDiscoveryConfiguration.class),
077        @XmlElement(name = "staticServiceDiscovery", type = StaticServiceCallServiceDiscoveryConfiguration.class)}
078    )
079    private ServiceCallServiceDiscoveryConfiguration serviceDiscoveryConfiguration;
080
081    @XmlElements({
082        @XmlElement(name = "blacklistServiceFilter", type = BlacklistServiceCallServiceFilterConfiguration.class),
083        @XmlElement(name = "chainedServiceFilter", type = ChainedServiceCallServiceFilterConfiguration.class),
084        @XmlElement(name = "customServiceFilter", type = CustomServiceCallServiceFilterConfiguration.class),
085        @XmlElement(name = "healthyServiceFilter", type = HealthyServiceCallServiceFilterConfiguration.class),
086        @XmlElement(name = "passThroughServiceFilter", type = PassThroughServiceCallServiceFilterConfiguration.class)}
087    )
088    private ServiceCallServiceFilterConfiguration serviceFilterConfiguration;
089
090    @XmlElements({
091        @XmlElement(name = "ribbonLoadBalancer", type = RibbonServiceCallServiceLoadBalancerConfiguration.class),
092        @XmlElement(name = "defaultLoadBalancer", type = DefaultServiceCallServiceLoadBalancerConfiguration.class) }
093    )
094    private ServiceCallServiceLoadBalancerConfiguration loadBalancerConfiguration;
095
096    @XmlElements({
097        @XmlElement(name = "expression", type = ServiceCallExpressionConfiguration.class)}
098    )
099    private ServiceCallExpressionConfiguration expressionConfiguration;
100
101    public ServiceCallConfigurationDefinition() {
102    }
103
104    // *****************************
105    // Properties
106    // *****************************
107
108    public ExchangePattern getPattern() {
109        return pattern;
110    }
111
112    public void setPattern(ExchangePattern pattern) {
113        this.pattern = pattern;
114    }
115
116    public String getUri() {
117        return uri;
118    }
119
120    /**
121     * The uri of the endpoint to send to.
122     * The uri can be dynamic computed using the {@link org.apache.camel.language.simple.SimpleLanguage} expression.
123     */
124    public void setUri(String uri) {
125        this.uri = uri;
126    }
127
128    public String getComponent() {
129        return component;
130    }
131
132    /**
133     * The component to use.
134     */
135    public void setComponent(String component) {
136        this.component = component;
137    }
138
139    public String getServiceDiscoveryRef() {
140        return serviceDiscoveryRef;
141    }
142
143    /**
144     * Sets a reference to a custom {@link ServiceDiscovery} to use.
145     */
146    public void setServiceDiscoveryRef(String serviceDiscoveryRef) {
147        this.serviceDiscoveryRef = serviceDiscoveryRef;
148    }
149
150    public ServiceDiscovery getServiceDiscovery() {
151        return serviceDiscovery;
152    }
153
154    /**
155     * Sets a custom {@link ServiceDiscovery} to use.
156     */
157    public void setServiceDiscovery(ServiceDiscovery serviceDiscovery) {
158        this.serviceDiscovery = serviceDiscovery;
159    }
160
161    public String getServiceFilterRef() {
162        return serviceFilterRef;
163    }
164
165    /**
166     * Sets a reference to a custom {@link ServiceFilter} to use.
167     */
168    public void setServiceFilterRef(String serviceFilterRef) {
169        this.serviceFilterRef = serviceFilterRef;
170    }
171
172    public ServiceFilter getServiceFilter() {
173        return serviceFilter;
174    }
175
176    /**
177     * Sets a custom {@link ServiceFilter} to use.
178     */
179    public void setServiceFilter(ServiceFilter serviceFilter) {
180        this.serviceFilter = serviceFilter;
181    }
182
183    public String getServiceChooserRef() {
184        return serviceChooserRef;
185    }
186
187    /**
188     * Sets a reference to a custom {@link ServiceChooser} to use.
189     */
190    public void setServiceChooserRef(String serviceChooserRef) {
191        this.serviceChooserRef = serviceChooserRef;
192    }
193
194    public ServiceChooser getServiceChooser() {
195        return serviceChooser;
196    }
197
198    /**
199     * Sets a custom {@link ServiceChooser} to use.
200     */
201    public void setServiceChooser(ServiceChooser serviceChooser) {
202        this.serviceChooser = serviceChooser;
203    }
204
205    public String getLoadBalancerRef() {
206        return loadBalancerRef;
207    }
208
209    /**
210     * Sets a reference to a custom {@link ServiceLoadBalancer} to use.
211     */
212    public void setLoadBalancerRef(String loadBalancerRef) {
213        this.loadBalancerRef = loadBalancerRef;
214    }
215
216    public ServiceLoadBalancer getLoadBalancer() {
217        return loadBalancer;
218    }
219
220    /**
221     * Sets a custom {@link ServiceLoadBalancer} to use.
222     */
223    public void setLoadBalancer(ServiceLoadBalancer loadBalancer) {
224        this.loadBalancer = loadBalancer;
225    }
226
227    public String getExpressionRef() {
228        return expressionRef;
229    }
230
231    /**
232     * Set a reference to a custom {@link Expression} to use.
233     */
234    public void setExpressionRef(String expressionRef) {
235        this.expressionRef = expressionRef;
236    }
237
238    public Expression getExpression() {
239        return expression;
240    }
241
242    /**
243     * Set a custom {@link Expression} to use.
244     */
245    public void setExpression(Expression expression) {
246        this.expression = expression;
247    }
248
249    public ServiceCallServiceDiscoveryConfiguration getServiceDiscoveryConfiguration() {
250        return serviceDiscoveryConfiguration;
251    }
252
253    /**
254     * Configures the ServiceDiscovery using the given configuration.
255     */
256    public void setServiceDiscoveryConfiguration(ServiceCallServiceDiscoveryConfiguration serviceDiscoveryConfiguration) {
257        this.serviceDiscoveryConfiguration = serviceDiscoveryConfiguration;
258    }
259
260    public ServiceCallServiceFilterConfiguration getServiceFilterConfiguration() {
261        return serviceFilterConfiguration;
262    }
263
264    /**
265     * Configures the ServiceFilter using the given configuration.
266     */
267    public void setServiceFilterConfiguration(ServiceCallServiceFilterConfiguration serviceFilterConfiguration) {
268        this.serviceFilterConfiguration = serviceFilterConfiguration;
269    }
270
271    public ServiceCallServiceLoadBalancerConfiguration getLoadBalancerConfiguration() {
272        return loadBalancerConfiguration;
273    }
274
275    /**
276     * Configures theL oadBalancer using the given configuration.
277     */
278    public void setLoadBalancerConfiguration(ServiceCallServiceLoadBalancerConfiguration loadBalancerConfiguration) {
279        this.loadBalancerConfiguration = loadBalancerConfiguration;
280    }
281
282    public ServiceCallExpressionConfiguration getExpressionConfiguration() {
283        return expressionConfiguration;
284    }
285
286    /**
287     * Configures the Expression using the given configuration.
288     */
289    public void setExpressionConfiguration(ServiceCallExpressionConfiguration expressionConfiguration) {
290        this.expressionConfiguration = expressionConfiguration;
291    }
292
293    // *****************************
294    // Fluent API
295    // *****************************
296
297    /**
298     * Sets the default Camel component to use for calling the remote service.
299     * <p/>
300     * By default the http component is used. You can configure this to use <tt>netty4-http</tt>, <tt>jetty</tt>,
301     * <tt>restlet</tt> or some other components of choice. If the service is not HTTP protocol you can use other
302     * components such as <tt>mqtt</tt>, <tt>jms</tt>, <tt>amqp</tt> etc.
303     * <p/>
304     * If the service call has been configured using an uri, then the component from the uri is used instead
305     * of this default component.
306     */
307    public ServiceCallConfigurationDefinition component(String component) {
308        setComponent(component);
309        return this;
310    }
311
312    /**
313     * Sets the uri of the service to use
314     */
315    public ServiceCallConfigurationDefinition uri(String uri) {
316        setUri(uri);
317        return this;
318    }
319
320    /**
321     * Sets the optional {@link ExchangePattern} used to invoke this endpoint
322     */
323    public ServiceCallConfigurationDefinition pattern(ExchangePattern pattern) {
324        setPattern(pattern);
325        return this;
326    }
327
328    /**
329     * Sets a reference to a custom {@link ServiceDiscovery} to use.
330     */
331    public ServiceCallConfigurationDefinition serviceDiscovery(String serviceDiscoveryRef) {
332        setServiceDiscoveryRef(serviceDiscoveryRef);
333        return this;
334    }
335
336    /**
337     * Sets a custom {@link ServiceDiscovery} to use.
338     */
339    public ServiceCallConfigurationDefinition serviceDiscovery(ServiceDiscovery serviceDiscovery) {
340        setServiceDiscovery(serviceDiscovery);
341        return this;
342    }
343
344    /**
345     * Sets a reference to a custom {@link ServiceFilter} to use.
346     */
347    public ServiceCallConfigurationDefinition serviceFilter(String serviceFilterRef) {
348        setServiceDiscoveryRef(serviceDiscoveryRef);
349        return this;
350    }
351
352    /**
353     * Sets a custom {@link ServiceFilter} to use.
354     */
355    public ServiceCallConfigurationDefinition serviceFilter(ServiceFilter serviceFilter) {
356        setServiceFilter(serviceFilter);
357        return this;
358    }
359
360    /**
361     * Sets a reference to a custom {@link ServiceChooser} to use.
362     */
363    public ServiceCallConfigurationDefinition serviceChooser(String serviceChooserRef) {
364        setServiceChooserRef(serviceChooserRef);
365        return this;
366    }
367
368    /**
369     * Sets a custom {@link ServiceChooser} to use.
370     */
371    public ServiceCallConfigurationDefinition serviceChooser(ServiceChooser serviceChooser) {
372        setServiceChooser(serviceChooser);
373        return this;
374    }
375
376    /**
377     * Sets a reference to a custom {@link ServiceLoadBalancer} to use.
378     */
379    public ServiceCallConfigurationDefinition loadBalancer(String loadBalancerRef) {
380        setLoadBalancerRef(loadBalancerRef);
381        return this;
382    }
383
384    /**
385     * Sets a custom {@link ServiceLoadBalancer} to use.
386     */
387    public ServiceCallConfigurationDefinition loadBalancer(ServiceLoadBalancer loadBalancer) {
388        setLoadBalancer(loadBalancer);
389        return this;
390    }
391
392    /**
393     * Sets a reference to a custom {@link Expression} to use.
394     */
395    public ServiceCallConfigurationDefinition expression(String expressionRef) {
396        setExpressionRef(loadBalancerRef);
397        return this;
398    }
399
400    /**
401     * Sets a custom {@link Expression} to use.
402     */
403    public ServiceCallConfigurationDefinition expression(Expression expression) {
404        setExpression(expression);
405        return this;
406    }
407
408    /**
409     * Sets a custom {@link Expression} to use through an expression builder clause.
410     *
411     * @return a expression builder clause to set the body
412     */
413    public ExpressionClause<ServiceCallConfigurationDefinition> expression() {
414        ExpressionClause<ServiceCallConfigurationDefinition> clause = new ExpressionClause<>(this);
415        setExpression(clause);
416
417        return clause;
418    }
419
420    /**
421     * Configures the ServiceDiscovery using the given configuration.
422     */
423    public ServiceCallConfigurationDefinition serviceDiscoveryConfiguration(ServiceCallServiceDiscoveryConfiguration serviceDiscoveryConfiguration) {
424        setServiceDiscoveryConfiguration(serviceDiscoveryConfiguration);
425        return this;
426    }
427
428    /**
429     * Configures the ServiceFilter using the given configuration.
430     */
431    public ServiceCallConfigurationDefinition serviceFilterConfiguration(ServiceCallServiceFilterConfiguration serviceFilterConfiguration) {
432        setServiceFilterConfiguration(serviceFilterConfiguration);
433        return this;
434    }
435
436    /**
437     * Configures the LoadBalancer using the given configuration.
438     */
439    public ServiceCallConfigurationDefinition loadBalancerConfiguration(ServiceCallServiceLoadBalancerConfiguration loadBalancerConfiguration) {
440        setLoadBalancerConfiguration(loadBalancerConfiguration);
441        return this;
442    }
443
444    /**
445     * Configures the Expression using the given configuration.
446     */
447    public ServiceCallConfigurationDefinition expressionConfiguration(ServiceCallExpressionConfiguration expressionConfiguration) {
448        setExpressionConfiguration(expressionConfiguration);
449        return this;
450    }
451
452    // *****************************
453    // Shortcuts - ServiceDiscovery
454    // *****************************
455
456    public CachingServiceCallServiceDiscoveryConfiguration cachingServiceDiscovery() {
457        CachingServiceCallServiceDiscoveryConfiguration conf = new CachingServiceCallServiceDiscoveryConfiguration();
458        setServiceDiscoveryConfiguration(conf);
459
460        return conf;
461    }
462
463    public ConsulServiceCallServiceDiscoveryConfiguration consulServiceDiscovery() {
464        ConsulServiceCallServiceDiscoveryConfiguration conf = new ConsulServiceCallServiceDiscoveryConfiguration();
465        setServiceDiscoveryConfiguration(conf);
466
467        return conf;
468    }
469
470    public DnsServiceCallServiceDiscoveryConfiguration dnsServiceDiscovery() {
471        DnsServiceCallServiceDiscoveryConfiguration conf = new DnsServiceCallServiceDiscoveryConfiguration();
472        setServiceDiscoveryConfiguration(conf);
473
474        return conf;
475    }
476
477    public ServiceCallConfigurationDefinition dnsServiceDiscovery(String domain) {
478        DnsServiceCallServiceDiscoveryConfiguration conf = new DnsServiceCallServiceDiscoveryConfiguration();
479        conf.setDomain(domain);
480
481        setServiceDiscoveryConfiguration(conf);
482
483        return this;
484    }
485
486    public ServiceCallConfigurationDefinition dnsServiceDiscovery(String domain, String protocol) {
487        DnsServiceCallServiceDiscoveryConfiguration conf = new DnsServiceCallServiceDiscoveryConfiguration();
488        conf.setDomain(domain);
489        conf.setProto(protocol);
490
491        setServiceDiscoveryConfiguration(conf);
492
493        return this;
494    }
495
496    public EtcdServiceCallServiceDiscoveryConfiguration etcdServiceDiscovery() {
497        EtcdServiceCallServiceDiscoveryConfiguration conf = new EtcdServiceCallServiceDiscoveryConfiguration();
498        setServiceDiscoveryConfiguration(conf);
499
500        return conf;
501    }
502
503    public KubernetesServiceCallServiceDiscoveryConfiguration kubernetesServiceDiscovery() {
504        KubernetesServiceCallServiceDiscoveryConfiguration conf = new KubernetesServiceCallServiceDiscoveryConfiguration();
505        setServiceDiscoveryConfiguration(conf);
506
507        return conf;
508    }
509
510    public KubernetesServiceCallServiceDiscoveryConfiguration kubernetesClientServiceDiscovery() {
511        KubernetesServiceCallServiceDiscoveryConfiguration conf = new KubernetesServiceCallServiceDiscoveryConfiguration();
512        conf.setLookup("client");
513
514        setServiceDiscoveryConfiguration(conf);
515
516        return conf;
517    }
518
519    public ServiceCallConfigurationDefinition kubernetesEnvServiceDiscovery() {
520        KubernetesServiceCallServiceDiscoveryConfiguration conf = new KubernetesServiceCallServiceDiscoveryConfiguration();
521        conf.setLookup("environment");
522
523        setServiceDiscoveryConfiguration(conf);
524
525        return this;
526    }
527
528    public ServiceCallConfigurationDefinition kubernetesDnsServiceDiscovery(String namespace, String domain) {
529        KubernetesServiceCallServiceDiscoveryConfiguration conf = new KubernetesServiceCallServiceDiscoveryConfiguration();
530
531        conf.setNamespace(namespace);
532        conf.setDnsDomain(domain);
533
534        setServiceDiscoveryConfiguration(conf);
535
536        return this;
537    }
538
539    public AggregatingServiceCallServiceDiscoveryConfiguration multiServiceDiscovery() {
540        AggregatingServiceCallServiceDiscoveryConfiguration conf = new AggregatingServiceCallServiceDiscoveryConfiguration();
541        setServiceDiscoveryConfiguration(conf);
542
543        return conf;
544    }
545
546    public ServiceCallConfigurationDefinition multiServiceDiscovery(AggregatingServiceCallServiceDiscoveryConfiguration conf) {
547        setServiceDiscoveryConfiguration(conf);
548
549        return this;
550    }
551
552    public StaticServiceCallServiceDiscoveryConfiguration staticServiceDiscovery() {
553        StaticServiceCallServiceDiscoveryConfiguration conf = new StaticServiceCallServiceDiscoveryConfiguration();
554        setServiceDiscoveryConfiguration(conf);
555
556        return conf;
557    }
558
559    public ServiceCallConfigurationDefinition staticServiceDiscovery(StaticServiceCallServiceDiscoveryConfiguration conf) {
560        setServiceDiscoveryConfiguration(conf);
561
562        return this;
563    }
564
565    // *****************************
566    // Shortcuts - ServiceFilter
567    // *****************************
568
569    public ServiceCallConfigurationDefinition healthyFilter() {
570        HealthyServiceCallServiceFilterConfiguration conf = new HealthyServiceCallServiceFilterConfiguration();
571        setServiceFilterConfiguration(conf);
572
573        return this;
574    }
575
576    public ServiceCallConfigurationDefinition passThroughFilter() {
577        PassThroughServiceCallServiceFilterConfiguration conf = new PassThroughServiceCallServiceFilterConfiguration();
578        setServiceFilterConfiguration(conf);
579
580        return this;
581    }
582
583    public ChainedServiceCallServiceFilterConfiguration multiFilter() {
584        ChainedServiceCallServiceFilterConfiguration conf = new ChainedServiceCallServiceFilterConfiguration();
585        setServiceFilterConfiguration(conf);
586
587        return conf;
588    }
589
590    public BlacklistServiceCallServiceFilterConfiguration blacklistFilter() {
591        BlacklistServiceCallServiceFilterConfiguration conf = new BlacklistServiceCallServiceFilterConfiguration();
592        setServiceFilterConfiguration(conf);
593
594        return conf;
595    }
596
597    public ServiceCallConfigurationDefinition customFilter(String serviceFilter) {
598        CustomServiceCallServiceFilterConfiguration conf = new CustomServiceCallServiceFilterConfiguration();
599        conf.setServiceFilterRef(serviceFilter);
600
601        setServiceFilterConfiguration(conf);
602
603        return this;
604    }
605
606    public ServiceCallConfigurationDefinition customFilter(ServiceFilter serviceFilter) {
607        CustomServiceCallServiceFilterConfiguration conf = new CustomServiceCallServiceFilterConfiguration();
608        conf.setServiceFilter(serviceFilter);
609
610        setServiceFilterConfiguration(conf);
611
612        return this;
613    }
614
615    // *****************************
616    // Shortcuts - LoadBalancer
617    // *****************************
618
619    public ServiceCallConfigurationDefinition defaultLoadBalancer() {
620        DefaultServiceCallServiceLoadBalancerConfiguration conf = new DefaultServiceCallServiceLoadBalancerConfiguration();
621        setLoadBalancerConfiguration(conf);
622
623        return this;
624    }
625
626    public ServiceCallConfigurationDefinition ribbonLoadBalancer() {
627        RibbonServiceCallServiceLoadBalancerConfiguration conf = new RibbonServiceCallServiceLoadBalancerConfiguration();
628        setLoadBalancerConfiguration(conf);
629
630        return this;
631    }
632
633    public ServiceCallConfigurationDefinition ribbonLoadBalancer(String clientName) {
634        RibbonServiceCallServiceLoadBalancerConfiguration conf = new RibbonServiceCallServiceLoadBalancerConfiguration();
635        conf.setClientName(clientName);
636
637        setLoadBalancerConfiguration(conf);
638
639        return this;
640    }
641}