INode n = parent.getNode(value);
INode n = (INode) parent.getChildElement(value);
    public void setString(String propname, String value) {        // nmgr.logEvent ("setting String prop");        checkWriteLock();        if (propMap == null) {            propMap = new Hashtable();        }        propname = propname.trim();        String p2 = propname.toLowerCase();        Property prop = (Property) propMap.get(p2);        String oldvalue = null;        if (prop != null) {            oldvalue = prop.getStringValue();            // check if the value has changed            if ((value != null) && value.equals(oldvalue)) {                return;            }            prop.setStringValue(value);        } else {            prop = new Property(propname, this);            prop.setStringValue(value);            propMap.put(p2, prop);        }        // check if this may have an effect on the node's URL when using accessname        // but only do this if we already have a parent set, i.e. if we are already stored in the db        Node parent = (parentHandle == null) ? null : (Node) getParent();        if ((dbmap != null) && (parent != null) && (parent.getDbMapping() != null)) {            // check if this node is already registered with the old name; if so, remove it.            // then set parent's property to this node for the new name value            DbMapping parentmap = parent.getDbMapping();            Relation propRel = parentmap.getSubnodeRelation();            String dbcolumn = dbmap.propertyToColumnName(propname);            if ((propRel != null) && (propRel.accessName != null) &&                    propRel.accessName.equals(dbcolumn)) {                INode n = parent.getNode(value);                if ((n != null) && (n != this)) {                    parent.unset(value);                    parent.removeNode(n);                }                if (oldvalue != null) {                    n = parent.getNode(oldvalue);                    if (n == this) {                        parent.unset(oldvalue);                        parent.addNode(this);                        // let the node cache know this key's not for this node anymore.                        nmgr.evictKey(new SyntheticKey(parent.getKey(), oldvalue));                    }                }                parent.setNode(value, this);                setName(value);            }        }        // check if the property we're setting specifies the prototype of this object.        if ((dbmap != null) && (dbmap.getPrototypeField() != null)) {            String pn = dbmap.columnNameToProperty(dbmap.getPrototypeField());            if (propname.equals(pn)) {                DbMapping newmap = nmgr.getDbMapping(value);                if (newmap != null) {                    // see if old and new prototypes have same storage - otherwise type change is ignored                    String oldStorage = dbmap.getStorageTypeName();                    String newStorage = newmap.getStorageTypeName();                    if (((oldStorage == null) && (newStorage == null)) ||                            ((oldStorage != null) && oldStorage.equals(newStorage))) {                        long now = System.currentTimeMillis();                        dbmap.setLastDataChange(now);                        newmap.setLastDataChange(now);                        this.dbmap = newmap;                        this.prototype = value;                    }                }            }        }        lastmodified = System.currentTimeMillis();        if (state == CLEAN) {            markAs(MODIFIED);        }    }