/**
* 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.cxf.jaxrs.client;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.client.RxInvokerProvider;
import javax.ws.rs.core.Configuration;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.common.util.ClassHelper;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.jaxrs.model.ProviderInfo;
import org.apache.cxf.jaxrs.provider.ProviderFactory;
import org.apache.cxf.message.Message;
public final class ClientProviderFactory extends ProviderFactory {
private List<ProviderInfo<ClientRequestFilter>> clientRequestFilters =
new ArrayList<ProviderInfo<ClientRequestFilter>>(1);
private List<ProviderInfo<ClientResponseFilter>> clientResponseFilters =
new ArrayList<ProviderInfo<ClientResponseFilter>>(1);
private List<ProviderInfo<ResponseExceptionMapper<?>>> responseExceptionMappers =
new ArrayList<ProviderInfo<ResponseExceptionMapper<?>>>(1);
private RxInvokerProvider<?> rxInvokerProvider;
private ClientProviderFactory(Bus bus) {
super(bus);
}
public static ClientProviderFactory createInstance(Bus bus) {
if (bus == null) {
bus = BusFactory.getThreadDefaultBus();
}
ClientProviderFactory factory = new ClientProviderFactory(bus);
ProviderFactory.initFactory(factory);
factory.setBusProviders();
return factory;
}
public static ClientProviderFactory getInstance(Message m) {
Endpoint e = m.getExchange().getEndpoint();
return (ClientProviderFactory)e.get(CLIENT_FACTORY_NAME);
}
public static ClientProviderFactory getInstance(Endpoint e) {
return (ClientProviderFactory)e.get(CLIENT_FACTORY_NAME);
}
@Override
protected void setProviders(boolean custom, boolean busGlobal, Object... providers) {
List<ProviderInfo<? extends Object>> theProviders =
prepareProviders(custom, busGlobal, (Object[])providers, null);
super.setCommonProviders(theProviders);
for (ProviderInfo<? extends Object> provider : theProviders) {
Class<?> providerCls = ClassHelper.getRealClass(getBus(), provider.getProvider());
if (filterContractSupported(provider, providerCls, ClientRequestFilter.class)) {
addProviderToList(clientRequestFilters, provider);
}
if (filterContractSupported(provider, providerCls, ClientResponseFilter.class)) {
addProviderToList(clientResponseFilters, provider);
}
if (ResponseExceptionMapper.class.isAssignableFrom(providerCls)) {
addProviderToList(responseExceptionMappers, provider);
}
if (RxInvokerProvider.class.isAssignableFrom(providerCls)) {
this.rxInvokerProvider = RxInvokerProvider.class.cast(provider.getProvider());
}
}
Collections.sort(clientRequestFilters,
new BindingPriorityComparator(ClientRequestFilter.class, true));
Collections.sort(clientResponseFilters,
new BindingPriorityComparator(ClientResponseFilter.class, false));
injectContextProxies(responseExceptionMappers, clientRequestFilters, clientResponseFilters);
}
@SuppressWarnings("unchecked")
public <T extends Throwable> ResponseExceptionMapper<T> createResponseExceptionMapper(
Message m, Class<?> paramType) {
List<ResponseExceptionMapper<?>> candidates = new LinkedList<ResponseExceptionMapper<?>>();
for (ProviderInfo<ResponseExceptionMapper<?>> em : responseExceptionMappers) {
if (handleMapper(em, paramType, m, ResponseExceptionMapper.class, true)) {
candidates.add(em.getProvider());
}
}
if (candidates.size() == 0) {
return null;
}
Collections.sort(candidates, new ProviderFactory.ClassComparator(paramType));
return (ResponseExceptionMapper<T>) candidates.get(0);
}
@Override
public void clearProviders() {
super.clearProviders();
responseExceptionMappers.clear();
clientRequestFilters.clear();
clientResponseFilters.clear();
}
public List<ProviderInfo<ClientRequestFilter>> getClientRequestFilters() {
return Collections.unmodifiableList(clientRequestFilters);
}
public List<ProviderInfo<ClientResponseFilter>> getClientResponseFilters() {
return Collections.unmodifiableList(clientResponseFilters);
}
@Override
public Configuration getConfiguration(Message m) {
return (Configuration)m.getExchange().getOutMessage()
.getContextualProperty(Configuration.class.getName());
}
public RxInvokerProvider<?> getRxInvokerProvider() {
return rxInvokerProvider;
}
}