public List<String> getProperties(String name, boolean ignored) {
        List<String> result = new ArrayList<>();
        String[] propName = parsePropertyName(name);

        boolean updateEncryption = false;

        final Lock readLock = readWriteLock.readLock();
        readLock.lock();
        try {
            // Search for this property by traversing down the XML hierarchy,
            // stopping one short.
            Element element = document.getRootElement();
            for (int i = 0; i < propName.length - 1; i++) {
                element = element.element(propName[i]);
                if (element == null) {
                    // This node doesn't match this part of the property name which
                    // indicates this property doesn't exist so return empty array.
                    return result;
                }
            }
            // We found matching property, return names of children.
            Iterator<Element> iter = element.elementIterator(propName[propName.length - 1]);
            Element prop;
            String value;
            while (iter.hasNext()) {
                prop = iter.next();
                // Empty strings are skipped.
                value = prop.getTextTrim();
                if (!"".equals(value)) {
                    // check to see if the property is marked as encrypted
                    if (JiveGlobals.isXMLPropertyEncrypted(name)) {
                        Attribute encrypted = prop.attribute(ENCRYPTED_ATTRIBUTE);
                        if (encrypted != null) {
                            value = JiveGlobals.getPropertyEncryptor().decrypt(value);
                        } else {
                            // rewrite property as an encrypted value
                            // TODO find a way to modify the Element while holding a Write lock rather than a Read lock.
                            prop.addAttribute(ENCRYPTED_ATTRIBUTE, "true");
                            updateEncryption = true;
                        }
                    }
                    result.add(value);
                }
            }
        } finally {
            readLock.unlock();

            // Outside read-lock: ReentrantReadWriteLock does not allow obtaining a write-lock while a read-lock is acquired.
            if (updateEncryption) {
                Log.info("Rewriting values for XML property " + name + " using encryption");
                final Lock writeLock = readWriteLock.writeLock();
                writeLock.lock();
                try {
                    saveProperties();
                } finally {
                    writeLock.unlock();
                }
            }
        }
        return result;
    }
Return all values who's path matches the given property
name as a String array, or an empty array if the if there
are no children. This allows you to retrieve several values
with the same property name. For example, consider the
XML file entry:
<pre>
&lt;foo&gt;
    &lt;bar&gt;
        &lt;prop&gt;some value&lt;/prop&gt;
        &lt;prop&gt;other value&lt;/prop&gt;
        &lt;prop&gt;last value&lt;/prop&gt;
    &lt;/bar&gt;
&lt;/foo&gt;
</pre>
If you call getProperties("foo.bar.prop") will return a string array containing
{"some value", "other value", "last value"}.

@param name the name of the property to retrieve
@param ignored unused parameter
@return all child property values for the given node name.
xmppserver/src/main/java/org/jivesoftware/util/XMLProperties.java