/* * Copyright (C) 2007 XStream Committers. * All rights reserved. * * The software in this package is published under the terms of the BSD * style license a copy of which has been included with this distribution in * the LICENSE.txt file. * * Created on 01. February 2007 by Joerg Schaible */ package com.thoughtworks.xstream.converters.reflection; import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.text.AttributedCharacterIterator; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * An abstract converter implementation for constants of * {@link AttributedCharacterIterator.Attribute} and derived types. * * @author Jörg Schaible * @since 1.2.2 */ public class AbstractAttributedCharacterIteratorAttributeConverter extends AbstractSingleValueConverter { private static final Method getName; static { try { getName = AttributedCharacterIterator.Attribute.class.getDeclaredMethod( "getName", (Class[])null); } catch (NoSuchMethodException e) { throw new ExceptionInInitializerError("Missing AttributedCharacterIterator.Attribute.getName()"); } } private final Class type; private transient Map attributeMap; private transient FieldDictionary fieldDictionary; public AbstractAttributedCharacterIteratorAttributeConverter(final Class type) { super(); this.type = type; readResolve(); } public boolean canConvert(final Class type) { return type == this.type; } public String toString(final Object source) { AttributedCharacterIterator.Attribute attribute = (AttributedCharacterIterator.Attribute)source; try { if (!getName.isAccessible()) { getName.setAccessible(true); } return (String)getName.invoke(attribute, (Object[])null); } catch (IllegalAccessException e) { throw new ObjectAccessException( "Cannot get name of AttributedCharacterIterator.Attribute", e); } catch (InvocationTargetException e) { throw new ObjectAccessException( "Cannot get name of AttributedCharacterIterator.Attribute", e .getTargetException()); } } public Object fromString(final String str) { return attributeMap.get(str); } private Object readResolve() { fieldDictionary = new FieldDictionary(); attributeMap = new HashMap(); for (final Iterator iterator = fieldDictionary.fieldsFor(type); iterator .hasNext();) { final Field field = (Field)iterator.next(); if (field.getType() == type && Modifier.isStatic(field.getModifiers())) { try { final Object attribute = field.get(null); attributeMap.put(toString(attribute), attribute); } catch (IllegalAccessException e) { throw new ObjectAccessException("Cannot get object of " + field, e); } } } return this; } }