/*
* 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 gobblin.http;
import org.apache.http.client.HttpClient;
import com.google.common.base.Optional;
import com.typesafe.config.Config;
import gobblin.configuration.State;
import gobblin.util.ClassAliasResolver;
/**
* Creates an instance of HttpClientConfigurator using dependency injection from configuration.
*/
public class HttpClientConfiguratorLoader {
/** Classname or alias for an {@link HttpClientConfigurator} instance to use for configuring and
* instantiating of {@link HttpClient} instances. */
public static final String HTTP_CLIENT_CONFIGURATOR_TYPE_KEY = "httpClientConfigurator.type";
public static final String HTTP_CLIENT_CONFIGURATOR_TYPE_FULL_KEY =
"gobblin." + HTTP_CLIENT_CONFIGURATOR_TYPE_KEY;
public static final Class<? extends HttpClientConfigurator> DEFAULT_CONFIGURATOR_CLASS =
DefaultHttpClientConfigurator.class;
private static final ClassAliasResolver<HttpClientConfigurator> TYPE_RESOLVER =
new ClassAliasResolver<>(HttpClientConfigurator.class);
private final HttpClientConfigurator _configurator;
/**
* Loads a HttpClientConfigurator using the value of the {@link #HTTP_CLIENT_CONFIGURATOR_TYPE_FULL_KEY}
* property in the state.
*/
public HttpClientConfiguratorLoader(State state) {
this(Optional.<String>fromNullable(state.getProp(HTTP_CLIENT_CONFIGURATOR_TYPE_FULL_KEY)));
}
/** Loads a HttpClientConfigurator using the value of {@link #HTTP_CLIENT_CONFIGURATOR_TYPE_KEY}
* in the local typesafe config. */
public HttpClientConfiguratorLoader(Config config) {
this(Optional.<String>fromNullable(config.hasPath(HTTP_CLIENT_CONFIGURATOR_TYPE_KEY) ?
config.getString(HTTP_CLIENT_CONFIGURATOR_TYPE_KEY) : null));
}
/** Loads a HttpClientConfigurator with the specified class or alias. If not specified,
* {@link #DEFAULT_CONFIGURATOR_CLASS} is used. */
public HttpClientConfiguratorLoader(Optional<String> configuratorType) {
try {
_configurator = getConfiguratorClass(configuratorType).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
throw new RuntimeException("Unable to find HttpClientConfigurator:" + e, e);
}
}
private static Class<? extends HttpClientConfigurator>
getConfiguratorClass(Optional<String> configuratorType) throws ClassNotFoundException {
return configuratorType.isPresent() ? TYPE_RESOLVER.resolveClass(configuratorType.get()) :
DEFAULT_CONFIGURATOR_CLASS;
}
public HttpClientConfigurator getConfigurator() {
return _configurator;
}
}