Mapping object references to objects

The somdSOMObjFromRef method maps SOMDObjects to SOMObjects. This method is invoked by SOMOA on the server object, for each object reference found as a parameter in a request.

The default implementation for somdSOMObjFromRef returns the address of the SOMObject for which the specified object reference was create (using the somdRefFromSOMObj method). If the object reference was not created by the same server process, then an exception (BadObjref) is raised. The default implementation does not, however, verify that the original object (for which the object reference was created) still exists. If the original object has been deleted (for example, by another client program), then the address returned will not represent a valid object, and any methods invoked on that object pointer will result in server failure. Note: The default implementation of somdSOMObjFromRef does not check that the original object address is still valid because the check is very expensive and seriously degrades server performance.

To have a server verify that all results from somdSOMObjFromRef represent valid objects, server programmers can subclass SOMDServer and override the somdSOMObjFromRef method to perform a validity check on the result (using the somIsObj function). For example, a subclass "MySOMDServer" of SOMDServer could implement the somdSOMObjFromRef method as follows:

SOM_Scope SOMObject SOMLINK somdSOMObjFromRef(MySOMDServer somSelf,
                                              Environment * ev,
                                              SOMDObject objref)
{
    SOMObject obj;
    StExcep_INV_OBJREF *ex;

    /* MySOMDServerData *somThis = MySOMDServerGetData(somSelf); */
    MySOMDServerMethodDebug(*MySOMDServer*, *somdSOMObjFromRef");

    obj = MySOMDServer_parent_SOMDServer_somdSOMObjFromRef(somSelf,
                                                    ev, objref);
    if (somIsObj(obj))
        return (obj);
    else {
        ex = (StExcep_INV_OBJREF *)
              SOMMalloc(sizeof(StExcep_INV_OBJREF));
        ex->minor = SOMDERROR_BadObjref;
        ex->completed = NO;
        somSetException(ev, USER_EXCEPTION,
                        ex_StExcep_INV_OBJREF, ex);
        return (NULL);
    }
}


[Back: Hints on the use of create vs. create_constant]
[Next: Dispatching a method]