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); } } }