/* * Copyright (C) 2003, 2004, 2005, 2006 Joe Walnes. * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 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 26. September 2003 by Joe Walnes */ package com.awsle.aibatis.xml.engine; import com.awsle.aibatis.xml.engine.alias.DefaultClassMapper; import com.awsle.aibatis.xml.engine.converters.Converter; import com.awsle.aibatis.xml.engine.converters.ConverterLookup; import com.awsle.aibatis.xml.engine.converters.basic.*; import com.awsle.aibatis.xml.engine.converters.collections.ArrayConverter; import com.awsle.aibatis.xml.engine.converters.collections.CollectionConverter; import com.awsle.aibatis.xml.engine.converters.collections.MapConverter; import com.awsle.aibatis.xml.engine.converters.composite.ObjectWithFieldsConverter; import com.awsle.aibatis.xml.engine.converters.lookup.DefaultConverterLookup; import com.awsle.aibatis.xml.engine.objecttree.ObjectTree; import com.awsle.aibatis.xml.engine.objecttree.reflection.MyObjectFactory; import com.awsle.aibatis.xml.engine.objecttree.reflection.ObjectFactory; import com.awsle.aibatis.xml.engine.objecttree.reflection.ReflectionObjectGraph; import com.awsle.aibatis.xml.engine.xml.XMLReader; import com.awsle.aibatis.xml.engine.xml.XMLReaderDriver; import com.awsle.aibatis.xml.engine.xml.XMLWriter; import com.awsle.aibatis.xml.engine.xml.dom.DomXMLReaderDriver; import com.awsle.aibatis.xml.engine.xml.text.PrettyPrintXMLWriter; import java.io.StringWriter; import java.io.Writer; import java.util.*; public class XStream { private DefaultClassMapper classMapper = new DefaultClassMapper(); private ConverterLookup converterLookup = new DefaultConverterLookup(); private XMLReaderDriver xmlReaderDriver = new DomXMLReaderDriver(); public XStream() { alias("int", Integer.class); alias("float", Float.class); alias("double", Double.class); alias("long", Long.class); alias("short", Short.class); alias("char", Character.class); alias("byte", Byte.class); alias("boolean", Boolean.class); alias("number", Number.class); alias("object", Object.class); alias("string-buffer", StringBuffer.class); alias("string", String.class); alias("java-class", Class.class); alias("date", Date.class); alias("map", Map.class, HashMap.class); alias("list", List.class, ArrayList.class); alias("set", Set.class, HashSet.class); alias("linked-list", LinkedList.class); alias("tree-map", TreeMap.class); alias("tree-set", TreeSet.class); registerConverter(new ObjectWithFieldsConverter(classMapper)); registerConverter(new IntConverter()); registerConverter(new FloatConverter()); registerConverter(new DoubleConverter()); registerConverter(new LongConverter()); registerConverter(new ShortConverter()); registerConverter(new CharConverter()); registerConverter(new BooleanConverter()); registerConverter(new ByteConverter()); registerConverter(new StringConverter()); registerConverter(new StringBufferConverter()); registerConverter(new DateConverter()); registerConverter(new JavaClassConverter()); registerConverter(new ArrayConverter(classMapper)); registerConverter(new CollectionConverter(classMapper)); registerConverter(new MapConverter(classMapper)); } public void alias(String elementName, Class type, Class defaultImplementation) { classMapper.alias(elementName, type, defaultImplementation); } public void alias(String elementName, Class type) { alias(elementName, type, type); } public String toXML(Object obj) { Writer stringWriter = new StringWriter(); XMLWriter xmlWriter = new PrettyPrintXMLWriter(stringWriter); toXML(obj, xmlWriter); return stringWriter.toString(); } public void toXML(Object obj, XMLWriter xmlWriter) { ObjectFactory objectFactory = new MyObjectFactory(); ObjectTree objectGraph = new ReflectionObjectGraph(obj, objectFactory); Converter rootConverter = converterLookup.lookupConverterForType(obj.getClass()); xmlWriter.startElement(classMapper.lookupName(obj.getClass())); rootConverter.toXML(objectGraph, xmlWriter, converterLookup); xmlWriter.endElement(); } public Object fromXML(String xml) { return fromXML(xmlReaderDriver.createReader(xml)); } public Object fromXML(XMLReader xmlReader) { Class type = classMapper.lookupType(xmlReader.name()); ObjectFactory objectFactory = new MyObjectFactory(); ObjectTree objectGraph = new ReflectionObjectGraph(type, objectFactory); Converter rootConverter = converterLookup.lookupConverterForType(type); rootConverter.fromXML(objectGraph, xmlReader, converterLookup, type); return objectGraph.get(); } public void registerConverter(Converter converter) { converterLookup.registerConverter(converter); } }