It is well understood
org.apache.olingo.odata4.client.core.edm.EdmEnumTypeImpl
implements 
org.apache.olingo.odata4.commons.api.edm.EdmEnumType

but it composes org.apache.olingo.odata4.client.api.edm.xml.EnumType, which is 
under the 'api' namespace, since this class is not really api/interface but 
part of client's internal implementation of the interface, should it be moved 
to 'core' namespace?

Also got another concern around namespace naming: now 'v4' is included in 
namespace, suppose in future there is 'v5' odata protocol, then: even if the 
client usages such as query/post stay unchanged, user still needs to update 
their codes instead of taking new client as non-breaking change.

Thanks,-Challen

-----Original Message-----
From: Francesco Chicchiriccò [mailto:ilgro...@apache.org] 
Sent: 2014年3月3日 15:50
To: dev@olingo.incubator.apache.org
Subject: Re: [OLINGO-169] Work in progress

Hi all,
a quick update.

I am currently implementing, as suggested below, the current set of commons-api 
Edm interfaces on client side, in the same way they are implemented on server 
side, e.g. on top of another whole set of classes:
for example

org.apache.olingo.odata4.server.core.edm.provider.EdmEnumImpl

implements

org.apache.olingo.odata4.commons.api.edm.EdmEnumType

by delegating to an

org.apache.olingo.odata4.server.api.edm.provider.EnumType

server object which contains the actual information about the enum type; in the 
same fashion

org.apache.olingo.odata4.client.core.edm.EdmEnumTypeImpl

is implementing the same EdmEnumType above by delegating to an

org.apache.olingo.odata4.client.api.edm.xml.EnumType

client interface, whose concrete instances (different for V3 and V4) are 
actually constructed by the Jackson XML parser.

At the end of this process I should be able to obtain what discussed below, 
hence I am fine.
I am finding many similarities between server's EdmEnumImpl and client's
EdmEnumTypeImpl: is it fine to you to introduce AbstractEdmEnumTypeImpl in 
commons-core? (and so on, for all other Edm interfaces implementions).

Besides this, I will also remove usage of client-side EdmType and EdmSimpleType 
classes with the commons EdmType hierarchy.

I am going to open two subtasks of OLINGO-169 in JIRA for these.

Few questions I have after looking closely to Edm interfaces:

1. Does EdmServiceMetadata#getMetadata (which returns an InputStream containing 
the metadata document) make sense on client side? I'd say no, since client code 
actually *builds* an EdmServiceMetadata from an InputStream.
Shall we remove such method from common interface?

2. What is EdmEntitySetInfo#getEntitySetUri expected to provide? Isn't the 
external URI of an EntitySet provided by the service document (and only for 
entity sets with 'IncludeInServiceDocument' set to true)?

3. Does Edm#getEntityContainer(FullQualifiedName) make sense? CSDL 
specification (at the beginning of chapter 13) says: "Each metadata document 
used to describe an OData service MUST define exactly one entity container."
I would have expected Edm#getEntityContainer (e.g. without arguments).

Regards.

On 28/02/2014 09:09, Klevenz, Stephan wrote:
> Sorry for responding late.
>
> I am not sure if there is still a problem with using edm interfaces 
> from commons. I can share [1] of OData 2.0 library which has a 
> deserializer for metadata and which returns an interface.
>
> Setters in the interface not necessary. They are required for 
> implementation only. The implementation in [1] is stax based and with 
> that I currently don not see issues with cyclic element dependencies.
>
> If there is a need to change the edm interface so that a client can 
> better deal with it, just make a proposal. We will then cross check 
> for the server case and if there is no issue ... just do it.
>
> Regards,
> Stephan
>
>
> [1]
> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata2.git;
> a=blo 
> b;f=odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/
> ep/co 
> nsumer/XmlMetadataConsumer.java;h=e8677a1112aa319d9b12fa615b39015e63fc
> e1d2;
> hb=HEAD
>
>
> On 26.02.14 17:05, "Challen He" <chall...@microsoft.com> wrote:
>
>> For (1), yes, I agree (the new work is to re-use ODataJClient parser, 
>> and then convert *"old" ODataJClient Edm interfaces* result --> 
>> *Olingo 4 common Edm interfaces* result) About (2), I think so, 
>> unifying Edm interfaces is one of the goals of moving to ASF, and the 
>> resulted Edm interfaces should be 'strong typed'
>> rather than 'weak typed' model. (we can take a look at and prioritize 
>> all tasks for better plan & schedule)
>>
>> Thanks,-Challen
>>
>> -----Original Message-----
>> From: Francesco Chicchiriccò [mailto:ilgro...@apache.org]
>> Sent: 2014年2月26日 23:45
>> To: dev@olingo.incubator.apache.org
>> Subject: Re: [OLINGO-169] Work in progress
>>
>> Hi Challen,
>> thanks for your suggestions: I was actually more willing to check
>>
>> (1) whether my understanding, e.g. the concept difference between "old"
>> ODataJClient Edm interfaces and Olingo 4 common Edm interfaces, is 
>> correct
>> (2) if so, whether it is immediately necessary to change the client 
>> XML Metadata parser accordingly: being not a trivial task, I want to 
>> be sure it is needed before committing to it
>>
>> Hope this clarifies.
>> Regards.
>>
>> On 26/02/2014 16:33, Challen He wrote:
>>> Hi Francesco,
>>>
>>> I think cross/circle reference in Edm is inevitable: not only 
>>> EntityContainer but also EntityType itself may refer to EntityType, e.g.
>>> entity type 'Employee' has a property of 'Manager' type, and 'Manager'
>>> type itself contains a collection of 'Employee'. So the job of 
>>> figuring out their relationships will be taken by user /client / 
>>> server code if common doesn't do it.
>>>
>>> A 2-phased solution is: phase1 - parse CSDL xml doc into a set of 
>>> intermediate csdl objects (they only have weak reference like the 
>>> mentioned String field named 'entityType'), phase2 - use csdl 
>>> objects to first build all edm type objects (EdmComplexType, 
>>> EdmEntityType, EdmEnumType..., need to handle circle references 
>>> among them), then these edm type objects are used to build 
>>> EntitySet/Container/function/action/annotation term...
>>>
>>> I think we can start with the assumption of no circle reference and 
>>> later add support for it, but in the design it looks ok for all Edm 
>>> interface definitions to have 'strong type' references like 
>>> 'EdmEntitySet' -> 'EdmEntityType', or 'EdmEntityType' -> another 
>>> 'EdmEntityType' ...
>>>
>>> (though I am not 100% sure but personally I think entity interfaces 
>>> with getter only will work, considering that they will be created by
>>> factory/builder)
>>>
>>> Thanks,-Challen
>>>
>>> -----Original Message-----
>>> From: Francesco Chicchiriccò [mailto:ilgro...@apache.org]
>>> Sent: 2014年2月26日 19:14
>>> To: dev@olingo.incubator.apache.org
>>> Subject: Re: [OLINGO-169] Work in progress
>>>
>>> Hi,
>>> I have spent some more time in comparing the commons-api Edm 
>>> interfaces and their client-api counterparts and I am going to try 
>>> to explain better my concerns.
>>>
>>> Let's take again the sample below:
>>>
>>> <EntitySet Name="Products" EntityType="ODataDemo.Product">
>>>     <NavigationPropertyBinding
>>> Path="ODataDemo.FeaturedProduct/Advertisement" Target="Advertisements"/>
>>>     <NavigationPropertyBinding Path="Categories" Target="Categories"/>
>>>     <NavigationPropertyBinding Path="Supplier" Target="Suppliers"/>
>>>     <NavigationPropertyBinding Path="ProductDetail"
>>> Target="ProductDetails"/>
>>> </EntitySet>
>>>
>>> Currently, the way odata4-client-core works will barely translate 
>>> this piece of information from XML to Java object(s), where an 
>>> instance of EntitySetImpl - implementation of EntitySet [9] - has a 
>>> String field named 'entityType' with value 'ODataDemo.Product'.
>>>
>>> If you take a look at EdmEntitySet [10] instead, this interface 
>>> supposes that an EdmEntitySetImpl will have an EdmEntityType field 
>>> named 'entityType', whose value is a reference to an 
>>> EdmEntityTypeImpl instance for ODataDemo.Product.
>>>
>>> This fact implies that the metadata XML parser will need, when 
>>> encountering the XML attribute
>>>
>>> EntityType="ODataDemo.Product"
>>>
>>> to look at EdmEntityTypeImpl instances built so far during parsing 
>>> and associate the one with name 'ODataDemo.Product' to the 
>>> EdmEntitySetImpl under construction.
>>> All that where potentially ODataDemo.Product could be not defined in 
>>> the current metadata document but in one of referenced metadata 
>>> documents.
>>>
>>> As you can see, this is a *huge* difference: consider, for example, 
>>> that the instances to link to the one under construction could not 
>>> even be built yet - see the NavigationPropertyBinding's target 
>>> above, where "Categories" could be an EntitySet or a Singleton not 
>>> yet encountered in the XML document being parsed.
>>>
>>> Before starting this considerable change effort, I'd like to 
>>> understand if I am right in the finding above and also if you think 
>>> it is worth to change the way how the client metadata XML parser currently 
>>> works.
>>> If I am right, in fact, we need either to give up on making the 
>>> effort to use the same Edm interfaces client- and server-side or the 
>>> change described above must be implemented.
>>>
>>> Another minor issue I have with commons-api Edm interfaces is that 
>>> they mostly lack setter methods: is it fine to introduce them? It 
>>> will make the XML parser work a little less hard.
>>>
>>> Regards.
>>>
>>> On 25/02/2014 17:16, Amend, Christian wrote:
>>>> 1. Yes using the EdmType hierarchy should work just fine. I Am not 
>>>> quite sure what you mean by parsing type expressions. Do you mean 
>>>> that you have a Java String and would like to have an 
>>>> EdmPrimitiveType for this?
>>>>
>>>> 2. I see your concern. We had a similar question with V2 when we 
>>>> tried to implement a client. We could delete these info objects but 
>>>> would then have to provide methods like getEntitySets() (returning 
>>>> a list of
>>>> EdmEntitySets) at the EDM directly. Otherwise how would a client 
>>>> access the entity sets without knowing their name first.
>>>>
>>>> 2.) b+c) then lets move the V3 interfaces into commons.
>>>>
>>>> Best Regards,
>>>> Christian
>>>>
>>>> -----Original Message-----
>>>> From: Francesco Chicchiriccò [mailto:ilgro...@apache.org]
>>>> Sent: Dienstag, 25. Februar 2014 16:10
>>>> To: dev@olingo.incubator.apache.org
>>>> Subject: Re: [OLINGO-169] Work in progress
>>>>
>>>> On 25/02/2014 14:38, Amend, Christian wrote:
>>>>> Hi Francesco,
>>>>>
>>>>> 1. I don`t quite understand where your concern is there. Could you 
>>>>> please clarify?
>>>> Let's put it differently: is there already something for parsing 
>>>> type expressions?
>>>> Moreover: is there already something to represent types? I guess 
>>>> that EdmType[8]'s hierarchy should fit the job, right? In this case 
>>>> I should be able to remove [1][2][3][4][5] and use EdmType descendants.
>>>>
>>>>> 2.)
>>>>> a) The info interfaces are there because there was no way to get a 
>>>>> list of all entity sets inside the edm without knowing their name.
>>>>> Also this information is needed for the service document.
>>>> Ok: I am not sure whether the existing interfaces are suitable, 
>>>> from a client perspective; consider that client will instantiate 
>>>> the Edm interfaces' implementations by parsing the $metadata XML content.
>>>> As an example, please see how to represent something like as
>>>>
>>>> <EntitySet Name="Products" EntityType="ODataDemo.Product">
>>>>     <NavigationPropertyBinding
>>>> Path="ODataDemo.FeaturedProduct/Advertisement"
>>>> Target="Advertisements"/>
>>>>     <NavigationPropertyBinding Path="Categories" Target="Categories"/>
>>>>     <NavigationPropertyBinding Path="Supplier" Target="Suppliers"/>
>>>>     <NavigationPropertyBinding Path="ProductDetail"
>>>> Target="ProductDetails"/> </EntitySet>
>>>>
>>>> With EntitySet [9] this will result in (please excuse the 
>>>> pseudo-JSON
>>>> representation):
>>>>
>>>> EntitySetImpl {
>>>>    name: "Products",
>>>>    entityType: "ODataDemo.Product",
>>>>    includeInServiceDocument: true,
>>>>    navigationPropertyBindings: [
>>>>      NavigationPropertyBindingImpl {
>>>>        path: "ODataDemo.FeaturedProduct/Advertisement",
>>>>        target: "Advertisements"
>>>>      },
>>>>      ...
>>>>    ]
>>>> }
>>>>
>>>> i.e. this is more or less the translation of the XML snippet above.
>>>>
>>>> With EdmEntitySet [10] instead the representation is much more 
>>>> involved, mostly because metadata is something that is to be built 
>>>> and then pushed out as XML, rather than parsed from XML.
>>>>
>>>> Not sure I actually succeeded in expressing my concerns...
>>>>
>>>>> b) No I think the interfaces in [6] should cover all aspects of 
>>>>> the EDM. If not this is functionality which has to be added.
>>>>> c) If they can coexist without causing conflicts I would put the 
>>>>> V3 interfaces in the commons API. We might not support this on 
>>>>> server side from the beginning but a later refactoring would be 
>>>>> cumbersome IMHO. Although I am open for other opinions.
>>>> The current client Edm interfaces [7] are available for V3 and V4 
>>>> without conflicts, so there should be no problem on having them in 
>>>> odata4-commons-api, without providing server implementations for V3's.
>>>>
>>>> Regards.
>>>>
>>>>> -----Original Message-----
>>>>> From: Francesco Chicchiriccò [mailto:ilgro...@apache.org]
>>>>> Sent: Dienstag, 25. Februar 2014 14:06
>>>>> To: dev@olingo.incubator.apache.org
>>>>> Subject: [OLINGO-169] Work in progress
>>>>>
>>>>> Hi all,
>>>>> I have reached a fair stable point for merging ODataJClient's 
>>>>> Metadata parsing into olingo-odata4 (in the 'olingo169' GIT branch):
>>>>> now metadata parsing works either for V3 and V4 (few unit tests 
>>>>> have been added in olingo-odata4-client-core ).
>>>>>
>>>>> At this point I have two main concerns before considering the work 
>>>>> for
>>>>> OLINGO-169 completed (and consequently merge olingo169 into master):
>>>>>
>>>>> 1. types
>>>>>
>>>>> EdmType [1] is an interface (with concrete implementations 
>>>>> available for
>>>>> V3 and V4) whose main purpose is parsing type expressions (like as
>>>>> 'Collection(ODataDemo.Product)') into a meaningful representation, 
>>>>> e.g.
>>>>> EdmSimpleType [2], EnumType [3], ComplexType [4] or EntityType [5] 
>>>>> and also to provide other useful information (is this a collection?
>>>>> does it have a base type?).
>>>>>
>>>>> I am sure that this duplicates something else in odata-olingo4. 
>>>>> but I need some guidance about how to replace [1][2][3][4][5]. 
>>>>> Also, I suppose that a better location for such items is 
>>>>> olingo-odata4-commons-api rather than olingo-odata4-client-api 
>>>>> (where they reside ATM).
>>>>> Who would like to volunteer?
>>>>>
>>>>>
>>>>> 2. Edm interfaces
>>>>>
>>>>> olingo-odata4-commons-api holds in [6] the current set of Edm 
>>>>> interfaces implemented server-side whilst I have temporarily put 
>>>>> the set of Edm interfaces implemented client-side in 
>>>>> olingo-odata4-client-api's [7] (and subpackages).
>>>>>
>>>>> Again, I need to understand how to reconcile and consolidate these 
>>>>> two sets (into olingo-odata4-commons-api of course), but there are 
>>>>> several aspects I don't understand:
>>>>>
>>>>>      (a) what is the purpose of *Info interfaces (like as 
>>>>> EdmEntitySetInfo)? what's the usage difference with EdmEntitySet?
>>>>>      (b) is the set from [6] still to be completed?
>>>>>      (c) would it be fine to put in [6] the merge with all 
>>>>> interfaces from [7], including V3's or is it better to keep V3's 
>>>>> in olingo-odata4-client-api?
>>>>>
>>>>>
>>>>> Thanks for your support.
>>>>> Regards.
>>>>>
>>>>> [1]
>>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.
>>>>> gi
>>>>> t
>>>>> ;a=blob;f=odata4-lib/odata4-client-api/src/main/java/org/apache/ol
>>>>> in
>>>>> g
>>>>> o/odata4/client/api/edm/EdmType.java;h=5a480d72cbbc707696dd358e117
>>>>> 46
>>>>> 8
>>>>> f0f87980fb;hb=olingo169 [2]
>>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.
>>>>> gi
>>>>> t
>>>>> ;a=blob;f=odata4-lib/odata4-client-api/src/main/java/org/apache/ol
>>>>> in
>>>>> g
>>>>> o/odata4/client/api/data/EdmSimpleType.java;h=7d44c376e89b084c6e85
>>>>> 63
>>>>> c
>>>>> 63317012284278795;hb=olingo169 [3] 
>>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.
>>>>> gi
>>>>> t
>>>>> ;a=blob;f=odata4-lib/odata4-client-api/src/main/java/org/apache/ol
>>>>> in
>>>>> g
>>>>> o/odata4/client/api/edm/EnumType.java;h=614c5e1e85a731ae80de56899e
>>>>> 7d
>>>>> 9
>>>>> d82ae846bf0;hb=olingo169 [4]
>>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.
>>>>> gi
>>>>> t
>>>>> ;a=blob;f=odata4-lib/odata4-client-api/src/main/java/org/apache/ol
>>>>> in
>>>>> g
>>>>> o/odata4/client/api/edm/ComplexType.java;h=929d1b83f4db4c290b0681b
>>>>> 7d
>>>>> 6
>>>>> 29b9d0545f33a5;hb=olingo169 [5]
>>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.
>>>>> gi
>>>>> t
>>>>> ;a=blob;f=odata4-lib/odata4-client-api/src/main/java/org/apache/ol
>>>>> in
>>>>> g
>>>>> o/odata4/client/api/edm/EntityType.java;h=37ebc359f0ec36e439b3a855
>>>>> 5e
>>>>> 2
>>>>> 3ebaa84506c2e;hb=olingo169 [6]
>>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.
>>>>> gi
>>>>> t
>>>>> ;a=tree;f=odata4-lib/odata4-commons-api/src/main/java/org/apache/o
>>>>> li
>>>>> n
>>>>> go/odata4/commons/api/edm;h=5735ace09587887d86a9f09c9ffdcd624b9752
>>>>> 1f
>>>>> ;
>>>>> hb=olingo169 [7]
>>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.
>>>>> gi
>>>>> t
>>>>> ;a=tree;f=odata4-lib/odata4-client-api/src/main/java/org/apache/ol
>>>>> in
>>>>> g
>>>>> o/odata4/client/api/edm;h=31d1e59d5b76ba321b93bd68bda675522f9d1a8c
>>>>> ;h
>>>>> b
>>>>> =olingo169
>>>> [8]
>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.g
>>>> it
>>>> ;
>>>> a=blob;f=odata4-lib/odata4-commons-api/src/main/java/org/apache/oli
>>>> ng
>>>> o
>>>> /odata4/commons/api/edm/EdmType.java;h=bee2fa5394774b4ea41a71ee433c
>>>> f5
>>>> d
>>>> 7366c961c;hb=olingo169 [9]
>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.g
>>>> it
>>>> ;
>>>> a=blob;f=odata4-lib/odata4-client-api/src/main/java/org/apache/olin
>>>> go
>>>> /
>>>> odata4/client/api/edm/v4/EntitySet.java;h=703c0dfa3c23ea66ea88c8fb3
>>>> 87
>>>> 5
>>>> f90962e3a800;hb=olingo169 [10]
>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.g
>>>> it
>>>> ;
>>>> a=blob;f=odata4-lib/odata4-commons-api/src/main/java/org/apache/oli
>>>> ng
>>>> o
>>>> /odata4/commons/api/edm/EdmEntitySet.java;h=50dbe0590ff5aa32340eeee
>>>> 5d
>>>> 3
>>>> 26844a92f0c91a;hb=olingo169

--
Francesco Chicchiriccò

Tirasa - Open Source Excellence
http://www.tirasa.net/

Involved at The Apache Software Foundation:
member, Syncope PMC chair, Cocoon PMC, Olingo PPMC 
http://people.apache.org/~ilgrosso/

Reply via email to