Relation prel = parentmap.getPropertyRelation ();
Relation propRel = parentmap.getPropertyRelation ();
    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 subnodesAreProperties	// 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 prel = parentmap.getPropertyRelation ();	    String dbcolumn = dbmap.propertyToColumnName (propname);	    if (prel != null && prel.accessor != null && prel.accessor.equals (dbcolumn)) {	        INode n = parent.getNode (value, false);	        if (n != null && n != this) {	            parent.unset (value);	            parent.removeNode (n);	        }	        if (oldvalue != null) {	            n = parent.getNode (oldvalue, false);	            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))) {	                dbmap.notifyDataChange ();	                newmap.notifyDataChange ();	                this.dbmap = newmap;	                this.prototype = value;	            }	        }	    }	}	// Server.throwNodeEvent (new NodeEvent (this, NodeEvent.PROPERTIES_CHANGED));	lastmodified = System.currentTimeMillis ();	if (state == CLEAN) markAs (MODIFIED);    }