/** * Reads an XML-representation of a list of some general type. * * @param tag The tag for the list <code>Element</code>. * @param type The type of the items to be added. This type needs to have a constructor accepting * a single <code>String</code>. * @return The list. * @exception XMLStreamException if a problem was encountered during parsing. */ public <T> List<T> readList(String tag, Class<T> type) throws XMLStreamException { expectTag(tag); final int length = getAttribute(FreeColObject.ARRAY_SIZE_TAG, -1); if (length < 0) return Collections.<T>emptyList(); List<T> list = new ArrayList<>(length); for (int x = 0; x < length; x++) { try { final String value = getAttribute("x" + x, (String) null); T object = null; if (value != null) { Constructor<T> c = type.getConstructor(type); object = c.newInstance(new Object[] {value}); } list.add(object); } catch (IllegalAccessException | InstantiationException | InvocationTargetException | NoSuchMethodException e) { throw new RuntimeException(e); } } closeTag(tag); return list; }
/** * Close the current tag, checking that it did indeed close correctly. * * @param tag The expected tag name. * @exception XMLStreamException if a closing tag is not found. */ public void closeTag(String tag) throws XMLStreamException { if (nextTag() != XMLStreamConstants.END_ELEMENT) { throw new XMLStreamException( "Parse error, END_ELEMENT expected," + " not: " + getLocalName()); } expectTag(tag); }
/** * Reads an XML-representation of a list of <code>FreeColGameObjectType</code>s. * * @param tag The tag for the list <code>Element</code>. * @param spec The <code>Specification</code> to find items in. * @param type The type of the items to be added. The type must exist in the supplied * specification. * @return The list. * @exception XMLStreamException if a problem was encountered during parsing. */ public <T extends FreeColGameObjectType> List<T> readList( Specification spec, String tag, Class<T> type) throws XMLStreamException { expectTag(tag); final int length = getAttribute(FreeColObject.ARRAY_SIZE_TAG, -1); if (length < 0) return Collections.<T>emptyList(); List<T> list = new ArrayList<>(length); for (int x = 0; x < length; x++) { T value = getType(spec, "x" + x, type, (T) null); if (value == null) logger.warning("Null list value(" + x + ")"); list.add(value); } closeTag(tag); return list; }