| /** |
| * 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.olingo4; |
| |
| import java.io.IOException; |
| import java.security.GeneralSecurityException; |
| import java.util.Map; |
| |
| import org.apache.camel.CamelContext; |
| import org.apache.camel.Endpoint; |
| import org.apache.camel.SSLContextParametersAware; |
| import org.apache.camel.component.olingo4.api.impl.Olingo4AppImpl; |
| import org.apache.camel.component.olingo4.internal.Olingo4ApiCollection; |
| import org.apache.camel.component.olingo4.internal.Olingo4ApiName; |
| import org.apache.camel.spi.Metadata; |
| import org.apache.camel.util.ObjectHelper; |
| import org.apache.camel.util.component.AbstractApiComponent; |
| import org.apache.camel.util.jsse.SSLContextParameters; |
| import org.apache.http.HttpHost; |
| import org.apache.http.client.config.RequestConfig; |
| import org.apache.http.impl.client.HttpClientBuilder; |
| import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; |
| |
| /** |
| * Represents the component that manages {@link Olingo4Endpoint}. |
| */ |
| public class Olingo4Component extends AbstractApiComponent<Olingo4ApiName, Olingo4Configuration, Olingo4ApiCollection> implements SSLContextParametersAware { |
| |
| @Metadata(label = "security", defaultValue = "false") |
| private boolean useGlobalSslContextParameters; |
| |
| // component level shared proxy |
| private Olingo4AppWrapper apiProxy; |
| |
| public Olingo4Component() { |
| super(Olingo4Endpoint.class, Olingo4ApiName.class, Olingo4ApiCollection.getCollection()); |
| } |
| |
| public Olingo4Component(CamelContext context) { |
| super(context, Olingo4Endpoint.class, Olingo4ApiName.class, Olingo4ApiCollection.getCollection()); |
| } |
| |
| @Override |
| protected Olingo4ApiName getApiName(String apiNameStr) throws IllegalArgumentException { |
| return Olingo4ApiName.fromValue(apiNameStr); |
| } |
| |
| @Override |
| protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { |
| // parse remaining to extract resourcePath and queryParams |
| final String[] pathSegments = remaining.split("/", -1); |
| final String methodName = pathSegments[0]; |
| |
| if (pathSegments.length > 1) { |
| final StringBuilder resourcePath = new StringBuilder(); |
| for (int i = 1; i < pathSegments.length; i++) { |
| resourcePath.append(pathSegments[i]); |
| if (i < (pathSegments.length - 1)) { |
| resourcePath.append('/'); |
| } |
| } |
| // This will override any URI supplied ?resourcePath=... param |
| parameters.put(Olingo4Endpoint.RESOURCE_PATH_PROPERTY, resourcePath.toString()); |
| } |
| |
| final Olingo4Configuration endpointConfiguration = createEndpointConfiguration(Olingo4ApiName.DEFAULT); |
| final Endpoint endpoint = createEndpoint(uri, methodName, Olingo4ApiName.DEFAULT, endpointConfiguration); |
| |
| // set endpoint property inBody |
| setProperties(endpoint, parameters); |
| |
| // configure endpoint properties and initialize state |
| endpoint.configureProperties(parameters); |
| |
| return endpoint; |
| } |
| |
| @Override |
| protected Endpoint createEndpoint(String uri, String methodName, Olingo4ApiName apiName, Olingo4Configuration endpointConfiguration) { |
| endpointConfiguration.setApiName(apiName); |
| endpointConfiguration.setMethodName(methodName); |
| return new Olingo4Endpoint(uri, this, apiName, methodName, endpointConfiguration); |
| } |
| |
| /** |
| * To use the shared configuration |
| */ |
| @Override |
| public void setConfiguration(Olingo4Configuration configuration) { |
| super.setConfiguration(configuration); |
| } |
| |
| /** |
| * To use the shared configuration |
| */ |
| @Override |
| public Olingo4Configuration getConfiguration() { |
| return super.getConfiguration(); |
| } |
| |
| public Olingo4AppWrapper createApiProxy(Olingo4Configuration endpointConfiguration) { |
| final Olingo4AppWrapper result; |
| if (endpointConfiguration.equals(this.configuration)) { |
| synchronized (this) { |
| if (apiProxy == null) { |
| apiProxy = createOlingo4App(this.configuration); |
| } |
| } |
| result = apiProxy; |
| } else { |
| result = createOlingo4App(endpointConfiguration); |
| } |
| return result; |
| } |
| |
| private Olingo4AppWrapper createOlingo4App(Olingo4Configuration configuration) { |
| |
| Object clientBuilder = configuration.getHttpAsyncClientBuilder(); |
| if (clientBuilder == null) { |
| HttpAsyncClientBuilder asyncClientBuilder = HttpAsyncClientBuilder.create(); |
| |
| // apply simple configuration properties |
| final RequestConfig.Builder requestConfigBuilder = RequestConfig.custom(); |
| requestConfigBuilder.setConnectTimeout(configuration.getConnectTimeout()); |
| requestConfigBuilder.setSocketTimeout(configuration.getSocketTimeout()); |
| |
| final HttpHost proxy = configuration.getProxy(); |
| if (proxy != null) { |
| requestConfigBuilder.setProxy(proxy); |
| } |
| |
| // set default request config |
| asyncClientBuilder.setDefaultRequestConfig(requestConfigBuilder.build()); |
| |
| SSLContextParameters sslContextParameters = configuration.getSslContextParameters(); |
| if (sslContextParameters == null) { |
| // use global ssl config |
| sslContextParameters = retrieveGlobalSslContextParameters(); |
| } |
| if (sslContextParameters == null) { |
| // use defaults if not specified |
| sslContextParameters = new SSLContextParameters(); |
| } |
| try { |
| asyncClientBuilder.setSSLContext(sslContextParameters.createSSLContext(getCamelContext())); |
| } catch (GeneralSecurityException e) { |
| throw ObjectHelper.wrapRuntimeCamelException(e); |
| } catch (IOException e) { |
| throw ObjectHelper.wrapRuntimeCamelException(e); |
| } |
| |
| clientBuilder = asyncClientBuilder; |
| } |
| |
| Olingo4AppImpl olingo4App; |
| if (clientBuilder == null || clientBuilder instanceof HttpAsyncClientBuilder) { |
| olingo4App = new Olingo4AppImpl(configuration.getServiceUri(), (HttpAsyncClientBuilder)clientBuilder); |
| } else { |
| olingo4App = new Olingo4AppImpl(configuration.getServiceUri(), (HttpClientBuilder)clientBuilder); |
| } |
| apiProxy = new Olingo4AppWrapper(olingo4App); |
| apiProxy.getOlingo4App().setContentType(configuration.getContentType()); |
| apiProxy.getOlingo4App().setHttpHeaders(configuration.getHttpHeaders()); |
| |
| return apiProxy; |
| } |
| |
| @Override |
| public boolean isUseGlobalSslContextParameters() { |
| return this.useGlobalSslContextParameters; |
| } |
| |
| /** |
| * Enable usage of global SSL context parameters. |
| */ |
| @Override |
| public void setUseGlobalSslContextParameters(boolean useGlobalSslContextParameters) { |
| this.useGlobalSslContextParameters = useGlobalSslContextParameters; |
| } |
| |
| public void closeApiProxy(Olingo4AppWrapper apiProxy) { |
| if (this.apiProxy != apiProxy) { |
| // not a shared proxy |
| apiProxy.close(); |
| } |
| } |
| |
| @Override |
| protected void doStop() throws Exception { |
| if (apiProxy != null) { |
| apiProxy.close(); |
| } |
| } |
| } |