blob: c94b3509ef23a4a8f437923c5b65b10607095443 [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.batchee.jaxrs.client;
import org.apache.batchee.jaxrs.client.http.Base64s;
import org.apache.batchee.jaxrs.common.JBatchResource;
import org.apache.batchee.jaxrs.common.RestProperties;
import org.apache.cxf.configuration.jsse.TLSClientParameters;
import org.apache.cxf.configuration.security.AuthorizationPolicy;
import org.apache.cxf.jaxrs.client.Client;
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.ConnectionType;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import javax.batch.runtime.JobInstance;
import javax.net.ssl.KeyManagerFactory;
class BatchEEJAXRS1CxfClient extends BatchEEJAXRSClientBase<Object> implements Base64s {
private final JBatchResource client;
public BatchEEJAXRS1CxfClient(final ClientConfiguration configuration) {
try {
final List<Object> providers = new LinkedList<Object>();
if (configuration.getJsonProvider() != null) {
providers.add(configuration.getJsonProvider().newInstance());
}
client = JAXRSClientFactory.create(configuration.getBaseUrl(), JBatchResource.class, providers);
final HTTPConduit conduit = WebClient.getConfig(client).getHttpConduit();
if (CxfClientConfiguration.class.isInstance(conduit)) {
final HTTPClientPolicy policy = CxfClientConfiguration.class.cast(configuration).getPolicy();
if (policy != null) {
conduit.setClient(policy);
}
} else {
conduit.setClient(defaultClientPolicy());
}
final ClientSslConfiguration ssl = configuration.getSsl();
if (ssl != null) {
final TLSClientParameters params;
if (conduit.getTlsClientParameters() == null) {
params = new TLSClientParameters();
conduit.setTlsClientParameters(params);
} else {
params = conduit.getTlsClientParameters();
}
if (ssl.getHostnameVerifier() != null) { // not really supported in CXF 2.6
params.setUseHttpsURLConnectionDefaultHostnameVerifier(false);
}
if (ssl.getSslContext() != null) {
params.setSSLSocketFactory(ssl.getSslContext().getSocketFactory());
}
if (ssl.getKeystore() != null) {
try {
final KeyManagerFactory tmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
tmf.init(ssl.getKeystore(), ssl.getKeystorePassword().toCharArray());
params.setKeyManagers(tmf.getKeyManagers());
} catch (final Exception ex) {
throw new IllegalArgumentException(ex);
}
}
}
final ClientSecurity security = configuration.getSecurity();
if (security != null) {
final AuthorizationPolicy authorization = new AuthorizationPolicy();
authorization.setUserName(security.getUsername());
authorization.setPassword(security.getPassword());
authorization.setAuthorizationType(security.getType());
conduit.setAuthorization(authorization);
}
} catch (final Exception e) {
throw new IllegalArgumentException(e);
}
}
private static HTTPClientPolicy defaultClientPolicy() {
final HTTPClientPolicy client = new HTTPClientPolicy();
client.setConnection(ConnectionType.CLOSE);
client.setAllowChunking(false);
client.setConnectionTimeout(0);
client.setReceiveTimeout(0);
return client;
}
@Override
protected Object extractEntity(final Object o, final Type genericReturnType) {
return o;
}
@Override
protected Object doInvoke(final Method jaxrsMethod, final Method method, final Object[] args) throws Throwable {
Object[] usedArgs = args;
final Class<?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length == 1 && JobInstance.class.equals(parameterTypes[0])) {
if (args[0] == null) {
usedArgs = new Object[2];
} else {
final JobInstance ji = JobInstance.class.cast(args[0]);
usedArgs = new Object[] { ji.getInstanceId(), ji.getJobName() };
}
}
if (args != null && args.length == 2 && Properties.class.isInstance(args[1])) {
usedArgs[1] = RestProperties.wrap(Properties.class.cast(args[1]));
}
try {
return jaxrsMethod.invoke(client, usedArgs);
} catch (final InvocationTargetException ite) {
throw ite.getCause();
} catch (final Exception e) {
throw new IllegalStateException(e);
}
}
@Override
protected void close() {
try { // not in cxf 2.6 but in cxf 2.7
Client.class.getDeclaredMethod("close").invoke(client);
} catch (final Exception e) {
// no-op
}
}
}