private void internalSetProperties()

in src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/ResidualPropertiesCollectionConverterImpl.java [157:218]


    private void internalSetProperties(Session session, Node parentNode,
        CollectionDescriptor collectionDescriptor,
        ManageableObjects objects, boolean removeExisting)
        throws RepositoryException {

        String jcrName = getCollectionJcrName(collectionDescriptor);

        // can only persist maps, not general collections
        if (!(objects instanceof ManageableMap)) {
            return;
        }

        // Delete existing values - before checking for collection !
        if (removeExisting) {
            for (PropertyIterator pi = parentNode.getProperties(jcrName); pi.hasNext();) {
                Property prop = pi.nextProperty();
                if (!prop.getDefinition().isProtected()) {
                    prop.remove();
                }
            }
        }

        AtomicTypeConverter atomicTypeConverter = getAtomicTypeConverter(collectionDescriptor);

        try {
            Map map = (Map) objects.getObjects();
            ValueFactory valueFactory = session.getValueFactory();
            for (Iterator ei = map.entrySet().iterator(); ei.hasNext();) {
                Map.Entry entry = (Map.Entry) ei.next();
                String name = String.valueOf(entry.getKey());

                // verify the property is not an existing protected property
                if (parentNode.hasProperty(name)
                    && parentNode.getProperty(name).getDefinition().isProtected()) {
                    continue;
                }

                Object value = entry.getValue();
                if (value instanceof List) {
                    // multi value
                    List valueList = (List) value;
                    Value[] jcrValues = new Value[valueList.size()];
                    int i = 0;
                    for (Iterator vi = valueList.iterator(); vi.hasNext();) {
                        value = vi.next();
                        jcrValues[i++] = atomicTypeConverter.getValue(
                            valueFactory, value);
                    }
                    parentNode.setProperty(name, jcrValues);
                } else {
                    // single value
                    Value jcrValue = atomicTypeConverter.getValue(valueFactory,
                        value);
                    parentNode.setProperty(name, jcrValue);
                }
            }
        } catch (ValueFormatException vfe) {
            throw new ObjectContentManagerException("Cannot insert collection field : "
                + collectionDescriptor.getFieldName() + " of class "
                + collectionDescriptor.getClassDescriptor().getClassName(), vfe);
        }
    }