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.remote;
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.XmlRootElement;
024import javax.xml.bind.annotation.XmlTransient;
025
026import org.apache.camel.ExchangePattern;
027import org.apache.camel.Processor;
028import org.apache.camel.model.NoOutputDefinition;
029import org.apache.camel.spi.Metadata;
030import org.apache.camel.spi.RouteContext;
031import org.apache.camel.spi.ServiceCallLoadBalancer;
032import org.apache.camel.spi.ServiceCallServerListStrategy;
033
034/**
035 * Remote service call
036 */
037@Metadata(label = "eip,routing")
038@XmlRootElement(name = "serviceCall")
039@XmlAccessorType(XmlAccessType.FIELD)
040public class ServiceCallDefinition extends NoOutputDefinition<ServiceCallDefinition> {
041
042    @XmlAttribute @Metadata(required = "true")
043    private String name;
044    @XmlAttribute @Metadata(required = "true")
045    private String uri;
046    @XmlAttribute
047    private ExchangePattern pattern;
048    @XmlElement
049    private ServiceCallConfigurationDefinition serviceCallConfiguration;
050    @XmlAttribute
051    private String serviceCallConfigurationRef;
052    @XmlAttribute
053    private String loadBalancerRef;
054    // TODO: allow to use custom type as load balancer
055    @XmlTransient
056    private ServiceCallLoadBalancer loadBalancer;
057    @XmlAttribute
058    private String serverListStrategyRef;
059    @XmlTransient
060    private ServiceCallServerListStrategy serverListStrategy;
061
062    public ServiceCallDefinition() {
063    }
064
065    @Override
066    public String toString() {
067        return "ServiceCall[" + name + "]";
068    }
069
070    @Override
071    public String getLabel() {
072        return "serviceCall";
073    }
074
075    @Override
076    public Processor createProcessor(RouteContext routeContext) throws Exception {
077        throw new IllegalStateException("Cannot find Camel component supporting the ServiceCall EIP such as camel-kubernetes or camel-ribbon.");
078    }
079
080    // Fluent API
081    // -------------------------------------------------------------------------
082
083    /**
084     * Sets the optional {@link ExchangePattern} used to invoke this endpoint
085     */
086    public ServiceCallDefinition pattern(ExchangePattern pattern) {
087        setPattern(pattern);
088        return this;
089    }
090
091    /**
092     * Sets the name of the service to use
093     */
094    public ServiceCallDefinition name(String name) {
095        setName(name);
096        return this;
097    }
098
099    /**
100     * Sets the uri of the service to use
101     */
102    public ServiceCallDefinition uri(String uri) {
103        setUri(uri);
104        return this;
105    }
106
107    /**
108     * Configures the Service Call EIP using Kubernetes
109     * <p/>
110     * Use <tt>end</tt> when configuration is complete, to return back to the Service Call EIP.
111     */
112    public KubernetesConfigurationDefinition kubernetesConfiguration() {
113        serviceCallConfiguration = new KubernetesConfigurationDefinition(this);
114        return (KubernetesConfigurationDefinition) serviceCallConfiguration;
115    }
116
117    /**
118     * Configures the Service Call EIP using Ribbon
119     * <p/>
120     * Use <tt>end</tt> when configuration is complete, to return back to the Service Call EIP.
121     */
122    public RibbonConfigurationDefinition ribbonConfiguration() {
123        serviceCallConfiguration = new RibbonConfigurationDefinition(this);
124        return (RibbonConfigurationDefinition) serviceCallConfiguration;
125    }
126
127    /**
128     * Configures the Service Call EIP using Consul
129     * <p/>
130     * Use <tt>end</tt> when configuration is complete, to return back to the Service Call EIP.
131     */
132    public ConsulConfigurationDefinition consulConfiguration() {
133        serviceCallConfiguration = new ConsulConfigurationDefinition(this);
134        return (ConsulConfigurationDefinition) serviceCallConfiguration;
135    }
136
137    /**
138     * Configures the Service Call EIP using Etcd
139     * <p/>
140     * Use <tt>end</tt> when configuration is complete, to return back to the Service Call EIP.
141     */
142    public EtcdConfigurationDefinition etcdConfiguration() {
143        serviceCallConfiguration = new EtcdConfigurationDefinition(this);
144        return (EtcdConfigurationDefinition) serviceCallConfiguration;
145    }
146
147    /**
148     * Configures the Service Call EIP using Dns
149     * <p/>
150     * Use <tt>end</tt> when configuration is complete, to return back to the Service Call EIP.
151     */
152    public DnsConfigurationDefinition dnsConfiguration() {
153        serviceCallConfiguration = new DnsConfigurationDefinition(this);
154        return (DnsConfigurationDefinition) serviceCallConfiguration;
155    }
156
157    /**
158     * Configures the ServiceCall using the given configuration
159     */
160    public ServiceCallDefinition serviceCallConfiguration(ServiceCallConfigurationDefinition configuration) {
161        serviceCallConfiguration = configuration;
162        return this;
163    }
164
165    /**
166     * Refers to a ServiceCall configuration to use
167     */
168    public ServiceCallDefinition serviceCallConfiguration(String ref) {
169        serviceCallConfigurationRef = ref;
170        return this;
171    }
172
173    /**
174     * Sets a reference to a custom {@link org.apache.camel.spi.ServiceCallLoadBalancer} to use.
175     */
176    public ServiceCallDefinition loadBalancer(String loadBalancerRef) {
177        setLoadBalancerRef(loadBalancerRef);
178        return this;
179    }
180
181    /**
182     * Sets a custom {@link org.apache.camel.spi.ServiceCallLoadBalancer} to use.
183     */
184    public ServiceCallDefinition loadBalancer(ServiceCallLoadBalancer loadBalancer) {
185        setLoadBalancer(loadBalancer);
186        return this;
187    }
188
189    /**
190     * Sets a reference to a custom {@link org.apache.camel.spi.ServiceCallServerListStrategy} to use.
191     */
192    public ServiceCallDefinition serverListStrategy(String serverListStrategyRef) {
193        setServerListStrategyRef(serverListStrategyRef);
194        return this;
195    }
196
197    /**
198     * Sets a custom {@link org.apache.camel.spi.ServiceCallServerListStrategy} to use.
199     */
200    public ServiceCallDefinition serverListStrategy(ServiceCallServerListStrategy serverListStrategy) {
201        setServerListStrategy(serverListStrategy);
202        return this;
203    }
204
205    // Properties
206    // -------------------------------------------------------------------------
207
208    public String getName() {
209        return name;
210    }
211
212    public void setName(String name) {
213        this.name = name;
214    }
215
216    public ExchangePattern getPattern() {
217        return pattern;
218    }
219
220    public void setPattern(ExchangePattern pattern) {
221        this.pattern = pattern;
222    }
223
224    public ServiceCallConfigurationDefinition getServiceCallConfiguration() {
225        return serviceCallConfiguration;
226    }
227
228    public void setServiceCallConfiguration(ServiceCallConfigurationDefinition serviceCallConfiguration) {
229        this.serviceCallConfiguration = serviceCallConfiguration;
230    }
231
232    public String getServiceCallConfigurationRef() {
233        return serviceCallConfigurationRef;
234    }
235
236    /**
237     * Refers to a ServiceCall configuration to use
238     */
239    public void setServiceCallConfigurationRef(String serviceCallConfigurationRef) {
240        this.serviceCallConfigurationRef = serviceCallConfigurationRef;
241    }
242
243    public String getUri() {
244        return uri;
245    }
246
247    /**
248     * The uri of the endpoint to send to.
249     * The uri can be dynamic computed using the {@link org.apache.camel.language.simple.SimpleLanguage} expression.
250     */
251    public void setUri(String uri) {
252        this.uri = uri;
253    }
254
255    public String getLoadBalancerRef() {
256        return loadBalancerRef;
257    }
258
259    /**
260     * Sets a reference to a custom {@link org.apache.camel.spi.ServiceCallLoadBalancer} to use.
261     */
262    public void setLoadBalancerRef(String loadBalancerRef) {
263        this.loadBalancerRef = loadBalancerRef;
264    }
265
266    public ServiceCallLoadBalancer getLoadBalancer() {
267        return loadBalancer;
268    }
269
270    public void setLoadBalancer(ServiceCallLoadBalancer loadBalancer) {
271        this.loadBalancer = loadBalancer;
272    }
273
274    public String getServerListStrategyRef() {
275        return serverListStrategyRef;
276    }
277
278    /**
279     * Sets a reference to a custom {@link org.apache.camel.spi.ServiceCallServerListStrategy} to use.
280     */
281    public void setServerListStrategyRef(String serverListStrategyRef) {
282        this.serverListStrategyRef = serverListStrategyRef;
283    }
284
285    public ServiceCallServerListStrategy getServerListStrategy() {
286        return serverListStrategy;
287    }
288
289    public void setServerListStrategy(ServiceCallServerListStrategy serverListStrategy) {
290        this.serverListStrategy = serverListStrategy;
291    }
292}