public static <X> BasicTypeInfo<X> getInfoFor(Class<X> type) { if (type == null) { throw new NullPointerException(); } @SuppressWarnings("unchecked") BasicTypeInfo<X> info = (BasicTypeInfo<X>) TYPES.get(type); return info; }
@Override public void begin(final String name, final Attributes attrs) { @SuppressWarnings("unchecked") ArrayList<Object> types = (ArrayList<Object>) ((HashMap<?, ?>) peek()).get(name); String type = attrs.getValue("type"); if ("uninitialized".equals(type)) { types.add(getLabel(attrs.getValue("label"))); } else { Integer t = TYPES.get(type); if (t == null) { types.add(type); } else { types.add(t); } } }
public static List<EndpointDescription> getEndpointDescriptions(String data) throws XMLStreamException { List<EndpointDescription> endpoints = new ArrayList<EndpointDescription>(); Map<String, Object> properties = null; String key = null; String type = null; String value = null; Object val = null; String txt = null; XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(data)); for (; ; ) { int code = reader.next(); switch (code) { case XMLStreamConstants.START_DOCUMENT: break; case XMLStreamConstants.START_ELEMENT: if (ENDPOINT_DESCRIPTION.equals(reader.getLocalName())) { properties = new HashMap<String, Object>(); } else if (PROPERTY.equals(reader.getLocalName())) { key = reader.getAttributeValue(null, NAME); type = reader.getAttributeValue(null, VALUE_TYPE); value = reader.getAttributeValue(null, VALUE); val = null; } else if (ARRAY.equals(reader.getLocalName())) { val = Array.newInstance(TYPES.get(type == null ? "String" : type), 0); } else if (SET.equals(reader.getLocalName())) { val = new HashSet<Object>(); } else if (LIST.equals(reader.getLocalName())) { val = new ArrayList<Object>(); } else if (VALUE.equals(reader.getLocalName())) { txt = null; } break; case XMLStreamConstants.CHARACTERS: if (txt == null) { txt = reader.getText(); } else { txt += reader.getText(); } break; case XMLStreamConstants.END_ELEMENT: if (ENDPOINT_DESCRIPTION.equals(reader.getLocalName())) { endpoints.add(new EndpointDescription(properties)); properties = null; } else if (PROPERTY.equals(reader.getLocalName())) { if (key == null || (val == null && value == null) || (val != null && value != null)) { throw new IllegalArgumentException(); } if (value != null) { val = instantiate(type == null ? "String" : type, value); } properties.put(key, val); } else if (VALUE.equals(reader.getLocalName())) { if (val.getClass().isArray()) { int len = Array.getLength(val); Object a = Array.newInstance(TYPES.get(type == null ? "String" : type), len + 1); System.arraycopy(val, 0, a, 0, len); Array.set(a, len, instantiate(type == null ? "String" : type, txt)); val = a; } else { ((Collection) val).add(instantiate(type == null ? "String" : type, txt)); } } break; case XMLStreamConstants.END_DOCUMENT: return endpoints; } } }
private static ParameterExtractor parameterExtractor( Type type, Parameter parameter, Description description) { if (type instanceof ParameterizedType) { ParameterizedType paramType = (ParameterizedType) type; Class<?> raw = (Class<?>) paramType.getRawType(); Type componentType = paramType.getActualTypeArguments()[0]; Class<?> component = null; if (componentType instanceof Class<?>) { component = (Class<?>) componentType; } if (Set.class == raw) { TypeCaster caster = TYPES.get(component); if (caster != null) { return new ListParameterExtractor(caster, component, parameter, description) { @Override Object convert(Object[] result) { return new HashSet<Object>(Arrays.asList(result)); } }; } } else if (List.class == raw || Collection.class == raw || Iterable.class == raw) { TypeCaster caster = TYPES.get(component); if (caster != null) { return new ListParameterExtractor(caster, component, parameter, description) { @Override Object convert(Object[] result) { return Arrays.asList(result); } }; } } } else if (type instanceof Class<?>) { Class<?> raw = (Class<?>) type; if (raw.isArray()) { TypeCaster caster = TYPES.get(raw.getComponentType()); if (caster != null) { return new ListParameterExtractor( caster, raw.getComponentType(), parameter, description) { @Override Object convert(Object[] result) { return result; } }; } } else { TypeCaster caster = TYPES.get(raw); if (caster != null) { return new ParameterExtractor(caster, raw, parameter, description); } } } else if (type instanceof GenericArrayType) { GenericArrayType array = (GenericArrayType) type; Type component = array.getGenericComponentType(); if (component instanceof Class<?>) { TypeCaster caster = TYPES.get(component); if (caster != null) { return new ListParameterExtractor(caster, (Class<?>) component, parameter, description) { @Override Object convert(Object[] result) { return result; } }; } } } throw new IllegalStateException("Unsupported parameter type: " + type); }