Hi Francesco, I looked at your changes and I think it is ok to merge them.
1.) Not sure what to deliver here on client side. I will have a look into it. 2.) Path is what leads to the property which is referenced in the key. For example: complexProperty1/complexProperty2 would be the path while the Name attribute would be the name of the property. Alias is then used inside the URI. 3.) A function import must have an attribute with a name which resolves to an unbound function but unbound functions can be overloaded using their parameters. Thus getFunction(parameters) delivers the function which matches with the parameters. Best Regards, Christian -----Original Message----- From: Francesco Chicchiriccò [mailto:ilgro...@apache.org] Sent: Mittwoch, 5. März 2014 16:28 To: dev@olingo.incubator.apache.org Subject: Re: [OLINGO-169] Work in progress Hi, as you might have noticed, I have completed the client-side implementation of common Edm interfaces in the olingo169 branch. Before merging such branch into master and close OLINGO-169, can you please take a look and see if everything looks fine? Of course all tests are succeeding, but I pushed some heavy refactoring that also affect server components and it would be nice if someone else can double-check. Finally, there are some more methods I have doubts about (and I have not implemented client-side): 1. EdmProperty#getMapping / EdmProperty#getMimeType / EdmParameter#getMapping - what kind of information can be provided here client-side? 2. EdmKeyPropertyRef#getPath - edm:PropertyRef element only allows Name and Alias attributes, so what is 'getPath' supposed to return? 3. Why EdmFunctionImport#getFunction(List<String> parameterNames) instead of EdmFunctionImport#getFunction() (e.g. without parameters)? Shall I open an issue for such changes (including the ones discussed below)? Regards. On 03/03/2014 13:44, Amend, Christian wrote: > Hi Francesco, > > I was about to start with metadata serialization on server side so I will > perform the changes on master and you can merge them when you are ready. > > About introducing an AbstractEdmEnumTypeImpl. Yes why not. > > Best Regards, > Christian > > > -----Original Message----- > From: Francesco Chicchiriccò [mailto:ilgro...@apache.org] > Sent: Montag, 3. März 2014 10:20 > To: dev@olingo.incubator.apache.org > Subject: Re: [OLINGO-169] Work in progress > > On 03/03/2014 09:52, Amend, Christian wrote: >> Hi Francesco, >> >> 1. yes. getMetadata should be deleted. > Fine: shall I take this on the olingo169 branch or instead can you make > it on master (and I will later merge)? > >> 2. We use the EdmEntitySetInfo to build the ServiceDocument. So we used this >> method to get the URI. Might also be a candidate to be deleted. > Same as above. > >> 3. Without arguments is fine by me. > Same as above. > >> I was thinking that the whole EdmServiceMetadata interface is unnecessary. >> We should provide access to all entity sets, function imports and singletons >> at the Edm interface directly. > +1 (even though I have already implemented client-side). > > What about > >> 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 implementations). > ? > > Regards. > >> -----Original Message----- >> From: Francesco Chicchiriccò [mailto:ilgro...@apache.org] >> Sent: Montag, 3. März 2014 08: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=e8677a1112aa319d9b12fa615b39015e63fce1d2; >>> 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/olin >>>>>>> g >>>>>>> o/odata4/client/api/edm/EdmType.java;h=5a480d72cbbc707696dd358e11746 >>>>>>> 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/olin >>>>>>> g >>>>>>> o/odata4/client/api/data/EdmSimpleType.java;h=7d44c376e89b084c6e8563 >>>>>>> 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/olin >>>>>>> g >>>>>>> o/odata4/client/api/edm/EnumType.java;h=614c5e1e85a731ae80de56899e7d >>>>>>> 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/olin >>>>>>> g >>>>>>> o/odata4/client/api/edm/ComplexType.java;h=929d1b83f4db4c290b0681b7d >>>>>>> 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/olin >>>>>>> g >>>>>>> o/odata4/client/api/edm/EntityType.java;h=37ebc359f0ec36e439b3a8555e >>>>>>> 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/oli >>>>>>> n >>>>>>> go/odata4/commons/api/edm;h=5735ace09587887d86a9f09c9ffdcd624b97521f >>>>>>> ; >>>>>>> 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/olin >>>>>>> g >>>>>>> o/odata4/client/api/edm;h=31d1e59d5b76ba321b93bd68bda675522f9d1a8c;h >>>>>>> b >>>>>>> =olingo169 >>>>>> [8] >>>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.git >>>>>> ; >>>>>> a=blob;f=odata4-lib/odata4-commons-api/src/main/java/org/apache/oling >>>>>> o >>>>>> /odata4/commons/api/edm/EdmType.java;h=bee2fa5394774b4ea41a71ee433cf5 >>>>>> d >>>>>> 7366c961c;hb=olingo169 [9] >>>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.git >>>>>> ; >>>>>> a=blob;f=odata4-lib/odata4-client-api/src/main/java/org/apache/olingo >>>>>> / >>>>>> odata4/client/api/edm/v4/EntitySet.java;h=703c0dfa3c23ea66ea88c8fb387 >>>>>> 5 >>>>>> f90962e3a800;hb=olingo169 [10] >>>>>> https://git-wip-us.apache.org/repos/asf?p=incubator-olingo-odata4.git >>>>>> ; >>>>>> a=blob;f=odata4-lib/odata4-commons-api/src/main/java/org/apache/oling >>>>>> o >>>>>> /odata4/commons/api/edm/EdmEntitySet.java;h=50dbe0590ff5aa32340eeee5d >>>>>> 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/