tuscany-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "kelvin goodson" <kel...@thegoodsons.org.uk>
Subject Re: [SDO] questions about support for Enumeration facet
Date Thu, 10 Jan 2008 15:54:38 GMT
Amita,
   thanks for the patches.  I've had a good look,  but still haven't made up
my mind which way to go.  First off is I think that you should not have
different test cases in your patches.  I believe the test case should always
test for 3 enumerations,  and the patch using the commons.sdo#Strings type
approach should be shown to fail.  This is my preferred approach if it can
be made to work.  I was digging down to see if this is an EMF bug,  but have
not proved it yet.  I was hoping to show that EcoreUtil's encoding for
Strings to String is not always the inverse of it's own String to Strings
mapping,  but we don't seem to use EcoreUtil for both directions of the
mapping.  I may adopt the alternative patsh as a tactical approach,  and
mark the code to keep a handle on the issue,  but I'd like to investigate a
bit further before I make that choice.

Kelvin.

On 10/01/2008, Amita Vadhavkar <amita.vadhavkar@gmail.com> wrote:
>
> Please see the 2 patches attached to JIRA-1360 and give comments.
>
> Regards,
> Amita
>
> On Jan 1, 2008 4:11 PM, Amita Vadhavkar <amita.vadhavkar@gmail.com> wrote:
>
> > Hi Kelvin,
> > Yes , below is the change I tried to see to make a Property of type
> > Strings, in DataObjectUtil -
> >
> >   protected static Property getGlobalProperty(HelperContext hc, String
> > uri, String name)
> >   {
> >     Property property;
> >     if (ExtendedMetaData.ANNOTATION_URI.equals(uri)) {
> >       if ("minExclusive".equals(name) ||...
> >           "enumeration".equals(name) ||
> >           "pattern".equals(name))
> >       {
> >           if("enumeration".equals(name) || "pattern".equals(name)) {
> >               property = SDOUtil.createOpenContentProperty(hc, uri,
> name,
> > ((ModelFactoryImpl)ModelFactory.INSTANCE).getStrings());
> >           } else {
> >               property = SDOUtil.createOpenContentProperty(hc, uri,
> name,
> > ((ModelFactoryImpl)ModelFactory.INSTANCE).getString());
> >           }
> >       }
> >       else
> >       {
> >         property = null;
> >       }
> >     }
> >     else
> >     {
> >       property = hc.getTypeHelper().getOpenContentProperty(uri, name);
> >       if (property == null)
> >       {
> >         property = SDOUtil.createOpenContentProperty(hc, uri, name,
> > ((ModelFactoryImpl)ModelFactory.INSTANCE).getString());
> >       }
> >     }
> >     return property;
> >   }
> >
> > Regards,
> > Amita
> >
> >
> > On Dec 21, 2007 4:31 PM, kelvin goodson <kelvin@thegoodsons.org.uk >
> > wrote:
> >
> > > Amita,
> > >  I'm a little unclear what you have changed.  Have you altered the
> > > enumeration facet Property type to commonj.sdo.{Strings}?
> > > Regards, Kelvin.
> > >
> > > On 21/12/2007, Amita Vadhavkar <amita.vadhavkar@gmail.com > wrote:
> > > >
> > > > This looks quite easy with one small difference in the behavior -
> > > >
> > > > For enum like below -
> > > > <simpleType name="ExampleRating">
> > > >     <restriction base="string">
> > > >         <enumeration value=""/>
> > > >         <enumeration value="Good"/>
> > > >         <enumeration value="Bad"/>
> > > >     </restriction>
> > > > </simpleType>
> > > >
> > > > 1) below returns size as 3 i.e. conuts for the null value
> > > >   if(metaObject instanceof EDataTypeImpl){
> > > >       System.out.println("metaObject instance of EDataTypeImpl");
> > > >       if( property.getName().equals("enumeration")) {
> > > >           System.out.println
> > > >
> > >
> (((EDataTypeImpl)metaObject).getExtendedMetaData().getEnumerationFacet());
> > > >           List enumVals =
> > > >
> > >
> ((EDataTypeImpl)metaObject).getExtendedMetaData().getEnumerationFacet();
> > > >           System.out.println("enum size from
> > > **EMF**"+enumVals.size());
> > > >       }
> > > >   }
> > > >
> > > > 2) whereas below returns size as 2, i.e. does not count for null
> > > > result = SDOUtil.createFromString (getInstanceProperty(type,
> > > > "enumeration").getType(), type.get(getInstanceProperty(type,
> > > > "enumeration")).toString());
> > > > System.out.println("Frank:enumeration"+result+", result
> > > > type:"+result.getClass().getName()+", size-"+ ((java.util.ArrayList
> > > > )result).size());
> > > >
> > > > in 2) the EMF call is made to EcoreUtil.createFromString
> > > > ((EDataType)dataType,
> > > > literal);
> > > > and assumed that DataObjectUtil.getGlobalProperty() checks for enum
> > > and
> > > > does
> > > > SDOUtil.createOpenContentProperty() for Strings.
> > > >
> > > > Suggestions?
> > > >
> > > > Regards,
> > > > Amita
> > > >
> > > > On Dec 17, 2007 4:10 PM, kelvin goodson <kelvin@thegoodsons.org.uk>
> > > wrote:
> > > >
> > > > > Amita,
> > > > >
> > > > >   I think Frank's note in this thread is key to the solution,  in
> > > that
> > > > the
> > > > > line ...
> > > > > return SDOUtil.createFromString(property.getType(), value);
> > > > > will create a List if the type of the Property is set to "
> > > > > commonj.sdo{Strings}"
> > > > >
> > > > >
> > > > > Regards, Kelvin.
> > > > >
> > > > >
> > > > > On 14/12/2007, Amita Vadhavkar <amita.vadhavkar@gmail.com>
wrote:
> > > > > >
> > > > > > Tried to do little more analysis to see what is the way to reach
> > > > > > ExtendedMetadata from DataObjectUtil. Please see the findings
> > > below.
> > > > > >
> > > > > > DataObjectUtil.getMetaObjectInstanceProperty (EModelElement,
> > > Property)
> > > > > can
> > > > > > be
> > > > > > reached from
> > > > > > AttributeImpl(EAttributeImpl), ClassImpl(EClassImpl),
> > > > > > DataTypeImpl(EDataTypeImpl), ReferenceImpl(EReferenceImpl).
> > > > > >
> > > > > > Below is the inheritance for EAttributeImpl -
> > > > > > java.lang.Object
> > > > > >   extended by
> org.eclipse.emf.common.notify.impl.BasicNotifierImpl
> > > > > >       extended by org.eclipse.emf.ecore.impl.BasicEObjectImpl
> > > > > >           extended by org.eclipse.emf.ecore.impl.EObjectImpl
> > > > > >               extended by
> > > org.eclipse.emf.ecore.impl.FlatEObjectImpl
> > > > > >                   extended by
> > > > > > org.eclipse.emf.ecore.impl.EModelElementImpl**
> > > > > >                       extended by
> > > > > > org.eclipse.emf.ecore.impl.ENamedElementImpl
> > > > > >                           extended by
> > > > > > org.eclipse.emf.ecore.impl.ETypedElementImpl
> > > > > >                               extended by
> > > > > > org.eclipse.emf.ecore.impl.EStructuralFeatureImpl
> > > > > >                                   extended by
> > > > > > org.eclipse.emf.ecore.impl.EAttributeImpl
> > > > > >
> > > > > > Below is the inheritance for EClassImpl -
> > > > > > java.lang.Object
> > > > > >   extended by
> org.eclipse.emf.common.notify.impl.BasicNotifierImpl
> > > > > >       extended by org.eclipse.emf.ecore.impl.BasicEObjectImpl
> > > > > >           extended by org.eclipse.emf.ecore.impl.EObjectImpl
> > > > > >               extended by
> > > org.eclipse.emf.ecore.impl.FlatEObjectImpl
> > > > > >                   extended by
> > > > > > org.eclipse.emf.ecore.impl.EModelElementImpl**
> > > > > >                       extended by
> > > > > > org.eclipse.emf.ecore.impl.ENamedElementImpl
> > > > > >                           extended by
> > > > > > org.eclipse.emf.ecore.impl.EClassifierImpl
> > > > > >                               extended by
> > > > > > org.eclipse.emf.ecore.impl.EClassImpl
> > > > > >
> > > > > > Below is the inheritance for EDataTypeImpl -
> > > > > > java.lang.Object
> > > > > >   extended by
> org.eclipse.emf.common.notify.impl.BasicNotifierImpl
> > > > > >       extended by org.eclipse.emf.ecore.impl.BasicEObjectImpl
> > > > > >           extended by org.eclipse.emf.ecore.impl.EObjectImpl
> > > > > >               extended by
> > > org.eclipse.emf.ecore.impl.FlatEObjectImpl
> > > > > >                   extended by
> > > > > > org.eclipse.emf.ecore.impl.EModelElementImpl**
> > > > > >                       extended by
> > > > > > org.eclipse.emf.ecore.impl.ENamedElementImpl
> > > > > >                           extended by
> > > > > > org.eclipse.emf.ecore.impl.EClassifierImpl****
> > > > > >                               extended by
> > > > > > org.eclipse.emf.ecore.impl.EDataTypeImpl****
> > > > > >
> > > > > > Below is the inheritance for EReferenceImpl -
> > > > > > java.lang.Object
> > > > > >   extended by
> org.eclipse.emf.common.notify.impl.BasicNotifierImpl
> > > > > >       extended by org.eclipse.emf.ecore.impl.BasicEObjectImpl
> > > > > >           extended by org.eclipse.emf.ecore.impl.EObjectImpl
> > > > > >               extended by
> > > org.eclipse.emf.ecore.impl.FlatEObjectImpl
> > > > > >                   extended by
> > > > > > org.eclipse.emf.ecore.impl.EModelElementImpl**
> > > > > >                       extended by
> > > > > > org.eclipse.emf.ecore.impl.ENamedElementImpl
> > > > > >                           extended by
> > > > > > org.eclipse.emf.ecore.impl.ETypedElementImpl
> > > > > >                               extended by
> > > > > > org.eclipse.emf.ecore.impl.EStructuralFeatureImpl
> > > > > >                                   extended by
> > > > > > org.eclipse.emf.ecore.impl.EReferenceImpl
> > > > > >
> > > > > > In this heirarchy,  DataObjectUtil.getMetaObjectInstanceProperty
> ()
> > > > > sticks
> > > > > > to
> > > > > > EModelElementImpl as is it common in all these 4 cases.
> > > > > > But in case of EDataTypeImpl there is further hierarchy which
is
> > > > useful
> > > > > > when
> > > > > > it comes to facets - which is EClassifierImpl.
> > > > > > EClassifierImpl has getExtendedMetaData() returning
> > > > > > BasicExtendedMetaData.EClassifierExtendedMetaData. This one
has
> > > all
> > > > the
> > > > > > methods
> > > > > > for getting different facet informations like - java.util.List<
> > > > > > java.lang.String> getEnumerationFacet() , int
> > > getMinLengthFacet()
> > > > > > and so on.
> > > > > >
> > > > > > So a way out to get the enum facet value as a list can be -
in
> > > > > > DataObjectUtil.getMetaObjectInstanceProperty () - do as below
-
> > > > > >
> > > > > >   if(metaObject instanceof EDataTypeImpl/EClassifierImpl){
> > > > > >       if(property.getName().equals("enumeration")) {
> > > > > >           List enumVals =
> > > > > >
> > > >
> > >
> ((EDataTypeImpl)metaObject).getExtendedMetaData().getEnumerationFacet();
> > > > > >           return enumVals;
> > > > > >       }
> > > > > >   }
> > > > > >
> > > > > > Same can be the way to get value of "getPatternFacet() as this
> is
> > > the
> > > > > only
> > > > > > other facet which returns a list" (ref
> > > > > > emfBasicExtendedMetaData.EClassifierExtendedMetaData).
> > > > > >
> > > > > > For all other facets as they return a single value, the current
> > > SDO
> > > > code
> > > > > > may
> > > > > > be enough {OR for all facets on EDataTypeImpl, we can
> > > > > > reach ((EDataTypeImpl)metaObject).getExtendedMetaData() and
call
> > > > > > patricular
> > > > > > getFacet methods, not sure if this is required - suggestions?}
> > > > > >
> > > > > > DataObjectUtil.getMetaObjectInstanceProperties() can remain
> > > unchanged.
> > > > > >
> > > > > > With the above change in
> > > DataObjectUtil.getMetaObjectInstanceProperty
> > > > (),
> > > > > > we
> > > > > > can add a new method in SDOUtil -
> > > > > >
> > > > > > public static List<String> getEnumerationFacet(Type type)
{
> > > > > >    Property enumProperty = getInstanceProperty(type,
> > > "enumeration");
> > > > > >    return DataObjectUtil.getMetaObjectInstanceProperty(type,
> > > > > > enumProperty);
> > > > > > }
> > > > > >
> > > > > > This way for a DataTypeImpl enum facet values will come out
as a
> > > List.
> > > > > > Please give suggestions.
> > > > > > I can open another JIRA and fix patternFacet too in same way.
> > > > > >
> > > > > > Regards,
> > > > > > Amita
> > > > > >
> > > > > > On Dec 12, 2007 3:40 PM, kelvin goodson <
> kelvin@thegoodsons.org.uk>
> > > > > wrote:
> > > > > >
> > > > > > > By the way, until the wiki has been used to update the
> websitre
> > > then
> > > > > the
> > > > > > > FAQ
> > > > > > > can be seen at
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SDO+Java+-+FAQ
> > >
> > > > > > >
> > > > > > > Kelvin.
> > > > > > >
> > > > > > > On 12/12/2007, kelvin goodson <kelvin@thegoodsons.org.uk>
> wrote:
> > >
> > > > > > > >
> > > > > > > > It occurred to me that there's a bit of a knack to
debugging
> > > into
> > > > > EMF
> > > > > > > > code,  so I just wrote an FAQ to describe how to do
> > > > this.  Comments
> > > > > > are
> > > > > > > > welcome on its clarity or accuracy.
> > > > > > > >
> > > > > > > > Regards, Kelvin.
> > > > > > > >
> > > > > > > > On 11/12/2007, kelvin goodson < kelvin@thegoodsons.org.uk>
> > > wrote:
> > > > > > > > >
> > > > > > > > > Amita,
> > > > > > > > >
> > > > > > > > > It feels like option 1 is the easy way to do
things, and
> > > option
> > > > 2
> > > > > is
> > > > > > > the
> > > > > > > > > right way given the introduction of instance
properties on
> > > > > metadata
> > > > > > > provided
> > > > > > > > > for this purpose (but doesn't currently work).
> > > > > > > > >
> > > > > > > > > Here's the results of my digging around.  Let's
start with
> > > what
> > > > I
> > > > > > > found
> > > > > > > > > last since it might prove to be the answer. 
It seems
> highly
> > >
> > > > > likely
> > > > > > to
> > > > > > > be
> > > > > > > > > so,  but there is more thinking to be done. 
So after
> quite
> > > a
> > > > bit
> > > > > of
> > > > > > > digging
> > > > > > > > > to see how things are handled in EMF I saw the
TODO in
> > > > > > DataObjectUtil
> > > > > > > ....
> > > > > > > > >
> > > > > > > > >   public static Object
> > > > getMetaObjectInstanceProperty(EModelElement
> > > > > > > > > metaObject, Property property)
> > > > > > > > >   {
> > > > > > > > >     String value = EcoreUtil.getAnnotation (metaObject,
> > > > > > > > > property.getContainingType().getURI(), property.getName());
> > > > > > > > >     //TODO if (property.isMany()) ... // create
list of
> > > values
> > > > > from
> > > > > > > from
> > > > > > > > > string
> > > > > > > > >     return SDOUtil.createFromString(property.getType(),
> > > value);
> > > > > > > > >   }
> > > > > > > > >
> > > > > > > > > So there's a couple of things I haven't got my
head round
> > > yet
> > > > that
> > > > > > > > > perhaps you could take a look at since I must
divert my
> > > > attention
> > > > > > for
> > > > > > > a
> > > > > > > > > while.  The first is that the instance Property
for the
> > > Type's
> > > > > > > enumeration
> > > > > > > > > is isMany = false.  So even if we handled the
TODO we
> > > wouldn't
> > > > get
> > > > > > the
> > > > > > > > > desired result.  The second is that we must ensure
a
> generic
> > > > > string
> > > > > > > > > tokenizer here,  but I'm not yet confident that
the
> > > tokenizing
> > > > > that
> > > > > > we
> > > > > > > want
> > > > > > > > > to satisfy the current issue would be the same
for all
> > > > Properties.
> > > > > > >  What I
> > > > > > > > > mean by this is that for the example you give,
 it starts
> > > with
> > > > the
> > > > > > > separator
> > > > > > > > > "space" indicating that the first literal that
should be
> > > > returned
> > > > > > from
> > > > > > > > > tokenizing is the empty string.  Would this be
true for
> all
> > > > > Property
> > > > > > > values,
> > > > > > > > > or is it the case that sometimes we would consider
> trimming
> > > > > leading
> > > > > > > white
> > > > > > > > > space?
> > > > > > > > >
> > > > > > > > > I had been going down a track of investigating
storage and
> > > > > retrieval
> > > > > > > of
> > > > > > > > > the enumeration facets inside EMF,  which may
yet prove to
> > > be
> > > > the
> > > > > > way
> > > > > > > to fix
> > > > > > > > > this issue.  The facets seem to be stored in
two
> ways.  Once
> > > as
> > > > an
> > > > > > > > > annotation on the metadata artifact directly,
in
> > > concatenated
> > > > > string
> > > > > > > form,
> > > > > > > > > and once as a vector on the extended metadata
associated
> > > with
> > > > the
> > > > > > > eDataType
> > > > > > > > > (See setEnumerationFacet(EDataType,List) of
> > > > BasicExtendedMetaData.
> > > > > > >  The bulk
> > > > > > > > > of code in setEnumerationFacet is devoted to
concatenating
> > > the
> > > > > > string
> > > > > > > > > literals and hanging the annotation on the eDataType
> > > > (Type),  but
> > > > > > the
> > > > > > > last
> > > > > > > > > line then squirrels the original input vector
of
> > > enumerations
> > > > away
> > > > > > on
> > > > > > > the
> > > > > > > > > extended metadata.
> > > > > > > > >
> > > > > > > > > Now there is a basicGetEnumerationFacet method
on the
> nested
> > > > class
> > > > > > > > > EDataTypeExtendedMetaDataImpl,  which is contained
in
> > > > > > > BasicExtendedMetaData
> > > > > > > > > which has all the reverse logic for unpacking
the vector
> of
> > > > > > > enumerations
> > > > > > > > > from the concatenated string,  but it never gets
called in
> > > the
> > > > > > > scenario you
> > > > > > > > > described.  Given the piece of code I included
above, that
> > > > > wouldn't
> > > > > > > work
> > > > > > > > > anyway, given the EcoreUtil .getAnnotation returns
a
> single
> > > > > String.
> > > > > > > > >
> > > > > > > > > I don't have a solution yet,  but I'll think
on it.  Any
> > > > > suggestions
> > > > > > > you
> > > > > > > > > may have are welcome.
> > > > > > > > >
> > > > > > > > > Regards, Kelvin.
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > On 11/12/2007, Amita Vadhavkar <amita.vadhavkar@gmail.com>
> > > > wrote:
> > > > > > > > > >
> > > > > > > > > > Hi,
> > > > > > > > > > I tried TUSCANY-1360 related to enumeration
facet. Below
> > > is
> > > > the
> > > > > > > > > > summary of
> > > > > > > > > > what was
> > > > > > > > > > discussed so far and a few questions.
> > > > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> -------------------------------------------------------------------------------------------------------------------------------------
> > >
> > > > > > > > > >
> > > > > > > > > > 1) One way to do this is -
> > > > > > > > > > public static List<String> getEnumerationFacet(Type
> type)
> > > {
> > > > > > > > > >     return ExtendedMetaData.INSTANCE.getEnumerationFacet
> > > > > > > > > > ((EDataType)type);
> > > > > > > > > > }
> > > > > > > > > >
> > > > > > > > > > which works very straight forward and gives
a list of
> > > enums.
> > > > > > > > > >
> > > > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> -------------------------------------------------------------------------------------------------------------------------------------
> > >
> > > > > > > > > > 2) Another way is -
> > > > > > > > > > Do type.getInstanceProperties() and find
the Property
> > > called
> > > > > > > > > > "enumeration".
> > > > > > > > > >
> > > > > > > > > > Where, getInstanceProperties() calls
> > > > > > > > > > DataObjectUtil.getMetaObjectInstanceProperties
> > > (EModelElement
> > > > > > > > > > metaObject)
> > > > > > > > > > in which for the given metaObject its annotations
and
> > > details
> > > > of
> > > > > > > each
> > > > > > > > > > annotations are traversed. Each
> > > > > > > > > > Annotation Detail is mapped to
> EStringToStringMapEntryImpl
> > >
> > > > entry
> > > > > > > like
> > > > > > > > > > below
> > > > > > > > > > -
> > > > > > > > > >
> > > > > > > > > > EStringToStringMapEntryImpl entry =
> > > > > > > > > > (EStringToStringMapEntryImpl)iter.next();
  //iter is
> > > Iterator
> > > > > > over
> > > > > > > > > > current
> > > > > > > > > > Annotation's Details
> > > > > > > > > > String propertyName = entry.getTypedKey();
> > > > > > > > > >
> > > > > > > > > > Property globalProperty = getGlobalProperty(hc,
> > > propertyURI,
> > > > > > > > > > propertyName);
> > > > > > > > > > if (globalProperty != null)
> > > > > > > > > > {
> > > > > > > > > >    result.add(globalProperty);
> > > > > > > > > > }
> > > > > > > > > >
> > > > > > > > > > Result is a UniqueEList which is returned
at the end.
> > > > > > > > > >
> > > > > > > > > > Here, when entry.getTypedKey() is "enumeration",
> > > > > > entry.getTypedValue
> > > > > > > ()
> > > > > > > > > > gives
> > > > > > > > > > a String having space separated enums
> > > > > > > > > >
> > > > > > > > > > e.g. for
> > > > > > > > > > <simpleType name="ExampleRating">
> > > > > > > > > >     <restriction base="string">
> > > > > > > > > >         <enumeration value=""/>
> > > > > > > > > >         <enumeration value="Good"/>
> > > > > > > > > >         <enumeration value="Bad"/>
> > > > > > > > > >     </restriction>
> > > > > > > > > > </simpleType>
> > > > > > > > > >
> > > > > > > > > > it gives,"   Good Bad"
> > > > > > > > > >
> > > > > > > > > > As we see in Property globalProperty =
> > > getGlobalProperty(hc,
> > > > > > > > > > propertyURI,
> > > > > > > > > > propertyName); the TypedKey information
is
> > > > > > > > > > used when forming Property with name "enumeration",
but
> > > the
> > > > > > > TypedValue
> > > > > > > > > > information is not stored in the Property.
> > > > > > > > > > Same thing will be applicable for other
facets like
> > > MinLenght,
> > > > > > > > > > MaxExclusive....
> > > > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> > > > > > > > > >
> > > > > > > > > > Questions:
> > > > > > > > > >
> > > > > > > > > > Thus, the question I have is, in case of
following 2),
> > > what
> > > > will
> > > > > > be
> > > > > > > > > > the way
> > > > > > > > > > to preserve the mapping (key-value)
> > > > > > > > > > information available about facets from
EMF in the
> formed
> > > > > > Property?
> > > > > > > > > > And what
> > > > > > > > > > will be better approach for TUSCANY-1360
> > > > > > > > > > and as such for any other facets?
> > > > > > > > > >
> > > > > > > > > > Regards,
> > > > > > > > > > Amita
> > > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> >
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message