You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ar...@apache.org on 2018/04/23 06:28:44 UTC
olingo-odata2 git commit: [Olingo-1259]Function Import enhancements
Repository: olingo-odata2
Updated Branches:
refs/heads/master 48b8d3ee3 -> 2e18476aa
[Olingo-1259]Function Import enhancements
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/2e18476a
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/2e18476a
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/2e18476a
Branch: refs/heads/master
Commit: 2e18476aa6d5f0c57ab50631b0389aa56426722f
Parents: 48b8d3e
Author: Archana Rai <ar...@sap.com>
Authored: Mon Apr 23 11:58:34 2018 +0530
Committer: Archana Rai <ar...@sap.com>
Committed: Mon Apr 23 11:58:34 2018 +0530
----------------------------------------------------------------------
.../odata2/api/ep/EntityProviderException.java | 6 +-
.../core/edm/Impl/EdmEntityContainerImpl.java | 2 +-
.../core/edm/Impl/EdmFunctionImportImpl.java | 6 +-
.../deserializer/XmlMetadataDeserializer.java | 19 +-
...LMetadataFunctionImportDeserializerTest.java | 260 ++++++++++++++++
.../core/ep/consumer/XmlMetadataConsumer.java | 17 +-
.../olingo/odata2/core/uri/UriParserImpl.java | 73 +++--
.../src/main/resources/i18n.properties | 1 +
.../ep/consumer/XmlMetadataConsumerTest.java | 312 +++++++++++++++++++
.../olingo/odata2/core/uri/UriParserTest.java | 4 +
.../olingo/odata2/testutil/mock/EdmMock.java | 4 +
11 files changed, 660 insertions(+), 44 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2e18476a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderException.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderException.java b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderException.java
index cc65e67..ed97771 100644
--- a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderException.java
+++ b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderException.java
@@ -113,7 +113,11 @@ public class EntityProviderException extends ODataMessageException {
public static final MessageReference INVALID_DELETED_ENTRY_METADATA = createMessageReference(
EntityProviderException.class, "INVALID_DELETED_ENTRY_METADATA");
-
+
+ /** INVALID_ATTRIBUTE found ('invalid attribute name') */
+ public static final MessageReference INVALID_ATTRIBUTE = createMessageReference(EntityProviderException.class,
+ "INVALID_ATTRIBUTE");
+
public EntityProviderException(final MessageReference messageReference) {
super(messageReference);
}
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2e18476a/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/edm/Impl/EdmEntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/edm/Impl/EdmEntityContainerImpl.java b/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/edm/Impl/EdmEntityContainerImpl.java
index bed4d44..2a95ef9 100644
--- a/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/edm/Impl/EdmEntityContainerImpl.java
+++ b/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/edm/Impl/EdmEntityContainerImpl.java
@@ -129,7 +129,7 @@ public class EdmEntityContainerImpl implements EdmEntityContainer, EdmAnnotatabl
public EdmEntitySet getEntitySet(final String name) throws EdmException {
EdmEntitySet edmEntitySet = null;
for(EdmEntitySet entity:edmEntitySets){
- if(name.equals(entity.getName())){
+ if(entity.getName().equals(name)){
edmEntitySet = entity;
}
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2e18476a/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/edm/Impl/EdmFunctionImportImpl.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/edm/Impl/EdmFunctionImportImpl.java b/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/edm/Impl/EdmFunctionImportImpl.java
index 8521ad7..99f2f15 100644
--- a/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/edm/Impl/EdmFunctionImportImpl.java
+++ b/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/edm/Impl/EdmFunctionImportImpl.java
@@ -144,7 +144,11 @@ public class EdmFunctionImportImpl extends EdmNamedImpl implements EdmFunctionIm
@Override
public EdmEntitySet getEntitySet() throws EdmException {
- return edmEntityContainer.getEntitySet(entitySet);
+ if(edmEntityContainer != null){
+ return edmEntityContainer.getEntitySet(entitySet);
+ }else{
+ return null;
+ }
}
@Override
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2e18476a/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/ep/deserializer/XmlMetadataDeserializer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/ep/deserializer/XmlMetadataDeserializer.java b/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/ep/deserializer/XmlMetadataDeserializer.java
index 73d62c1..3b470a6 100644
--- a/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/ep/deserializer/XmlMetadataDeserializer.java
+++ b/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/ep/deserializer/XmlMetadataDeserializer.java
@@ -544,22 +544,33 @@ public class XmlMetadataDeserializer {
EdmAnnotationsImpl annotations = new EdmAnnotationsImpl();
Map<String, EdmParameter> edmParamMap = new HashMap<String, EdmParameter>();
List<String> parametersList = new ArrayList<String>();
-
+ FullQualifiedName fqName ;
function.setName(reader.getAttributeValue(null, XmlMetadataConstants.EDM_NAME));
function.setHttpMethod(reader.getAttributeValue(Edm.NAMESPACE_M_2007_08,
XmlMetadataConstants.EDM_FUNCTION_IMPORT_HTTP_METHOD));
- function.setEntitySet(reader.getAttributeValue(null, XmlMetadataConstants.EDM_ENTITY_SET));
+ String entitySet = reader.getAttributeValue(null, XmlMetadataConstants.EDM_ENTITY_SET);
+ function.setEntitySet(entitySet);
String returnTypeString = reader.getAttributeValue(null, XmlMetadataConstants.EDM_FUNCTION_IMPORT_RETURN);
EdmTypedImpl returnType = new EdmTypedImpl();
if (returnTypeString != null) {
if (returnTypeString.startsWith("Collection") || returnTypeString.startsWith("collection")) {
- returnType.setMultiplicity(EdmMultiplicity.MANY);
returnTypeString = returnTypeString.substring(returnTypeString.indexOf("(") + 1, returnTypeString.length() - 1);
+ fqName = extractFQName(returnTypeString);
+ if(entitySet == null && entityTypesMap.get(fqName) != null){
+ throw new EntityProviderException(EntityProviderException.MISSING_ATTRIBUTE.addContent
+ ("EntitySet = "+entitySet, XmlMetadataConstants.EDM_FUNCTION_IMPORT +" = "+ function.getName()));
+ }
+ returnType.setMultiplicity(EdmMultiplicity.MANY);
} else {
+ fqName = extractFQName(returnTypeString);
+ if(entitySet != null && entityTypesMap.get(fqName) == null) {
+ throw new EntityProviderException(EntityProviderException.INVALID_ATTRIBUTE.addContent
+ ("EntitySet = "+entitySet, XmlMetadataConstants.EDM_FUNCTION_IMPORT
+ + " = "+ function.getName()));
+ }
returnType.setMultiplicity(EdmMultiplicity.ONE);
}
- FullQualifiedName fqName = extractFQName(returnTypeString);
returnType.setTypeName(fqName);
((EdmNamedImpl) returnType).setName(fqName.getName());
((EdmNamedImpl) returnType).setEdm(edm);
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2e18476a/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/XMLMetadataFunctionImportDeserializerTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/XMLMetadataFunctionImportDeserializerTest.java b/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/XMLMetadataFunctionImportDeserializerTest.java
index eb3d89f..50788e2 100644
--- a/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/XMLMetadataFunctionImportDeserializerTest.java
+++ b/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/deserializer/XMLMetadataFunctionImportDeserializerTest.java
@@ -359,6 +359,266 @@ public class XMLMetadataFunctionImportDeserializerTest {
}
}
+//Function Import with return type as entity type and entityset attribute set
+ @Test
+ public void testFunctionImportEntity() throws Exception {
+ final String xmWithEntityContainer =
+ "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ + Edm.NAMESPACE_EDMX_2007_06
+ + "\">"
+ + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\""
+ + Edm.NAMESPACE_M_2007_08
+ + "\">"
+ + "<Schema Namespace=\""
+ + NAMESPACE
+ + "\" xmlns=\""
+ + Edm.NAMESPACE_EDM_2008_09
+ + "\">"
+ + "<EntityType Name= \"Employee\" m:HasStream=\"true\">"
+ + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>"
+ + "<Property Name=\""
+ + propertyNames[0]
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[1]
+ + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>"
+ + "</EntityType>"
+ + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>"
+ + "<FunctionImport Name=\"EmployeeSearch\" ReturnType=\"RefScenario.Employee\" " +
+ "EntitySet=\"Employees\" m:HttpMethod=\"GET\">"
+ + "<Parameter Name=\"q1\" Type=\"Edm.String\" Nullable=\"true\" />"
+ + "<Parameter Name=\"q2\" Type=\"Edm.Int32\" Nullable=\"false\" />"
+ + "</FunctionImport>"
+ + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>";
+ XmlMetadataDeserializer parser = new XmlMetadataDeserializer();
+ InputStream reader = createStreamReader(xmWithEntityContainer);
+ EdmDataServices result = parser.readMetadata(reader, true);
+ for (EdmSchema schema : result.getEdm().getSchemas()) {
+ for (EdmEntityContainer container : schema.getEntityContainers()) {
+ assertEquals("Container1", container.getName());
+ assertEquals(Boolean.TRUE, container.isDefaultEntityContainer());
+
+ EdmFunctionImport functionImport1 = container.getFunctionImport("EmployeeSearch");
+
+ assertEquals("EmployeeSearch", functionImport1.getName());
+ assertEquals("Employees", functionImport1.getEntitySet().getName());
+ assertEquals(EdmMultiplicity.ONE, functionImport1.getReturnType().getMultiplicity());
+ assertEquals("GET", functionImport1.getHttpMethod());
+ }
+ }
+ }
+
+//Function Import with return type as entity type and entityset attribute not set
+ @Test
+ public void testFunctionImportEntityWithoutEntitySet() throws Exception {
+ final String xmWithEntityContainer =
+ "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ + Edm.NAMESPACE_EDMX_2007_06
+ + "\">"
+ + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\""
+ + Edm.NAMESPACE_M_2007_08
+ + "\">"
+ + "<Schema Namespace=\""
+ + NAMESPACE
+ + "\" xmlns=\""
+ + Edm.NAMESPACE_EDM_2008_09
+ + "\">"
+ + "<EntityType Name= \"Employee\" m:HasStream=\"true\">"
+ + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>"
+ + "<Property Name=\""
+ + propertyNames[0]
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[1]
+ + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>"
+ + "</EntityType>"
+ + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>"
+ + "<FunctionImport Name=\"EmployeeSearch\" ReturnType=\"RefScenario.Employee\" " +
+ " m:HttpMethod=\"GET\">"
+ + "<Parameter Name=\"q1\" Type=\"Edm.String\" Nullable=\"true\" />"
+ + "<Parameter Name=\"q2\" Type=\"Edm.Int32\" Nullable=\"false\" />"
+ + "</FunctionImport>"
+ + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>";
+ XmlMetadataDeserializer parser = new XmlMetadataDeserializer();
+ InputStream reader = createStreamReader(xmWithEntityContainer);
+ EdmDataServices result = parser.readMetadata(reader, true);
+ for (EdmSchema schema : result.getEdm().getSchemas()) {
+ for (EdmEntityContainer container : schema.getEntityContainers()) {
+ assertEquals("Container1", container.getName());
+ EdmFunctionImport functionImport1 = container.getFunctionImport("EmployeeSearch");
+
+ assertEquals("EmployeeSearch", functionImport1.getName());
+ assertNull(functionImport1.getEntitySet());
+ assertEquals("GET", functionImport1.getHttpMethod());
+ }
+ }
+ }
+
+ //Function Import with return type collection of complex type and entityset attribute not set
+ @Test
+ public void testFunctionImportCollection() throws Exception {
+ final String xmWithEntityContainer =
+ "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ + Edm.NAMESPACE_EDMX_2007_06
+ + "\">"
+ + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\""
+ + Edm.NAMESPACE_M_2007_08
+ + "\">"
+ + "<Schema Namespace=\""
+ + NAMESPACE
+ + "\" xmlns=\""
+ + Edm.NAMESPACE_EDM_2008_09
+ + "\">"
+ + "<EntityType Name= \"Room\" >"
+ + "<Key><PropertyRef Name=\"RoomId\"/></Key>"
+ + "<Property Name=\""
+ + "RoomId"
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[2]
+ + "\" Type=\"Edm.String\" />"
+ + "</EntityType>"
+ + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ + "<EntitySet Name=\"Rooms\" EntityType=\"RefScenario.Room\"/>"
+ + "<FunctionImport Name=\"LocationSearch\" ReturnType=\"Collection(RefScenario.Location)\" " +
+ " m:HttpMethod=\"GET\">"
+ + "<Parameter Name=\"q1\" Type=\"Edm.String\" Nullable=\"true\" Mode=\"In\"/>"
+ + "<Parameter Name=\"q2\" Type=\"Edm.Int32\" Nullable=\"false\" />"
+ + "</FunctionImport>"
+ + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>";
+ XmlMetadataDeserializer parser = new XmlMetadataDeserializer();
+ InputStream reader = createStreamReader(xmWithEntityContainer);
+ EdmDataServices result = parser.readMetadata(reader, true);
+ for (EdmSchema schema : result.getEdm().getSchemas()) {
+ for (EdmEntityContainer container : schema.getEntityContainers()) {
+ assertEquals("Container1", container.getName());
+ assertEquals(Boolean.TRUE, container.isDefaultEntityContainer());
+
+ EdmFunctionImport functionImport2 = container.getFunctionImport("LocationSearch");
+ assertEquals("LocationSearch", functionImport2.getName());
+ assertNull(functionImport2.getEntitySet());
+ assertEquals(EdmMultiplicity.MANY, functionImport2.getReturnType().getMultiplicity());
+ assertEquals("GET", functionImport2.getHttpMethod());
+ assertEquals(EdmMultiplicity.MANY, functionImport2.getReturnType().getMultiplicity());
+ }
+ }
+ }
+ //Function import returning collection of entitysets must have entityset attribute defined
+ @Test(expected = EntityProviderException.class)
+ public void testFunctionImportCollError() throws Exception {
+ final String xmWithEntityContainer =
+ "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ + Edm.NAMESPACE_EDMX_2007_06
+ + "\">"
+ + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\""
+ + Edm.NAMESPACE_M_2007_08
+ + "\">"
+ + "<Schema Namespace=\""
+ + NAMESPACE
+ + "\" xmlns=\""
+ + Edm.NAMESPACE_EDM_2008_09
+ + "\">"
+ + "<EntityType Name= \"Employee\" m:HasStream=\"true\">"
+ + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>"
+ + "<Property Name=\""
+ + propertyNames[0]
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[1]
+ + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>"
+ + "</EntityType>"
+ + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>"
+ + "<FunctionImport Name=\"EmployeeSearch\" ReturnType=\"Collection(RefScenario.Employee)\" " +
+ " m:HttpMethod=\"GET\">"
+ + "<Parameter Name=\"q1\" Type=\"Edm.String\" Nullable=\"true\" />"
+ + "<Parameter Name=\"q2\" Type=\"Edm.Int32\" Nullable=\"false\" />"
+ + "</FunctionImport>"
+ + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>";
+ XmlMetadataDeserializer parser = new XmlMetadataDeserializer();
+ InputStream reader = createStreamReader(xmWithEntityContainer);
+ parser.readMetadata(reader, true);
+ }
+
+ //Function import returning complextype or edmsimpletype must not have entityset attribute
+ @Test(expected = EntityProviderException.class)
+ public void testFunctionImportError() throws Exception {
+ final String xmWithEntityContainer =
+ "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ + Edm.NAMESPACE_EDMX_2007_06
+ + "\">"
+ + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\""
+ + Edm.NAMESPACE_M_2007_08
+ + "\">"
+ + "<Schema Namespace=\""
+ + NAMESPACE
+ + "\" xmlns=\""
+ + Edm.NAMESPACE_EDM_2008_09
+ + "\">"
+ + "<EntityType Name= \"Employee\" m:HasStream=\"true\">"
+ + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>"
+ + "<Property Name=\""
+ + propertyNames[0]
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[1]
+ + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>"
+ + "</EntityType>"
+ + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>"
+ + "<FunctionImport Name=\"NoReturn\" " +
+ "EntitySet=\"Rooms\" m:HttpMethod=\"GET\"/>"
+ + "<FunctionImport Name=\"SingleRoomReturnType\" ReturnType=\"RefScenario.Room\" " +
+ "EntitySet=\"Rooms\" m:HttpMethod=\"GET\">"
+ + "</FunctionImport>"
+ + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>";
+ XmlMetadataDeserializer parser = new XmlMetadataDeserializer();
+ InputStream reader = createStreamReader(xmWithEntityContainer);
+ parser.readMetadata(reader, true);
+ }
+//Function import returning complextype or edmsimpletype must not have entityset attribute positive flow
+ @Test
+ public void testFunctionImportProperty() throws Exception {
+ final String xmWithEntityContainer =
+ "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ + Edm.NAMESPACE_EDMX_2007_06
+ + "\">"
+ + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\""
+ + Edm.NAMESPACE_M_2007_08
+ + "\">"
+ + "<Schema Namespace=\""
+ + NAMESPACE
+ + "\" xmlns=\""
+ + Edm.NAMESPACE_EDM_2008_09
+ + "\">"
+ + "<EntityType Name= \"Employee\" m:HasStream=\"true\">"
+ + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>"
+ + "<Property Name=\""
+ + propertyNames[0]
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[1]
+ + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>"
+ + "</EntityType>"
+ + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>"
+ + "<FunctionImport Name=\"GetId\" ReturnType=\"Edm.String\""
+ + " m:HttpMethod=\"GET\"/>"
+ + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>";
+ XmlMetadataDeserializer parser = new XmlMetadataDeserializer();
+ InputStream reader = createStreamReader(xmWithEntityContainer);
+ EdmDataServices result = parser.readMetadata(reader, true);
+ for (EdmSchema schema : result.getEdm().getSchemas()) {
+ for (EdmEntityContainer container : schema.getEntityContainers()) {
+ EdmFunctionImport functionImport4 = container.getFunctionImport("GetId");
+ assertEquals("GetId", functionImport4.getName());
+ assertNull(functionImport4.getEntitySet());
+ }
+ }
+ }
+
/**
* @param i
* @param functionImport
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2e18476a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java
index 160fdf6..92f57c7 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java
@@ -257,7 +257,7 @@ public class XmlMetadataConsumer {
FunctionImport function = new FunctionImport();
List<FunctionImportParameter> functionParameters = new ArrayList<FunctionImportParameter>();
List<AnnotationElement> annotationElements = new ArrayList<AnnotationElement>();
-
+ FullQualifiedName fqName;
function.setName(reader.getAttributeValue(null, XmlMetadataConstants.EDM_NAME));
function.setHttpMethod(reader.getAttributeValue(Edm.NAMESPACE_M_2007_08,
XmlMetadataConstants.EDM_FUNCTION_IMPORT_HTTP_METHOD));
@@ -267,12 +267,23 @@ public class XmlMetadataConsumer {
if (returnTypeString != null) {
ReturnType returnType = new ReturnType();
if (returnTypeString.startsWith("Collection") || returnTypeString.startsWith("collection")) {
- returnType.setMultiplicity(EdmMultiplicity.MANY);
returnTypeString = returnTypeString.substring(returnTypeString.indexOf("(") + 1, returnTypeString.length() - 1);
+ fqName = extractFQName(returnTypeString);
+ if(function.getEntitySet() == null && entityTypesMap.get(fqName) != null){
+ throw new EntityProviderException(EntityProviderException.MISSING_ATTRIBUTE.addContent
+ ("EntitySet = "+function.getEntitySet(), XmlMetadataConstants.EDM_FUNCTION_IMPORT + function.getName()));
+ }
+ returnType.setMultiplicity(EdmMultiplicity.MANY);
} else {
+ fqName = extractFQName(returnTypeString);
+ if(function.getEntitySet() != null && entityTypesMap.get(fqName) == null) {
+ throw new EntityProviderException(EntityProviderException.INVALID_ATTRIBUTE.addContent
+ ("EntitySet = "+function.getEntitySet(), XmlMetadataConstants.EDM_FUNCTION_IMPORT
+ + " : "+ function.getName()));
+ }
returnType.setMultiplicity(EdmMultiplicity.ONE);
}
- FullQualifiedName fqName = extractFQName(returnTypeString);
+ fqName = extractFQName(returnTypeString);
returnType.setTypeName(fqName);
function.setReturnType(returnType);
}
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2e18476a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java
index b7e9c18..ac1927e 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java
@@ -545,42 +545,47 @@ public class UriParserImpl extends UriParser {
private void handleFunctionImport(final EdmFunctionImport functionImport, final String emptyParentheses,
final String keyPredicate) throws UriSyntaxException, UriNotMatchingException, EdmException {
final EdmTyped returnType = functionImport.getReturnType();
- final EdmType type = returnType.getType();
- final boolean isCollection = returnType.getMultiplicity() == EdmMultiplicity.MANY;
-
- if (type.getKind() == EdmTypeKind.ENTITY && isCollection) {
- handleEntitySet(functionImport.getEntitySet(), keyPredicate);
- return;
- }
-
- if (emptyParentheses != null) {
- throw new UriSyntaxException(UriSyntaxException.INVALIDSEGMENT.addContent(emptyParentheses));
- }
-
- uriResult.setTargetType(type);
- switch (type.getKind()) {
- case SIMPLE:
- uriResult.setUriType(isCollection ? UriType.URI13 : UriType.URI14);
- break;
- case COMPLEX:
- uriResult.setUriType(isCollection ? UriType.URI11 : UriType.URI12);
- break;
- case ENTITY:
- uriResult.setUriType(UriType.URI10);
- break;
- default:
- throw new UriSyntaxException(UriSyntaxException.INVALIDRETURNTYPE.addContent(type.getKind()));
- }
-
- if (!pathSegments.isEmpty()) {
- if (uriResult.getUriType() == UriType.URI14) {
- currentPathSegment = pathSegments.remove(0);
- if ("$value".equals(percentDecode(currentPathSegment))) {
- uriResult.setValue(true);
- } else {
- throw new UriSyntaxException(UriSyntaxException.INVALIDSEGMENT.addContent(currentPathSegment));
+
+ if (returnType != null && returnType.getType() != null) {
+ final EdmType type = returnType.getType();
+ final boolean isCollection = returnType.getMultiplicity() == EdmMultiplicity.MANY;
+
+ if (type.getKind() == EdmTypeKind.ENTITY && isCollection) {
+ handleEntitySet(functionImport.getEntitySet(), keyPredicate);
+ return;
+ }
+
+ if (emptyParentheses != null) {
+ throw new UriSyntaxException(UriSyntaxException.INVALIDSEGMENT.addContent(emptyParentheses));
+ }
+
+ uriResult.setTargetType(type);
+ switch (type.getKind()) {
+ case SIMPLE:
+ uriResult.setUriType(isCollection ? UriType.URI13 : UriType.URI14);
+ break;
+ case COMPLEX:
+ uriResult.setUriType(isCollection ? UriType.URI11 : UriType.URI12);
+ break;
+ case ENTITY:
+ uriResult.setUriType(UriType.URI10);
+ break;
+ default:
+ throw new UriSyntaxException(UriSyntaxException.INVALIDRETURNTYPE.addContent(type.getKind()));
+ }
+
+ if (!pathSegments.isEmpty()) {
+ if (uriResult.getUriType() == UriType.URI14) {
+ currentPathSegment = pathSegments.remove(0);
+ if ("$value".equals(percentDecode(currentPathSegment))) {
+ uriResult.setValue(true);
+ } else {
+ throw new UriSyntaxException(UriSyntaxException.INVALIDSEGMENT.addContent(currentPathSegment));
+ }
}
}
+ } else {
+ uriResult.setUriType(UriType.URI14);
}
ensureLastSegment();
}
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2e18476a/odata2-lib/odata-core/src/main/resources/i18n.properties
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/resources/i18n.properties b/odata2-lib/odata-core/src/main/resources/i18n.properties
index 375b6b8..508925d 100644
--- a/odata2-lib/odata-core/src/main/resources/i18n.properties
+++ b/odata2-lib/odata-core/src/main/resources/i18n.properties
@@ -123,6 +123,7 @@ org.apache.olingo.odata2.api.ep.EntityProviderException.INVALID_DELETED_ENTRY_ME
org.apache.olingo.odata2.api.ep.EntityProviderException.NULL_VALUE=Entity or expanded entity cannot have null value.
org.apache.olingo.odata2.api.ep.EntityProviderException.INCORRECT_NAVIGATION_TYPE=Navigation has to be either an Entity or a Map.
org.apache.olingo.odata2.api.ep.EntityProviderException.MANDATORY_WRITE_PROPERTY=Write properties are mandatory for XML.
+org.apache.olingo.odata2.api.ep.EntityProviderException.INVALID_ATTRIBUTE=Invalid attribute '%1$s' found at tag '%2$s'.
##################################
# BatchParserexceptions
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2e18476a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
index 9c4877c..54f7d4b 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
@@ -839,6 +839,15 @@ public class XmlMetadataConsumerTest extends AbstractXmlConsumerTest {
+ propertyNames[1]
+ "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>"
+ "</EntityType>"
+ + "<EntityType Name= \"Room\" >"
+ + "<Key><PropertyRef Name=\"RoomId\"/></Key>"
+ + "<Property Name=\""
+ + "RoomId"
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[2]
+ + "\" Type=\"Edm.String\" />"
+ + "</EntityType>"
+ "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>"
+ "<FunctionImport Name=\"EmployeeSearch\" ReturnType=\"Collection(RefScenario.Employee)\" " +
@@ -936,6 +945,309 @@ public class XmlMetadataConsumerTest extends AbstractXmlConsumerTest {
}
}
+//Function Import with return type as entity type and entityset attribute set
+ @Test
+ public void testFunctionImportEntity() throws XMLStreamException, EntityProviderException {
+ final String xmWithEntityContainer =
+ "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ + Edm.NAMESPACE_EDMX_2007_06
+ + "\">"
+ + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\""
+ + Edm.NAMESPACE_M_2007_08
+ + "\">"
+ + "<Schema Namespace=\""
+ + NAMESPACE
+ + "\" xmlns=\""
+ + Edm.NAMESPACE_EDM_2008_09
+ + "\">"
+ + "<EntityType Name= \"Employee\" m:HasStream=\"true\">"
+ + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>"
+ + "<Property Name=\""
+ + propertyNames[0]
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[1]
+ + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>"
+ + "</EntityType>"
+ + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>"
+ + "<FunctionImport Name=\"EmployeeSearch\" ReturnType=\"RefScenario.Employee\" " +
+ "EntitySet=\"Employees\" m:HttpMethod=\"GET\">"
+ + "<Parameter Name=\"q1\" Type=\"Edm.String\" Nullable=\"true\" />"
+ + "<Parameter Name=\"q2\" Type=\"Edm.Int32\" Nullable=\"false\" />"
+ + "</FunctionImport>"
+ + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>";
+ XmlMetadataConsumer parser = new XmlMetadataConsumer();
+ XMLStreamReader reader = createStreamReader(xmWithEntityContainer);
+ DataServices result = parser.readMetadata(reader, true);
+ for (Schema schema : result.getSchemas()) {
+ for (EntityContainer container : schema.getEntityContainers()) {
+ assertEquals("Container1", container.getName());
+ assertEquals(Boolean.TRUE, container.isDefaultEntityContainer());
+
+ FunctionImport functionImport1 = container.getFunctionImports().get(0);
+
+ assertEquals("EmployeeSearch", functionImport1.getName());
+ assertEquals("Employees", functionImport1.getEntitySet());
+ assertEquals(NAMESPACE, functionImport1.getReturnType().getTypeName().getNamespace());
+ assertEquals("Employee", functionImport1.getReturnType().getTypeName().getName());
+ assertEquals(EdmMultiplicity.ONE, functionImport1.getReturnType().getMultiplicity());
+ assertEquals("GET", functionImport1.getHttpMethod());
+ assertEquals(2, functionImport1.getParameters().size());
+ assertEquals("q1", functionImport1.getParameters().get(0).getName());
+ assertEquals(EdmSimpleTypeKind.String, functionImport1.getParameters().get(0).getType());
+ assertEquals(Boolean.TRUE, functionImport1.getParameters().get(0).getFacets().isNullable());
+ assertEquals("q2", functionImport1.getParameters().get(1).getName());
+ assertEquals(EdmSimpleTypeKind.Int32, functionImport1.getParameters().get(1).getType());
+ assertEquals(Boolean.FALSE, functionImport1.getParameters().get(1).getFacets().isNullable());
+ }
+ }
+ }
+
+//Function Import with return type as entity type and entityset attribute not set
+ @Test
+ public void testFunctionImportEntityWithoutEntitySet() throws XMLStreamException, EntityProviderException {
+ final String xmWithEntityContainer =
+ "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ + Edm.NAMESPACE_EDMX_2007_06
+ + "\">"
+ + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\""
+ + Edm.NAMESPACE_M_2007_08
+ + "\">"
+ + "<Schema Namespace=\""
+ + NAMESPACE
+ + "\" xmlns=\""
+ + Edm.NAMESPACE_EDM_2008_09
+ + "\">"
+ + "<EntityType Name= \"Employee\" m:HasStream=\"true\">"
+ + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>"
+ + "<Property Name=\""
+ + propertyNames[0]
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[1]
+ + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>"
+ + "</EntityType>"
+ + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>"
+ + "<FunctionImport Name=\"EmployeeSearch\" ReturnType=\"RefScenario.Employee\" " +
+ " m:HttpMethod=\"GET\">"
+ + "<Parameter Name=\"q1\" Type=\"Edm.String\" Nullable=\"true\" />"
+ + "<Parameter Name=\"q2\" Type=\"Edm.Int32\" Nullable=\"false\" />"
+ + "</FunctionImport>"
+ + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>";
+ XmlMetadataConsumer parser = new XmlMetadataConsumer();
+ XMLStreamReader reader = createStreamReader(xmWithEntityContainer);
+ DataServices result = parser.readMetadata(reader, true);
+ for (Schema schema : result.getSchemas()) {
+ for (EntityContainer container : schema.getEntityContainers()) {
+ assertEquals("Container1", container.getName());
+ assertEquals(Boolean.TRUE, container.isDefaultEntityContainer());
+
+ FunctionImport functionImport1 = container.getFunctionImports().get(0);
+
+ assertEquals("EmployeeSearch", functionImport1.getName());
+ assertEquals(null, functionImport1.getEntitySet());
+ assertEquals(NAMESPACE, functionImport1.getReturnType().getTypeName().getNamespace());
+ assertEquals("Employee", functionImport1.getReturnType().getTypeName().getName());
+ assertEquals(EdmMultiplicity.ONE, functionImport1.getReturnType().getMultiplicity());
+ assertEquals("GET", functionImport1.getHttpMethod());
+ assertEquals(2, functionImport1.getParameters().size());
+
+ assertEquals("q1", functionImport1.getParameters().get(0).getName());
+ assertEquals(EdmSimpleTypeKind.String, functionImport1.getParameters().get(0).getType());
+ assertEquals(Boolean.TRUE, functionImport1.getParameters().get(0).getFacets().isNullable());
+ assertEquals("q2", functionImport1.getParameters().get(1).getName());
+ assertEquals(EdmSimpleTypeKind.Int32, functionImport1.getParameters().get(1).getType());
+ assertEquals(Boolean.FALSE, functionImport1.getParameters().get(1).getFacets().isNullable());
+ }
+ }
+ }
+
+ //Function Import with return type collection of complex type and entityset attribute not set
+ @Test
+ public void testFunctionImportCollection() throws XMLStreamException, EntityProviderException {
+ final String xmWithEntityContainer =
+ "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ + Edm.NAMESPACE_EDMX_2007_06
+ + "\">"
+ + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\""
+ + Edm.NAMESPACE_M_2007_08
+ + "\">"
+ + "<Schema Namespace=\""
+ + NAMESPACE
+ + "\" xmlns=\""
+ + Edm.NAMESPACE_EDM_2008_09
+ + "\">"
+ + "<EntityType Name= \"Room\" >"
+ + "<Key><PropertyRef Name=\"RoomId\"/></Key>"
+ + "<Property Name=\""
+ + "RoomId"
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[2]
+ + "\" Type=\"Edm.String\" />"
+ + "</EntityType>"
+ + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ + "<EntitySet Name=\"Rooms\" EntityType=\"RefScenario.Room\"/>"
+ + "<FunctionImport Name=\"LocationSearch\" ReturnType=\"Collection(RefScenario.Location)\" " +
+ " m:HttpMethod=\"GET\">"
+ + "<Parameter Name=\"q1\" Type=\"Edm.String\" Nullable=\"true\" Mode=\"In\"/>"
+ + "<Parameter Name=\"q2\" Type=\"Edm.Int32\" Nullable=\"false\" />"
+ + "</FunctionImport>"
+ + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>";
+ XmlMetadataConsumer parser = new XmlMetadataConsumer();
+ XMLStreamReader reader = createStreamReader(xmWithEntityContainer);
+ DataServices result = parser.readMetadata(reader, true);
+ for (Schema schema : result.getSchemas()) {
+ for (EntityContainer container : schema.getEntityContainers()) {
+ assertEquals("Container1", container.getName());
+ assertEquals(Boolean.TRUE, container.isDefaultEntityContainer());
+
+ FunctionImport functionImport2 = container.getFunctionImports().get(0);
+ assertEquals("LocationSearch", functionImport2.getName());
+ assertEquals(null, functionImport2.getEntitySet());
+ assertEquals(NAMESPACE, functionImport2.getReturnType().getTypeName().getNamespace());
+ assertEquals("Location", functionImport2.getReturnType().getTypeName().getName());
+ assertEquals(EdmMultiplicity.MANY, functionImport2.getReturnType().getMultiplicity());
+ assertEquals("GET", functionImport2.getHttpMethod());
+ assertEquals(2, functionImport2.getParameters().size());
+ assertEquals(new FullQualifiedName("RefScenario", "Location"),
+ functionImport2.getReturnType().getTypeName());
+ assertEquals(EdmMultiplicity.MANY, functionImport2.getReturnType().getMultiplicity());
+
+ FunctionImportParameter functionImportParameter = functionImport2.getParameters().get(0);
+ assertEquals("q1", functionImportParameter.getName());
+ assertEquals(EdmSimpleTypeKind.String, functionImport2.getParameters().get(0).getType());
+ assertEquals(Boolean.TRUE, functionImport2.getParameters().get(0).getFacets().isNullable());
+ assertEquals("In", functionImportParameter.getMode());
+
+ assertEquals("q2", functionImport2.getParameters().get(1).getName());
+ assertEquals(EdmSimpleTypeKind.Int32, functionImport2.getParameters().get(1).getType());
+ assertEquals(Boolean.FALSE, functionImport2.getParameters().get(1).getFacets().isNullable());
+ assertEquals(null, functionImport2.getParameters().get(1).getMode());
+
+
+ }
+ }
+ }
+ //Function import returning collection of entitysets must have entityset attribute defined
+ @Test(expected = EntityProviderException.class)
+ public void testFunctionImportCollError() throws XMLStreamException, EntityProviderException {
+ final String xmWithEntityContainer =
+ "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ + Edm.NAMESPACE_EDMX_2007_06
+ + "\">"
+ + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\""
+ + Edm.NAMESPACE_M_2007_08
+ + "\">"
+ + "<Schema Namespace=\""
+ + NAMESPACE
+ + "\" xmlns=\""
+ + Edm.NAMESPACE_EDM_2008_09
+ + "\">"
+ + "<EntityType Name= \"Employee\" m:HasStream=\"true\">"
+ + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>"
+ + "<Property Name=\""
+ + propertyNames[0]
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[1]
+ + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>"
+ + "</EntityType>"
+ + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>"
+ + "<FunctionImport Name=\"EmployeeSearch\" ReturnType=\"Collection(RefScenario.Employee)\" " +
+ " m:HttpMethod=\"GET\">"
+ + "<Parameter Name=\"q1\" Type=\"Edm.String\" Nullable=\"true\" />"
+ + "<Parameter Name=\"q2\" Type=\"Edm.Int32\" Nullable=\"false\" />"
+ + "</FunctionImport>"
+ + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>";
+ XmlMetadataConsumer parser = new XmlMetadataConsumer();
+ XMLStreamReader reader = createStreamReader(xmWithEntityContainer);
+ parser.readMetadata(reader, true);
+ }
+
+ //Function import returning complextype or edmsimpletype must not have entityset attribute
+ @Test(expected = EntityProviderException.class)
+ public void testFunctionImportError() throws XMLStreamException, EntityProviderException {
+ final String xmWithEntityContainer =
+ "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ + Edm.NAMESPACE_EDMX_2007_06
+ + "\">"
+ + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\""
+ + Edm.NAMESPACE_M_2007_08
+ + "\">"
+ + "<Schema Namespace=\""
+ + NAMESPACE
+ + "\" xmlns=\""
+ + Edm.NAMESPACE_EDM_2008_09
+ + "\">"
+ + "<EntityType Name= \"Employee\" m:HasStream=\"true\">"
+ + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>"
+ + "<Property Name=\""
+ + propertyNames[0]
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[1]
+ + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>"
+ + "</EntityType>"
+ + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>"
+ + "<FunctionImport Name=\"NoReturn\" " +
+ "EntitySet=\"Rooms\" m:HttpMethod=\"GET\"/>"
+ + "<FunctionImport Name=\"SingleRoomReturnType\" ReturnType=\"RefScenario.Room\" " +
+ "EntitySet=\"Rooms\" m:HttpMethod=\"GET\">"
+ + "</FunctionImport>"
+ + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>";
+ XmlMetadataConsumer parser = new XmlMetadataConsumer();
+ XMLStreamReader reader = createStreamReader(xmWithEntityContainer);
+ parser.readMetadata(reader, true);
+ }
+//Function import returning complextype or edmsimpletype must not have entityset attribute positive flow
+ @Test
+ public void testFunctionImportProperty() throws XMLStreamException, EntityProviderException {
+ final String xmWithEntityContainer =
+ "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\""
+ + Edm.NAMESPACE_EDMX_2007_06
+ + "\">"
+ + "<edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\""
+ + Edm.NAMESPACE_M_2007_08
+ + "\">"
+ + "<Schema Namespace=\""
+ + NAMESPACE
+ + "\" xmlns=\""
+ + Edm.NAMESPACE_EDM_2008_09
+ + "\">"
+ + "<EntityType Name= \"Employee\" m:HasStream=\"true\">"
+ + "<Key><PropertyRef Name=\"EmployeeId\"/></Key>"
+ + "<Property Name=\""
+ + propertyNames[0]
+ + "\" Type=\"Edm.String\" Nullable=\"false\"/>"
+ + "<Property Name=\""
+ + propertyNames[1]
+ + "\" Type=\"Edm.String\" m:FC_TargetPath=\"SyndicationTitle\"/>"
+ + "</EntityType>"
+ + "<EntityContainer Name=\"Container1\" m:IsDefaultEntityContainer=\"true\">"
+ + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>"
+ + "<FunctionImport Name=\"GetId\" ReturnType=\"Edm.String\""
+ + " m:HttpMethod=\"GET\"/>"
+ + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>";
+ XmlMetadataConsumer parser = new XmlMetadataConsumer();
+ XMLStreamReader reader = createStreamReader(xmWithEntityContainer);
+ DataServices result = parser.readMetadata(reader, true);
+ for (Schema schema : result.getSchemas()) {
+ for (EntityContainer container : schema.getEntityContainers()) {
+ FunctionImport functionImport4 = container.getFunctionImports().get(0);
+ assertEquals("GetId", functionImport4.getName());
+ List<FunctionImportParameter> parameters4 = functionImport4.getParameters();
+ assertNotNull(parameters4);
+ assertEquals(0, parameters4.size());
+ assertEquals("String", functionImport4.getReturnType().getTypeName().getName());
+ }
+ }
+ }
+
@Test()
public void testAlias() throws XMLStreamException, EntityProviderException {
final String xml =
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2e18476a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/uri/UriParserTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/uri/UriParserTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/uri/UriParserTest.java
index a4b095c..f08012a 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/uri/UriParserTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/uri/UriParserTest.java
@@ -711,6 +711,10 @@ public class UriParserTest extends BaseTest {
result = parse("OldestEmployee");
assertEquals("OldestEmployee", result.getFunctionImport().getName());
assertEquals(UriType.URI10, result.getUriType());
+
+ result = parse("SetEmployee");
+ assertEquals("SetEmployee", result.getFunctionImport().getName());
+ assertEquals(UriType.URI14, result.getUriType());
}
@Test
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2e18476a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java
index 20290c0..de1506e 100644
--- a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java
+++ b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java
@@ -242,6 +242,10 @@ class EdmMock {
EdmFunctionImport oldestEmployeeFunctionImport =
createFunctionImportMock(defaultContainer, "OldestEmployee", employeeType, EdmMultiplicity.ONE);
when(oldestEmployeeFunctionImport.getEntitySet()).thenReturn(employeeEntitySet);
+ EdmFunctionImport employeeActionImport =
+ createFunctionImportMock(defaultContainer, "SetEmployee", null, EdmMultiplicity.ONE);
+ when(employeeActionImport.getEntitySet()).thenReturn(employeeEntitySet);
+ when(employeeActionImport.getHttpMethod()).thenReturn(ODataHttpMethod.POST.name());
// Issue with not explicitly nullable parameters and facets
EdmFunctionImport functionImportNullableParameter =