1 package com.thoughtworks.xstream.converters.collections;
2
3 import com.thoughtworks.xstream.alias.ClassMapper;
4 import com.thoughtworks.xstream.converters.ConversionException;
5 import com.thoughtworks.xstream.converters.Converter;
6 import com.thoughtworks.xstream.converters.ConverterLookup;
7 import com.thoughtworks.xstream.objecttree.ObjectTree;
8 import com.thoughtworks.xstream.xml.XMLReader;
9 import com.thoughtworks.xstream.xml.XMLWriter;
10
11 public abstract class AbstractCollectionConverter implements Converter {
12 protected ClassMapper classMapper;
13
14 public abstract boolean canConvert(Class type);
15
16 public AbstractCollectionConverter(ClassMapper classMapper) {
17 this.classMapper = classMapper;
18 }
19
20 public abstract void toXML(ObjectTree objectGraph, XMLWriter xmlWriter, ConverterLookup converterLookup);
21
22 public abstract void fromXML(ObjectTree objectGraph, XMLReader xmlReader, ConverterLookup converterLookup, Class requiredType);
23
24 protected void writeItem(Object item, XMLWriter xmlWriter, ConverterLookup converterLookup, ObjectTree objectGraph) {
25 if (item == null) {
26 xmlWriter.startElement("null");
27 xmlWriter.endElement();
28 } else {
29 Class type = item.getClass();
30 xmlWriter.startElement(classMapper.lookupName(type));
31 Converter converter = converterLookup.lookupConverterForType(type);
32 converter.toXML(objectGraph.newStack(item), xmlWriter, converterLookup);
33 xmlWriter.endElement();
34 }
35 }
36
37 protected Object readItem(XMLReader xmlReader, int childIndex, ObjectTree objectGraph, ConverterLookup converterLookup) {
38 xmlReader.child(childIndex);
39 Class type = classMapper.lookupType(xmlReader.name());
40 ObjectTree itemWriter = objectGraph.newStack(type);
41 Converter converter = converterLookup.lookupConverterForType(type);
42 converter.fromXML(itemWriter, xmlReader, converterLookup, type);
43 xmlReader.pop();
44 return itemWriter.get();
45 }
46
47 protected Object createCollection(Class type) {
48 Class defaultType = classMapper.lookupDefaultType(type);
49 try {
50 return defaultType.newInstance();
51 } catch (InstantiationException e) {
52 throw new ConversionException("Cannot instantiate " + defaultType.getName(), e);
53 } catch (IllegalAccessException e) {
54 throw new ConversionException("Cannot instantiate " + defaultType.getName(), e);
55 }
56 }
57 }
This page was automatically generated by Maven