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