You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tuscany.apache.org by Amita Vadhavkar <am...@gmail.com> on 2008/01/01 11:41:43 UTC

Re: [SDO] questions about support for Enumeration facet

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 <ke...@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 <am...@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 <ke...@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 <am...@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 <ke...@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 <ke...@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 <ke...@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 <am...@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
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>

Re: [SDO] questions about support for Enumeration facet

Posted by kelvin goodson <ke...@thegoodsons.org.uk>.
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 <am...@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 <am...@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 <ke...@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 <am...@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 <ke...@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 <am...@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
> > > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> >
>

Re: [SDO] questions about support for Enumeration facet

Posted by Amita Vadhavkar <am...@gmail.com>.
Please see the 2 patches attached to JIRA-1360 and give comments.

Regards,
Amita

On Jan 1, 2008 4:11 PM, Amita Vadhavkar <am...@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 <ke...@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 <am...@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 <ke...@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 <ke...@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 <am...@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
> > > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>
>