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 java.util.ArrayList;
020import java.util.List;
021import java.util.Map;
022import javax.xml.bind.annotation.XmlAccessType;
023import javax.xml.bind.annotation.XmlAccessorType;
024import javax.xml.bind.annotation.XmlElement;
025import javax.xml.bind.annotation.XmlElements;
026import javax.xml.bind.annotation.XmlRootElement;
027
028import org.apache.camel.CamelContext;
029import org.apache.camel.cloud.ServiceDiscovery;
030import org.apache.camel.spi.Metadata;
031
032@Metadata(label = "routing,cloud,service-discovery")
033@XmlRootElement(name = "multiServiceDiscovery")
034@XmlAccessorType(XmlAccessType.FIELD)
035public class AggregatingServiceCallServiceDiscoveryConfiguration extends ServiceCallServiceDiscoveryConfiguration {
036    @XmlElements({
037        @XmlElement(name = "consulServiceDiscovery", type = ConsulServiceCallServiceDiscoveryConfiguration.class),
038        @XmlElement(name = "dnsServiceDiscovery", type = DnsServiceCallServiceDiscoveryConfiguration.class),
039        @XmlElement(name = "etcdServiceDiscovery", type = EtcdServiceCallServiceDiscoveryConfiguration.class),
040        @XmlElement(name = "kubernetesServiceDiscovery", type = KubernetesServiceCallServiceDiscoveryConfiguration.class),
041        @XmlElement(name = "staticServiceDiscovery", type = StaticServiceCallServiceDiscoveryConfiguration.class),
042        @XmlElement(name = "cachingServiceDiscovery", type = CachingServiceCallServiceDiscoveryConfiguration.class)}
043    )
044    private List<ServiceCallServiceDiscoveryConfiguration> serviceDiscoveryConfigurations;
045
046    public AggregatingServiceCallServiceDiscoveryConfiguration() {
047        this(null);
048    }
049
050    public AggregatingServiceCallServiceDiscoveryConfiguration(ServiceCallDefinition parent) {
051        super(parent, "aggregating-service-discovery");
052    }
053
054    // *************************************************************************
055    // Properties
056    // *************************************************************************
057
058    public List<ServiceCallServiceDiscoveryConfiguration> getServiceDiscoveryConfigurations() {
059        return serviceDiscoveryConfigurations;
060    }
061
062    /**
063     * List of ServiceDiscovery configuration to use
064     * @param serviceDiscoveryConfigurations
065     */
066    public void setServiceDiscoveryConfigurations(List<ServiceCallServiceDiscoveryConfiguration> serviceDiscoveryConfigurations) {
067        this.serviceDiscoveryConfigurations = serviceDiscoveryConfigurations;
068    }
069
070    /**
071     *  Add a ServiceDiscovery configuration
072     */
073    public void addServiceDiscoveryConfigurations(ServiceCallServiceDiscoveryConfiguration serviceDiscoveryConfiguration) {
074        if (serviceDiscoveryConfigurations == null) {
075            serviceDiscoveryConfigurations = new ArrayList<>();
076        }
077
078        serviceDiscoveryConfigurations.add(serviceDiscoveryConfiguration);
079    }
080
081    // *************************************************************************
082    // Fluent API
083    // *************************************************************************
084
085    /**
086     *  List of ServiceDiscovery configuration to use
087     */
088    public AggregatingServiceCallServiceDiscoveryConfiguration serviceDiscoveryConfigurations(List<ServiceCallServiceDiscoveryConfiguration> serviceDiscoveryConfigurations) {
089        setServiceDiscoveryConfigurations(serviceDiscoveryConfigurations);
090        return this;
091    }
092
093    /**
094     *  Add a ServiceDiscovery configuration
095     */
096    public AggregatingServiceCallServiceDiscoveryConfiguration serviceDiscoveryConfiguration(ServiceCallServiceDiscoveryConfiguration serviceDiscoveryConfiguration) {
097        addServiceDiscoveryConfigurations(serviceDiscoveryConfiguration);
098        return this;
099    }
100
101    // *****************************
102    // Shortcuts - ServiceDiscovery
103    // *****************************
104
105    public CachingServiceCallServiceDiscoveryConfiguration cachingServiceDiscovery() {
106        CachingServiceCallServiceDiscoveryConfiguration conf = new CachingServiceCallServiceDiscoveryConfiguration();
107        addServiceDiscoveryConfigurations(conf);
108
109        return conf;
110    }
111
112    public ConsulServiceCallServiceDiscoveryConfiguration consulServiceDiscovery() {
113        ConsulServiceCallServiceDiscoveryConfiguration conf = new ConsulServiceCallServiceDiscoveryConfiguration();
114        addServiceDiscoveryConfigurations(conf);
115
116        return conf;
117    }
118
119    public DnsServiceCallServiceDiscoveryConfiguration dnsServiceDiscovery() {
120        DnsServiceCallServiceDiscoveryConfiguration conf = new DnsServiceCallServiceDiscoveryConfiguration();
121        addServiceDiscoveryConfigurations(conf);
122
123        return conf;
124    }
125
126    public EtcdServiceCallServiceDiscoveryConfiguration etcdServiceDiscovery() {
127        EtcdServiceCallServiceDiscoveryConfiguration conf = new EtcdServiceCallServiceDiscoveryConfiguration();
128        addServiceDiscoveryConfigurations(conf);
129
130        return conf;
131    }
132
133    public KubernetesServiceCallServiceDiscoveryConfiguration kubernetesServiceDiscovery() {
134        KubernetesServiceCallServiceDiscoveryConfiguration conf = new KubernetesServiceCallServiceDiscoveryConfiguration();
135        addServiceDiscoveryConfigurations(conf);
136
137        return conf;
138    }
139
140    public AggregatingServiceCallServiceDiscoveryConfiguration multiServiceDiscovery() {
141        AggregatingServiceCallServiceDiscoveryConfiguration conf = new AggregatingServiceCallServiceDiscoveryConfiguration();
142        addServiceDiscoveryConfigurations(conf);
143
144        return conf;
145    }
146
147    public StaticServiceCallServiceDiscoveryConfiguration staticServiceDiscovery() {
148        StaticServiceCallServiceDiscoveryConfiguration conf = new StaticServiceCallServiceDiscoveryConfiguration();
149        addServiceDiscoveryConfigurations(conf);
150
151        return conf;
152    }
153
154    // *************************************************************************
155    // Utilities
156    // *************************************************************************
157
158    @Override
159    protected void postProcessFactoryParameters(final CamelContext camelContext, final Map<String, Object> parameters) throws Exception {
160        if (serviceDiscoveryConfigurations != null && !serviceDiscoveryConfigurations.isEmpty()) {
161            List<ServiceDiscovery> discoveries = new ArrayList<>(serviceDiscoveryConfigurations.size());
162            for (ServiceCallServiceDiscoveryConfiguration conf : serviceDiscoveryConfigurations) {
163                discoveries.add(conf.newInstance(camelContext));
164            }
165
166            parameters.put("serviceDiscoveryList", discoveries);
167        }
168    }
169}