public void setProperties(String name, List<String> values) {
        String[] propName = parsePropertyName(name);
        // Search for this property by traversing down the XML hierarchy,
        // stopping one short.
        final Lock writeLock = readWriteLock.writeLock();
        writeLock.lock();
        try {
            Element element = document.getRootElement();
            for (int i = 0; i < propName.length - 1; i++) {
                // If we don't find this part of the property in the XML hierarchy
                // we add it as a new node
                if (element.element(propName[i]) == null) {
                    element.addElement(propName[i]);
                }
                element = element.element(propName[i]);
            }
            String childName = propName[propName.length - 1];
            // We found matching property, clear all children.
            List<Element> toRemove = new ArrayList<>();
            Iterator<Element> iter = element.elementIterator(childName);
            while (iter.hasNext()) {
                toRemove.add(iter.next());
            }
            for (iter = toRemove.iterator(); iter.hasNext(); ) {
                element.remove(iter.next());
            }
            // Add the new children.
            for (String value : values) {
                Element childElement = element.addElement(childName);
                if (value.startsWith("<![CDATA[")) {
                    Iterator<Node> it = childElement.nodeIterator();
                    while (it.hasNext()) {
                        Node node = it.next();
                        if (node instanceof CDATA) {
                            childElement.remove(node);
                            break;
                        }
                    }
                    childElement.addCDATA(value.substring(9, value.length() - 3));
                } else {
                    String propValue = value;
                    // check to see if the property is marked as encrypted
                    if (JiveGlobals.isPropertyEncrypted(name)) {
                        propValue = JiveGlobals.getPropertyEncryptor().encrypt(value);
                        childElement.addAttribute(ENCRYPTED_ATTRIBUTE, "true");
                    }
                    childElement.setText(propValue);
                }
            }
            saveProperties();
        } finally {
            writeLock.unlock();
        }

        // Generate event.
        Map<String, Object> params = new HashMap<>();
        params.put("value", values);
        PropertyEventDispatcher.dispatchEvent(name,
                PropertyEventDispatcher.EventType.xml_property_set, params);
    }
Sets a property to an array of values. Multiple values matching the same property
is mapped to an XML file as multiple elements containing each value.
For example, using the name "foo.bar.prop", and the value string array containing
{"some value", "other value", "last value"} would produce the following XML:
<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>

@param name the name of the property.
@param values the values for the property (can be empty but not null).
xmppserver/src/main/java/org/jivesoftware/util/XMLProperties.java