[OLINGO-801] support for function-parameter aliases in tech. service

Change-Id: I57b222418cf2760d3926da185f4dba0207311f4a

Signed-off-by: Christian Holzer <c.holzer@sap.com>
This commit is contained in:
Klaus Straubinger 2015-10-15 10:52:17 +02:00 committed by Christian Holzer
parent 587f904338
commit 85ed370707
8 changed files with 207 additions and 183 deletions

View File

@ -27,13 +27,9 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.apache.olingo.client.api.communication.request.invoke.ODataInvokeRequest;
import org.apache.olingo.client.api.communication.request.retrieve.ODataPropertyRequest;
import org.apache.olingo.client.api.communication.request.retrieve.ODataRawRequest;
import org.apache.olingo.client.api.communication.request.retrieve.ODataValueRequest;
import org.apache.olingo.client.api.communication.response.ODataInvokeResponse;
import org.apache.olingo.client.api.communication.response.ODataRawResponse;
import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
import org.apache.olingo.client.api.domain.ClientCollectionValue;
import org.apache.olingo.client.api.domain.ClientComplexValue;
@ -42,6 +38,7 @@ import org.apache.olingo.client.api.domain.ClientEntitySet;
import org.apache.olingo.client.api.domain.ClientPrimitiveValue;
import org.apache.olingo.client.api.domain.ClientProperty;
import org.apache.olingo.client.api.domain.ClientValue;
import org.apache.olingo.client.core.uri.ParameterAlias;
import org.apache.olingo.commons.api.http.HttpStatusCode;
import org.apache.olingo.fit.tecsvc.TecSvcConst;
import org.junit.Test;
@ -166,19 +163,21 @@ public class FunctionImportITCase extends AbstractParamTecSvcITCase {
@Test
public void countEntityCollection() throws Exception {
final ODataRawRequest request = getClient().getRetrieveRequestFactory()
.getRawRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI).appendOperationCallSegment("FICRTCollESMedia")
.count().build());
final ODataRawResponse response = request.execute();
assertEquals("4", IOUtils.toString(response.getRawResponse()));
ODataValueRequest request = getClient().getRetrieveRequestFactory()
.getValueRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
.appendOperationCallSegment("FICRTCollESMedia").count().build());
setCookieHeader(request);
final ODataRetrieveResponse<ClientPrimitiveValue> response = request.execute();
saveCookieHeader(response);
assertEquals("4", response.getBody().toValue());
}
@Test
public void complexWithPath() throws Exception {
ODataInvokeRequest<ClientProperty> request = getClient().getInvokeRequestFactory()
.getFunctionInvokeRequest(
getClient().newURIBuilder(TecSvcConst.BASE_URI).appendOperationCallSegment("FICRTCTTwoPrim")
.appendPropertySegment("PropertyInt16").build(),
.getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
.appendOperationCallSegment("FICRTCTTwoPrim")
.appendPropertySegment("PropertyInt16").build(),
ClientProperty.class);
assertNotNull(request);
setCookieHeader(request);
@ -241,44 +240,60 @@ public class FunctionImportITCase extends AbstractParamTecSvcITCase {
@Test
public void FICRTStringTwoParamNotNull() {
Map<String, Object> keys = new HashMap<String, Object>();
keys.put("ParameterInt16", 3);
keys.put("ParameterString", "ab");
ODataPropertyRequest<ClientProperty> request = getClient().getRetrieveRequestFactory()
.getPropertyRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
.appendPropertySegment("FICRTStringTwoParam").appendKeySegment(keys).build());
ODataInvokeRequest<ClientProperty> request = getClient().getInvokeRequestFactory()
.getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
.appendOperationCallSegment("FICRTStringTwoParam").build(),
ClientProperty.class,
buildTwoParameters(3, "ab"));
setCookieHeader(request);
final ODataRetrieveResponse<ClientProperty> response = request.execute();
final ODataInvokeResponse<ClientProperty> response = request.execute();
saveCookieHeader(response);
assertEquals("\"ab\",\"ab\",\"ab\"", response.getBody().getPrimitiveValue().toValue());
}
@Test
public void FICRTStringTwoParamNull() {
Map<String, Object> keys = new HashMap<String, Object>();
keys.put("ParameterInt16", 1);
ODataPropertyRequest<ClientProperty> request = getClient().getRetrieveRequestFactory()
.getPropertyRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
.appendPropertySegment("FICRTStringTwoParam").appendKeySegment(keys).build());
ODataInvokeRequest<ClientProperty> request = getClient().getInvokeRequestFactory()
.getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
.appendOperationCallSegment("FICRTStringTwoParam").build(),
ClientProperty.class,
Collections.<String, ClientValue> singletonMap("ParameterInt16",
getFactory().newPrimitiveValueBuilder().buildInt32(1)));
setCookieHeader(request);
final ODataRetrieveResponse<ClientProperty> response = request.execute();
final ODataInvokeResponse<ClientProperty> response = request.execute();
saveCookieHeader(response);
assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), response.getStatusCode());
}
@Test
public void FICRTCollCTTwoPrimTwoParamNotNull() {
Map<String, Object> keys = new HashMap<String, Object>();
keys.put("ParameterInt16", 2);
keys.put("ParameterString", "TestString");
ODataPropertyRequest<ClientProperty> request = getClient().getRetrieveRequestFactory()
.getPropertyRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
.appendEntitySetSegment("FICRTCollCTTwoPrimTwoParam").appendKeySegment(keys).build());
public void FICRTStringTwoParamWithAliases() {
Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
parameters.put("ParameterInt16", getFactory().newPrimitiveValueBuilder().setValue(
new ParameterAlias("first")).build());
parameters.put("ParameterString", getFactory().newPrimitiveValueBuilder().setValue(
new ParameterAlias("second")).build());
ODataInvokeRequest<ClientProperty> request = getClient().getInvokeRequestFactory().getFunctionInvokeRequest(
getClient().newURIBuilder(TecSvcConst.BASE_URI)
.appendOperationCallSegment("FICRTStringTwoParam")
.addParameterAlias("second", "'x'").addParameterAlias("first", "4")
.build(),
ClientProperty.class,
parameters);
setCookieHeader(request);
final ODataRetrieveResponse<ClientProperty> response = request.execute();
final ODataInvokeResponse<ClientProperty> response = request.execute();
saveCookieHeader(response);
assertEquals("\"x\",\"x\",\"x\",\"x\"", response.getBody().getPrimitiveValue().toValue());
}
@Test
public void FICRTCollCTTwoPrimTwoParamNotNull() {
ODataInvokeRequest<ClientProperty> request = getClient().getInvokeRequestFactory()
.getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
.appendOperationCallSegment("FICRTCollCTTwoPrimTwoParam").build(),
ClientProperty.class,
buildTwoParameters(3, "TestString"));
setCookieHeader(request);
final ODataInvokeResponse<ClientProperty> response = request.execute();
saveCookieHeader(response);
final ClientCollectionValue<ClientValue> collection = response.getBody().getCollectionValue().asCollection();
final Iterator<ClientValue> iter = collection.iterator();
@ -295,15 +310,13 @@ public class FunctionImportITCase extends AbstractParamTecSvcITCase {
@Test
public void FICRTCollCTTwoPrimTwoParamNull() {
Map<String, Object> keys = new HashMap<String, Object>();
keys.put("ParameterInt16", 2);
keys.put("ParameterString", null);
ODataPropertyRequest<ClientProperty> request = getClient().getRetrieveRequestFactory()
.getPropertyRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
.appendEntitySetSegment("FICRTCollCTTwoPrimTwoParam").appendKeySegment(keys).build());
ODataInvokeRequest<ClientProperty> request = getClient().getInvokeRequestFactory()
.getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI)
.appendOperationCallSegment("FICRTCollCTTwoPrimTwoParam").build(),
ClientProperty.class,
buildTwoParameters(2, null));
setCookieHeader(request);
final ODataRetrieveResponse<ClientProperty> response = request.execute();
final ODataInvokeResponse<ClientProperty> response = request.execute();
saveCookieHeader(response);
final ClientCollectionValue<ClientValue> collection = response.getBody().getCollectionValue().asCollection();
final Iterator<ClientValue> iter = collection.iterator();
@ -317,4 +330,11 @@ public class FunctionImportITCase extends AbstractParamTecSvcITCase {
assertEquals("UFCRTCollCTTwoPrimTwoParamstring value: null",
complexValue.get("PropertyString").getPrimitiveValue().toValue());
}
private Map<String, ClientValue> buildTwoParameters(final int parameterInt16, final String parameterString) {
Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
parameters.put("ParameterInt16", getFactory().newPrimitiveValueBuilder().buildInt32(parameterInt16));
parameters.put("ParameterString", getFactory().newPrimitiveValueBuilder().buildString(parameterString));
return parameters;
}
}

View File

@ -21,22 +21,22 @@ package org.apache.olingo.server.api.uri;
import org.apache.olingo.server.api.uri.queryoption.expression.Expression;
/**
* Represents an function parameter or key predicate when used in the URI.
* Represents a function parameter or key predicate when used in the URI.
*/
public interface UriParameter {
/**
* @return Alias name if the parameters values is an alias, otherwise null
* @return Alias name if the parameter's value is an alias, otherwise null
*/
String getAlias();
/**
* @return Text of the parameters value
* @return Text of the parameter's value
*/
String getText();
/**
* @return If the parameters value is a expression and expression is returned, otherwise null
* @return Expression if the parameter's value is an expression, otherwise null
*/
Expression getExpression();
@ -46,7 +46,7 @@ public interface UriParameter {
String getName();
/**
* @return Name of the referenced property when referential constrains are used
* @return Name of the referenced property when referential constraints are used
*/
String getReferencedProperty();
}

View File

@ -67,7 +67,8 @@ public class ActionData {
}
return DataCreator.createPrimitive(null, count);
}
throw new DataProviderException("Action " + name + " is not yet implemented.");
throw new DataProviderException("Action " + name + " is not yet implemented.",
HttpStatusCode.NOT_IMPLEMENTED);
}
protected static Property primitiveCollectionAction(final String name, final Map<String, Parameter> parameters,
@ -83,7 +84,7 @@ public class ActionData {
return new Property(null, name, ValueType.COLLECTION_PRIMITIVE, Arrays.asList(
name + " int16 value: " + param16String,
name + " duration value: " + paramDurationString));
} catch(EdmPrimitiveTypeException e) {
} catch (EdmPrimitiveTypeException e) {
throw new DataProviderException("EdmPrimitiveTypeException", e);
}
}
@ -103,7 +104,8 @@ public class ActionData {
}
return new Property(null, name, ValueType.COLLECTION_PRIMITIVE, collectionValues);
}
throw new DataProviderException("Action " + name + " is not yet implemented.");
throw new DataProviderException("Action " + name + " is not yet implemented.",
HttpStatusCode.NOT_IMPLEMENTED);
}
private static String valueAsString(final Parameter parameter, final EdmPrimitiveTypeKind kind, final OData oData)
@ -122,7 +124,8 @@ public class ActionData {
(Short) paramInt16.asPrimitive();
return createCTTwoPrimComplexProperty(name, number, "UARTCTTwoPrimParam string value");
}
throw new DataProviderException("Action " + name + " is not yet implemented.");
throw new DataProviderException("Action " + name + " is not yet implemented.",
HttpStatusCode.NOT_IMPLEMENTED);
}
private static Property createCTTwoPrimComplexProperty(final String name, final Short number, final String text) {
@ -148,7 +151,8 @@ public class ActionData {
}
return new Property(null, name, ValueType.COLLECTION_COMPLEX, complexCollection);
}
throw new DataProviderException("Action " + name + " is not yet implemented.");
throw new DataProviderException("Action " + name + " is not yet implemented.",
HttpStatusCode.NOT_IMPLEMENTED);
}
protected static EntityActionResult entityAction(final String name, final Map<String, Parameter> parameters,
@ -191,7 +195,8 @@ public class ActionData {
return new EntityActionResult().setEntity(entityCollection.getEntities().get(0));
}
}
throw new DataProviderException("Action " + name + " is not yet implemented.");
throw new DataProviderException("Action " + name + " is not yet implemented.",
HttpStatusCode.NOT_IMPLEMENTED);
}
private static Entity createAllPrimEntity(final Short key, final String val, final Calendar date,
@ -241,7 +246,8 @@ public class ActionData {
}
return collection;
}
throw new DataProviderException("Action " + name + " is not yet implemented.");
throw new DataProviderException("Action " + name + " is not yet implemented.",
HttpStatusCode.NOT_IMPLEMENTED);
}
@SuppressWarnings("unchecked")

View File

@ -43,6 +43,7 @@ import org.apache.olingo.commons.api.edm.EdmEntitySet;
import org.apache.olingo.commons.api.edm.EdmEntityType;
import org.apache.olingo.commons.api.edm.EdmFunction;
import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
import org.apache.olingo.commons.api.edm.EdmParameter;
import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
@ -56,6 +57,7 @@ import org.apache.olingo.server.api.OData;
import org.apache.olingo.server.api.ODataApplicationException;
import org.apache.olingo.server.api.deserializer.DeserializerException;
import org.apache.olingo.server.api.serializer.SerializerException;
import org.apache.olingo.server.api.uri.UriInfoResource;
import org.apache.olingo.server.api.uri.UriParameter;
import org.apache.olingo.server.api.uri.UriResourceEntitySet;
@ -500,19 +502,55 @@ public class DataProvider {
entity.setMediaETag("W/\"" + UUID.randomUUID() + "\"");
}
public EntityCollection readFunctionEntitySet(final EdmFunction function, final List<UriParameter> parameters)
throws DataProviderException {
return FunctionData.entityCollectionFunction(function.getName(), parameters, data);
public EntityCollection readFunctionEntityCollection(final EdmFunction function, final List<UriParameter> parameters,
final UriInfoResource uriInfo) throws DataProviderException {
return FunctionData.entityCollectionFunction(function.getName(),
getFunctionParameterValues(function, parameters, uriInfo),
data);
}
public Entity readFunctionEntity(final EdmFunction function, final List<UriParameter> parameters)
throws DataProviderException {
return FunctionData.entityFunction(function.getName(), parameters, data);
public Entity readFunctionEntity(final EdmFunction function, final List<UriParameter> parameters,
final UriInfoResource uriInfo) throws DataProviderException {
return FunctionData.entityFunction(function.getName(),
getFunctionParameterValues(function, parameters, uriInfo),
data);
}
public Property readFunctionPrimitiveComplex(final EdmFunction function, final List<UriParameter> parameters)
throws DataProviderException {
return FunctionData.primitiveComplexFunction(function.getName(), parameters, data, odata);
public Property readFunctionPrimitiveComplex(final EdmFunction function, final List<UriParameter> parameters,
final UriInfoResource uriInfo) throws DataProviderException {
return FunctionData.primitiveComplexFunction(function.getName(),
getFunctionParameterValues(function, parameters, uriInfo),
data);
}
private Map<String, Object> getFunctionParameterValues(final EdmFunction function,
final List<UriParameter> parameters, final UriInfoResource uriInfo) throws DataProviderException {
Map<String, Object> values = new HashMap<String, Object>();
for (final UriParameter parameter : parameters) {
final EdmParameter edmParameter = function.getParameter(parameter.getName());
final String text = parameter.getAlias() == null ?
parameter.getText() :
uriInfo.getValueForAlias(parameter.getAlias());
if (text != null) {
if (edmParameter.getType().getKind() == EdmTypeKind.PRIMITIVE
&& !edmParameter.isCollection()) {
final EdmPrimitiveType primitiveType = (EdmPrimitiveType) edmParameter.getType();
try {
values.put(parameter.getName(),
primitiveType.valueOfString(primitiveType.fromUriLiteral(text),
edmParameter.isNullable(), edmParameter.getMaxLength(),
edmParameter.getPrecision(), edmParameter.getScale(), null,
primitiveType.getDefaultType()));
} catch (final EdmPrimitiveTypeException e) {
throw new DataProviderException("Invalid function parameter.", e);
}
} else {
throw new DataProviderException("Non-primitive and collection functionn parameters are not yet supported.",
HttpStatusCode.NOT_IMPLEMENTED);
}
}
}
return values;
}
public Property processActionPrimitive(final String name, final Map<String, Parameter> actionParameters)
@ -544,33 +582,34 @@ public class DataProvider {
final Map<String, Parameter> actionParameters) throws DataProviderException {
return ActionData.entityCollectionAction(name, actionParameters, odata, edm);
}
public void createReference(final Entity entity, final EdmNavigationProperty navigationProperty, final URI entityId,
final String rawServiceRoot) throws DataProviderException {
setLink(navigationProperty, entity, getEntityByReference(entityId.toASCIIString(), rawServiceRoot));
}
public void deleteReference(final Entity entity, final EdmNavigationProperty navigationProperty,
final String entityId, final String rawServiceRoot) throws DataProviderException {
if(navigationProperty.isCollection()) {
if (navigationProperty.isCollection()) {
final Entity targetEntity = getEntityByReference(entityId, rawServiceRoot);
final Link navigationLink = entity.getNavigationLink(navigationProperty.getName());
if(navigationLink != null && navigationLink.getInlineEntitySet() != null
if (navigationLink != null && navigationLink.getInlineEntitySet() != null
&& navigationLink.getInlineEntitySet().getEntities().contains(targetEntity)) {
// Remove partner single-valued navigation property
if(navigationProperty.getPartner() != null) {
if (navigationProperty.getPartner() != null) {
final EdmNavigationProperty edmPartnerNavigationProperty = navigationProperty.getPartner();
if(!edmPartnerNavigationProperty.isCollection() && !edmPartnerNavigationProperty.isNullable()) {
if (!edmPartnerNavigationProperty.isCollection() && !edmPartnerNavigationProperty.isNullable()) {
throw new DataProviderException("Navigation property must not be null", HttpStatusCode.BAD_REQUEST);
} else if(!edmPartnerNavigationProperty.isCollection()) {
} else if (!edmPartnerNavigationProperty.isCollection()) {
removeLink(edmPartnerNavigationProperty, targetEntity);
} else if(edmPartnerNavigationProperty.isCollection() && edmPartnerNavigationProperty.getPartner() != null) {
} else if (edmPartnerNavigationProperty.isCollection()
&& edmPartnerNavigationProperty.getPartner() != null) {
// Bidirectional referential constraint
final Link partnerNavigationLink = targetEntity.getNavigationLink(edmPartnerNavigationProperty.getName());
if(partnerNavigationLink != null && partnerNavigationLink.getInlineEntitySet() != null) {
if (partnerNavigationLink != null && partnerNavigationLink.getInlineEntitySet() != null) {
partnerNavigationLink.getInlineEntitySet().getEntities().remove(entity);
}
}
@ -582,7 +621,7 @@ public class DataProvider {
throw new DataProviderException("Entity not found", HttpStatusCode.NOT_FOUND);
}
} else {
if(navigationProperty.isNullable()) {
if (navigationProperty.isNullable()) {
removeLink(navigationProperty, entity);
} else {
throw new DataProviderException("Navigation property must not be null", HttpStatusCode.BAD_REQUEST);

View File

@ -28,21 +28,18 @@ import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.EntityCollection;
import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.data.ValueType;
import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.server.api.OData;
import org.apache.olingo.server.api.uri.UriParameter;
import org.apache.olingo.commons.api.http.HttpStatusCode;
import org.apache.olingo.server.tecsvc.data.DataProvider.DataProviderException;
public class FunctionData {
protected static EntityCollection entityCollectionFunction(final String name, final List<UriParameter> parameters,
final Map<String, EntityCollection> data) throws DataProviderException {
protected static EntityCollection entityCollectionFunction(final String name,
final Map<String, Object> parameterValues, final Map<String, EntityCollection> data)
throws DataProviderException {
if (name.equals("UFCRTCollETTwoKeyNavParam")) {
final List<Entity> esTwoKeyNav = data.get("ESTwoKeyNav").getEntities();
EntityCollection result = new EntityCollection();
final int endIndex = parameters.isEmpty() ? 0 : Short.valueOf(parameters.get(0).getText());
final int endIndex = parameterValues.isEmpty() ? 0 : getParameterInt16(parameterValues);
result.getEntities().addAll(
esTwoKeyNav.subList(0,
endIndex < 0 ? 0 : endIndex > esTwoKeyNav.size() ? esTwoKeyNav.size() : endIndex));
@ -52,11 +49,12 @@ public class FunctionData {
} else if (name.equals("UFCRTCollETMedia")) {
return data.get("ESMedia");
} else {
throw new DataProviderException("Function " + name + " is not yet implemented.");
throw new DataProviderException("Function " + name + " is not yet implemented.",
HttpStatusCode.NOT_IMPLEMENTED);
}
}
protected static Entity entityFunction(final String name, final List<UriParameter> parameters,
protected static Entity entityFunction(final String name, final Map<String, Object> parameterValues,
final Map<String, EntityCollection> data) throws DataProviderException {
final List<Entity> esTwoKeyNav = data.get("ESTwoKeyNav").getEntities();
if (name.equals("UFCRTETKeyNav")) {
@ -64,20 +62,21 @@ public class FunctionData {
} else if (name.equals("UFCRTETTwoKeyNav")) {
return esTwoKeyNav.get(0);
} else if (name.equals("UFCRTETTwoKeyNavParam")) {
final int index = parameters.isEmpty() ? 0 : Short.valueOf(parameters.get(0).getText());
final int index = parameterValues.isEmpty() ? 0 : getParameterInt16(parameterValues);
return index < 0 || index >= esTwoKeyNav.size() ? null : esTwoKeyNav.get(index);
} else if (name.equals("UFCRTETMedia")) {
final int index = parameters.isEmpty() ? 1 : Short.valueOf(parameters.get(0).getText());
final int index = parameterValues.isEmpty() ? 1 : getParameterInt16(parameterValues);
final List<Entity> esMedia = data.get("ESMedia").getEntities();
return index < 1 || index > esMedia.size() ? null : esMedia.get(index - 1);
} else {
throw new DataProviderException("Function " + name + " is not yet implemented.");
throw new DataProviderException("Function " + name + " is not yet implemented.",
HttpStatusCode.NOT_IMPLEMENTED);
}
}
@SuppressWarnings("unchecked")
protected static Property primitiveComplexFunction(final String name, final List<UriParameter> parameters,
final Map<String, EntityCollection> data, final OData oData) throws DataProviderException {
protected static Property primitiveComplexFunction(final String name, final Map<String, Object> parameterValues,
final Map<String, EntityCollection> data) throws DataProviderException {
if (name.equals("UFNRTInt16")) {
return DataCreator.createPrimitive(name, (short) 12345);
} else if (name.equals("UFCRTString")) {
@ -89,19 +88,9 @@ public class FunctionData {
DataCreator.createPrimitive("PropertyInt16", (short) 16),
DataCreator.createPrimitive("PropertyString", "UFCRTCTTwoPrim string value"));
} else if (name.equals("UFCRTCTTwoPrimParam")) {
try {
return DataCreator.createComplex(name,
DataCreator.createPrimitive("PropertyInt16", oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16)
.valueOfString(getParameterText("ParameterInt16", parameters),
null, null, null, null, null, Short.class)),
DataCreator.createPrimitive("PropertyString",
oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String)
.valueOfString(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String)
.fromUriLiteral(getParameterText("ParameterString", parameters)),
null, null, null, null, null, String.class)));
} catch (final EdmPrimitiveTypeException e) {
throw new DataProviderException("Error in function " + name + ".", e);
}
return DataCreator.createComplex(name,
DataCreator.createPrimitive("PropertyInt16", getParameterInt16(parameterValues)),
DataCreator.createPrimitive("PropertyString", getParameterString(parameterValues)));
} else if (name.equals("UFCRTCollCTTwoPrim")) {
return DataCreator.createComplexCollection(name,
Arrays.asList(DataCreator.createPrimitive("PropertyInt16", (short) 16),
@ -110,89 +99,57 @@ public class FunctionData {
DataCreator.createPrimitive("PropertyString", "Test456")),
Arrays.asList(DataCreator.createPrimitive("PropertyInt16", 18),
DataCreator.createPrimitive("PropertyString", "Test678")));
} else if(name.equals("UFCRTStringTwoParam")) {
final String parameterStringRaw = getParameterText("ParameterString", parameters);
final String parameterInt16Raw = getParameterText("ParameterInt16", parameters);
} else if (name.equals("UFCRTStringTwoParam")) {
final String parameterString = getParameterString(parameterValues);
// ParameterString is not provided
if (parameterStringRaw == null) {
return new Property(null, "value", ValueType.PRIMITIVE, null);
if (parameterString == null) {
return DataCreator.createPrimitive(name, null);
} else {
try {
final EdmPrimitiveType edmInt16 = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16);
final EdmPrimitiveType edmString = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String);
final Short parameterInt16 = edmInt16.valueOfString(parameterInt16Raw, null, null, null, null, null,
Short.class);
final String parameterString = edmString.fromUriLiteral(parameterStringRaw);
final StringBuilder builder = new StringBuilder();
// if parameterInt16 <= 0 return an empty string
for (short i = parameterInt16; i > 0; i--) {
if (builder.length() != 0) {
builder.append(',');
}
builder.append('"');
builder.append(parameterString);
builder.append('"');
final Short parameterInt16 = getParameterInt16(parameterValues);
final StringBuilder builder = new StringBuilder();
// if parameterInt16 <= 0 return an empty string
for (short i = parameterInt16; i > 0; i--) {
if (builder.length() != 0) {
builder.append(',');
}
return new Property(null, "value", ValueType.PRIMITIVE, builder.toString());
} catch (final EdmPrimitiveTypeException e) {
throw new DataProviderException("Invalid function parameter.");
builder.append('"')
.append(parameterString)
.append('"');
}
return DataCreator.createPrimitive(name, builder.toString());
}
} else if (name.equals("UFCRTCollCTTwoPrimTwoParam")) {
String parameterStringRaw = getParameterText("ParameterString", parameters);
String parameteInt16Raw = getParameterText("ParameterInt16", parameters);
EdmPrimitiveType edmInt16 = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16);
EdmPrimitiveType edmString = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String);
try {
Short parameterInt16 = edmInt16.valueOfString(parameteInt16Raw, null, null, null, null, null, Short.class);
if (parameterStringRaw == null) {
ComplexValue complexValue1 = new ComplexValue();
ComplexValue complexValue2 = new ComplexValue();
complexValue1.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 1));
complexValue1.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE,
name + " int16 value: " + parameterInt16));
complexValue2.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 2));
complexValue2.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE,
name + "string value: null"));
return new Property(null, "value", ValueType.COLLECTION_COMPLEX, Arrays.asList(new ComplexValue[] {
complexValue1, complexValue2
}));
} else {
String parameterString = edmString.fromUriLiteral(parameterStringRaw);
List<ComplexValue> complexValues = new ArrayList<ComplexValue>();
short counter = 1;
for(short i = parameterInt16; 0 < i; i--) {
ComplexValue complexValue = new ComplexValue();
complexValue.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, counter++));
complexValue.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE,
name + " string value: " + parameterString));
complexValues.add(complexValue);
}
return new Property(null, "value", ValueType.COLLECTION_COMPLEX, complexValues);
final Short parameterInt16 = getParameterInt16(parameterValues);
final String parameterString = getParameterString(parameterValues);
if (parameterString == null) {
return DataCreator.createComplexCollection(name,
Arrays.asList(DataCreator.createPrimitive("PropertyInt16", 1),
DataCreator.createPrimitive("PropertyString", name + " int16 value: " + parameterInt16)),
Arrays.asList(DataCreator.createPrimitive("PropertyInt16", 2),
DataCreator.createPrimitive("PropertyString", name + "string value: null")));
} else {
List<ComplexValue> complexValues = new ArrayList<ComplexValue>();
short counter = 1;
for (short i = parameterInt16; 0 < i; i--) {
ComplexValue complexValue = new ComplexValue();
complexValue.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, counter++));
complexValue.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE,
name + " string value: " + parameterString));
complexValues.add(complexValue);
}
} catch (EdmPrimitiveTypeException e) {
throw new DataProviderException("Invalid function parameter");
return new Property(null, name, ValueType.COLLECTION_COMPLEX, complexValues);
}
} else {
throw new DataProviderException("Function " + name + " is not yet implemented.");
throw new DataProviderException("Function " + name + " is not yet implemented.",
HttpStatusCode.NOT_IMPLEMENTED);
}
}
private static String getParameterText(final String name, final List<UriParameter> parameters) {
for (final UriParameter parameter : parameters) {
if (parameter.getName().equals(name)) {
return parameter.getText();
}
}
return null;
private static Short getParameterInt16(final Map<String, Object> parameterValues) {
return (Short) parameterValues.get("ParameterInt16");
}
private static String getParameterString(final Map<String, Object> parameterValues) {
return (String) parameterValues.get("ParameterString");
}
}

View File

@ -498,17 +498,18 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
final SelectOption select = uriInfo.getSelectOption();
// Transform the entity graph to a tree. The construction is controlled by the expand tree.
// Apply all expand system query options to the tree.So the expanded navigation properties can be modified
// for serialization,without affecting the data stored in the database.
// Apply all expand system query options to the tree.
// So the expanded navigation properties can be modified for serialization,
// without affecting the data stored in the database.
final ExpandSystemQueryOptionHandler expandHandler = new ExpandSystemQueryOptionHandler();
final EntityCollection entitySetSerialization = expandHandler.transformEntitySetGraphToTree(entitySet,
edmEntitySet,
expand);
expandHandler.applyExpandQueryOptions(entitySetSerialization, edmEntitySet, expand);
final CountOption countOption = uriInfo.getCountOption();
String id;
if(edmEntitySet == null) {
if (edmEntitySet == null) {
// Used for functions, function imports etc.
id = request.getRawODataPath();
} else {

View File

@ -223,7 +223,7 @@ public class TechnicalPrimitiveComplexProcessor extends TechnicalProcessor
final Property property = entity == null ?
getPropertyData(
dataProvider.readFunctionPrimitiveComplex(((UriResourceFunction) resourceParts.get(0)).getFunction(),
((UriResourceFunction) resourceParts.get(0)).getParameters()), path) :
((UriResourceFunction) resourceParts.get(0)).getParameters(), resource), path) :
getPropertyData(entity, path);
if (property == null && representationType != RepresentationType.COUNT) {

View File

@ -139,11 +139,11 @@ public abstract class TechnicalProcessor implements Processor {
if (uriResource.isCollection()) { // handled in readEntityCollection()
return null;
} else {
entity = dataProvider.readFunctionEntity(function, uriResource.getParameters());
entity = dataProvider.readFunctionEntity(function, uriResource.getParameters(), uriInfo);
}
} else {
entity = dataProvider.read((EdmEntityType) function.getReturnType().getType(),
dataProvider.readFunctionEntitySet(function, uriResource.getParameters()),
dataProvider.readFunctionEntityCollection(function, uriResource.getParameters(), uriInfo),
key);
}
} else {
@ -197,7 +197,8 @@ public abstract class TechnicalProcessor implements Processor {
} else {
if (resourcePaths.get(0) instanceof UriResourceFunction) {
final UriResourceFunction uriResource = (UriResourceFunction) resourcePaths.get(0);
return dataProvider.readFunctionEntitySet(uriResource.getFunction(), uriResource.getParameters());
return dataProvider.readFunctionEntityCollection(uriResource.getFunction(), uriResource.getParameters(),
uriInfo);
} else {
return dataProvider.readAll(((UriResourceEntitySet) resourcePaths.get(0)).getEntitySet());
}