@Nonnull private ResourceBundle toResourceBundle(@Nonnull Document document) { document.getDocumentElement().normalize(); final Map<String, Object> map = new LinkedHashMap<>(); traverseNodes(map, document.getDocumentElement().getChildNodes()); return new AbstractMapResourceBundle() { @Override protected void initialize(@Nonnull Map<String, Object> entries) { entries.putAll(map); } }; }
@Nonnull @Override public Collection<ResourceBundle> load(@Nonnull String name) { requireNonBlank(name, ERROR_FILENAME_BLANK); List<ResourceBundle> bundles = new ArrayList<>(); List<URL> resources = getResources(name, XML_SUFFIX); if (resources != null) { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = null; try { documentBuilder = documentBuilderFactory.newDocumentBuilder(); } catch (ParserConfigurationException e) { throw new IllegalStateException("Can not read " + name + XML_SUFFIX, e); } for (URL resource : resources) { if (null == resource) { continue; } try { Document document = documentBuilder.parse(resource.openStream()); ResourceBundle bundle = resourceBundleReader.read(toResourceBundle(document)); bundles.add(bundle); } catch (Exception e) { // ignore } } } return bundles; }
private void traverseNodes(@Nonnull Map<String, Object> accumulator, @Nonnull NodeList nodes) { for (int index = 0; index < nodes.getLength(); index++) { Node item = nodes.item(index); if (item.getNodeType() != Node.ELEMENT_NODE) { continue; } String key = item.getNodeName(); if (item.hasChildNodes()) { if (item.getChildNodes().getLength() == 1) { accumulator.put(key, item.getTextContent().trim()); } else { Map<String, Object> map = new LinkedHashMap<>(); traverseNodes(map, item.getChildNodes()); accumulator.put(key, map); } } else { accumulator.put(key, ""); } } } }