11package parser ;
22
3- import org .apache .commons .lang3 .StringUtils ;
4- import org .apache .commons .lang3 .math .NumberUtils ;
53import org .slf4j .Logger ;
64import org .slf4j .LoggerFactory ;
75import org .xml .sax .Attributes ;
2624/**
2725 * todo start using generics
2826 */
29- public class XmlTreeParser extends DefaultHandler {
27+ public class FreeFormXmlParser extends DefaultHandler {
3028
31- private final static Logger log = LoggerFactory .getLogger (XmlTreeParser .class );
29+ private final static Logger log = LoggerFactory .getLogger (FreeFormXmlParser .class );
3230
3331 private final Class rootClass ;
3432 private final String xmlContent ;
33+ private final PropertyBinder propertyBinder ;
3534 private Object rootNode ;
3635
3736 private final Stack <NodeInfo > nodes = new Stack <>();
@@ -48,13 +47,18 @@ public static class BindingException extends RuntimeException {
4847 }
4948 }
5049
51- public XmlTreeParser (Class rootClass , String xmlContent ) {
50+ public FreeFormXmlParser (Class rootClass , String xmlContent , PropertyBinder propertyBinder ) {
5251 this .rootClass = rootClass ;
5352 this .xmlContent = xmlContent ;
53+ this .propertyBinder = propertyBinder ;
5454 }
5555
5656 public static <T > T parse (Class <T > rootClass , String xmlContent ) throws IOException , SAXException , ParserConfigurationException {
57- XmlTreeParser parser = new XmlTreeParser (rootClass , xmlContent );
57+ return parse (rootClass , xmlContent , DefaultPropertyBinder .INSTANCE );
58+ }
59+
60+ public static <T > T parse (Class <T > rootClass , String xmlContent , PropertyBinder propertyBinder ) throws IOException , SAXException , ParserConfigurationException {
61+ FreeFormXmlParser parser = new FreeFormXmlParser (rootClass , xmlContent , propertyBinder );
5862 return (T ) parser .parse ();
5963 }
6064
@@ -277,38 +281,12 @@ private Class getListElementType(Field field) {
277281 private void setFieldFromStringValue (Object object , String attrName , String value ) {
278282 try {
279283 Field field = object .getClass ().getDeclaredField (attrName );
280- setFieldFromStringValue (object , field , value );
284+ propertyBinder . setFieldFromStringValue (object , field , value );
281285 } catch (NoSuchFieldException e ) {
282286 log .debug ("there is no property {}.{} in the Java model - no assignment performed" , object .getClass ().getName (), attrName );
283287 }
284288 }
285289
286- private void setFieldFromStringValue (Object object , Field field , String stringValue ) {
287- try {
288- Class <?> fieldType = field .getType ();
289- field .setAccessible (true );
290- if (fieldType .equals (String .class )) {
291- field .set (object , stringValue );
292- } else if (isBoolean (fieldType )) {
293- if (StringUtils .isNotEmpty (stringValue )) {
294- field .set (object , Boolean .parseBoolean (stringValue ));
295- }
296- } else if (fieldType == int .class || fieldType == Integer .class ) {
297- field .set (object , NumberUtils .toInt (stringValue , 0 ));
298- } else if (fieldType == long .class || fieldType == Long .class ) {
299- field .set (object , NumberUtils .toLong (stringValue , 0L ));
300- } else {
301- log .warn ("The field type is unsupported for assignment yet: {}" , field );
302- }
303- } catch (IllegalAccessException e ) {
304- log .warn ("Failed assigning property {} from value {}: " + e .getMessage (), field , stringValue );
305- }
306- }
307-
308- private boolean isBoolean (Class <?> type ) {
309- return type == boolean .class || type == Boolean .class ;
310- }
311-
312290 public static InputSource makeStringInputSource (String content ) {
313291 return new InputSource (new StringReader (content ));
314292 }
0 commit comments