/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.consul;
import java.util.Map;
import java.util.Optional;
import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
import org.apache.camel.SSLContextParametersAware;
import org.apache.camel.component.consul.enpoint.ConsulAgentProducer;
import org.apache.camel.component.consul.enpoint.ConsulCatalogProducer;
import org.apache.camel.component.consul.enpoint.ConsulCoordinatesProducer;
import org.apache.camel.component.consul.enpoint.ConsulEventConsumer;
import org.apache.camel.component.consul.enpoint.ConsulEventProducer;
import org.apache.camel.component.consul.enpoint.ConsulHealthProducer;
import org.apache.camel.component.consul.enpoint.ConsulKeyValueConsumer;
import org.apache.camel.component.consul.enpoint.ConsulKeyValueProducer;
import org.apache.camel.component.consul.enpoint.ConsulPreparedQueryProducer;
import org.apache.camel.component.consul.enpoint.ConsulSessionProducer;
import org.apache.camel.component.consul.enpoint.ConsulStatusProducer;
import org.apache.camel.impl.DefaultComponent;
import org.apache.camel.spi.Metadata;
import org.apache.camel.util.jsse.SSLContextParameters;
/**
* Represents the component that manages {@link ConsulEndpoint}.
*/
public class ConsulComponent extends DefaultComponent implements SSLContextParametersAware {
@Metadata(label = "advanced")
private ConsulConfiguration configuration = new ConsulConfiguration();
@Metadata(label = "security", defaultValue = "false")
private boolean useGlobalSslContextParameters;
public ConsulComponent() {
super();
}
public ConsulComponent(CamelContext context) {
super(context);
}
// ************************************
// Options
// ************************************
public String getUrl() {
return this.configuration.getUrl();
}
/**
* The Consul agent URL
*/
public void setUrl(String url) {
this.configuration.setUrl(url);
}
public String getDatacenter() {
return configuration.getDatacenter();
}
/**
* The data center
* @param datacenter
*/
public void setDatacenter(String datacenter) {
configuration.setDatacenter(datacenter);
}
public SSLContextParameters getSslContextParameters() {
return configuration.getSslContextParameters();
}
/**
* SSL configuration using an org.apache.camel.util.jsse.SSLContextParameters
* instance.
* @param sslContextParameters
*/
public void setSslContextParameters(SSLContextParameters sslContextParameters) {
configuration.setSslContextParameters(sslContextParameters);
}
@Override
public boolean isUseGlobalSslContextParameters() {
return this.useGlobalSslContextParameters;
}
/**
* Enable usage of global SSL context parameters.
*/
@Override
public void setUseGlobalSslContextParameters(boolean useGlobalSslContextParameters) {
this.useGlobalSslContextParameters = useGlobalSslContextParameters;
}
public String getAclToken() {
return configuration.getAclToken();
}
/**
* Sets the ACL token to be used with Consul
* @param aclToken
*/
public void setAclToken(String aclToken) {
configuration.setAclToken(aclToken);
}
public String getUserName() {
return configuration.getUserName();
}
/**
* Sets the username to be used for basic authentication
* @param userName
*/
public void setUserName(String userName) {
configuration.setUserName(userName);
}
public String getPassword() {
return configuration.getPassword();
}
/**
* Sets the password to be used for basic authentication
* @param password
*/
public void setPassword(String password) {
configuration.setPassword(password);
}
public ConsulConfiguration getConfiguration() {
return configuration;
}
/**
* Sets the common configuration shared among endpoints
*/
public void setConfiguration(ConsulConfiguration configuration) {
this.configuration = configuration;
}
@Override
protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
ConsulConfiguration configuration = Optional.ofNullable(this.configuration).orElseGet(ConsulConfiguration::new).copy();
configuration.setCamelContext(getCamelContext());
// using global ssl context parameters if set
if (configuration.getSslContextParameters() == null) {
configuration.setSslContextParameters(retrieveGlobalSslContextParameters());
}
setProperties(configuration, parameters);
switch (remaining) {
case "kv":
return new ConsulEndpoint(
remaining, uri, this, configuration, Optional.of(ConsulKeyValueProducer::new), Optional.of(ConsulKeyValueConsumer::new)
);
case "event":
return new ConsulEndpoint(
remaining, uri, this, configuration, Optional.of(ConsulEventProducer::new), Optional.of(ConsulEventConsumer::new)
);
case "agent":
return new ConsulEndpoint(
remaining, uri, this, configuration, Optional.of(ConsulAgentProducer::new), Optional.empty()
);
case "coordinates":
return new ConsulEndpoint(
remaining, uri, this, configuration, Optional.of(ConsulCoordinatesProducer::new), Optional.empty()
);
case "health":
return new ConsulEndpoint(
remaining, uri, this, configuration, Optional.of(ConsulHealthProducer::new), Optional.empty()
);
case "status":
return new ConsulEndpoint(
remaining, uri, this, configuration, Optional.of(ConsulStatusProducer::new), Optional.empty()
);
case "preparedQuery":
return new ConsulEndpoint(
remaining, uri, this, configuration, Optional.of(ConsulPreparedQueryProducer::new), Optional.empty()
);
case "catalog":
return new ConsulEndpoint(
remaining, uri, this, configuration, Optional.of(ConsulCatalogProducer::new), Optional.empty()
);
case "session":
return new ConsulEndpoint(
remaining, uri, this, configuration, Optional.of(ConsulSessionProducer::new), Optional.empty()
);
default:
throw new IllegalArgumentException("Unknown apiEndpoint: " + remaining);
}
}
}