On 15/12/06, Jean-Sebastien Delfino <[EMAIL PROTECTED]> wrote:

Pete Robbins wrote:
> Actually we are wrong here. To replace the isMany() logic you need to
>
>
> dob = sequence->getDataObject*Value*(i);
>
>
> getDataObject returns the sequenced DO not the value at position *i*.
>
> Cheers,
>
>
> On 15/12/06, Yang ZHONG <[EMAIL PROTECTED]> wrote:
>
>> It depends on implementation, e.g. Tuscany C++ get(property)
>> delegates to
>> get(int), and Tuscany Java get(int) delegates to get(property)
>>
>> On 12/14/06, Jean-Sebastien Delfino <[EMAIL PROTECTED]> wrote:
>> >
>> > [snip]
>> > Pete Robbins wrote:
>> > > On 14/12/06, Yang ZHONG <[EMAIL PROTECTED]> wrote:
>> > >>
>> > >>                            if (seqProperty.isMany())
>> > >>                            {
>> > >>                                int index =
>> sequence->getListIndex(i);
>> > >>                                dob =
>> > >> dataObject->getList(seqProperty)[index];
>> > >>                            }
>> > >>                            else
>> > >>                            {
>> > >>                                dob =
>> > >> dataObject->getDataObject(seqProperty);
>> > >>                            }
>> > >> might have an alternative:
>> > >>                            dob = sequence->getDataObject(i)
>> > >
>> > >
>> > > Correct. I recall making the same simplification in some code
>> > recently...
>> > > can't remember where though ;-) The code in CopyHelper and
>> > > SDOXMLWriter use
>> > > the longer method but I'm sure dob = sequence->getDataObject(i)
will
>> > > work.
>> > >
>> > > Cheers,
>> > >
>> >
>> > OK, Thanks! I had just blindly mirrored  what I had seen in
CopyHelper
>> > for this :) This triggers another question: Is it more efficient to
>> > access properties by index or by property object? In other words,
>> should
>> > I do dob->getXyz(i) or dob->getXyz(property)?
>> >
>> > --
>> > Jean-Sebastien
>> >
>> > --
>> >
>> > Yang ZHONG
>>
>>
>
>

Ok, thanks for the clarification. I am now looking at similar code in
Utils::printDO and have one more question:

This code starts at Utils.cpp:441.

                   SequencePtr sequence = dataObject->getSequence();
                   if (sequence != NULL)
                   {
                       for (unsigned int i = 0; i < sequence->size(); i++)
                       {
                           if (sequence->isText(i))
                           {
                               tabs(inc);
                               cout<< "Text Value: " <<
sequence->getCStringValue(i) <<endl ;
                           }
                           else {
                               const Property& p =
sequence->getProperty(i);

                               tabs(inc);
                               cout << "Property: " << p.getName() <<
endl;

                               const Type& propertyType = p.getType();

                               tabs(inc);
                               cout << "Property Type: " <<
propertyType.getURI()<< "#" << propertyType.getName() << endl;

                               if (dataObject->isSet(p))
                               {


//////////////////////////////////////////////////////////////////////
                                   // For a many-valued property get
the list of values

//////////////////////////////////////////////////////////////////////
                                   if (p.isMany())
                                   {
                                       inc++;
                                       DataObjectList& dol =
dataObject->getList(p);
                                       for (unsigned int j = 0; j
<dol.size(); j++)
                                       {
                                           tabs(inc);
                                           cout << "Value " << j <<endl;
                                           inc++;

                                           if (propertyType.isDataType())
                                           {
                                               tabs(inc);
                                               cout<< "Property Value:
" << dol.getCString(j) <<endl ;
                                           }
                                           else
                                               printDO(dol[j], inc);
                                           inc--;
                                       }
                                       inc--;
                                   } // end IsMany

This code iterates over a sequence, gets a DataObjectList from a
property with isMany == true, then iterates over the the DataObjectList
and prints all entries in the list.

On the other hand, my code in SDOUtils::accept(...) iterates over a
sequence, gets a DataObjectList from a property with isMany == true, but
then picks the one entry from the list that matches the sequence entry
(which you said earlier in this thread can be done in a simpler way by
calling sequence->getDataObjectValue(i)).

Which code is right? Does Utils::printDO() print the same entries twice?
Or am I going to miss entries in SDOUtils::accept()?

Thanks

--
Jean-Sebastien


Your newer code is correct. Feel free to change the printDO to use the
visitor code.

There is currently an outstanding problem that if the DO is sequenced but
properties ar set using dataobject->setXX then they do not appear in the
sequence but they should... and will soon.

--
Pete

Reply via email to