[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