package se.dolkow.tangiblexml; import android.support.annotation.NonNull; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import static org.xmlpull.v1.XmlPullParser.END_TAG; import static org.xmlpull.v1.XmlPullParser.START_TAG; import static org.xmlpull.v1.XmlPullParser.TEXT; abstract class TextNodes<T,V> extends ParserNode<T> { private final @NonNull Putter<T,V> putter; TextNodes(@NonNull Putter<T, V> putter) { this.putter = putter; } protected abstract @NonNull V parse(@NonNull String txt); @Override public final void parse(@NonNull XmlPullParser xml, @NonNull T target) throws ConversionException, ValueCountException, ReflectionException, InputException { Util.consume(xml, START_TAG); String textblock = ""; try { if (xml.getEventType() == TEXT) { textblock = xml.getText(); Util.consume(xml, TEXT); } } catch (XmlPullParserException e) { throw new InputException(e); } Util.consume(xml, END_TAG); final V value; try { value = parse(textblock); } catch (RuntimeException e) { throw new ConversionException(e); } putter.put(target, value); } @Override protected void prepare(@NonNull T t) { // do nothing. } public static class Int<T> extends TextNodes<T,Integer> { Int(Putter<T, Integer> putter) { super(putter); } @Override protected @NonNull Integer parse(@NonNull String txt) { return Integer.valueOf(txt); } } public static class Str<T> extends TextNodes<T,String> { Str(Putter<T, String> putter) { super(putter); } @Override protected @NonNull String parse(@NonNull String txt) { return txt; } } }