readonly = "true".equalsIgnoreCase(props.getProperty(propName + ".readonly"));
ResourceProperties config = props.getSubProperties(propName + '.');
    public void update(String desc, Properties props) {        Application app = ownType.getApplication();        if ((desc == null) || "".equals(desc.trim())) {            if (propName != null) {                reftype = PRIMITIVE;                columnName = propName;            } else {                reftype = INVALID;                columnName = propName;            }        } else {            desc = desc.trim();            int open = desc.indexOf("(");            int close = desc.indexOf(")");            if ((open > -1) && (close > open)) {                String ref = desc.substring(0, open).trim();                String proto = desc.substring(open + 1, close).trim();                if ("collection".equalsIgnoreCase(ref)) {                    virtual = !"_children".equalsIgnoreCase(propName);                    reftype = COLLECTION;                } else if ("mountpoint".equalsIgnoreCase(ref)) {                    virtual = true;                    reftype = COLLECTION;                    prototype = proto;                } else if ("object".equalsIgnoreCase(ref)) {                    virtual = false;                    if (reftype != COMPLEX_REFERENCE) {                        reftype = REFERENCE;                    }                } else {                    throw new RuntimeException("Invalid property Mapping: " + desc);                }                otherType = app.getDbMapping(proto);                if (otherType == null) {                    throw new RuntimeException("DbMapping for " + proto +                                               " not found from " + ownType.getTypeName());                }                // make sure the type we're referring to is up to date!                if (otherType.needsUpdate()) {                    otherType.update();                }            } else {                virtual = false;                columnName = desc;                reftype = PRIMITIVE;            }        }        readonly = "true".equalsIgnoreCase(props.getProperty(propName + ".readonly"));        isPrivate = "true".equalsIgnoreCase(props.getProperty(propName + ".private"));        // the following options only apply to object and collection relations        if ((reftype != PRIMITIVE) && (reftype != INVALID)) {            Vector newConstraints = new Vector();            parseOptions(newConstraints, props);            constraints = new Constraint[newConstraints.size()];            newConstraints.copyInto(constraints);            if (reftype == REFERENCE || reftype == COMPLEX_REFERENCE) {                if (constraints.length == 0) {                    referencesPrimaryKey = true;                } else {                    boolean rprim = false;                    for (int i=0; i<constraints.length; i++) {                        if (constraints[0].foreignKeyIsPrimary()) {                            rprim = true;                        }                    }                    referencesPrimaryKey = rprim;                }                // check if this is a non-trivial reference                if (constraints.length > 0 && !usesPrimaryKey()) {                    reftype = COMPLEX_REFERENCE;                } else {                    reftype = REFERENCE;                }            }            if (reftype == COLLECTION) {                referencesPrimaryKey = (accessName == null) ||                        accessName.equalsIgnoreCase(otherType.getIDField());            }            // if DbMapping for virtual nodes has already been created,            // update its subnode relation.            // FIXME: needs to be synchronized?            if (virtualMapping != null) {                virtualMapping.lastTypeChange = ownType.lastTypeChange;                virtualMapping.subRelation = getVirtualSubnodeRelation();                virtualMapping.propRelation = getVirtualPropertyRelation();            }        } else {            referencesPrimaryKey = false;        }    }