public static AttributeValue create(Object value) { Class<?> valueType = value.getClass(); boolean listType = List.class.isAssignableFrom(valueType); if (listType) { List<?> list = (List<?>) value; if (!list.isEmpty()) { // Use the type of the first element in the list valueType = list.get(0).getClass(); } else { // For an empty list it is not possible to infer it's component type valueType = String.class; } } Type type = Type.valueOf(valueType.getSimpleName()); return new AttributeValue(type, value); }
private void readAttributeElement(XMLStreamReader reader, Map<String, Object> attributes) throws XMLStreamException { String name = reader.getAttributeValue(null, Attribute.NAME.toString()); String valstr = reader.getAttributeValue(null, Attribute.VALUE.toString()); String typespec = reader.getAttributeValue(null, Attribute.TYPE.toString()); AttributeValue value = AttributeValueHandler.readAttributeValue(typespec, valstr); attributes.put(name, value.getValue()); while (reader.hasNext() && reader.nextTag() != END_ELEMENT); }
break; return new AttributeValue(type, value);
private void writeAttributes(Map<String, Object> attributes) throws XMLStreamException { for (Entry<String, Object> entry : attributes.entrySet()) { AttributeValue attval = AttributeValue.create(entry.getValue()); writer.writeStartElement(ATTRIBUTE.getLocalName()); writer.writeAttribute(NAME.getLocalName(), entry.getKey()); if (attval.isListType()) { writer.writeAttribute(VALUE.getLocalName(), attval.getValueString()); writer.writeAttribute(TYPE.getLocalName(), "List<" + attval.getType() + ">"); } else { writer.writeAttribute(VALUE.getLocalName(), attval.getValueString()); if (attval.getType() != Type.String) { writer.writeAttribute(TYPE.getLocalName(), attval.getType().toString()); } } writer.writeEndElement(); } }
@Override public String toString() { return toExternalForm(); } }