package com.arondor.common.reflection.xstream; import org.apache.log4j.Logger; import com.arondor.common.reflection.api.parser.AccessibleClassParser; import com.arondor.common.reflection.model.config.ObjectConfiguration; import com.arondor.common.reflection.model.java.AccessibleClass; import com.arondor.common.reflection.model.java.AccessibleField; import com.arondor.common.reflection.parser.java.JavaAccessibleClassParser; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class AbstractTestXStream { private static final Logger LOG = Logger.getLogger(AbstractTestXStream.class); private final W3CXStream2ObjectDefinitionConverter converter = new W3CXStream2ObjectDefinitionConverter(); private final XStream xstream = new XStream(new DomDriver()); private final AccessibleClassParser classParser = new JavaAccessibleClassParser(); protected AbstractTestXStream() { if (true) { converter.setTypeOracle(new TypeOracle() { @Override public String guessType(String className, String fieldName) { LOG.debug("guessType(className=" + className + ", fieldName=" + fieldName + ")"); try { Class<?> jClass = Class.forName(className); AccessibleClass axsClazz = classParser.parseAccessibleClass(jClass); AccessibleField axsField = axsClazz.getAccessibleFields().get(fieldName); if (axsField == null) { LOG.error("guessType(className=" + className + ", fieldName=" + fieldName + ") => NO FIELD OF THAT NAME !"); } String guessedType = axsField.getClassName(); LOG.debug("guessType(className=" + className + ", fieldName=" + fieldName + ") => " + guessedType); return guessedType; } catch (ClassNotFoundException e) { LOG.error("Error", e); } return null; } }); } xstream.aliasSystemAttribute("class", "class"); } protected ObjectConfiguration serializeAndParse(Object o) { String xml = xstream.toXML(o); LOG.info("Result xml :" + xml); ObjectConfiguration oc = converter.parse(xml); return oc; } }