/**
* 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.utils;
import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MultivaluedMap;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.jaxrs.model.ParameterType;
import org.apache.cxf.jaxrs.provider.ProviderFactory;
import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.ExchangeImpl;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
public class InjectionUtilsTest extends Assert {
@Test
public void testHandleParameterWithXmlAdapterOnInterface() throws Exception {
// Arrange
String value = "1.1";
// Act
Object id = InjectionUtils.handleParameter(value,
true,
Id.class,
Id.class,
new Annotation[] {},
ParameterType.PATH,
createMessage());
// Assert
assertTrue(id instanceof Id);
assertEquals(value, ((Id)id).getId());
}
public void testCollectionTypeFromArray() {
assertNull(InjectionUtils.getCollectionType(String[].class));
}
@Test
public void testCollectionType() {
assertEquals(ArrayList.class, InjectionUtils.getCollectionType(Collection.class));
assertEquals(ArrayList.class, InjectionUtils.getCollectionType(List.class));
assertEquals(HashSet.class, InjectionUtils.getCollectionType(Set.class));
assertEquals(TreeSet.class, InjectionUtils.getCollectionType(SortedSet.class));
}
@Test
public void testSupportedCollectionType() {
assertFalse(InjectionUtils.isSupportedCollectionOrArray(Map.class));
assertTrue(InjectionUtils.isSupportedCollectionOrArray(String[].class));
assertTrue(InjectionUtils.isSupportedCollectionOrArray(List.class));
assertTrue(InjectionUtils.isSupportedCollectionOrArray(Collection.class));
assertTrue(InjectionUtils.isSupportedCollectionOrArray(Set.class));
assertTrue(InjectionUtils.isSupportedCollectionOrArray(SortedSet.class));
}
@Test
public void testExtractValuesFromBean() {
CustomerBean1 bean1 = new CustomerBean1();
bean1.setA("aValue");
bean1.setB(1L);
List<String> values = new ArrayList<>();
values.add("lv1");
values.add("lv2");
bean1.setC(values);
CustomerBean2 bean2 = new CustomerBean2();
bean2.setA("aaValue");
bean2.setB(2L);
values = new ArrayList<>();
values.add("lv11");
values.add("lv22");
bean2.setC(values);
Set<String> set = new HashSet<>();
set.add("set1");
set.add("set2");
bean2.setS(set);
bean1.setD(bean2);
MultivaluedMap<String, Object> map = InjectionUtils.extractValuesFromBean(bean1, "");
assertEquals("Size is wrong", 7, map.size());
assertEquals(1, map.get("a").size());
assertEquals("aValue", map.getFirst("a"));
assertEquals(1, map.get("b").size());
assertEquals(1L, map.getFirst("b"));
assertEquals(2, map.get("c").size());
assertEquals("lv1", map.get("c").get(0));
assertEquals("lv2", map.get("c").get(1));
assertEquals(1, map.get("d.a").size());
assertEquals("aaValue", map.getFirst("d.a"));
assertEquals(1, map.get("d.b").size());
assertEquals(2L, map.getFirst("d.b"));
assertEquals(2, map.get("d.c").size());
assertEquals("lv11", map.get("d.c").get(0));
assertEquals("lv22", map.get("d.c").get(1));
assertEquals(2, map.get("d.s").size());
assertTrue(map.get("d.s").contains("set1"));
assertTrue(map.get("d.s").contains("set2"));
}
@Test
public void testInstantiateJAXBEnum() {
CarType carType = InjectionUtils.handleParameter("AUDI", false, CarType.class,
CarType.class, null,
ParameterType.QUERY, null);
assertEquals("Type is wrong", CarType.AUDI, carType);
}
@Test
public void testInstantiateIntegerInQuery() {
Integer integer = InjectionUtils.handleParameter("", false, Integer.class,
Integer.class, null,
ParameterType.QUERY, null);
assertNull("Integer is not null", integer);
}
@Test
public void testInstantiateFloatInQuery() {
Float f = InjectionUtils.handleParameter("", false, float.class,
float.class, null,
ParameterType.QUERY, null);
assertEquals("Float is not 0", Float.valueOf(0F), f);
}
@Test
public void testGenericInterfaceType() throws NoSuchMethodException {
Type str = InjectionUtils.getGenericResponseType(GenericInterface.class.getMethod("get"),
TestService.class, "", String.class, new ExchangeImpl());
assertEquals(String.class, str);
ParameterizedType list = (ParameterizedType) InjectionUtils.getGenericResponseType(
GenericInterface.class.getMethod("list"), TestService.class,
new ArrayList<>(), ArrayList.class, new ExchangeImpl());
assertEquals(String.class, list.getActualTypeArguments()[0]);
}
static class CustomerBean1 {
private String a;
private Long b;
private List<String> c;
private CustomerBean2 d;
private String e;
public void setA(String aString) {
this.a = aString;
}
public void setB(Long bLong) {
this.b = bLong;
}
public void setC(List<String> cStringList) {
this.c = cStringList;
}
public void setD(CustomerBean2 dCustomerBean) {
this.d = dCustomerBean;
}
public String getA() {
return a;
}
public Long getB() {
return b;
}
public List<String> getC() {
return c;
}
public CustomerBean2 getD() {
return d;
}
public void setE(String ee) {
this.e = ee;
}
public String getE() {
return e;
}
}
static class CustomerBean2 {
private String a;
private Long b;
private List<String> c;
private Set<String> s;
public void setA(String aString) {
this.a = aString;
}
public void setB(Long bLong) {
this.b = bLong;
}
public void setC(List<String> cStringList) {
this.c = cStringList;
}
public String getA() {
return a;
}
public Long getB() {
return b;
}
public List<String> getC() {
return c;
}
public void setS(Set<String> set) {
this.s = set;
}
public Set<String> getS() {
return this.s;
}
}
private Message createMessage() {
ProviderFactory factory = ServerProviderFactory.getInstance();
Message m = new MessageImpl();
m.put("org.apache.cxf.http.case_insensitive_queries", false);
Exchange e = new ExchangeImpl();
m.setExchange(e);
e.setInMessage(m);
Endpoint endpoint = EasyMock.createMock(Endpoint.class);
endpoint.getEndpointInfo();
EasyMock.expectLastCall().andReturn(null).anyTimes();
endpoint.get(Application.class.getName());
EasyMock.expectLastCall().andReturn(null);
endpoint.size();
EasyMock.expectLastCall().andReturn(0).anyTimes();
endpoint.isEmpty();
EasyMock.expectLastCall().andReturn(true).anyTimes();
endpoint.get(ServerProviderFactory.class.getName());
EasyMock.expectLastCall().andReturn(factory).anyTimes();
EasyMock.replay(endpoint);
e.put(Endpoint.class, endpoint);
return m;
}
public static class Adapter extends XmlAdapter<String, Id> {
@Override
public String marshal(final Id id) throws Exception {
return id.getId();
}
@Override
public Id unmarshal(final String idStr) throws Exception {
Id id = new DelegatingId();
id.setId(idStr);
return id;
}
}
@XmlJavaTypeAdapter(Adapter.class)
public interface Id {
String getId();
void setId(String id);
}
public static class DelegatingId implements Id {
private String id;
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
}
public enum CarType {
AUDI("Audi"),
GOLF("Golf"),
BMW("BMW");
private final String value;
CarType(String v) {
value = v;
}
public String value() {
return value;
}
public static CarType fromValue(String v) {
for (CarType c: CarType.values()) {
if (c.value.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(v);
}
}
interface GenericInterface<A> {
A get();
List<A> list();
}
interface ServiceInterface extends Serializable, GenericInterface<String> {
}
public static class TestService implements Serializable, ServiceInterface {
private static final long serialVersionUID = 1L;
@Override
public String get() {
return "";
}
@Override
public List<String> list() {
return new ArrayList<>();
}
}
}