xuxiuxi
2017-07-21 ec544e9cc330ce40aeb78e96aa362e245feecd4d
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
package com.awsle.aibatis.xml.engine.converters.collections;
 
import com.awsle.aibatis.xml.engine.alias.ClassMapper;
import com.awsle.aibatis.xml.engine.converters.ConversionException;
import com.awsle.aibatis.xml.engine.converters.Converter;
import com.awsle.aibatis.xml.engine.converters.ConverterLookup;
import com.awsle.aibatis.xml.engine.objecttree.ObjectTree;
import com.awsle.aibatis.xml.engine.xml.XMLReader;
import com.awsle.aibatis.xml.engine.xml.XMLWriter;
 
public abstract class AbstractCollectionConverter implements Converter {
    protected ClassMapper classMapper;
 
    public abstract boolean canConvert(Class type);
 
    public AbstractCollectionConverter(ClassMapper classMapper) {
        this.classMapper = classMapper;
    }
 
    public abstract void toXML(ObjectTree objectGraph, XMLWriter xmlWriter, ConverterLookup converterLookup);
 
    public abstract void fromXML(ObjectTree objectGraph, XMLReader xmlReader, ConverterLookup converterLookup, Class requiredType);
 
    protected void writeItem(Object item, XMLWriter xmlWriter, ConverterLookup converterLookup, ObjectTree objectGraph) {
        if (item == null) {
            xmlWriter.startElement("null");
            xmlWriter.endElement();
        } else {
            Class type = item.getClass();
            xmlWriter.startElement(classMapper.lookupName(type));
            Converter converter = converterLookup.lookupConverterForType(type);
            converter.toXML(objectGraph.newStack(item), xmlWriter, converterLookup);
            xmlWriter.endElement();
        }
    }
 
    protected Object readItem(XMLReader xmlReader, int childIndex, ObjectTree objectGraph, ConverterLookup converterLookup) {
        xmlReader.child(childIndex);
        Class type = classMapper.lookupType(xmlReader.name());
        ObjectTree itemWriter = objectGraph.newStack(type);
        Converter converter = converterLookup.lookupConverterForType(type);
        converter.fromXML(itemWriter, xmlReader, converterLookup, type);
        xmlReader.pop();
        return itemWriter.get();
    }
 
    protected Object createCollection(Class type) {
        Class defaultType = classMapper.lookupDefaultType(type);
        try {
            return defaultType.newInstance();
        } catch (InstantiationException e) {
            throw new ConversionException("Cannot instantiate " + defaultType.getName(), e);
        } catch (IllegalAccessException e) {
            throw new ConversionException("Cannot instantiate " + defaultType.getName(), e);
        }
    }
}