blob: e6ae6c3da575cc05d5dab2d09be329d74b5edcc8 [file] [log] [blame]
/*
* 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.splunk;
import java.net.URLStreamHandler;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import com.splunk.HttpService;
import com.splunk.SSLSecurityProtocol;
import com.splunk.Service;
import com.splunk.ServiceArgs;
import org.apache.camel.CamelContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SplunkConnectionFactory {
private static final Logger LOG = LoggerFactory.getLogger(SplunkConnectionFactory.class);
private String host;
private int port;
private String scheme;
private String app;
private String owner;
private String username;
private String password;
private int connectionTimeout;
private boolean useSunHttpsHandler;
private SSLSecurityProtocol sslProtocol;
public SplunkConnectionFactory(final String host, final int port, final String username, final String password) {
this.host = host;
this.port = port;
this.username = username;
this.password = password;
}
public SplunkConnectionFactory(final String username, final String password) {
this(Service.DEFAULT_HOST, Service.DEFAULT_PORT, username, password);
}
public String getApp() {
return app;
}
public void setApp(String app) {
this.app = app;
}
public int getConnectionTimeout() {
return connectionTimeout;
}
public void setConnectionTimeout(int connectionTimeout) {
this.connectionTimeout = connectionTimeout;
}
public String getScheme() {
return scheme;
}
public void setScheme(String scheme) {
this.scheme = scheme;
}
public boolean isUseSunHttpsHandler() {
return useSunHttpsHandler;
}
public void setUseSunHttpsHandler(boolean useSunHttpsHandler) {
this.useSunHttpsHandler = useSunHttpsHandler;
}
public SSLSecurityProtocol getSslProtocol() {
return sslProtocol;
}
public void setSslProtocol(SSLSecurityProtocol sslProtocol) {
this.sslProtocol = sslProtocol;
}
public synchronized Service createService(CamelContext camelContext) {
final ServiceArgs args = new ServiceArgs();
if (host != null) {
args.setHost(host);
}
if (port > 0) {
args.setPort(port);
}
if (scheme != null) {
args.setScheme(scheme);
}
if (app != null) {
args.setApp(app);
}
if (owner != null) {
args.setOwner(owner);
}
args.setUsername(username);
args.setPassword(password);
// useful in cases where you want to bypass app. servers https handling
// (wls i'm looking at you)
if (isUseSunHttpsHandler()) {
String sunHandlerClassName = "sun.net.www.protocol.https.Handler";
Class<URLStreamHandler> clazz = camelContext.getClassResolver().resolveClass(sunHandlerClassName, URLStreamHandler.class);
if (clazz != null) {
URLStreamHandler handler = camelContext.getInjector().newInstance(clazz);
args.setHTTPSHandler(handler);
LOG.debug("using the URLStreamHandler {} for {}", handler, args);
} else {
LOG.warn("could not resolve and use the URLStreamHandler class '{}'", sunHandlerClassName);
}
}
ExecutorService executor = camelContext.getExecutorServiceManager().newSingleThreadExecutor(this, "DefaultSplunkConnectionFactory");
Future<Service> future = executor.submit(new Callable<Service>() {
public Service call() throws Exception {
if (Service.DEFAULT_SCHEME.equals(getScheme())) {
LOG.debug("Https in use. Setting SSL protocol to {}", getSslProtocol());
HttpService.setSslSecurityProtocol(getSslProtocol());
}
return Service.connect(args);
}
});
try {
Service service = null;
if (connectionTimeout > 0) {
service = future.get(connectionTimeout, TimeUnit.MILLISECONDS);
} else {
service = future.get();
}
LOG.info("Successfully connected to Splunk");
return service;
} catch (Exception e) {
throw new RuntimeException(String.format("could not connect to Splunk Server @ %s:%d - %s", host, port, e.getMessage()));
} finally {
if (executor != null) {
camelContext.getExecutorServiceManager().shutdownNow(executor);
}
}
}
}