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