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