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;
022
023import javax.xml.bind.annotation.XmlAccessType;
024import javax.xml.bind.annotation.XmlAccessorType;
025import javax.xml.bind.annotation.XmlElement;
026import javax.xml.bind.annotation.XmlElements;
027import javax.xml.bind.annotation.XmlRootElement;
028
029import org.apache.camel.CamelContext;
030import org.apache.camel.cloud.ServiceFilter;
031import org.apache.camel.spi.Metadata;
032
033@Metadata(label = "routing,cloud,service-filter")
034@XmlRootElement(name = "combinedServiceFilter")
035@XmlAccessorType(XmlAccessType.FIELD)
036public class CombinedServiceCallServiceFilterConfiguration extends ServiceCallServiceFilterConfiguration {
037    @XmlElements({
038        @XmlElement(name = "blacklistServiceFilter", type = BlacklistServiceCallServiceFilterConfiguration.class),
039        @XmlElement(name = "customServiceFilter", type = CustomServiceCallServiceFilterConfiguration.class),
040        @XmlElement(name = "healthyServiceFilter", type = HealthyServiceCallServiceFilterConfiguration.class),
041        @XmlElement(name = "passThroughServiceFilter", type = PassThroughServiceCallServiceFilterConfiguration.class) }
042    )
043    private List<ServiceCallServiceFilterConfiguration> serviceFilterConfigurations;
044
045    public CombinedServiceCallServiceFilterConfiguration() {
046        this(null);
047    }
048
049    public CombinedServiceCallServiceFilterConfiguration(ServiceCallDefinition parent) {
050        super(parent, "combined-service-filter");
051    }
052
053    // *************************************************************************
054    // Properties
055    // *************************************************************************
056
057    public List<ServiceCallServiceFilterConfiguration> getServiceFilterConfigurations() {
058        return serviceFilterConfigurations;
059    }
060
061    /**
062     * List of ServiceFilter configuration to use
063     * @param serviceFilterConfigurations
064     */
065    public void setServiceFilterConfigurations(List<ServiceCallServiceFilterConfiguration> serviceFilterConfigurations) {
066        this.serviceFilterConfigurations = serviceFilterConfigurations;
067    }
068
069    /**
070     *  Add a ServiceFilter configuration
071     */
072    public void addServiceFilterConfiguration(ServiceCallServiceFilterConfiguration serviceFilterConfiguration) {
073        if (serviceFilterConfigurations == null) {
074            serviceFilterConfigurations = new ArrayList<>();
075        }
076
077        serviceFilterConfigurations.add(serviceFilterConfiguration);
078    }
079
080    // *************************************************************************
081    // Fluent API
082    // *************************************************************************
083
084    /**
085     *  List of ServiceFilter configuration to use
086     */
087    public CombinedServiceCallServiceFilterConfiguration serviceFilterConfigurations(List<ServiceCallServiceFilterConfiguration> serviceFilterConfigurations) {
088        setServiceFilterConfigurations(serviceFilterConfigurations);
089        return this;
090    }
091
092    /**
093     *  Add a ServiceFilter configuration
094     */
095    public CombinedServiceCallServiceFilterConfiguration serviceFilterConfiguration(ServiceCallServiceFilterConfiguration serviceFilterConfiguration) {
096        addServiceFilterConfiguration(serviceFilterConfiguration);
097        return this;
098    }
099
100    // *****************************
101    // Shortcuts - ServiceFilter
102    // *****************************
103
104    public CombinedServiceCallServiceFilterConfiguration healthy() {
105        addServiceFilterConfiguration(new HealthyServiceCallServiceFilterConfiguration());
106        return this;
107    }
108
109    public CombinedServiceCallServiceFilterConfiguration passThrough() {
110        addServiceFilterConfiguration(new PassThroughServiceCallServiceFilterConfiguration());
111        return this;
112    }
113
114    public CombinedServiceCallServiceFilterConfiguration custom(String serviceFilter) {
115        addServiceFilterConfiguration(new CustomServiceCallServiceFilterConfiguration().serviceFilter(serviceFilter));
116        return this;
117    }
118
119    public CombinedServiceCallServiceFilterConfiguration custom(ServiceFilter serviceFilter) {
120        addServiceFilterConfiguration(new CustomServiceCallServiceFilterConfiguration().serviceFilter(serviceFilter));
121        return this;
122    }
123
124    // *************************************************************************
125    // Utilities
126    // *************************************************************************
127
128    @Override
129    protected void postProcessFactoryParameters(final CamelContext camelContext, final Map<String, Object> parameters) throws Exception {
130        if (serviceFilterConfigurations != null && !serviceFilterConfigurations.isEmpty()) {
131            List<ServiceFilter> discoveries = new ArrayList<>(serviceFilterConfigurations.size());
132            for (ServiceCallServiceFilterConfiguration conf : serviceFilterConfigurations) {
133                discoveries.add(conf.newInstance(camelContext));
134            }
135
136            parameters.put("serviceFilterList", discoveries);
137        }
138    }
139}