Changeset 16181 in josm


Ignore:
Timestamp:
2020-03-21T12:00:55+01:00 (4 years ago)
Author:
simon04
Message:

see #18954, see #18864 - Introduce StringParser for parsing various types

Location:
trunk
Files:
2 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/tools/XmlObjectParser.java

    r16180 r16181  
    1717import java.util.Locale;
    1818import java.util.Map;
     19import java.util.Optional;
    1920import java.util.Stack;
    2021
     
    6869        private final Stack<Object> current = new Stack<>();
    6970        private StringBuilder characters = new StringBuilder(64);
    70 
    7171        private Locator locator;
     72        private final StringParser primitiveParsers = new StringParser(StringParser.DEFAULT)
     73                .registerParser(boolean.class, this::parseBoolean)
     74                .registerParser(Boolean.class, this::parseBoolean);
    7275
    7376        @Override
     
    123126        }
    124127
    125         private Object getValueForClass(Class<?> klass, String value) {
    126             if (boolean.class.equals(klass))
    127                 return parseBoolean(value);
    128             else if (char.class.equals(klass))
    129                 return value.charAt(0);
    130             else if (short.class.equals(klass) || Short.class.equals(klass))
    131                 return Integer.valueOf(value);
    132             else if (Integer.class.equals(klass))
    133                 return Integer.valueOf(value);
    134             else if (Long.class.equals(klass))
    135                 return Long.valueOf(value);
    136             else if (Float.class.equals(klass))
    137                 return Float.valueOf(value);
    138             else if (Double.class.equals(klass))
    139                 return Double.valueOf(value);
    140             return value;
    141         }
    142 
    143128        private void setValue(Entry entry, String fieldName, String value) throws SAXException {
    144129            if (value != null) {
     
    157142                    f = entry.getField("locale_" + fieldName.substring(lang.length()));
    158143                }
    159                 if (f != null && Modifier.isPublic(f.getModifiers()) && (
    160                         String.class.equals(f.getType()) || boolean.class.equals(f.getType()) || char.class.equals(f.getType()) ||
    161                         Float.class.equals(f.getType()) || Double.class.equals(f.getType()) ||
    162                         short.class.equals(f.getType()) || Short.class.equals(f.getType()) ||
    163                         Long.class.equals(f.getType()) || Integer.class.equals(f.getType()))) {
    164                     f.set(c, getValueForClass(f.getType(), value));
     144                Optional<?> parsed;
     145                if (f != null && Modifier.isPublic(f.getModifiers()) && (parsed = primitiveParsers.tryParse(f.getType(), value)).isPresent()) {
     146                    f.set(c, parsed.get());
    165147                } else {
    166148                    String setter;
     
    173155                    Method m = entry.getMethod(setter);
    174156                    if (m != null) {
    175                         m.invoke(c, getValueForClass(m.getParameterTypes()[0], value));
     157                        parsed = primitiveParsers.tryParse(m.getParameterTypes()[0], value);
     158                        m.invoke(c, parsed.isPresent() ? parsed.get() : value);
    176159                    }
    177160                }
Note: See TracChangeset for help on using the changeset viewer.