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}