[omniORB] Sequences and Java Client

Armen Yampolsky ayampolsky@erols.com
Thu, 11 Feb 1999 18:51:03 +0000


My apologies for rejuvinating an old thread, but I am having questions
regarding the proper way to handle sequences of objects. My issues stem
from the fact that my client is in Java (viz., Sun's ORB impl), so I can
not call delete on the sequence from Java. Instead, I am resorting to
using an unload(CORBA::Object *obj) method in my factory. I want this
simple method to correctly release all resources associated with the
object in the argument, including any objects which *it* may have
instantiated and copied into a sequence.

I am attaching a fragment of code depicting what I am doing. I would
love it if someone could clarify the situation for me. TIA!


IDL:
==============
interface Echo
{
    void setMessage(in string message);
    string getMessage();
};

interface EchoList
{
    typedef sequence<Echo> Echoseq;
    Echoseq getEchos();
};

interface Factory
{
    EchoList load();
    void unload(CORBA::Object obj);
};


Server:
=================
Echoseq* EchoList_i::getEchos()
{
 CORBA::Long size = 3;
 Echoseq* seq = new Echoseq();  //instantiate sequence on the heap

 static char *value_list[] =
 {
  "Hello",
  "Hi There",
  "Hi Again"
 };

 seq->length(size);

 for (int i = 0; i < size; i++)
 {
  Echo_i *echo = new Echo_i();
  echo->_obj_is_ready(_boa());    //I export it to the BOA straightaway
  echo->setMessage(CORBA::string_dup(value_list[i]));

  (*seq)[i] = echo->_this();
 }

return seq;
}


EchoList_ptr Factory_i::load()
{
 EchoList_i *list = new EchoList_i();
 list->_obj_is_ready(_boa());
 EchoList_ptr list_ptr = list->_this();
 return list_ptr;
}

void Factory_i::unload(CORBA::Object *obj)
{
 _boa()->dispose(obj);    //this should call everyone's destructor, no?
}



Client (Java):
=========================
org.omg.CORBA.Object factory_obj =
MyNameResolvingClass.getFactoryFromNameService();
Factory factory = FactoryHelper.narrow(factory_obj);
EchoList list = EchoListHelper.narrow(factory.load());
Echo[] echos = list.getEchos();
for (int i = 0; i<echos.length; i++)
{
    System.err.println(echos[i].getMessage());
}

//Now I want the server to release all resources associated with the
EchoList,
//but the 3 Echo destructors are never called!
factory.unload(list);

=========================
END
=========================



--
Armen Yampolsky
Axiom Software Labs
New York