xuxiuxi
2017-07-20 d018d0217f0afeb976bea7c739185cefe7267a9e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 * 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);
    }
 
}