The "departments" property is a containment reference - not a simple 
cross-reference (pointer). A DataObject can only have a single container, 
so SDO specifies that if you add an object to a containment reference, it 
is automatically removed from its previous container, if it has one.

You could define a non-containment property and set two of those to point 
to a single object, but using it in a way that crosses DataGraphs is also 
not allowed. SDO DataGraphs are supposed to be self contained - any 
non-containment references in a DataGraph need to point to objects that 
are contained in the same DG.

Frank

"Murtaza Goga" <[EMAIL PROTECTED]> wrote on 03/20/2007 12:09:28 
PM:

> Maybe I confused the issue with the way I had coded it.  I want to add a
> reference to the 'department' object in the two disconnected DataGraphs.
> I was calling DataObject.detach to remove the container reference.  The
> test case will fail with the same exception if you comment out the
> detach.
> 
> I am not removing objects, I am adding objects.  At the end of the test
> case I would have expected to see companyA to have 1 department and
> companyB to have 2 departments.  The only way we are able to work around
> this is by making a copy of the object as follows:
> 
>     for (Iterator iter = departments_A.iterator(); iter.hasNext();) {
>       DataObject department_A = (DataObject) iter.next();
>       departments_B.add(CopyHelper.INSTANCE.copy(department_A));
>     }
> 
>    This is the failing test code fragment:
>    for (Iterator iter = departments_A.iterator(); iter.hasNext();) {
>       DataObject department_A = (DataObject) iter.next();
>       departments_B.add(department_A);
>     }
> 
> I hope this clarifies the use case and question.
> 
> -----Original Message-----
> From: Frank Budinsky [mailto:[EMAIL PROTECTED] 
> Sent: Tuesday, March 20, 2007 11:54 AM
> To: tuscany-user@ws.apache.org
> Subject: Re: ConcurrentModificationException Disconnected DataGraphs
> 
> Murtaza,
> 
> This is just a standard Java programming issue. You can't remove objects
> 
> in a List while you have an active Iterator, unless you use 
> Iterator.remove().
> 
> In your example, instead of this:
> 
>        department_A.detach();
> 
> you would need to call:
> 
>       iter.remove();
> 
> to remove the department from the list and inform the Iterator of the 
> change.
> 
> Frank
> 
> 
> "Murtaza Goga" <[EMAIL PROTECTED]> wrote on 03/20/2007
> 11:24:34 
> AM:
> 
> > We have two disconnected DataGraphs and when we add DataObjects from
> one
> > DataGraph into the other (with or without 'detach' being called) we
> are
> > observe ConcurrentModificationExceptions.  I have pasted a simple test
> > case below which adds a 'department' from one company into another.
> > This test case will error out with the above exception.  The
> company.xsd
> > is from the Tuscany M3 RC1 build.
> > 
> > 
> > 
> > Can someone explain this behavior and what should be the recommended
> > usage pattern?
> > 
> > 
> > 
> >   /**
> > 
> >    * @see junit.framework.TestCase#setUp()
> > 
> >    */
> > 
> >   @Override
> > 
> >   protected void setUp() throws Exception {
> > 
> >     XSDHelper.INSTANCE.define(ClassLoader
> > 
> >         .getSystemResourceAsStream("company.xsd"), null);
> > 
> >   }
> > 
> > 
> > 
> >   /**
> > 
> >    * Test list usage.
> > 
> >    */
> > 
> >   public void test01Concurrency() {
> > 
> >     DataGraph dataGraph_A = createCompanyDataGraph(1);
> > 
> >     DataGraph dataGraph_B = createCompanyDataGraph(1);
> > 
> > 
> > 
> >     List departments_A =
> > dataGraph_A.getRootObject().getList("departments");
> > 
> >     List departments_B =
> > dataGraph_B.getRootObject().getList("departments");
> > 
> >     for (Iterator iter = departments_A.iterator(); iter.hasNext();) {
> > 
> >       DataObject department_A = (DataObject) iter.next();
> > 
> >       department_A.detach(); // Does not matter if this call is made
> or
> > not
> > 
> >       departments_B.add(department_A);
> > 
> >     }
> > 
> >   }
> > 
> > 
> > 
> >   /**
> > 
> >    * Creates the company datagraph.
> > 
> >    * @param departmentsToCreate the number of departments to create.
> > 
> >    * @return the DataGraph.
> > 
> >    */
> > 
> >   private DataGraph createCompanyDataGraph(int departmentsToCreate) {
> > 
> >     DataGraph dataGraph = SDOUtil.createDataGraph();
> > 
> >     dataGraph.createRootObject("company.xsd", "CompanyType");
> > 
> >     for (int i = 0; i < departmentsToCreate; i++) {
> > 
> >       dataGraph.getRootObject().createDataObject("departments",
> > "company.xsd",
> > 
> >           "DepartmentType");
> > 
> >     }
> > 
> >     return dataGraph;
> > 
> >   }
> > 
> > 
> > 
> > Thanks,
> > 
> > Murtaza.
> > 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to