You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by il...@apache.org on 2014/08/04 13:13:32 UTC

[17/20] git commit: [OLINGO-365] Composable function invocation refactory - in progress

[OLINGO-365] Composable function invocation refactory - in progress


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/c0b92cf0
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/c0b92cf0
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/c0b92cf0

Branch: refs/heads/master
Commit: c0b92cf09ed1dc712051c4b93bfef5b3d6a02419
Parents: 312aff1
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Sun Aug 3 15:24:54 2014 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Sun Aug 3 15:24:54 2014 +0200

----------------------------------------------------------------------
 .../olingo/ext/proxy/api/ComposableInvoker.java |   2 +-
 .../AbstractStructuredInvocationHandler.java    |   2 +-
 .../ComplexCollectionInvocationHandler.java     |   3 +-
 .../proxy/commons/ComplexInvocationHandler.java |  45 +-
 .../ext/proxy/commons/InvokerHandler.java       |  24 +-
 .../commons/OperationInvocationHandler.java     |  12 +-
 .../olingo/ext/proxy/utils/CoreUtils.java       |   4 +-
 .../olingo/ext/pojogen/AbstractPOJOGenMojo.java |  21 +-
 .../complexCollectionComposableInvoker.vm       |  58 +++
 .../resources/complexTypeComposableInvoker.vm   |  48 ++
 .../src/main/resources/container.vm             |  21 +-
 .../entityCollectionComposableInvoker.vm        |  58 +++
 .../main/resources/entityComposableInvoker.vm   | 163 ++++++
 .../src/main/resources/operation.vm             |  26 +-
 .../v30/complexTypeComposableInvoker.vm         |  51 ++
 .../v40/complexTypeComposableInvoker.vm         | 115 +++++
 .../AliasesCollectionComposableInvoker.java     |  32 ++
 .../types/AliasesComposableInvoker.java         |  45 ++
 ...lectionTypesCollectionComposableInvoker.java |  32 ++
 ...SpatialCollectionTypesComposableInvoker.java |  64 +++
 ...Types_SimpleCollectionComposableInvoker.java |  32 ++
 ...CollectionTypes_SimpleComposableInvoker.java | 202 ++++++++
 ...SpatialTypesCollectionComposableInvoker.java |  32 ++
 .../types/AllSpatialTypesComposableInvoker.java | 432 ++++++++++++++++
 .../AuditInfoCollectionComposableInvoker.java   |  32 ++
 .../types/AuditInfoComposableInvoker.java       |  67 +++
 ...ckOrderLine2CollectionComposableInvoker.java |  32 ++
 .../types/BackOrderLine2ComposableInvoker.java  | 176 +++++++
 ...ackOrderLineCollectionComposableInvoker.java |  32 ++
 .../types/BackOrderLineComposableInvoker.java   | 176 +++++++
 .../types/CarCollectionComposableInvoker.java   |  32 ++
 .../types/CarComposableInvoker.java             | 136 +++++
 ...exToCategoryCollectionComposableInvoker.java |  32 ++
 .../ComplexToCategoryComposableInvoker.java     |  67 +++
 .../ComputerCollectionComposableInvoker.java    |  32 ++
 .../types/ComputerComposableInvoker.java        |  97 ++++
 ...mputerDetailCollectionComposableInvoker.java |  32 ++
 .../types/ComputerDetailComposableInvoker.java  | 212 ++++++++
 ...currencyInfoCollectionComposableInvoker.java |  32 ++
 .../types/ConcurrencyInfoComposableInvoker.java |  56 +++
 ...ntactDetailsCollectionComposableInvoker.java |  32 ++
 .../types/ContactDetailsComposableInvoker.java  | 100 ++++
 .../ContractorCollectionComposableInvoker.java  |  32 ++
 .../types/ContractorComposableInvoker.java      | 189 +++++++
 .../CustomerCollectionComposableInvoker.java    |  32 ++
 .../types/CustomerComposableInvoker.java        | 252 ++++++++++
 ...CustomerInfoCollectionComposableInvoker.java |  32 ++
 .../types/CustomerInfoComposableInvoker.java    |  90 ++++
 .../DimensionsCollectionComposableInvoker.java  |  32 ++
 .../types/DimensionsComposableInvoker.java      |  67 +++
 ...inuedProductCollectionComposableInvoker.java |  32 ++
 .../DiscontinuedProductComposableInvoker.java   | 334 +++++++++++++
 .../DriverCollectionComposableInvoker.java      |  32 ++
 .../types/DriverComposableInvoker.java          |  97 ++++
 .../EmployeeCollectionComposableInvoker.java    |  32 ++
 .../types/EmployeeComposableInvoker.java        | 176 +++++++
 .../LastLoginCollectionComposableInvoker.java   |  32 ++
 .../types/LastLoginComposableInvoker.java       | 143 ++++++
 .../LicenseCollectionComposableInvoker.java     |  32 ++
 .../types/LicenseComposableInvoker.java         | 166 ++++++
 .../types/LoginCollectionComposableInvoker.java |  32 ++
 .../types/LoginComposableInvoker.java           | 137 +++++
 ...edEntityTypeCollectionComposableInvoker.java |  32 ++
 .../MappedEntityTypeComposableInvoker.java      | 501 +++++++++++++++++++
 ...geAttachmentCollectionComposableInvoker.java |  32 ++
 .../MessageAttachmentComposableInvoker.java     |  87 ++++
 .../MessageCollectionComposableInvoker.java     |  32 ++
 .../types/MessageComposableInvoker.java         | 232 +++++++++
 .../types/OrderCollectionComposableInvoker.java |  32 ++
 .../types/OrderComposableInvoker.java           | 130 +++++
 .../OrderLineCollectionComposableInvoker.java   |  32 ++
 .../types/OrderLineComposableInvoker.java       | 176 +++++++
 .../PageViewCollectionComposableInvoker.java    |  32 ++
 .../types/PageViewComposableInvoker.java        | 166 ++++++
 .../PersonCollectionComposableInvoker.java      |  32 ++
 .../types/PersonComposableInvoker.java          |  97 ++++
 ...rsonMetadataCollectionComposableInvoker.java |  32 ++
 .../types/PersonMetadataComposableInvoker.java  | 143 ++++++
 .../types/PhoneCollectionComposableInvoker.java |  32 ++
 .../types/PhoneComposableInvoker.java           |  56 +++
 .../ProductCollectionComposableInvoker.java     |  32 ++
 .../types/ProductComposableInvoker.java         | 242 +++++++++
 ...roductDetailCollectionComposableInvoker.java |  32 ++
 .../types/ProductDetailComposableInvoker.java   |  97 ++++
 ...ductPageViewCollectionComposableInvoker.java |  32 ++
 .../types/ProductPageViewComposableInvoker.java | 212 ++++++++
 ...ProductPhotoCollectionComposableInvoker.java |  32 ++
 .../types/ProductPhotoComposableInvoker.java    | 110 ++++
 ...roductReviewCollectionComposableInvoker.java |  32 ++
 .../types/ProductReviewComposableInvoker.java   | 143 ++++++
 .../RSATokenCollectionComposableInvoker.java    |  32 ++
 .../types/RSATokenComposableInvoker.java        |  97 ++++
 ...cialEmployeeCollectionComposableInvoker.java |  32 ++
 .../types/SpecialEmployeeComposableInvoker.java | 255 ++++++++++
 ...ntactDetailsCollectionComposableInvoker.java |  32 ++
 .../types/ContactDetailsComposableInvoker.java  | 166 ++++++
 .../IndexedRowCollectionComposableInvoker.java  |  32 ++
 .../types/IndexedRowComposableInvoker.java      |  65 +++
 .../types/RowCollectionComposableInvoker.java   |  32 ++
 .../types/RowComposableInvoker.java             |  65 +++
 .../RowIndexCollectionComposableInvoker.java    |  32 ++
 .../types/RowIndexComposableInvoker.java        |  75 +++
 .../EdmBinaryCollectionComposableInvoker.java   |  32 ++
 .../types/EdmBinaryComposableInvoker.java       |  64 +++
 .../EdmBooleanCollectionComposableInvoker.java  |  32 ++
 .../types/EdmBooleanComposableInvoker.java      |  64 +++
 .../EdmByteCollectionComposableInvoker.java     |  32 ++
 .../types/EdmByteComposableInvoker.java         |  64 +++
 .../EdmDateTimeCollectionComposableInvoker.java |  32 ++
 .../types/EdmDateTimeComposableInvoker.java     |  64 +++
 ...teTimeOffsetCollectionComposableInvoker.java |  32 ++
 .../EdmDateTimeOffsetComposableInvoker.java     |  64 +++
 .../EdmDecimalCollectionComposableInvoker.java  |  32 ++
 .../types/EdmDecimalComposableInvoker.java      |  64 +++
 .../EdmDoubleCollectionComposableInvoker.java   |  32 ++
 .../types/EdmDoubleComposableInvoker.java       |  64 +++
 .../EdmGuidCollectionComposableInvoker.java     |  32 ++
 .../types/EdmGuidComposableInvoker.java         |  64 +++
 .../EdmInt16CollectionComposableInvoker.java    |  32 ++
 .../types/EdmInt16ComposableInvoker.java        |  64 +++
 .../EdmInt32CollectionComposableInvoker.java    |  32 ++
 .../types/EdmInt32ComposableInvoker.java        |  64 +++
 .../EdmInt64CollectionComposableInvoker.java    |  32 ++
 .../types/EdmInt64ComposableInvoker.java        |  64 +++
 .../EdmSingleCollectionComposableInvoker.java   |  32 ++
 .../types/EdmSingleComposableInvoker.java       |  64 +++
 .../EdmStringCollectionComposableInvoker.java   |  32 ++
 .../types/EdmStringComposableInvoker.java       |  64 +++
 .../EdmTimeCollectionComposableInvoker.java     |  32 ++
 .../types/EdmTimeComposableInvoker.java         |  64 +++
 .../FolderCollectionComposableInvoker.java      |  32 ++
 .../types/FolderComposableInvoker.java          |  97 ++++
 .../AliasesCollectionComposableInvoker.java     |  32 ++
 .../types/AliasesComposableInvoker.java         |  45 ++
 ...lectionTypesCollectionComposableInvoker.java |  32 ++
 ...SpatialCollectionTypesComposableInvoker.java |  64 +++
 ...Types_SimpleCollectionComposableInvoker.java |  32 ++
 ...CollectionTypes_SimpleComposableInvoker.java | 202 ++++++++
 ...SpatialTypesCollectionComposableInvoker.java |  32 ++
 .../types/AllSpatialTypesComposableInvoker.java | 432 ++++++++++++++++
 .../AuditInfoCollectionComposableInvoker.java   |  32 ++
 .../types/AuditInfoComposableInvoker.java       |  67 +++
 ...ckOrderLine2CollectionComposableInvoker.java |  32 ++
 .../types/BackOrderLine2ComposableInvoker.java  | 176 +++++++
 ...ackOrderLineCollectionComposableInvoker.java |  32 ++
 .../types/BackOrderLineComposableInvoker.java   | 176 +++++++
 .../types/CarCollectionComposableInvoker.java   |  32 ++
 .../types/CarComposableInvoker.java             | 136 +++++
 ...exToCategoryCollectionComposableInvoker.java |  32 ++
 .../ComplexToCategoryComposableInvoker.java     |  67 +++
 ...imitiveTypesCollectionComposableInvoker.java |  32 ++
 ...xWithAllPrimitiveTypesComposableInvoker.java | 188 +++++++
 .../ComputerCollectionComposableInvoker.java    |  32 ++
 .../types/ComputerComposableInvoker.java        |  97 ++++
 ...mputerDetailCollectionComposableInvoker.java |  32 ++
 .../types/ComputerDetailComposableInvoker.java  | 212 ++++++++
 ...currencyInfoCollectionComposableInvoker.java |  32 ++
 .../types/ConcurrencyInfoComposableInvoker.java |  56 +++
 ...ntactDetailsCollectionComposableInvoker.java |  32 ++
 .../types/ContactDetailsComposableInvoker.java  | 100 ++++
 .../ContractorCollectionComposableInvoker.java  |  32 ++
 .../types/ContractorComposableInvoker.java      | 189 +++++++
 .../CustomerCollectionComposableInvoker.java    |  32 ++
 .../types/CustomerComposableInvoker.java        | 252 ++++++++++
 ...CustomerInfoCollectionComposableInvoker.java |  32 ++
 .../types/CustomerInfoComposableInvoker.java    |  90 ++++
 .../DimensionsCollectionComposableInvoker.java  |  32 ++
 .../types/DimensionsComposableInvoker.java      |  67 +++
 ...inuedProductCollectionComposableInvoker.java |  32 ++
 .../DiscontinuedProductComposableInvoker.java   | 334 +++++++++++++
 .../DriverCollectionComposableInvoker.java      |  32 ++
 .../types/DriverComposableInvoker.java          |  97 ++++
 .../EmployeeCollectionComposableInvoker.java    |  32 ++
 .../types/EmployeeComposableInvoker.java        | 176 +++++++
 .../LastLoginCollectionComposableInvoker.java   |  32 ++
 .../types/LastLoginComposableInvoker.java       | 143 ++++++
 .../LicenseCollectionComposableInvoker.java     |  32 ++
 .../types/LicenseComposableInvoker.java         | 166 ++++++
 .../types/LoginCollectionComposableInvoker.java |  32 ++
 .../types/LoginComposableInvoker.java           | 137 +++++
 ...edEntityTypeCollectionComposableInvoker.java |  32 ++
 .../MappedEntityTypeComposableInvoker.java      | 501 +++++++++++++++++++
 ...geAttachmentCollectionComposableInvoker.java |  32 ++
 .../MessageAttachmentComposableInvoker.java     |  87 ++++
 .../MessageCollectionComposableInvoker.java     |  32 ++
 .../types/MessageComposableInvoker.java         | 232 +++++++++
 .../types/OrderCollectionComposableInvoker.java |  32 ++
 .../types/OrderComposableInvoker.java           | 130 +++++
 .../OrderLineCollectionComposableInvoker.java   |  32 ++
 .../types/OrderLineComposableInvoker.java       | 176 +++++++
 .../PageViewCollectionComposableInvoker.java    |  32 ++
 .../types/PageViewComposableInvoker.java        | 166 ++++++
 .../PersonCollectionComposableInvoker.java      |  32 ++
 .../types/PersonComposableInvoker.java          |  97 ++++
 ...rsonMetadataCollectionComposableInvoker.java |  32 ++
 .../types/PersonMetadataComposableInvoker.java  | 143 ++++++
 .../types/PhoneCollectionComposableInvoker.java |  32 ++
 .../types/PhoneComposableInvoker.java           |  56 +++
 .../ProductCollectionComposableInvoker.java     |  32 ++
 .../types/ProductComposableInvoker.java         | 242 +++++++++
 ...roductDetailCollectionComposableInvoker.java |  32 ++
 .../types/ProductDetailComposableInvoker.java   |  97 ++++
 ...ductPageViewCollectionComposableInvoker.java |  32 ++
 .../types/ProductPageViewComposableInvoker.java | 212 ++++++++
 ...ProductPhotoCollectionComposableInvoker.java |  32 ++
 .../types/ProductPhotoComposableInvoker.java    | 110 ++++
 ...roductReviewCollectionComposableInvoker.java |  32 ++
 .../types/ProductReviewComposableInvoker.java   | 143 ++++++
 .../RSATokenCollectionComposableInvoker.java    |  32 ++
 .../types/RSATokenComposableInvoker.java        |  97 ++++
 ...cialEmployeeCollectionComposableInvoker.java |  32 ++
 .../types/SpecialEmployeeComposableInvoker.java | 255 ++++++++++
 .../fit/proxy/v4/APIBasicDesignTestITCase.java  |   6 +-
 .../olingo/fit/proxy/v4/AsyncTestITCase.java    |   2 +-
 .../AddressCollectionComposableInvoker.java     |  32 ++
 .../types/AddressComposableInvoker.java         | 123 +++++
 ...dvertisementCollectionComposableInvoker.java |  32 ++
 .../types/AdvertisementComposableInvoker.java   | 123 +++++
 .../CategoryCollectionComposableInvoker.java    |  32 ++
 .../types/CategoryComposableInvoker.java        |  98 ++++
 .../CustomerCollectionComposableInvoker.java    |  32 ++
 .../types/CustomerComposableInvoker.java        | 120 +++++
 .../EmployeeCollectionComposableInvoker.java    |  32 ++
 .../types/EmployeeComposableInvoker.java        | 166 ++++++
 ...turedProductCollectionComposableInvoker.java |  32 ++
 .../types/FeaturedProductComposableInvoker.java | 242 +++++++++
 .../PersonCollectionComposableInvoker.java      |  32 ++
 .../types/PersonComposableInvoker.java          |  97 ++++
 ...PersonDetailCollectionComposableInvoker.java |  32 ++
 .../types/PersonDetailComposableInvoker.java    | 189 +++++++
 .../ProductCollectionComposableInvoker.java     |  32 ++
 .../types/ProductComposableInvoker.java         | 232 +++++++++
 ...roductDetailCollectionComposableInvoker.java |  32 ++
 .../types/ProductDetailComposableInvoker.java   |  97 ++++
 .../SupplierCollectionComposableInvoker.java    |  32 ++
 .../types/SupplierComposableInvoker.java        | 166 ++++++
 .../AccountInfoCollectionComposableInvoker.java |  32 ++
 .../types/AccountInfoComposableInvoker.java     |  74 +++
 ...ntactDetailsCollectionComposableInvoker.java |  32 ++
 .../types/ContactDetailsComposableInvoker.java  | 242 +++++++++
 .../IndexedRowCollectionComposableInvoker.java  |  32 ++
 .../types/IndexedRowComposableInvoker.java      |  65 +++
 .../types/RowCollectionComposableInvoker.java   |  32 ++
 .../types/RowComposableInvoker.java             |  65 +++
 .../RowIndexCollectionComposableInvoker.java    |  32 ++
 .../types/RowIndexComposableInvoker.java        |  75 +++
 .../odatawcfservice/InMemoryEntities.java       |   6 +-
 .../AccountCollectionComposableInvoker.java     |  32 ++
 .../types/AccountComposableInvoker.java         | 169 +++++++
 .../AccountInfoCollectionComposableInvoker.java |  32 ++
 .../types/AccountInfoComposableInvoker.java     |  74 +++
 .../AddressCollectionComposableInvoker.java     |  32 ++
 .../types/AddressComposableInvoker.java         |  89 ++++
 .../types/AssetCollectionComposableInvoker.java |  32 ++
 .../types/AssetComposableInvoker.java           | 110 ++++
 .../types/ClubCollectionComposableInvoker.java  |  32 ++
 .../types/ClubComposableInvoker.java            |  87 ++++
 ...mpanyAddressCollectionComposableInvoker.java |  32 ++
 .../types/CompanyAddressComposableInvoker.java  | 106 ++++
 .../CompanyCollectionComposableInvoker.java     |  32 ++
 .../types/CompanyComposableInvoker.java         | 197 ++++++++
 ...CreditCardPICollectionComposableInvoker.java |  32 ++
 .../types/CreditCardPIComposableInvoker.java    | 266 ++++++++++
 ...CreditRecordCollectionComposableInvoker.java |  32 ++
 .../types/CreditRecordComposableInvoker.java    | 133 +++++
 .../CustomerCollectionComposableInvoker.java    |  32 ++
 .../types/CustomerComposableInvoker.java        | 324 ++++++++++++
 .../DepartmentCollectionComposableInvoker.java  |  32 ++
 .../types/DepartmentComposableInvoker.java      | 120 +++++
 .../EmployeeCollectionComposableInvoker.java    |  32 ++
 .../types/EmployeeComposableInvoker.java        | 291 +++++++++++
 .../GiftCardCollectionComposableInvoker.java    |  32 ++
 .../types/GiftCardComposableInvoker.java        | 156 ++++++
 .../HomeAddressCollectionComposableInvoker.java |  32 ++
 .../types/HomeAddressComposableInvoker.java     | 106 ++++
 .../LabourUnionCollectionComposableInvoker.java |  32 ++
 .../types/LabourUnionComposableInvoker.java     |  87 ++++
 .../types/OrderCollectionComposableInvoker.java |  32 ++
 .../types/OrderComposableInvoker.java           | 163 ++++++
 .../OrderDetailCollectionComposableInvoker.java |  32 ++
 .../types/OrderDetailComposableInvoker.java     | 176 +++++++
 ...ntInstrumentCollectionComposableInvoker.java |  32 ++
 .../PaymentInstrumentComposableInvoker.java     | 150 ++++++
 .../PersonCollectionComposableInvoker.java      |  32 ++
 .../types/PersonComposableInvoker.java          | 235 +++++++++
 .../ProductCollectionComposableInvoker.java     |  32 ++
 .../types/ProductComposableInvoker.java         | 258 ++++++++++
 ...roductDetailCollectionComposableInvoker.java |  32 ++
 .../types/ProductDetailComposableInvoker.java   | 153 ++++++
 ...roductReviewCollectionComposableInvoker.java |  32 ++
 .../types/ProductReviewComposableInvoker.java   | 179 +++++++
 ...ublicCompanyCollectionComposableInvoker.java |  32 ++
 .../types/PublicCompanyComposableInvoker.java   | 260 ++++++++++
 .../StatementCollectionComposableInvoker.java   |  32 ++
 .../types/StatementComposableInvoker.java       | 133 +++++
 .../StoredPICollectionComposableInvoker.java    |  32 ++
 .../types/StoredPIComposableInvoker.java        | 133 +++++
 ...SubscriptionCollectionComposableInvoker.java |  32 ++
 .../types/SubscriptionComposableInvoker.java    | 156 ++++++
 .../invoke/AbstractODataInvokeRequest.java      |   6 +-
 .../invoke/v3/ODataInvokeRequestImpl.java       |   6 -
 .../invoke/v4/ODataInvokeRequestImpl.java       |   7 -
 .../apache/olingo/client/core/uri/URIUtils.java |   2 +-
 303 files changed, 25553 insertions(+), 102 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/api/ComposableInvoker.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/api/ComposableInvoker.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/api/ComposableInvoker.java
index 9319ebd..4ebe43d 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/api/ComposableInvoker.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/api/ComposableInvoker.java
@@ -20,5 +20,5 @@ package org.apache.olingo.ext.proxy.api;
 
 public interface ComposableInvoker<T, O extends Operations> extends Invoker<T> {
 
-  O compose();
+  O operations();
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractStructuredInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractStructuredInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractStructuredInvocationHandler.java
index 6b54f02..b9710db 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractStructuredInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractStructuredInvocationHandler.java
@@ -329,8 +329,8 @@ public abstract class AbstractStructuredInvocationHandler extends AbstractInvoca
 
             if (property == null || property.hasNullValue()) {
               collectionHandler = new ComplexCollectionInvocationHandler(
-                      service,
                       itemRef,
+                      service,
                       baseURI == null
                       ? null : getClient().newURIBuilder(baseURI.toASCIIString()).appendPropertySegment(name));
             } else {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexCollectionInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexCollectionInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexCollectionInvocationHandler.java
index 342a2a6..efc650d 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexCollectionInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexCollectionInvocationHandler.java
@@ -53,9 +53,10 @@ public class ComplexCollectionInvocationHandler<T extends ComplexType<?>>
   }
 
   public ComplexCollectionInvocationHandler(
-          final AbstractService<?> service,
           final Class<T> itemRef,
+          final AbstractService<?> service,
           final CommonURIBuilder<?> uri) {
+      
     this(service, new ArrayList<T>(), itemRef, uri);
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
index b0ab9b2..1a4838e 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
@@ -27,27 +27,26 @@ import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.ext.proxy.api.annotations.ComplexType;
 import org.apache.olingo.ext.proxy.api.annotations.NavigationProperty;
 import org.apache.olingo.ext.proxy.utils.ClassUtils;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
 import org.apache.olingo.client.api.communication.request.retrieve.ODataPropertyRequest;
 import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
 import org.apache.olingo.client.api.uri.CommonURIBuilder;
 import org.apache.olingo.ext.proxy.AbstractService;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 
 public class ComplexInvocationHandler extends AbstractStructuredInvocationHandler {
 
   private static Pair<ODataComplexValue<? extends CommonODataProperty>, Class<?>> init(
-          final AbstractService<?> service,
-          final Class<?> reference) {
+          final Class<?> typeRef,
+          final AbstractService<?> service) {
 
     final Class<?> complexTypeRef;
-    if (Collection.class.isAssignableFrom(reference)) {
-      complexTypeRef = ClassUtils.extractTypeArg(reference);
+    if (Collection.class.isAssignableFrom(typeRef)) {
+      complexTypeRef = ClassUtils.extractTypeArg(typeRef);
     } else {
-      complexTypeRef = reference;
+      complexTypeRef = typeRef;
     }
 
     final ComplexType annotation = complexTypeRef.getAnnotation(ComplexType.class);
@@ -57,7 +56,6 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
 
     final FullQualifiedName typeName =
             new FullQualifiedName(ClassUtils.getNamespace(complexTypeRef), annotation.name());
-
     final ODataComplexValue<? extends CommonODataProperty> complex =
             service.getClient().getObjectFactory().newComplexValue(typeName.toString());
 
@@ -66,42 +64,45 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
 
   public static ComplexInvocationHandler getInstance(
           final String propertyName,
-          final Class<?> reference,
-          final EntityInvocationHandler handler) {
+          final EntityInvocationHandler handler,
+          final Class<?> typeRef) {
 
-    final Pair<ODataComplexValue<? extends CommonODataProperty>, Class<?>> init = init(handler.service, reference);
+    final Pair<ODataComplexValue<? extends CommonODataProperty>, Class<?>> init = init(typeRef, handler.service);
     return new ComplexInvocationHandler(init.getLeft(), init.getRight(), handler);
   }
 
   public static ComplexInvocationHandler getInstance(
           final ODataComplexValue<?> complex,
-          final Class<?> reference,
+          final Class<?> typeRef,
           final AbstractService<?> service) {
 
-    return new ComplexInvocationHandler(complex, reference, service);
+    return new ComplexInvocationHandler(complex, typeRef, service);
   }
 
   public static ComplexInvocationHandler getInstance(
           final Class<?> typeRef,
           final AbstractService<?> service) {
-    final Pair<ODataComplexValue<? extends CommonODataProperty>, Class<?>> init = init(service, typeRef);
+      
+    final Pair<ODataComplexValue<? extends CommonODataProperty>, Class<?>> init = init(typeRef, service);
     return new ComplexInvocationHandler(init.getLeft(), init.getRight(), service);
   }
 
   public static ComplexInvocationHandler getInstance(
-          final Class<?> reference,
+          final Class<?> typeRef,
           final AbstractService<?> service,
           final CommonURIBuilder<?> uri) {
-    final Pair<ODataComplexValue<? extends CommonODataProperty>, Class<?>> init = init(service, reference);
+      
+    final Pair<ODataComplexValue<? extends CommonODataProperty>, Class<?>> init = init(typeRef, service);
     return new ComplexInvocationHandler(init.getLeft(), init.getRight(), service, uri);
   }
 
   public static ComplexInvocationHandler getInstance(
           final ODataComplexValue<? extends CommonODataProperty> complex,
-          final Class<?> reference,
+          final Class<?> typeRef,
           final AbstractService<?> service,
           final CommonURIBuilder<?> uri) {
-    return new ComplexInvocationHandler(complex, reference, service, uri);
+      
+    return new ComplexInvocationHandler(complex, typeRef, service, uri);
   }
 
   private ComplexInvocationHandler(
@@ -184,7 +185,7 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
   }
 
   @Override
-  protected CommonODataProperty getInternalProperty(String name) {
+  protected CommonODataProperty getInternalProperty(final String name) {
     return getComplex() == null ? null : getComplex().get(name);
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/InvokerHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/InvokerHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/InvokerHandler.java
index 8db5463..2c27dc3 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/InvokerHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/InvokerHandler.java
@@ -55,7 +55,7 @@ import org.apache.olingo.ext.proxy.utils.ClassUtils;
 import org.apache.olingo.ext.proxy.utils.CoreUtils;
 import org.apache.olingo.ext.proxy.utils.ProxyUtils;
 
-public class InvokerHandler<T, C> extends AbstractInvocationHandler {
+public class InvokerHandler<T, O> extends AbstractInvocationHandler {
 
   private final URI baseURI;
 
@@ -95,10 +95,6 @@ public class InvokerHandler<T, C> extends AbstractInvocationHandler {
     }
   }
 
-  public C compose() {
-    return null;
-  }
-
   public Future<T> executeAsync() {
     return service.getClient().getConfiguration().getExecutor().submit(new Callable<T>() {
 
@@ -249,25 +245,24 @@ public class InvokerHandler<T, C> extends AbstractInvocationHandler {
             || "select".equals(method.getName())) {
       invokeSelfMethod(method, args);
       return proxy;
-    } else if ("compose".equals(method.getName()) && ArrayUtils.isEmpty(args)) {
-
-      final EdmTypeInfo edmType = new EdmTypeInfo.Builder().
+    } else if ("operations".equals(method.getName()) && ArrayUtils.isEmpty(args)) {
+      final EdmTypeInfo returnType = new EdmTypeInfo.Builder().
               setEdm(service.getClient().getCachedEdm()).setTypeExpression(operation.returnType()).build();
 
-      final OperationInvocationHandler handler;
+      final URI prefixURI = URIUtils.buildFunctionInvokeURI(this.baseURI, parameters, getClient().getServiceVersion());
 
-      final URI prefixURI = URIUtils.buildInvokeRequestURI(this.baseURI, parameters, getClient().getServiceVersion());
+      OperationInvocationHandler handler;
 
-      if (edmType.isComplexType()) {
-        if (edmType.isCollection()) {
+      if (returnType.isComplexType()) {
+        if (returnType.isCollection()) {
           handler = OperationInvocationHandler.getInstance(new ComplexCollectionInvocationHandler(
-                  service, targetRef, getClient().newURIBuilder(prefixURI.toASCIIString())));
+                  targetRef, service, getClient().newURIBuilder(prefixURI.toASCIIString())));
         } else {
           handler = OperationInvocationHandler.getInstance(ComplexInvocationHandler.getInstance(
                   targetRef, service, getClient().newURIBuilder(prefixURI.toASCIIString())));
         }
       } else {
-        if (edmType.isCollection()) {
+        if (returnType.isCollection()) {
           handler = OperationInvocationHandler.getInstance(new EntityCollectionInvocationHandler(
                   service, null, targetRef, null, getClient().newURIBuilder(prefixURI.toASCIIString())));
         } else {
@@ -279,7 +274,6 @@ public class InvokerHandler<T, C> extends AbstractInvocationHandler {
       return Proxy.newProxyInstance(
               Thread.currentThread().getContextClassLoader(),
               new Class<?>[] {operationRef}, handler);
-
     } else if (isSelfMethod(method, args)) {
       return invokeSelfMethod(method, args);
     } else {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/OperationInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/OperationInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/OperationInvocationHandler.java
index 880f464..00630aa 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/OperationInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/OperationInvocationHandler.java
@@ -139,7 +139,6 @@ final class OperationInvocationHandler extends AbstractInvocationHandler {
     } else {
       final Operation operation = method.getAnnotation(Operation.class);
       if (operation != null) {
-
         final Annotation[][] annotations = method.getParameterAnnotations();
         final List<String> parameterNames;
         final LinkedHashMap<Parameter, Object> parameters = new LinkedHashMap<Parameter, Object>();
@@ -175,25 +174,25 @@ final class OperationInvocationHandler extends AbstractInvocationHandler {
 
         final Map<String, ODataValue> parameterValues = new LinkedHashMap<String, ODataValue>();
         for (Map.Entry<Parameter, Object> parameter : parameters.entrySet()) {
-
           if (!parameter.getKey().nullable() && parameter.getValue() == null) {
             throw new IllegalArgumentException(
                     "Parameter " + parameter.getKey().name() + " is not nullable but a null value was provided");
           }
 
-          final EdmTypeInfo type = new EdmTypeInfo.Builder().
+          final EdmTypeInfo parameterType = new EdmTypeInfo.Builder().
                   setEdm(service.getClient().getCachedEdm()).setTypeExpression(parameter.getKey().type()).build();
 
           final ODataValue paramValue = parameter.getValue() == null
                   ? null
-                  : CoreUtils.getODataValue(service.getClient(), type, parameter.getValue());
-
+                  : CoreUtils.getODataValue(service.getClient(), parameterType, parameter.getValue());
+          
           parameterValues.put(parameter.getKey().name(), paramValue);
         }
 
         return Proxy.newProxyInstance(
                 Thread.currentThread().getContextClassLoader(),
-                new Class<?>[] {ClassUtils.getTypeClass(method.getGenericReturnType())}, new InvokerHandler(
+                new Class<?>[] {ClassUtils.getTypeClass(method.getGenericReturnType())}, 
+                new InvokerHandler(
                         edmOperation.getKey(),
                         parameterValues,
                         operation,
@@ -301,7 +300,6 @@ final class OperationInvocationHandler extends AbstractInvocationHandler {
     return new AbstractMap.SimpleEntry<URI, EdmOperation>(boundOp.getTarget(), edmOperation);
   }
 
-  @SuppressWarnings("unchecked")
   private Map.Entry<URI, EdmOperation> getCollectionBoundOperation(
           final Operation operation, final List<String> parameterNames) {
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java
index aaf2d78..1fdea3f 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java
@@ -479,7 +479,7 @@ public final class CoreUtils {
               final Object complex = Proxy.newProxyInstance(
                       Thread.currentThread().getContextClassLoader(),
                       new Class<?>[] {getter.getReturnType()},
-                      ComplexInvocationHandler.getInstance(property.getName(), getter.getReturnType(), typeHandler));
+                      ComplexInvocationHandler.getInstance(property.getName(), typeHandler, getter.getReturnType()));
 
               populate(client, typeHandler, complex, Property.class, property.getValue().asComplex().iterator());
               setPropertyValue(bean, getter, complex);
@@ -503,7 +503,7 @@ public final class CoreUtils {
                   final Object collItem = Proxy.newProxyInstance(
                           Thread.currentThread().getContextClassLoader(),
                           new Class<?>[] {collItemClass},
-                          ComplexInvocationHandler.getInstance(property.getName(), collItemClass, typeHandler));
+                          ComplexInvocationHandler.getInstance(property.getName(), typeHandler, collItemClass));
 
                   populate(client, typeHandler, collItem, Property.class, value.asComplex().iterator());
                   collection.add(collItem);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/AbstractPOJOGenMojo.java
----------------------------------------------------------------------
diff --git a/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/AbstractPOJOGenMojo.java b/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/AbstractPOJOGenMojo.java
index aff8559..dda303a 100644
--- a/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/AbstractPOJOGenMojo.java
+++ b/ext/pojogen-maven-plugin/src/main/java/org/apache/olingo/ext/pojogen/AbstractPOJOGenMojo.java
@@ -294,8 +294,15 @@ public abstract class AbstractPOJOGenMojo extends AbstractMojo {
           complexTypeNames.put(complex.getFullQualifiedName().toString(), typesPkg + "." + className);
           objs.clear();
           objs.put("complexType", complex);
-          parseObj(typesBaseDir, typesPkg, "complexType", className + ".java", objs);
-          parseObj(typesBaseDir, typesPkg, "complexCollection", className + "Collection.java", objs);
+          
+          parseObj(typesBaseDir, typesPkg, 
+                  "complexType", className + ".java", objs);
+          parseObj(typesBaseDir, typesPkg, 
+                  "complexTypeComposableInvoker", className + "ComposableInvoker.java", objs);
+          parseObj(typesBaseDir, typesPkg, 
+                  "complexCollection", className + "Collection.java", objs);
+          parseObj(typesBaseDir, typesPkg, 
+                  "complexCollectionComposableInvoker", className + "CollectionComposableInvoker.java", objs);
         }
 
         for (EdmEntityType entity : schema.getEntityTypes()) {
@@ -332,8 +339,14 @@ public abstract class AbstractPOJOGenMojo extends AbstractMojo {
             }
           }
 
-          parseObj(typesBaseDir, typesPkg, "entityType", className + ".java", objs);
-          parseObj(typesBaseDir, typesPkg, "entityCollection", className + "Collection.java", objs);
+          parseObj(typesBaseDir, typesPkg, 
+                  "entityType", className + ".java", objs);
+          parseObj(typesBaseDir, typesPkg, 
+                  "entityComposableInvoker", className + "ComposableInvoker.java", objs);
+          parseObj(typesBaseDir, typesPkg, 
+                  "entityCollection", className + "Collection.java", objs);
+          parseObj(typesBaseDir, typesPkg, 
+                  "entityCollectionComposableInvoker", className + "CollectionComposableInvoker.java", objs);
         }
 
         // write container and top entity sets into the base package

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/pojogen-maven-plugin/src/main/resources/complexCollectionComposableInvoker.vm
----------------------------------------------------------------------
diff --git a/ext/pojogen-maven-plugin/src/main/resources/complexCollectionComposableInvoker.vm b/ext/pojogen-maven-plugin/src/main/resources/complexCollectionComposableInvoker.vm
new file mode 100644
index 0000000..7ab133c
--- /dev/null
+++ b/ext/pojogen-maven-plugin/src/main/resources/complexCollectionComposableInvoker.vm
@@ -0,0 +1,58 @@
+#*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *#
+package ${package};
+
+//CHECKSTYLE:OFF (Maven checkstyle)
+import org.apache.olingo.client.api.http.HttpMethod;
+import org.apache.olingo.ext.proxy.api.AbstractTerm;
+import org.apache.olingo.ext.proxy.api.OperationType;
+import org.apache.olingo.ext.proxy.api.annotations.Operation;
+import org.apache.olingo.ext.proxy.api.annotations.Parameter;
+#foreach($ns in $namespaces)
+import #if($basePackage)${basePackage}.#end${ns}.*;
+#end
+
+import org.apache.olingo.commons.api.edm.geo.Geospatial;
+import org.apache.olingo.commons.api.edm.geo.GeospatialCollection;
+import org.apache.olingo.commons.api.edm.geo.LineString;
+import org.apache.olingo.commons.api.edm.geo.MultiLineString;
+import org.apache.olingo.commons.api.edm.geo.MultiPoint;
+import org.apache.olingo.commons.api.edm.geo.MultiPolygon;
+import org.apache.olingo.commons.api.edm.geo.Point;
+import org.apache.olingo.commons.api.edm.geo.Polygon;
+import java.math.BigDecimal;
+import java.net.URI;
+import java.util.UUID;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Calendar;
+import javax.xml.datatype.Duration;
+//CHECKSTYLE:ON (Maven checkstyle)
+
+#set ( $javaComplexType = $utility.getJavaType($complexType) )
+
+public interface $utility.capitalize($complexType.Name)CollectionComposableInvoker extends 
+    org.apache.olingo.ext.proxy.api.StructuredCollectionComposableInvoker<${javaComplexType}Collection, ${javaComplexType}Collection.Operations> {
+
+  @Override
+  $utility.capitalize($complexType.Name)CollectionComposableInvoker select(String... select);
+
+  @Override
+  $utility.capitalize($complexType.Name)CollectionComposableInvoker expand(String... expand);
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/pojogen-maven-plugin/src/main/resources/complexTypeComposableInvoker.vm
----------------------------------------------------------------------
diff --git a/ext/pojogen-maven-plugin/src/main/resources/complexTypeComposableInvoker.vm b/ext/pojogen-maven-plugin/src/main/resources/complexTypeComposableInvoker.vm
new file mode 100644
index 0000000..0678a38
--- /dev/null
+++ b/ext/pojogen-maven-plugin/src/main/resources/complexTypeComposableInvoker.vm
@@ -0,0 +1,48 @@
+#*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *#
+package ${package};
+
+//CHECKSTYLE:OFF (Maven checkstyle)
+import org.apache.olingo.ext.proxy.api.annotations.AnnotationsForProperty;
+import org.apache.olingo.ext.proxy.api.annotations.AnnotationsForNavigationProperty;
+import org.apache.olingo.ext.proxy.api.annotations.Namespace;
+import org.apache.olingo.ext.proxy.api.annotations.ComplexType;
+import org.apache.olingo.ext.proxy.api.annotations.EntitySet;
+import org.apache.olingo.ext.proxy.api.annotations.Property;
+import org.apache.olingo.ext.proxy.api.annotations.NavigationProperty;
+import org.apache.olingo.ext.proxy.api.AbstractOpenType;
+import org.apache.olingo.ext.proxy.api.AbstractEntitySet;
+import org.apache.olingo.ext.proxy.api.Annotatable;
+#foreach($ns in $namespaces)
+import #if($basePackage)${basePackage}.#end${ns}.*;
+#end
+
+import org.apache.olingo.commons.api.edm.geo.Geospatial;
+import org.apache.olingo.commons.api.edm.geo.GeospatialCollection;
+import org.apache.olingo.commons.api.edm.geo.LineString;
+import org.apache.olingo.commons.api.edm.geo.MultiLineString;
+import org.apache.olingo.commons.api.edm.geo.MultiPoint;
+import org.apache.olingo.commons.api.edm.geo.MultiPolygon;
+import org.apache.olingo.commons.api.edm.geo.Point;
+import org.apache.olingo.commons.api.edm.geo.Polygon;
+//CHECKSTYLE:ON (Maven checkstyle)
+
+#parse( "${odataVersion}/complexTypeComposableInvoker.vm" )
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/pojogen-maven-plugin/src/main/resources/container.vm
----------------------------------------------------------------------
diff --git a/ext/pojogen-maven-plugin/src/main/resources/container.vm b/ext/pojogen-maven-plugin/src/main/resources/container.vm
index 827de54..defb9e1 100644
--- a/ext/pojogen-maven-plugin/src/main/resources/container.vm
+++ b/ext/pojogen-maven-plugin/src/main/resources/container.vm
@@ -84,9 +84,17 @@ public interface $utility.capitalize($container.Name) extends PersistenceManager
       *##else#*
         *##if(${function.ReturnType.Type.Kind} == "ENTITY" || ${function.ReturnType.Type.Kind} == "COMPLEX")#*
           *##if($function.getReturnType().isCollection())#*
-            *##set($returnType = "org.apache.olingo.ext.proxy.api.StructuredCollection${composable}")#*
+            *##if($function.Composable)#*
+              *##set($returnType = "${defaultType}ComposableInvoker")#*
+            *##{else}#*
+              *##set($returnType = "org.apache.olingo.ext.proxy.api.StructuredCollectionInvoker<$defaultType>")#*
+            *##end#*
           *##{else}#*
-            *##set($returnType = "org.apache.olingo.ext.proxy.api.Structured${composable}")#*
+            *##if($function.Composable)#*
+              *##set($returnType = "${defaultType}ComposableInvoker")#*
+            *##{else}#*
+              *##set($returnType = "org.apache.olingo.ext.proxy.api.StructuredInvoker<$defaultType>")#*
+            *##end#*
           *##end#*
         *##{else}#*
           *##if($function.getReturnType().isCollection())#*
@@ -124,19 +132,14 @@ public interface $utility.capitalize($container.Name) extends PersistenceManager
   #if($action)
     #if($action.ReturnType)#*
       *##set($defaultType = $utility.getJavaType($action.ReturnType.Type, $action.ReturnType.Collection))#*
-      *##if($action.Composable)#*
-        *##set($composable = "ComposableInvoker<$defaultType, ${defaultType}.Operations>")#*
-      *##{else}#*
-        *##set($composable = "Invoker<$defaultType>")#*
-      *##end#*
       *##if(!($action.getReturnType().isCollection() || ${action.ReturnType.Type.Kind} == "ENTITY" || ${action.ReturnType.Type.Kind} == "COMPLEX" || $utility.isStreamType($action.ReturnType.Type)))#*
         *##set($returnType = "org.apache.olingo.ext.proxy.api.Invoker<$defaultType>")#*
       *##else#*
         *##if(${action.ReturnType.Type.Kind} == "ENTITY" || ${action.ReturnType.Type.Kind} == "COMPLEX")#*
           *##if($action.getReturnType().isCollection())#*
-            *##set($returnType = "org.apache.olingo.ext.proxy.api.StructuredCollection${composable}")#*
+            *##set($returnType = "org.apache.olingo.ext.proxy.api.StructuredCollectionInvoker<$defaultType>")#*
           *##{else}#*
-            *##set($returnType = "org.apache.olingo.ext.proxy.api.Structured${composable}")#*
+            *##set($returnType = "org.apache.olingo.ext.proxy.api.StructuredInvoker<$defaultType>")#*
           *##end#*
         *##{else}#*
           *##if($action.getReturnType().isCollection())#*

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/pojogen-maven-plugin/src/main/resources/entityCollectionComposableInvoker.vm
----------------------------------------------------------------------
diff --git a/ext/pojogen-maven-plugin/src/main/resources/entityCollectionComposableInvoker.vm b/ext/pojogen-maven-plugin/src/main/resources/entityCollectionComposableInvoker.vm
new file mode 100644
index 0000000..a5ef494
--- /dev/null
+++ b/ext/pojogen-maven-plugin/src/main/resources/entityCollectionComposableInvoker.vm
@@ -0,0 +1,58 @@
+#*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *#
+package ${package};
+
+//CHECKSTYLE:OFF (Maven checkstyle)
+import org.apache.olingo.client.api.http.HttpMethod;
+import org.apache.olingo.ext.proxy.api.AbstractTerm;
+import org.apache.olingo.ext.proxy.api.OperationType;
+import org.apache.olingo.ext.proxy.api.annotations.Operation;
+import org.apache.olingo.ext.proxy.api.annotations.Parameter;
+#foreach($ns in $namespaces)
+import #if($basePackage)${basePackage}.#end${ns}.*;
+#end
+
+import org.apache.olingo.commons.api.edm.geo.Geospatial;
+import org.apache.olingo.commons.api.edm.geo.GeospatialCollection;
+import org.apache.olingo.commons.api.edm.geo.LineString;
+import org.apache.olingo.commons.api.edm.geo.MultiLineString;
+import org.apache.olingo.commons.api.edm.geo.MultiPoint;
+import org.apache.olingo.commons.api.edm.geo.MultiPolygon;
+import org.apache.olingo.commons.api.edm.geo.Point;
+import org.apache.olingo.commons.api.edm.geo.Polygon;
+import java.math.BigDecimal;
+import java.net.URI;
+import java.util.UUID;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Calendar;
+import javax.xml.datatype.Duration;
+//CHECKSTYLE:ON (Maven checkstyle)
+
+#set ( $javaEntityType = $utility.getJavaType($entityType) )
+
+public interface $utility.capitalize($entityType.Name)CollectionComposableInvoker extends 
+    org.apache.olingo.ext.proxy.api.StructuredCollectionComposableInvoker<${javaEntityType}Collection, ${javaEntityType}Collection.Operations> {
+
+  @Override
+  $utility.capitalize($entityType.Name)CollectionComposableInvoker select(String... select);
+
+  @Override
+  $utility.capitalize($entityType.Name)CollectionComposableInvoker expand(String... expand);
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/pojogen-maven-plugin/src/main/resources/entityComposableInvoker.vm
----------------------------------------------------------------------
diff --git a/ext/pojogen-maven-plugin/src/main/resources/entityComposableInvoker.vm b/ext/pojogen-maven-plugin/src/main/resources/entityComposableInvoker.vm
new file mode 100644
index 0000000..3853e6d
--- /dev/null
+++ b/ext/pojogen-maven-plugin/src/main/resources/entityComposableInvoker.vm
@@ -0,0 +1,163 @@
+#*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *#
+#set( $clsSuffix = ".class" )
+package ${package};
+//CHECKSTYLE:OFF (Maven checkstyle)
+import org.apache.olingo.client.api.http.HttpMethod;
+import org.apache.olingo.ext.proxy.api.annotations.AnnotationsForProperty;
+import org.apache.olingo.ext.proxy.api.annotations.AnnotationsForNavigationProperty;
+import org.apache.olingo.ext.proxy.api.annotations.Namespace;
+import org.apache.olingo.ext.proxy.api.annotations.EntityType;
+import org.apache.olingo.ext.proxy.api.annotations.EntitySet;
+import org.apache.olingo.ext.proxy.api.annotations.Key;
+import org.apache.olingo.ext.proxy.api.annotations.KeyRef;
+import org.apache.olingo.ext.proxy.api.annotations.NavigationProperty;
+import org.apache.olingo.ext.proxy.api.annotations.Property;
+import org.apache.olingo.ext.proxy.api.annotations.Operation;
+import org.apache.olingo.ext.proxy.api.annotations.Parameter;
+import org.apache.olingo.ext.proxy.api.AbstractOpenType;
+import org.apache.olingo.ext.proxy.api.OperationType;
+import org.apache.olingo.ext.proxy.api.AbstractEntitySet;
+import org.apache.olingo.commons.api.edm.constants.EdmContentKind;
+import org.apache.olingo.client.api.edm.ConcurrencyMode;
+#foreach($ns in $namespaces)
+import #if($basePackage)${basePackage}.#end${ns}.*;
+#end
+
+import org.apache.olingo.commons.api.edm.geo.Geospatial;
+import org.apache.olingo.commons.api.edm.geo.GeospatialCollection;
+import org.apache.olingo.commons.api.edm.geo.LineString;
+import org.apache.olingo.commons.api.edm.geo.MultiLineString;
+import org.apache.olingo.commons.api.edm.geo.MultiPoint;
+import org.apache.olingo.commons.api.edm.geo.MultiPolygon;
+import org.apache.olingo.commons.api.edm.geo.Point;
+import org.apache.olingo.commons.api.edm.geo.Polygon;
+import java.util.concurrent.Future;
+//CHECKSTYLE:ON (Maven checkstyle)
+
+public interface $utility.capitalize($entityType.Name)ComposableInvoker 
+  extends org.apache.olingo.ext.proxy.api.StructuredComposableInvoker<$utility.capitalize($entityType.Name), ${utility.capitalize($entityType.Name)}.Operations>
+  #{if}( $entityType.isOpenType() ),AbstractOpenType#end {
+
+  @Override
+  $utility.capitalize($entityType.Name)ComposableInvoker select(String... select);
+
+  @Override
+  $utility.capitalize($entityType.Name)ComposableInvoker expand(String... expand);
+
+#set( $keys = [] )
+#foreach($key in $entityType.KeyPropertyRefs)
+    #if(!$keys.add($key.KeyPropertyName)) #stop #end
+#end
+
+#set( $contained = [] )
+
+#foreach($propertyName in $entityType.PropertyNames)
+    #set($property = $entityType.getProperty($propertyName))
+    #set($fcprops = $utility.getFcProperties($property) )
+    #if($keys.contains($property.Name))@Key#end
+
+    #if($property.Type.FullQualifiedName.toString().equals("Edm.Stream"))#*
+      *##set( $returnType = "org.apache.olingo.ext.proxy.api.EdmStreamValue" )#*
+    *##else#*
+      *##set( $returnType = $utility.getJavaType($property.Type, $property.Collection) )#*
+    *##end
+
+    @org.apache.olingo.ext.proxy.api.annotations.Property(name = "$property.Name", 
+                type = "$property.Type.FullQualifiedName.toString()", 
+                nullable = $property.Nullable,
+                defaultValue = "#if($property.getDefaultValue())$property.getDefaultValue()#end",
+                maxLenght = #if($property.getMaxLength() && !$property.getMaxLength().equalsIgnoreCase("max"))$property.getMaxLength()#{else}Integer.MAX_VALUE#end,
+                fixedLenght = #if($property.isFixedLength())$property.isFixedLength()#{else}false#end,
+                precision = #if($property.getPrecision())$property.getPrecision()#{else}0#end,
+                scale = #if($property.getScale())$property.getScale()#{else}0#end,
+                unicode = #if($property.isUnicode())$property.isUnicode()#{else}false#end,
+                collation = "#if($property.getCollation())$property.getCollation()#end",
+                srid = "#if($property.getSRID())$property.getSRID()#end",
+                concurrencyMode = #if($property.getConcurrencyMode())ConcurrencyMode.$property.getConcurrencyMode()#{else}ConcurrencyMode.None#end,
+                fcSourcePath = "#if($fcprops.containsKey("fcSourcePath"))$fcprops.get("fcSourcePath")#end",
+                fcTargetPath = "#if($fcprops.containsKey("fcTargetPath"))$fcprops.get("fcTargetPath")#end",
+                fcContentKind = #if($fcprops.containsKey("fcContentKind"))EdmContentKind.$fcprops.get("fcContentKind")#{else}EdmContentKind.text#end,
+                fcNSPrefix = "#if($fcprops.containsKey("fcNSPrefix"))$fcprops.get("fcNSPrefix")#end",
+                fcNSURI = "#if($fcprops.containsKey("fcNSURI"))$fcprops.get("fcNSURI")#end",
+                fcKeepInContent = #if($fcprops.containsKey("fcKeepInContent"))$fcprops.get("fcKeepInContent")#{else}false#end)
+    $returnType get$utility.capitalize($property.Name)();
+
+    void set$utility.capitalize($property.Name)($returnType _$utility.uncapitalize($property.Name));
+#end
+    
+#foreach($propertyName in $entityType.NavigationPropertyNames)
+    #set($property = $entityType.getNavigationProperty($propertyName))
+    #set($type = $utility.getNavigationType($property))
+    #set($binding = $utility.getNavigationBindingDetails($entityType, $property))
+
+    #if($property.containsTarget() && $property.Collection)#*
+      *##set( $contains = $contained.add($property) )
+    #else#*
+      *#@org.apache.olingo.ext.proxy.api.annotations.NavigationProperty(name = "$property.Name", 
+                type = "$type", 
+                targetSchema = "$binding.Schema.Namespace", 
+                targetContainer = "#if($binding.Container)$binding.Container.Name#end", 
+                targetEntitySet = "#if($binding.EntitySet)$binding.EntitySet.Name#end",
+                containsTarget = $property.containsTarget())
+    $utility.getJavaType($type, $property.Collection) get$utility.capitalize($property.Name)();
+
+    void set$utility.capitalize($property.Name)($utility.getJavaType($type, $property.Collection) _$utility.uncapitalize($property.Name));
+    #end
+#end
+
+#if($entityType.hasStream())
+    void uploadStream(org.apache.olingo.ext.proxy.api.EdmStreamValue stream);
+
+    org.apache.olingo.ext.proxy.api.EdmStreamValue loadStream();
+#end
+
+#foreach($property in $contained)
+  #if( !$entityType.BaseType.getNavigationProperty($property.Name))
+    #set( $pkgname = "${package}.${utility.capitalize($entityType.Name)}.$utility.capitalize($property.Name)" )
+    @org.apache.olingo.ext.proxy.api.annotations.NavigationProperty(name = "$property.Name", 
+                type = "$type", 
+                targetSchema = "$binding.Schema.Namespace", 
+                targetContainer = "#if($binding.Container)$binding.Container.Name#end", 
+                targetEntitySet = "#if($binding.EntitySet)$binding.EntitySet.Name#end",
+                containsTarget = $property.containsTarget())
+    $pkgname get$utility.capitalize($property.Name)();
+    void set$utility.capitalize($property.Name)($pkgname _$utility.uncapitalize($property.Name));
+
+    #set( $keys = $utility.getEntityKeyType($property) )
+    #if( $keys.size() > 1 )
+      #set( $type = $utility.getEdmType($property).EntityType.Name + "Key" )
+    #elseif( $keys.size() == 1 )
+      #set( $type = $keys.values().iterator().next() )
+    #else
+      #set( $type = "" )
+    #end
+
+    #set ( $javaEntityType = $utility.getJavaType($property.Type) )
+
+    @org.apache.olingo.ext.proxy.api.annotations.EntitySet(name = "$property.Name", contained = true)
+    interface $utility.capitalize($property.Name) 
+      extends org.apache.olingo.ext.proxy.api.EntitySet<$javaEntityType, ${javaEntityType}Collection>, 
+      org.apache.olingo.ext.proxy.api.StructuredCollectionQuery<$utility.capitalize($property.Name)>,
+      AbstractEntitySet<$javaEntityType, $type, ${javaEntityType}Collection> {
+    }
+
+  #end
+#end
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/pojogen-maven-plugin/src/main/resources/operation.vm
----------------------------------------------------------------------
diff --git a/ext/pojogen-maven-plugin/src/main/resources/operation.vm b/ext/pojogen-maven-plugin/src/main/resources/operation.vm
index d8bdae8..c2376b7 100644
--- a/ext/pojogen-maven-plugin/src/main/resources/operation.vm
+++ b/ext/pojogen-maven-plugin/src/main/resources/operation.vm
@@ -25,19 +25,22 @@
     #foreach($operation in $functions)
       #if($operation.ReturnType)#*
         *##set($defaultType = $utility.getJavaType($operation.ReturnType.Type, $operation.ReturnType.Collection))#*
-        *##if($operationComposable)#*
-          *##set($composable = "ComposableInvoker<$defaultType, ${defaultType}.Operations>")#*
-        *##{else}#*
-          *##set($composable = "Invoker<$defaultType>")#*
-        *##end#*
         *##if(!($operation.getReturnType().isCollection() || ${operation.ReturnType.Type.Kind} == "ENTITY" || ${operation.ReturnType.Type.Kind} == "COMPLEX" || $utility.isStreamType($operation.ReturnType.Type)))#*
           *##set($returnType = "org.apache.olingo.ext.proxy.api.Invoker<$defaultType>")#*
         *##else#*
           *##if(${operation.ReturnType.Type.Kind} == "ENTITY" || ${operation.ReturnType.Type.Kind} == "COMPLEX")#*
             *##if($operation.getReturnType().isCollection())#*
-              *##set($returnType = "org.apache.olingo.ext.proxy.api.StructuredCollection${composable}")#*
+              *##if($operationComposable)#*
+                *##set($returnType = "${defaultType}ComposableInvoker")#*
+              *##{else}#*
+                *##set($returnType = "org.apache.olingo.ext.proxy.api.StructuredCollectionInvoker<$defaultType>")#*
+              *##end#*
             *##{else}#*
-              *##set($returnType = "org.apache.olingo.ext.proxy.api.Structured${composable}")#*
+              *##if($operationComposable)#*
+                *##set($returnType = "${defaultType}ComposableInvoker")#*
+              *##{else}#*
+              *##set($returnType = "org.apache.olingo.ext.proxy.api.StructuredInvoker<$defaultType>")#*
+              *##end#*
             *##end#*
           *##{else}#*
             *##if($operation.getReturnType().isCollection())#*
@@ -74,19 +77,14 @@
     #foreach($operation in $actions)
       #if($operation.ReturnType)#*
         *##set($defaultType = $utility.getJavaType($operation.ReturnType.Type, $operation.ReturnType.Collection))#*
-        *##if($operation.Composable)#*
-          *##set($composable = "ComposableInvoker<$defaultType, ${defaultType}.Operations>")#*
-        *##{else}#*
-          *##set($composable = "Invoker<$defaultType>")#*
-        *##end#*
         *##if(!($operation.getReturnType().isCollection() || ${operation.ReturnType.Type.Kind} == "ENTITY" || ${operation.ReturnType.Type.Kind} == "COMPLEX" || $utility.isStreamType($operation.ReturnType.Type)))#*
           *##set($returnType = "org.apache.olingo.ext.proxy.api.Invoker<$defaultType>")#*
         *##else#*
           *##if(${operation.ReturnType.Type.Kind} == "ENTITY" || ${operation.ReturnType.Type.Kind} == "COMPLEX")#*
             *##if($operation.getReturnType().isCollection())#*
-              *##set($returnType = "org.apache.olingo.ext.proxy.api.StructuredCollection${composable}")#*
+              *##set($returnType = "org.apache.olingo.ext.proxy.api.StructuredCollectionInvoker<$defaultType>")#*
             *##{else}#*
-              *##set($returnType = "org.apache.olingo.ext.proxy.api.Structured${composable}")#*
+              *##set($returnType = "org.apache.olingo.ext.proxy.api.StructuredInvoker<$defaultType>")#*
             *##end#*
           *##{else}#*
             *##if($operation.getReturnType().isCollection())#*

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/pojogen-maven-plugin/src/main/resources/v30/complexTypeComposableInvoker.vm
----------------------------------------------------------------------
diff --git a/ext/pojogen-maven-plugin/src/main/resources/v30/complexTypeComposableInvoker.vm b/ext/pojogen-maven-plugin/src/main/resources/v30/complexTypeComposableInvoker.vm
new file mode 100644
index 0000000..8e86d43
--- /dev/null
+++ b/ext/pojogen-maven-plugin/src/main/resources/v30/complexTypeComposableInvoker.vm
@@ -0,0 +1,51 @@
+#*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *#
+public interface $utility.capitalize($complexType.Name)ComposableInvoker 
+  extends org.apache.olingo.ext.proxy.api.StructuredComposableInvoker<$utility.capitalize($complexType.Name), ${utility.capitalize($complexType.Name)}.Operations> {
+
+  @Override
+  $utility.capitalize($complexType.Name)ComposableInvoker select(String... select);
+
+  @Override
+  $utility.capitalize($complexType.Name)ComposableInvoker expand(String... expand);
+
+#set( $complexProps = [] )
+#foreach($propertyName in $complexType.PropertyNames)
+    #set($property = $complexType.getProperty($propertyName))#*
+
+    *##if($property.Type.FullQualifiedName.toString().equals("Edm.Stream"))#*
+      *##set( $returnType = "org.apache.olingo.ext.proxy.api.EdmStreamValue" )#*
+    *##else#*
+      *##set( $returnType = $utility.getJavaType($property.Type, $property.Collection) )#*
+    *##end
+
+
+    @org.apache.olingo.ext.proxy.api.annotations.Property(
+                name = "$property.Name", 
+                type = "$property.Type.FullQualifiedName.toString()", 
+                nullable = $property.Nullable)
+    $returnType get$utility.capitalize($property.Name)();
+
+    void set$utility.capitalize($property.Name)($returnType _$utility.uncapitalize($property.Name));
+
+    #if($utility.isComplex($property.Type.FullQualifiedName))#*
+      *##set( $adding = $complexProps.add($property) )
+    #end
+
+#end

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/ext/pojogen-maven-plugin/src/main/resources/v40/complexTypeComposableInvoker.vm
----------------------------------------------------------------------
diff --git a/ext/pojogen-maven-plugin/src/main/resources/v40/complexTypeComposableInvoker.vm b/ext/pojogen-maven-plugin/src/main/resources/v40/complexTypeComposableInvoker.vm
new file mode 100644
index 0000000..5467a5a
--- /dev/null
+++ b/ext/pojogen-maven-plugin/src/main/resources/v40/complexTypeComposableInvoker.vm
@@ -0,0 +1,115 @@
+#*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *#
+public interface $utility.capitalize($complexType.Name)ComposableInvoker 
+  extends org.apache.olingo.ext.proxy.api.StructuredComposableInvoker<$utility.capitalize($complexType.Name), ${utility.capitalize($complexType.Name)}.Operations>
+  #{if}( $complexType.isOpenType() ),AbstractOpenType#end {
+
+  @Override
+  $utility.capitalize($complexType.Name)ComposableInvoker select(String... select);
+
+  @Override
+  $utility.capitalize($complexType.Name)ComposableInvoker expand(String... expand);
+
+#set( $complexProps = [] )
+#set( $contained = [] )
+#foreach($propertyName in $complexType.PropertyNames)
+    #set($property = $complexType.getProperty($propertyName))#*
+
+    *##if($property.Type.FullQualifiedName.toString().equals("Edm.Stream"))#*
+      *##set( $returnType = "org.apache.olingo.ext.proxy.api.EdmStreamValue" )#*
+    *##else#*
+      *##set( $returnType = $utility.getJavaType($property.Type, $property.Collection) )#*
+    *##end
+
+    @org.apache.olingo.ext.proxy.api.annotations.Property(name = "$property.Name", 
+                type = "$property.Type.getFullQualifiedName().toString()",
+                nullable = $property.Nullable,
+                defaultValue = "#if($property.getDefaultValue())$property.getDefaultValue()#end",
+                maxLenght = #if($property.getMaxLength() && !$property.getMaxLength().equalsIgnoreCase("max"))$property.getMaxLength()#{else}Integer.MAX_VALUE#end,
+                fixedLenght = #if($property.isFixedLength())$property.isFixedLength()#{else}false#end,
+                precision = #if($property.getPrecision())$property.getPrecision()#{else}0#end,
+                scale = #if($property.getScale())$property.getScale()#{else}0#end,
+                unicode = #if($property.isUnicode())$property.isUnicode()#{else}false#end,
+                collation = "#if($property.getCollation())$property.getCollation()#end",
+                srid = "#if($property.getSRID())$property.getSRID()#end")
+    $returnType get$utility.capitalize($property.Name)();
+
+    void set$utility.capitalize($property.Name)($returnType _$utility.uncapitalize($property.Name));
+
+    #if($utility.isComplex($property.Type.FullQualifiedName))#*
+      *##set( $adding = $complexProps.add($property) )
+    #end
+
+#end
+
+#foreach($propertyName in $complexType.NavigationPropertyNames)
+    #set($property = $complexType.getNavigationProperty($propertyName))
+    #set( $type = $utility.getNavigationType($property) )
+    #set( $binding = $utility.getNavigationBindingDetails($complexType, $property) )
+
+    #if($property.containsTarget() && $property.Collection)#*
+      *##set( $contains = $contained.add($property) )
+    #else#*
+      *#@org.apache.olingo.ext.proxy.api.annotations.NavigationProperty(name = "$property.Name", 
+                type = "$type", 
+                targetSchema = "$binding.Schema.Namespace", 
+                targetContainer = "#if($binding.Container)$binding.Container.Name#end", 
+                targetEntitySet = "#if($binding.EntitySet)$binding.EntitySet.Name#end")
+    $utility.getJavaType($type, $property.Collection) get$utility.capitalize($property.Name)();
+
+    void set$utility.capitalize($property.Name)($utility.getJavaType($type, $property.Collection) _$utility.uncapitalize($property.Name));
+    #end
+#end
+
+#foreach($property in $contained)
+  #if( !$entityType.BaseType.getNavigationProperty($property.Name))
+    #set( $pkgname = "${package}.${utility.capitalize($entityType.Name)}.$utility.capitalize($property.Name)" )
+    @NavigationProperty(name = "$property.Name", 
+                type = "$type", 
+                targetSchema = "$binding.Schema.Namespace", 
+                targetContainer = "#if($binding.Container)$binding.Container.Name#end", 
+                targetEntitySet = "#if($binding.EntitySet)$binding.EntitySet.Name#end",
+                containsTarget = $property.containsTarget())
+    $pkgname get$utility.capitalize($property.Name)();
+    void set$utility.capitalize($property.Name)($pkgname _$utility.uncapitalize($property.Name));
+
+    #set( $keys = $utility.getEntityKeyType($property) )
+    #if( $keys.size() > 1 )
+      #set( $type = $utility.getEdmType($property).EntityType.Name + "Key" )
+    #elseif( $keys.size() == 1 )
+      #set( $type = $keys.values().iterator().next() )
+    #else
+      #set( $type = "" )
+    #end
+
+    @EntitySet(name = "$property.Name", contained = true)
+    interface $utility.capitalize($property.Name) 
+      extends AbstractEntitySet<$utility.getJavaType($property.Type), $type, $utility.getJavaType($property.Type)Collection> {
+
+    #foreach( $dos in $utility.getDescendantsOrSelf($utility.getEdmType($property)) )
+        #set( $djt = $utility.getJavaType($dos) )
+        #set( $sIdx = $djt.lastIndexOf('.') + 1 )
+        $djt new$djt.substring($sIdx)();
+        ${djt}Collection new$djt.substring($sIdx)Collection();
+    #end
+    }
+
+  #end
+#end
+

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AliasesCollectionComposableInvoker.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AliasesCollectionComposableInvoker.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AliasesCollectionComposableInvoker.java
new file mode 100644
index 0000000..5339121
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AliasesCollectionComposableInvoker.java
@@ -0,0 +1,32 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.proxy.v3.actionoverloading.microsoft.test.odata.services.astoriadefaultservice.types;
+
+//CHECKSTYLE:OFF (Maven checkstyle)
+
+
+public interface AliasesCollectionComposableInvoker extends 
+    org.apache.olingo.ext.proxy.api.StructuredCollectionComposableInvoker<org.apache.olingo.fit.proxy.v3.actionoverloading.microsoft.test.odata.services.astoriadefaultservice.types.AliasesCollection, org.apache.olingo.fit.proxy.v3.actionoverloading.microsoft.test.odata.services.astoriadefaultservice.types.AliasesCollection.Operations> {
+
+  @Override
+  AliasesCollectionComposableInvoker select(String... select);
+
+  @Override
+  AliasesCollectionComposableInvoker expand(String... expand);
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AliasesComposableInvoker.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AliasesComposableInvoker.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AliasesComposableInvoker.java
new file mode 100644
index 0000000..980ff72
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AliasesComposableInvoker.java
@@ -0,0 +1,45 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.proxy.v3.actionoverloading.microsoft.test.odata.services.astoriadefaultservice.types;
+
+//CHECKSTYLE:OFF (Maven checkstyle)
+
+
+public interface AliasesComposableInvoker 
+  extends org.apache.olingo.ext.proxy.api.StructuredComposableInvoker<Aliases, Aliases.Operations> {
+
+  @Override
+  AliasesComposableInvoker select(String... select);
+
+  @Override
+  AliasesComposableInvoker expand(String... expand);
+
+
+
+    @org.apache.olingo.ext.proxy.api.annotations.Property(
+                name = "AlternativeNames", 
+                type = "Edm.String", 
+                nullable = false)
+    org.apache.olingo.ext.proxy.api.PrimitiveCollection<java.lang.String> getAlternativeNames();
+
+    void setAlternativeNames(org.apache.olingo.ext.proxy.api.PrimitiveCollection<java.lang.String> _alternativeNames);
+
+    
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AllSpatialCollectionTypesCollectionComposableInvoker.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AllSpatialCollectionTypesCollectionComposableInvoker.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AllSpatialCollectionTypesCollectionComposableInvoker.java
new file mode 100644
index 0000000..6a3d10c
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AllSpatialCollectionTypesCollectionComposableInvoker.java
@@ -0,0 +1,32 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.proxy.v3.actionoverloading.microsoft.test.odata.services.astoriadefaultservice.types;
+
+//CHECKSTYLE:OFF (Maven checkstyle)
+
+
+public interface AllSpatialCollectionTypesCollectionComposableInvoker extends 
+    org.apache.olingo.ext.proxy.api.StructuredCollectionComposableInvoker<org.apache.olingo.fit.proxy.v3.actionoverloading.microsoft.test.odata.services.astoriadefaultservice.types.AllSpatialCollectionTypesCollection, org.apache.olingo.fit.proxy.v3.actionoverloading.microsoft.test.odata.services.astoriadefaultservice.types.AllSpatialCollectionTypesCollection.Operations> {
+
+  @Override
+  AllSpatialCollectionTypesCollectionComposableInvoker select(String... select);
+
+  @Override
+  AllSpatialCollectionTypesCollectionComposableInvoker expand(String... expand);
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AllSpatialCollectionTypesComposableInvoker.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AllSpatialCollectionTypesComposableInvoker.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AllSpatialCollectionTypesComposableInvoker.java
new file mode 100644
index 0000000..6a4ca8c
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AllSpatialCollectionTypesComposableInvoker.java
@@ -0,0 +1,64 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.proxy.v3.actionoverloading.microsoft.test.odata.services.astoriadefaultservice.types;
+//CHECKSTYLE:OFF (Maven checkstyle)
+import org.apache.olingo.ext.proxy.api.annotations.Key;
+import org.apache.olingo.commons.api.edm.constants.EdmContentKind;
+import org.apache.olingo.client.api.edm.ConcurrencyMode;
+//CHECKSTYLE:ON (Maven checkstyle)
+
+public interface AllSpatialCollectionTypesComposableInvoker 
+  extends org.apache.olingo.ext.proxy.api.StructuredComposableInvoker<AllSpatialCollectionTypes, AllSpatialCollectionTypes.Operations>
+   {
+
+  @Override
+  AllSpatialCollectionTypesComposableInvoker select(String... select);
+
+  @Override
+  AllSpatialCollectionTypesComposableInvoker expand(String... expand);
+
+    
+
+    @Key
+    
+    @org.apache.olingo.ext.proxy.api.annotations.Property(name = "Id", 
+                type = "Edm.Int32", 
+                nullable = false,
+                defaultValue = "",
+                maxLenght = Integer.MAX_VALUE,
+                fixedLenght = false,
+                precision = 0,
+                scale = 0,
+                unicode = true,
+                collation = "",
+                srid = "",
+                concurrencyMode = ConcurrencyMode.None,
+                fcSourcePath = "",
+                fcTargetPath = "",
+                fcContentKind = EdmContentKind.text,
+                fcNSPrefix = "",
+                fcNSURI = "",
+                fcKeepInContent = false)
+    java.lang.Integer getId();
+
+    void setId(java.lang.Integer _id);
+    
+
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0b92cf0/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AllSpatialCollectionTypes_SimpleCollectionComposableInvoker.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AllSpatialCollectionTypes_SimpleCollectionComposableInvoker.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AllSpatialCollectionTypes_SimpleCollectionComposableInvoker.java
new file mode 100644
index 0000000..be255f0
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/actionoverloading/microsoft/test/odata/services/astoriadefaultservice/types/AllSpatialCollectionTypes_SimpleCollectionComposableInvoker.java
@@ -0,0 +1,32 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.proxy.v3.actionoverloading.microsoft.test.odata.services.astoriadefaultservice.types;
+
+//CHECKSTYLE:OFF (Maven checkstyle)
+
+
+public interface AllSpatialCollectionTypes_SimpleCollectionComposableInvoker extends 
+    org.apache.olingo.ext.proxy.api.StructuredCollectionComposableInvoker<org.apache.olingo.fit.proxy.v3.actionoverloading.microsoft.test.odata.services.astoriadefaultservice.types.AllSpatialCollectionTypes_SimpleCollection, org.apache.olingo.fit.proxy.v3.actionoverloading.microsoft.test.odata.services.astoriadefaultservice.types.AllSpatialCollectionTypes_SimpleCollection.Operations> {
+
+  @Override
+  AllSpatialCollectionTypes_SimpleCollectionComposableInvoker select(String... select);
+
+  @Override
+  AllSpatialCollectionTypes_SimpleCollectionComposableInvoker expand(String... expand);
+}