[OLINGO-801] support for non-primitive function parameters Signed-off-by: Christian Amend <[email protected]>
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/3fa2b3df Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/3fa2b3df Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/3fa2b3df Branch: refs/heads/OLINGO-811_CountForExpand Commit: 3fa2b3df2ffd9dafc41af6ad6be436e55dbed6a4 Parents: 6614aea Author: Klaus Straubinger <[email protected]> Authored: Fri Nov 13 16:46:04 2015 +0100 Committer: Christian Amend <[email protected]> Committed: Tue Nov 17 09:20:57 2015 +0100 ---------------------------------------------------------------------- .../fit/tecsvc/client/FunctionImportITCase.java | 35 + .../deserializer/FixedFormatDeserializer.java | 9 + .../apache/olingo/server/api/uri/UriInfo.java | 26 +- .../olingo/server/api/uri/UriInfoEntityId.java | 2 +- .../olingo/server/api/uri/UriInfoMetadata.java | 2 +- .../olingo/server/api/uri/UriInfoResource.java | 3 +- .../uri/queryoption/SystemQueryOptionKind.java | 28 +- .../olingo/server/core/uri/antlr/UriParser.g4 | 15 +- .../olingo/server/core/debug/DebugTabUri.java | 176 ++++- .../server/core/debug/ServerCoreDebugger.java | 3 +- .../FixedFormatDeserializerImpl.java | 37 ++ .../json/ODataJsonDeserializer.java | 104 ++- .../olingo/server/core/uri/UriInfoImpl.java | 215 +++--- .../server/core/uri/UriParameterImpl.java | 5 +- .../server/core/uri/UriResourceActionImpl.java | 4 +- .../core/uri/UriResourceFunctionImpl.java | 7 +- .../olingo/server/core/uri/parser/Parser.java | 44 +- .../core/uri/parser/UriParseTreeVisitor.java | 38 +- .../uri/queryoption/AliasQueryOptionImpl.java | 2 +- .../core/uri/queryoption/ExpandOptionImpl.java | 7 +- .../core/uri/queryoption/FormatOptionImpl.java | 5 +- .../core/uri/queryoption/IdOptionImpl.java | 5 +- .../core/uri/queryoption/OrderByOptionImpl.java | 7 +- .../core/uri/queryoption/SelectOptionImpl.java | 8 +- .../uri/queryoption/SkipTokenOptionImpl.java | 5 +- .../uri/queryoption/SystemQueryOptionImpl.java | 2 +- .../server-core-exceptions-i18n.properties | 2 +- .../olingo/server/tecsvc/data/ActionData.java | 20 +- .../olingo/server/tecsvc/data/DataProvider.java | 48 +- .../olingo/server/tecsvc/data/FunctionData.java | 61 +- .../expression/ExpressionVisitorImpl.java | 63 +- .../expression/operand/TypedOperand.java | 13 +- .../expression/operation/BinaryOperator.java | 8 +- .../queryoptions/options/FilterHandler.java | 2 +- .../queryoptions/options/OrderByHandler.java | 4 +- .../tecsvc/provider/ContainerProvider.java | 45 +- .../tecsvc/provider/FunctionProvider.java | 665 +++++++++---------- .../server/tecsvc/provider/SchemaProvider.java | 61 +- ...aJsonDeserializerFunctionParametersTest.java | 121 ++++ .../serializer/json/ServiceDocumentTest.java | 2 +- .../olingo/server/core/uri/UriInfoImplTest.java | 206 +++--- .../core/uri/antlr/TestFullResourcePath.java | 11 +- 42 files changed, 1185 insertions(+), 941 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java ---------------------------------------------------------------------- diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java index d506838..66e6932 100644 --- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java +++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java @@ -331,6 +331,41 @@ public class FunctionImportITCase extends AbstractParamTecSvcITCase { complexValue.get("PropertyString").getPrimitiveValue().toValue()); } + @Test + public void allParameterKinds() { + Map<String, ClientValue> parameters = new HashMap<String, ClientValue>(); + parameters.put("ParameterEnum", getFactory().newEnumValue("Namespace1_Alias.ENString", "String1")); + parameters.put("ParameterDef", getFactory().newPrimitiveValueBuilder().build()); + parameters.put("ParameterComp", getFactory().newPrimitiveValueBuilder().setValue( + new ParameterAlias("comp")).build()); + parameters.put("ParameterETTwoPrim", getFactory().newPrimitiveValueBuilder().build()); + parameters.put("CollParameterByte", getFactory().newPrimitiveValueBuilder().setValue( + new ParameterAlias("collByte")).build()); + parameters.put("CollParameterEnum", getFactory().newPrimitiveValueBuilder().setValue( + new ParameterAlias("collEnum")).build()); + parameters.put("CollParameterDef", getFactory().newPrimitiveValueBuilder().setValue( + new ParameterAlias("collDef")).build()); + parameters.put("CollParameterComp", getFactory().newPrimitiveValueBuilder().setValue( + new ParameterAlias("collComp")).build()); + parameters.put("CollParameterETTwoPrim", getFactory().newPrimitiveValueBuilder().build()); + ODataInvokeRequest<ClientProperty> request = getClient().getInvokeRequestFactory() + .getFunctionInvokeRequest(getClient().newURIBuilder(TecSvcConst.BASE_URI) + .appendOperationCallSegment("FINRTByteNineParam") + .addParameterAlias("comp", "{\"PropertyInt16\":1}") + .addParameterAlias("collByte", "[1]") + .addParameterAlias("collEnum", "[\"String1,String1\"]") + .addParameterAlias("collDef", "[\"Test\"]") + .addParameterAlias("collComp", "[{\"PropertyInt16\":11}]") + .build(), + ClientProperty.class, + parameters); + setCookieHeader(request); + final ODataInvokeResponse<ClientProperty> response = request.execute(); + saveCookieHeader(response); + assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode()); + assertShortOrInt(6, response.getBody().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)); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/FixedFormatDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/FixedFormatDeserializer.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/FixedFormatDeserializer.java index 22dd711..0bf8e0d 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/FixedFormatDeserializer.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/deserializer/FixedFormatDeserializer.java @@ -21,6 +21,8 @@ package org.apache.olingo.server.api.deserializer; import java.io.InputStream; import java.util.List; +import org.apache.olingo.commons.api.data.Parameter; +import org.apache.olingo.commons.api.edm.EdmParameter; import org.apache.olingo.commons.api.edm.EdmProperty; import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerException; import org.apache.olingo.server.api.deserializer.batch.BatchOptions; @@ -43,6 +45,13 @@ public interface FixedFormatDeserializer { public Object primitiveValue(InputStream content, EdmProperty property) throws DeserializerException; /** + * Reads parameter data (in URI syntax) from a String. + * @param content the textual value as String + * @param parameter EDM parameter + */ + public Parameter parameter(String content, EdmParameter parameter) throws DeserializerException; + + /** * Reads batch data from an InputStream. * @param content the data as multipart input stream * @param boundary the boundary between the parts http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java index d12c524..12cfdba 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java @@ -18,18 +18,18 @@ */ package org.apache.olingo.server.api.uri; -import java.util.Collection; +import java.util.List; +import org.apache.olingo.server.api.uri.queryoption.AliasQueryOption; import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption; /** - * Object acting as general access to URI information extracted from the request URI. Depending on - * the URI info kind different interfaces are used to provide access to that information. </p> - * Use method {@link #getKind()} to obtain URI info kind information and to perform an appropriate cast. + * <p>Object acting as general access to URI information extracted from the request URI.</p> + * <p>Depending on the URI info kind different interfaces are used to provide access to that information. + * Use method {@link #getKind()} to obtain URI info kind information and to perform an appropriate cast.</p> */ -public interface UriInfo extends -UriInfoService, UriInfoAll, UriInfoBatch, UriInfoCrossjoin, -UriInfoEntityId, UriInfoMetadata, UriInfoResource { +public interface UriInfo extends UriInfoService, UriInfoMetadata, UriInfoResource, UriInfoBatch, + UriInfoAll, UriInfoCrossjoin, UriInfoEntityId { /** * See {@link UriInfoKind} for more details which kinds are allowed. @@ -80,8 +80,14 @@ UriInfoEntityId, UriInfoMetadata, UriInfoResource { UriInfoResource asUriInfoResource(); /** - * A collection of all system query options which were in the URI. - * @return a collection of all system query options used. + * Gets a list of all system query options which were in the URI. + * @return a list of all system query options used */ - Collection<SystemQueryOption> getSystemQueryOptions(); + List<SystemQueryOption> getSystemQueryOptions(); + + /** + * Gets a list of all alias definitions which were in the URI (including aliases not used anywhere). + * @return a list of all alias definitions + */ + List<AliasQueryOption> getAliases(); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoEntityId.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoEntityId.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoEntityId.java index 2579b6d..5dc5521 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoEntityId.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoEntityId.java @@ -34,7 +34,7 @@ import org.apache.olingo.server.api.uri.queryoption.SelectOption; public interface UriInfoEntityId { /** - * @return List of custom query options used in the URI + * @return List of custom query options used in the URI (without alias definitions) */ List<CustomQueryOption> getCustomQueryOptions(); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoMetadata.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoMetadata.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoMetadata.java index 7bf8d91..2b9619d 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoMetadata.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoMetadata.java @@ -27,7 +27,7 @@ import org.apache.olingo.server.api.uri.queryoption.FormatOption; public interface UriInfoMetadata { /** - * @return Object containing information of the $id option + * @return Object containing information of the $format option */ FormatOption getFormatOption(); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoResource.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoResource.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoResource.java index 3ea1058..c418bf9 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoResource.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfoResource.java @@ -40,7 +40,7 @@ import org.apache.olingo.server.api.uri.queryoption.TopOption; public interface UriInfoResource { /** - * @return List of custom query options used in the URI + * @return List of custom query options used in the URI (without alias definitions) */ List<CustomQueryOption> getCustomQueryOptions(); @@ -75,7 +75,6 @@ public interface UriInfoResource { OrderByOption getOrderByOption(); /** - * <b>CURRENTLY NOT SUPPORTED. WILL ALWAYS RETURN NULL</b> * @return Object containing information of the $search option */ SearchOption getSearchOption(); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/SystemQueryOptionKind.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/SystemQueryOptionKind.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/SystemQueryOptionKind.java index 77dfb84..735c631 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/SystemQueryOptionKind.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/SystemQueryOptionKind.java @@ -19,70 +19,70 @@ package org.apache.olingo.server.api.uri.queryoption; /** - * Defining the supported system query options + * Defines the supported system query options. */ public enum SystemQueryOptionKind { /** - * See {@link FilterOption}<br> + * @see FilterOption */ FILTER("$filter"), /** - * See {@link FormatOption}<br> + * @see FormatOption */ FORMAT("$format"), /** - * See {@link ExpandOption}<br> + * @see ExpandOption */ EXPAND("$expand"), /** - * See {@link IdOption}<br> + * @see IdOption */ ID("$id"), /** - * See {@link CountOption}<br> + * @see CountOption */ COUNT("$count"), /** - * See {@link OrderByOption}<br> + * @see OrderByOption */ ORDERBY("$orderby"), /** - * See {@link SearchOption}<br> + * @see SearchOption */ SEARCH("$search"), /** - * See {@link SelectOption}<br> + * @see SelectOption */ SELECT("$select"), /** - * See {@link SkipOption}<br> + * @see SkipOption */ SKIP("$skip"), /** - * See {@link SkipTokenOption}<br> + * @see SkipTokenOption */ SKIPTOKEN("$skiptoken"), /** - * See {@link TopOption}<br> + * @see TopOption */ TOP("$top"), /** - * See {@link LevelsExpandOption}<br> + * @see LevelsExpandOption */ - LEVELS("$level"); + LEVELS("$levels"); private String syntax; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/antlr4/org/apache/olingo/server/core/uri/antlr/UriParser.g4 ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/antlr4/org/apache/olingo/server/core/uri/antlr/UriParser.g4 b/lib/server-core/src/main/antlr4/org/apache/olingo/server/core/uri/antlr/UriParser.g4 index ff8994f..5a24b29 100644 --- a/lib/server-core/src/main/antlr4/org/apache/olingo/server/core/uri/antlr/UriParser.g4 +++ b/lib/server-core/src/main/antlr4/org/apache/olingo/server/core/uri/antlr/UriParser.g4 @@ -302,24 +302,19 @@ castExpr : CAST_WORD WSP? ( vE1=commonExpr WSP? COMMA arrayOrObject : json_array | json_object; -json_array : BEGIN_ARRAY json_value ( WSP? COMMA WSP? json_value)* END_ARRAY; +json_array : BEGIN_ARRAY (json_value (WS* COMMA WS* json_value)*)? END_ARRAY; json_value : jsonPrimitive | rootExpr | json_object | json_array; -json_object : BEGIN_OBJECT - ( - json_key_value_pair - (COMMA json_key_value_pair)* - )? +json_object : BEGIN_OBJECT + (json_key_value_pair (WS* COMMA WS* json_key_value_pair)*)? END_OBJECT; -json_key_value_pair : STRING_IN_JSON - WSP? COLON WSP? - json_value; - +json_key_value_pair : STRING_IN_JSON WS* COLON WS* json_value; + //; JSON syntax: adapted to URI restrictions from [RFC4627] jsonPrimitive : STRING_IN_JSON | number_in_json http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/DebugTabUri.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/DebugTabUri.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/DebugTabUri.java index 071bb3c..66c755a 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/DebugTabUri.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/DebugTabUri.java @@ -20,17 +20,25 @@ package org.apache.olingo.server.core.debug; import java.io.IOException; import java.io.Writer; +import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import org.apache.olingo.commons.api.ex.ODataException; import org.apache.olingo.server.api.uri.UriInfo; +import org.apache.olingo.server.api.uri.UriParameter; import org.apache.olingo.server.api.uri.UriResource; +import org.apache.olingo.server.api.uri.UriResourceEntitySet; +import org.apache.olingo.server.api.uri.UriResourceFunction; +import org.apache.olingo.server.api.uri.UriResourceNavigation; import org.apache.olingo.server.api.uri.queryoption.CountOption; import org.apache.olingo.server.api.uri.queryoption.ExpandItem; import org.apache.olingo.server.api.uri.queryoption.ExpandOption; import org.apache.olingo.server.api.uri.queryoption.FilterOption; import org.apache.olingo.server.api.uri.queryoption.OrderByItem; import org.apache.olingo.server.api.uri.queryoption.OrderByOption; +import org.apache.olingo.server.api.uri.queryoption.QueryOption; import org.apache.olingo.server.api.uri.queryoption.SelectItem; import org.apache.olingo.server.api.uri.queryoption.SelectOption; import org.apache.olingo.server.api.uri.queryoption.SkipOption; @@ -61,6 +69,11 @@ public class DebugTabUri implements DebugTab { public void appendJson(JsonGenerator gen) throws IOException { gen.writeStartObject(); + if (!uriInfo.getUriResourceParts().isEmpty()) { + gen.writeFieldName("uriResourceParts"); + appendURIResourceParts(gen, uriInfo.getUriResourceParts()); + } + if (uriInfo.getFormatOption() != null) { gen.writeStringField("format", uriInfo.getFormatOption().getFormat()); } @@ -73,11 +86,17 @@ public class DebugTabUri implements DebugTab { gen.writeStringField("skiptoken", uriInfo.getSkipTokenOption().getValue()); } - appendCommonJsonObjects(gen, uriInfo.getCountOption(), uriInfo.getSkipOption(), uriInfo.getTopOption(), uriInfo - .getFilterOption(), uriInfo.getOrderByOption(), uriInfo.getSelectOption(), uriInfo.getExpandOption()); + appendCommonJsonObjects(gen, uriInfo.getCountOption(), uriInfo.getSkipOption(), uriInfo.getTopOption(), + uriInfo.getFilterOption(), uriInfo.getOrderByOption(), uriInfo.getSelectOption(), uriInfo.getExpandOption()); - if (uriInfo.getUriResourceParts() != null) { - appendURIResourceParts(gen, uriInfo.getUriResourceParts()); + if (!uriInfo.getAliases().isEmpty()) { + gen.writeFieldName("aliases"); + DebugResponseHelperImpl.appendJsonTable(gen, getQueryOptionsMap(uriInfo.getAliases())); + } + + if (!uriInfo.getCustomQueryOptions().isEmpty()) { + gen.writeFieldName("customQueryOptions"); + DebugResponseHelperImpl.appendJsonTable(gen, getQueryOptionsMap(uriInfo.getCustomQueryOptions())); } gen.writeEndObject(); @@ -104,55 +123,76 @@ public class DebugTabUri implements DebugTab { appendJsonExpressionString(gen, filterOption.getExpression()); } - if (orderByOption != null && orderByOption.getOrders() != null) { + if (orderByOption != null && !orderByOption.getOrders().isEmpty()) { gen.writeFieldName("orderby"); gen.writeStartObject(); gen.writeStringField("nodeType", "orderCollection"); gen.writeFieldName("orders"); - gen.writeStartArray(); - for (OrderByItem item : orderByOption.getOrders()) { - gen.writeStartObject(); - gen.writeStringField("nodeType", "order"); - gen.writeStringField("sortorder", item.isDescending() ? "desc" : "asc"); - gen.writeFieldName("expression"); - appendJsonExpressionString(gen, item.getExpression()); - gen.writeEndObject(); - } - gen.writeEndArray(); + appendOrderByItemsJson(gen, orderByOption.getOrders()); gen.writeEndObject(); } if (selectOption != null && !selectOption.getSelectItems().isEmpty()) { + gen.writeFieldName("select"); appendSelectedPropertiesJson(gen, selectOption.getSelectItems()); } if (expandOption != null && !expandOption.getExpandItems().isEmpty()) { + gen.writeFieldName("expand"); appendExpandedPropertiesJson(gen, expandOption.getExpandItems()); } } private void appendURIResourceParts(JsonGenerator gen, List<UriResource> uriResourceParts) throws IOException { - gen.writeFieldName("uriResourceParts"); - gen.writeStartArray(); for (UriResource resource : uriResourceParts) { gen.writeStartObject(); gen.writeStringField("uriResourceKind", resource.getKind().toString()); gen.writeStringField("segment", resource.toString()); + if (resource instanceof UriResourceEntitySet) { + appendParameters(gen, "keys", ((UriResourceEntitySet) resource).getKeyPredicates()); + } else if (resource instanceof UriResourceNavigation) { + appendParameters(gen, "keys", ((UriResourceNavigation) resource).getKeyPredicates()); + } else if (resource instanceof UriResourceFunction) { + appendParameters(gen, "parameters", ((UriResourceFunction) resource).getParameters()); + appendParameters(gen, "keys", ((UriResourceFunction) resource).getKeyPredicates()); + } gen.writeEndObject(); } gen.writeEndArray(); } - private void appendExpandedPropertiesJson(JsonGenerator gen, List<ExpandItem> expandItems) throws IOException { - gen.writeFieldName("expand"); + private void appendParameters(JsonGenerator gen, final String name, final List<UriParameter> parameters) + throws IOException { + if (!parameters.isEmpty()) { + Map<String, String> parameterMap = new LinkedHashMap<String, String>(); + for (final UriParameter parameter : parameters) { + parameterMap.put(parameter.getName(), + parameter.getText() == null ? parameter.getAlias() : parameter.getText()); + } + gen.writeFieldName(name); + DebugResponseHelperImpl.appendJsonTable(gen, parameterMap); + } + } + private void appendOrderByItemsJson(JsonGenerator gen, final List<OrderByItem> orders) throws IOException { gen.writeStartArray(); + for (final OrderByItem item : orders) { + gen.writeStartObject(); + gen.writeStringField("nodeType", "order"); + gen.writeStringField("sortorder", item.isDescending() ? "desc" : "asc"); + gen.writeFieldName("expression"); + appendJsonExpressionString(gen, item.getExpression()); + gen.writeEndObject(); + } + gen.writeEndArray(); + } + private void appendExpandedPropertiesJson(JsonGenerator gen, List<ExpandItem> expandItems) throws IOException { + gen.writeStartArray(); for (ExpandItem item : expandItems) { appendExpandItemJson(gen, item); } - gen.writeEndArray(); } @@ -161,7 +201,7 @@ public class DebugTabUri implements DebugTab { if (item.isStar()) { gen.writeBooleanField("star", item.isStar()); - } else if (item.getResourcePath() != null && item.getResourcePath().getUriResourceParts() != null) { + } else if (item.getResourcePath() != null && !item.getResourcePath().getUriResourceParts().isEmpty()) { gen.writeFieldName("expandPath"); gen.writeStartArray(); for (UriResource resource : item.getResourcePath().getUriResourceParts()) { @@ -198,21 +238,18 @@ public class DebugTabUri implements DebugTab { } catch (final ODataException e) { expressionJsonString = "Exception in Debug Filter visitor occurred: " + e.getMessage(); } - gen.writeRawValue(expressionJsonString); } private void appendSelectedPropertiesJson(JsonGenerator gen, List<SelectItem> selectItems) throws IOException { - gen.writeFieldName("select"); - gen.writeStartArray(); for (SelectItem selectItem : selectItems) { - appendSelectItemJson(gen, selectItem); + gen.writeString(getSelectString(selectItem)); } gen.writeEndArray(); } - private void appendSelectItemJson(JsonGenerator gen, SelectItem selectItem) throws IOException { + private String getSelectString(final SelectItem selectItem) { String selectedProperty = ""; if (selectItem.isStar()) { if (selectItem.getAllOperationsInSchemaNameSpace() == null) { @@ -230,18 +267,93 @@ public class DebugTabUri implements DebugTab { first = false; } } - - gen.writeString(selectedProperty); + return selectedProperty; } @Override public void appendHtml(final Writer writer) throws IOException { - writer.append("<h2>Uri Information</h2>\n") + writer.append("<h2>Resource Path</h2>\n") .append("<ul class=\"json\">\n<li>\n"); - JsonGenerator json = new JsonFactory().createGenerator(writer) - .setPrettyPrinter(new DefaultPrettyPrinter()); - appendJson(json); + JsonGenerator json = new JsonFactory().createGenerator(writer).setPrettyPrinter(new DefaultPrettyPrinter()); + appendURIResourceParts(json, uriInfo.getUriResourceParts()); json.close(); writer.append("\n</li>\n</ul>\n"); + + if (uriInfo.getFilterOption() != null) { + writer.append("<h2>Filter Option</h2>\n") + .append("<ul class=\"json\">\n<li>\n"); + json = new JsonFactory().createGenerator(writer); + appendJsonExpressionString(json, uriInfo.getFilterOption().getExpression()); + json.close(); + writer.append("\n</li>\n</ul>\n"); + } + + if (uriInfo.getOrderByOption() != null) { + writer.append("<h2>OrderBy Option</h2>\n") + .append("<ul class=\"json\">\n<li>\n"); + json = new JsonFactory().createGenerator(writer); + appendOrderByItemsJson(json, uriInfo.getOrderByOption().getOrders()); + json.close(); + writer.append("\n</li>\n</ul>\n"); + } + + if (uriInfo.getExpandOption() != null) { + writer.append("<h2>Expand Option</h2>\n") + .append("<ul class=\"json\">\n<li>\n"); + json = new JsonFactory().createGenerator(writer); + appendExpandedPropertiesJson(json, uriInfo.getExpandOption().getExpandItems()); + json.close(); + writer.append("\n</li>\n</ul>\n"); + } + + if (uriInfo.getSelectOption() != null) { + writer.append("<h2>Selected Properties</h2>\n") + .append("<ul>\n"); + for (final SelectItem selectItem : uriInfo.getSelectOption().getSelectItems()) { + writer.append("<li>").append(getSelectString(selectItem)).append("</li>\n"); + } + writer.append("</ul>\n"); + } + + if (uriInfo.getSearchOption() != null) { + writer.append("<h2>Search Option</h2>\n") + .append("<p>not yet shown here</p>\n"); + } + + if (uriInfo.getSkipOption() != null + || uriInfo.getSkipTokenOption() != null + || uriInfo.getTopOption() != null + || uriInfo.getCountOption() != null + || uriInfo.getFormatOption() != null + || uriInfo.getIdOption() != null) { + writer.append("<h2>Unstructured System Query Options</h2>\n"); + DebugResponseHelperImpl.appendHtmlTable(writer, getQueryOptionsMap(Arrays.asList( + uriInfo.getSkipOption(), + uriInfo.getSkipTokenOption(), + uriInfo.getTopOption(), + uriInfo.getCountOption(), + uriInfo.getFormatOption(), + uriInfo.getIdOption()))); + } + + if (!uriInfo.getAliases().isEmpty()) { + writer.append("<h2>Aliases</h2>\n"); + DebugResponseHelperImpl.appendHtmlTable(writer, getQueryOptionsMap(uriInfo.getAliases())); + } + + if (!uriInfo.getCustomQueryOptions().isEmpty()) { + writer.append("<h2>Custom Query Options</h2>\n"); + DebugResponseHelperImpl.appendHtmlTable(writer, getQueryOptionsMap(uriInfo.getCustomQueryOptions())); + } + } + + private Map<String, String> getQueryOptionsMap(final List<? extends QueryOption> queryOptions) { + Map<String, String> options = new LinkedHashMap<String, String>(); + for (final QueryOption option : queryOptions) { + if (option != null) { + options.put(option.getName(), option.getText()); + } + } + return options; } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ServerCoreDebugger.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ServerCoreDebugger.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ServerCoreDebugger.java index 09ef98d..0ca965f 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ServerCoreDebugger.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ServerCoreDebugger.java @@ -122,10 +122,9 @@ public class ServerCoreDebugger { public void stopRuntimeMeasurement(final int handle) { if (isDebugMode && handle < runtimeInformation.size()) { - long stopTime = System.nanoTime(); RuntimeMeasurement runtimeMeasurement = runtimeInformation.get(handle); if (runtimeMeasurement != null) { - runtimeMeasurement.setTimeStopped(stopTime); + runtimeMeasurement.setTimeStopped(System.nanoTime()); } } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java index 7c54f1d..df6b4cc 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java @@ -25,15 +25,22 @@ import java.io.InputStreamReader; import java.io.StringWriter; import java.util.List; +import org.apache.olingo.commons.api.data.Parameter; +import org.apache.olingo.commons.api.data.ValueType; +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.EdmProperty; +import org.apache.olingo.commons.api.edm.EdmType; +import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; +import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.server.api.deserializer.DeserializerException; import org.apache.olingo.server.api.deserializer.FixedFormatDeserializer; import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerException; import org.apache.olingo.server.api.deserializer.batch.BatchOptions; import org.apache.olingo.server.api.deserializer.batch.BatchRequestPart; import org.apache.olingo.server.core.deserializer.batch.BatchParser; +import org.apache.olingo.server.core.deserializer.json.ODataJsonDeserializer; public class FixedFormatDeserializerImpl implements FixedFormatDeserializer { @@ -80,6 +87,36 @@ public class FixedFormatDeserializerImpl implements FixedFormatDeserializer { } @Override + public Parameter parameter(final String content, final EdmParameter parameter) throws DeserializerException { + final EdmType type = parameter.getType(); + final EdmTypeKind kind = type.getKind(); + if ((kind == EdmTypeKind.PRIMITIVE || kind == EdmTypeKind.DEFINITION || kind == EdmTypeKind.ENUM) + && !parameter.isCollection()) { + // The content is a primitive URI literal. + Parameter result = new Parameter(); + result.setName(parameter.getName()); + result.setType(type.getFullQualifiedName().getFullQualifiedNameAsString()); + final EdmPrimitiveType primitiveType = (EdmPrimitiveType) type; + try { + result.setValue(type.getKind() == EdmTypeKind.ENUM ? ValueType.ENUM : ValueType.PRIMITIVE, + primitiveType.valueOfString(primitiveType.fromUriLiteral(content), + parameter.isNullable(), parameter.getMaxLength(), parameter.getPrecision(), parameter.getScale(), true, + parameter.getMapping() == null ? + primitiveType.getDefaultType() : + parameter.getMapping().getMappedJavaClass())); + } catch (final EdmPrimitiveTypeException e) { + throw new DeserializerException( + "Invalid value '" + content + "' for parameter " + parameter.getName(), e, + DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, parameter.getName()); + } + return result; + } else { + // The content is a JSON array or object. + return new ODataJsonDeserializer(ContentType.JSON).parameter(content, parameter); + } + } + + @Override public List<BatchRequestPart> parseBatchRequest(final InputStream content, final String boundary, final BatchOptions options) throws BatchDeserializerException { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java index efe1531..9639b3d 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java @@ -107,21 +107,9 @@ public class ODataJsonDeserializer implements ODataDeserializer { DeserializerException.MessageKeys.VALUE_ARRAY_NOT_PRESENT); } - final List<String> toRemove = new ArrayList<String>(); - Iterator<Entry<String, JsonNode>> fieldsIterator = tree.fields(); - while (fieldsIterator.hasNext()) { - Map.Entry<String, JsonNode> field = fieldsIterator.next(); - - if (field.getKey().contains(ODATA_CONTROL_INFORMATION_PREFIX)) { - // Control Information is ignored for requests as per specification chapter "4.5 Control Information" - toRemove.add(field.getKey()); - } else if (field.getKey().contains(ODATA_ANNOTATION_MARKER)) { - throw new DeserializerException("Custom annotation with field name: " + field.getKey() + " not supported", - DeserializerException.MessageKeys.NOT_IMPLEMENTED); - } + if (tree.isObject()) { + removeAnnotations(tree); } - // remove here to avoid iterator issues. - tree.remove(toRemove); assertJsonNodeIsEmpty(tree); return entitySet; @@ -186,21 +174,9 @@ public class ODataJsonDeserializer implements ODataDeserializer { ObjectNode tree = parseJsonTree(stream); Map<String, Parameter> parameters = consumeParameters(edmAction, tree); - final List<String> toRemove = new ArrayList<String>(); - Iterator<Entry<String, JsonNode>> fieldsIterator = tree.fields(); - while (fieldsIterator.hasNext()) { - Map.Entry<String, JsonNode> field = fieldsIterator.next(); - - if (field.getKey().contains(ODATA_CONTROL_INFORMATION_PREFIX)) { - // Control Information is ignored for requests as per specification chapter "4.5 Control Information" - toRemove.add(field.getKey()); - } else if (field.getKey().contains(ODATA_ANNOTATION_MARKER)) { - throw new DeserializerException("Custom annotation with field name: " + field.getKey() + " not supported", - DeserializerException.MessageKeys.NOT_IMPLEMENTED); - } + if (tree.isObject()) { + removeAnnotations(tree); } - // remove here to avoid iterator issues. - tree.remove(toRemove); assertJsonNodeIsEmpty(tree); return DeserializerResultImpl.with().actionParameters(parameters).build(); @@ -209,7 +185,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { } } - private ObjectNode parseJsonTree(final InputStream stream) throws IOException, DeserializerException { + private ObjectNode parseJsonTree(InputStream stream) throws IOException, DeserializerException { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY, true); JsonParser parser = new JsonFactory(objectMapper).createParser(stream); @@ -251,8 +227,8 @@ public class ODataJsonDeserializer implements ODataDeserializer { return parameters; } - private Parameter createParameter(JsonNode node, String paramName, EdmParameter edmParameter) throws - DeserializerException { + private Parameter createParameter(JsonNode node, final String paramName, final EdmParameter edmParameter) + throws DeserializerException { Parameter parameter = new Parameter(); parameter.setName(paramName); if (node == null || node.isNull()) { @@ -285,6 +261,28 @@ public class ODataJsonDeserializer implements ODataDeserializer { return parameter; } + /** Reads a parameter value from a String. */ + public Parameter parameter(final String content, final EdmParameter parameter) throws DeserializerException { + try { + JsonParser parser = new JsonFactory(new ObjectMapper() + .configure(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY, true)) + .createParser(content); + JsonNode node = parser.getCodec().readTree(parser); + if (node == null) { + throw new DeserializerException("Invalid JSON syntax.", + DeserializerException.MessageKeys.JSON_SYNTAX_EXCEPTION); + } + final Parameter result = createParameter(node, parameter.getName(), parameter); + if (node.isObject()) { + removeAnnotations((ObjectNode) node); + assertJsonNodeIsEmpty(node); + } + return result; + } catch (final IOException e) { + throw wrapParseException(e); + } + } + /** * Consumes all remaining fields of Json ObjectNode and tries to map found values * to according Entity fields and omits OData fields to be ignored (e.g., control information). @@ -305,16 +303,12 @@ public class ODataJsonDeserializer implements ODataDeserializer { Link bindingLink = consumeBindingLink(field.getKey(), field.getValue(), edmEntityType); entity.getNavigationBindings().add(bindingLink); toRemove.add(field.getKey()); - } else if (field.getKey().contains(ODATA_CONTROL_INFORMATION_PREFIX)) { - // Control Information is ignored for requests as per specification chapter "4.5 Control Information" - toRemove.add(field.getKey()); - } else if (field.getKey().contains(ODATA_ANNOTATION_MARKER)) { - throw new DeserializerException("Custom annotation with field name: " + field.getKey() + " not supported", - DeserializerException.MessageKeys.NOT_IMPLEMENTED); } } // remove here to avoid iterator issues. node.remove(toRemove); + + removeAnnotations(node); } private void consumeEntityProperties(final EdmEntityType edmEntityType, final ObjectNode node, @@ -492,22 +486,8 @@ public class ODataJsonDeserializer implements ODataDeserializer { // read and add all complex properties ComplexValue value = readComplexValue(name, type, isNullable, jsonNode); - final List<String> toRemove = new ArrayList<String>(); - Iterator<Entry<String, JsonNode>> fieldsIterator = jsonNode.fields(); - while (fieldsIterator.hasNext()) { - Entry<String, JsonNode> field = fieldsIterator.next(); - - if (field.getKey().contains(ODATA_CONTROL_INFORMATION_PREFIX)) { - // Control Information is ignored for requests as per specification chapter "4.5 Control Information" - toRemove.add(field.getKey()); - } else if (field.getKey().contains(ODATA_ANNOTATION_MARKER)) { - throw new DeserializerException("Custom annotation with field name: " + field.getKey() + " not supported", - DeserializerException.MessageKeys.NOT_IMPLEMENTED); - } - } - // remove here to avoid iterator issues. - if (!jsonNode.isNull()) { - ((ObjectNode) jsonNode).remove(toRemove); + if (jsonNode.isObject()) { + removeAnnotations((ObjectNode) jsonNode); } // Afterwards the node must be empty assertJsonNodeIsEmpty(jsonNode); @@ -653,6 +633,24 @@ public class ODataJsonDeserializer implements ODataDeserializer { } } + private void removeAnnotations(ObjectNode tree) throws DeserializerException { + List<String> toRemove = new ArrayList<String>(); + Iterator<Entry<String, JsonNode>> fieldsIterator = tree.fields(); + while (fieldsIterator.hasNext()) { + Map.Entry<String, JsonNode> field = fieldsIterator.next(); + + if (field.getKey().contains(ODATA_CONTROL_INFORMATION_PREFIX)) { + // Control Information is ignored for requests as per specification chapter "4.5 Control Information" + toRemove.add(field.getKey()); + } else if (field.getKey().contains(ODATA_ANNOTATION_MARKER)) { + throw new DeserializerException("Custom annotation with field name: " + field.getKey() + " not supported", + DeserializerException.MessageKeys.NOT_IMPLEMENTED); + } + } + // remove here to avoid iterator issues. + tree.remove(toRemove); + } + /** * Validates that node is empty (<code>node.size() == 0</code>). * @param node node to be checked http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java index 0aff5b6..bc396f7 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java @@ -19,7 +19,6 @@ package org.apache.olingo.server.core.uri; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -36,8 +35,8 @@ import org.apache.olingo.server.api.uri.UriInfoKind; import org.apache.olingo.server.api.uri.UriInfoMetadata; import org.apache.olingo.server.api.uri.UriInfoResource; import org.apache.olingo.server.api.uri.UriInfoService; -import org.apache.olingo.server.api.uri.UriParameter; import org.apache.olingo.server.api.uri.UriResource; +import org.apache.olingo.server.api.uri.queryoption.AliasQueryOption; import org.apache.olingo.server.api.uri.queryoption.CountOption; import org.apache.olingo.server.api.uri.queryoption.CustomQueryOption; import org.apache.olingo.server.api.uri.queryoption.ExpandOption; @@ -45,6 +44,7 @@ import org.apache.olingo.server.api.uri.queryoption.FilterOption; import org.apache.olingo.server.api.uri.queryoption.FormatOption; import org.apache.olingo.server.api.uri.queryoption.IdOption; import org.apache.olingo.server.api.uri.queryoption.OrderByOption; +import org.apache.olingo.server.api.uri.queryoption.QueryOption; import org.apache.olingo.server.api.uri.queryoption.SearchOption; import org.apache.olingo.server.api.uri.queryoption.SelectOption; import org.apache.olingo.server.api.uri.queryoption.SkipOption; @@ -52,9 +52,6 @@ import org.apache.olingo.server.api.uri.queryoption.SkipTokenOption; import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption; import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind; import org.apache.olingo.server.api.uri.queryoption.TopOption; -import org.apache.olingo.server.core.uri.queryoption.CustomQueryOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.QueryOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.SystemQueryOptionImpl; public class UriInfoImpl implements UriInfo { @@ -63,16 +60,25 @@ public class UriInfoImpl implements UriInfo { private List<String> entitySetNames = new ArrayList<String>(); // for $entity private EdmEntityType entityTypeCast; // for $entity - private List<CustomQueryOptionImpl> customQueryOptions = new ArrayList<CustomQueryOptionImpl>(); - private Map<String, UriParameter> aliasValues = new HashMap<String, UriParameter>(); - + private UriResource lastResourcePart; + private List<UriResource> pathParts = new ArrayList<UriResource>(); + private Map<SystemQueryOptionKind, SystemQueryOption> systemQueryOptions = new HashMap<SystemQueryOptionKind, SystemQueryOption>(); + private Map<String, AliasQueryOption> aliases = new HashMap<String, AliasQueryOption>(); + private List<CustomQueryOption> customQueryOptions = new ArrayList<CustomQueryOption>(); private String fragment; - private UriResource lastResourcePart; - private List<UriResource> pathParts = new ArrayList<UriResource>(); + public UriInfoImpl setKind(final UriInfoKind kind) { + this.kind = kind; + return this; + } + + @Override + public UriInfoKind getKind() { + return kind; + } @Override public UriInfoAll asUriInfoAll() { @@ -95,6 +101,11 @@ public class UriInfoImpl implements UriInfo { } @Override + public UriInfoService asUriInfoService() { + return this; + } + + @Override public UriInfoMetadata asUriInfoMetadata() { return this; } @@ -104,60 +115,90 @@ public class UriInfoImpl implements UriInfo { return this; } + public UriInfoImpl addEntitySetName(final String entitySet) { + entitySetNames.add(entitySet); + return this; + } + @Override public List<String> getEntitySetNames() { return Collections.unmodifiableList(entitySetNames); } - public void addEntitySetName(final String entitySet) { - entitySetNames.add(entitySet); + public UriInfoImpl setEntityTypeCast(final EdmEntityType type) { + entityTypeCast = type; + return this; } @Override - public List<UriResource> getUriResourceParts() { - List<UriResource> returnList = new ArrayList<UriResource>(); - for (UriResource item : pathParts) { - returnList.add(item); - } - return Collections.unmodifiableList(returnList); + public EdmEntityType getEntityTypeCast() { + return entityTypeCast; } - public UriInfoImpl addResourcePart(final UriResourceImpl uriPathInfo) { + public UriInfoImpl addResourcePart(final UriResource uriPathInfo) { pathParts.add(uriPathInfo); lastResourcePart = uriPathInfo; return this; } - @Override - public List<CustomQueryOption> getCustomQueryOptions() { - List<CustomQueryOption> retList = new ArrayList<CustomQueryOption>(); - for (CustomQueryOptionImpl item : customQueryOptions) { - retList.add(item); - } - return retList; + public UriInfoImpl removeResourcePart(final int index) { + pathParts.remove(index); + return this; } - @Override - public String getValueForAlias(final String alias) { - final UriParameter parameter = aliasValues.get(alias); - return parameter == null ? null : parameter.getText(); + public UriResource getLastResourcePart() { + return lastResourcePart; } - public UriParameter getAlias(final String key) { - return aliasValues.get(key); - } - - public void addAlias(final String key, UriParameter parameter) { - aliasValues.put(key, parameter); - } - @Override - public EdmEntityType getEntityTypeCast() { - return entityTypeCast; + public List<UriResource> getUriResourceParts() { + return Collections.unmodifiableList(pathParts); } - public UriInfoImpl setEntityTypeCast(final EdmEntityType type) { - entityTypeCast = type; + public UriInfoImpl setQueryOptions(final List<QueryOption> list) { + for (final QueryOption item : list) { + if (item instanceof SystemQueryOption) { + setSystemQueryOption((SystemQueryOption) item); + } else if (item instanceof AliasQueryOption) { + addAlias((AliasQueryOption) item); + } else if (item instanceof CustomQueryOption) { + addCustomQueryOption((CustomQueryOption) item); + } + } + return this; + } + + /** + * Adds system query option. + * @param systemOption the option to be added + * @return this object for method chaining + * @throws ODataRuntimeException if an unsupported option is provided + * or an option of this kind has been added before + */ + public UriInfoImpl setSystemQueryOption(final SystemQueryOption systemOption) { + final SystemQueryOptionKind kind = systemOption.getKind(); + if (systemQueryOptions.containsKey(kind)) { + throw new ODataRuntimeException("Double System Query Option: " + systemOption.getName()); + } + + switch (kind) { + case EXPAND: + case FILTER: + case FORMAT: + case ID: + case COUNT: + case ORDERBY: + case SEARCH: + case SELECT: + case SKIP: + case SKIPTOKEN: + case TOP: + case LEVELS: + systemQueryOptions.put(kind, systemOption); + break; + default: + throw new ODataRuntimeException("Unsupported System Query Option: " + systemOption.getName()); + } return this; } @@ -187,27 +228,12 @@ public class UriInfoImpl implements UriInfo { } @Override - public UriInfoKind getKind() { - return kind; - } - - public UriInfoImpl setKind(final UriInfoKind kind) { - this.kind = kind; - return this; - } - - public UriResource getLastResourcePart() { - return lastResourcePart; - } - - @Override public OrderByOption getOrderByOption() { return (OrderByOption) systemQueryOptions.get(SystemQueryOptionKind.ORDERBY); } @Override public SearchOption getSearchOption() { - return (SearchOption) systemQueryOptions.get(SystemQueryOptionKind.SEARCH); } @@ -231,64 +257,39 @@ public class UriInfoImpl implements UriInfo { return (TopOption) systemQueryOptions.get(SystemQueryOptionKind.TOP); } - public UriInfoImpl setQueryOptions(final List<QueryOptionImpl> list) { + @Override + public List<SystemQueryOption> getSystemQueryOptions() { + return Collections.unmodifiableList(new ArrayList<SystemQueryOption>(systemQueryOptions.values())); + } - for (QueryOptionImpl item : list) { - if (item instanceof SystemQueryOptionImpl) { - setSystemQueryOption((SystemQueryOptionImpl) item); - } else if (item instanceof CustomQueryOptionImpl) { - addCustomQueryOption((CustomQueryOptionImpl) item); - } - } + public UriInfoImpl addAlias(final AliasQueryOption alias) { + aliases.put(alias.getName(), alias); return this; } - public void addCustomQueryOption(final CustomQueryOptionImpl item) { - customQueryOptions.add(item); + @Override + public String getValueForAlias(final String alias) { + final AliasQueryOption aliasQueryOption = getAlias(alias); + return aliasQueryOption == null ? null : aliasQueryOption.getText(); } - /** - * Adds system query option. - * @param systemOption the option to be added - * @return this object for method chaining - * @throws ODataRuntimeException if an unsupported option is provided - * or an option of this kind has been added before - */ - public UriInfoImpl setSystemQueryOption(final SystemQueryOption systemOption) { - final SystemQueryOptionKind kind = systemOption.getKind(); - if (systemQueryOptions.containsKey(kind)) { - throw new ODataRuntimeException("Double System Query Option: " + systemOption.getName()); - } - - switch (kind) { - case EXPAND: - case FILTER: - case FORMAT: - case ID: - case COUNT: - case ORDERBY: - case SEARCH: - case SELECT: - case SKIP: - case SKIPTOKEN: - case TOP: - case LEVELS: - systemQueryOptions.put(kind, systemOption); - break; - default: - throw new ODataRuntimeException("Unsupported System Query Option: " + systemOption.getName()); - } - return this; + public AliasQueryOption getAlias(final String key) { + return aliases.get(key); } @Override - public UriInfoService asUriInfoService() { + public List<AliasQueryOption> getAliases() { + return Collections.unmodifiableList(new ArrayList<AliasQueryOption>(aliases.values())); + } + + public UriInfoImpl addCustomQueryOption(final CustomQueryOption item) { + customQueryOptions.add(item); return this; } @Override - public String getFragment() { - return fragment; + public List<CustomQueryOption> getCustomQueryOptions() { + return Collections.unmodifiableList(customQueryOptions); } public UriInfoImpl setFragment(final String fragment) { @@ -296,12 +297,8 @@ public class UriInfoImpl implements UriInfo { return this; } - public void removeResourcePart(final int index) { - pathParts.remove(index); - } - @Override - public Collection<SystemQueryOption> getSystemQueryOptions() { - return Collections.unmodifiableCollection(systemQueryOptions.values()); + public String getFragment() { + return fragment; } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriParameterImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriParameterImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriParameterImpl.java index ddbcd57..b650cc5 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriParameterImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriParameterImpl.java @@ -20,7 +20,6 @@ package org.apache.olingo.server.core.uri; import org.apache.olingo.server.api.uri.UriParameter; import org.apache.olingo.server.api.uri.queryoption.expression.Expression; -import org.apache.olingo.server.core.uri.queryoption.expression.ExpressionImpl; public class UriParameterImpl implements UriParameter { private String name; @@ -64,7 +63,7 @@ public class UriParameterImpl implements UriParameter { return expression; } - public UriParameterImpl setExpression(final ExpressionImpl expression) { + public UriParameterImpl setExpression(final Expression expression) { this.expression = expression; return this; } @@ -74,7 +73,7 @@ public class UriParameterImpl implements UriParameter { return referencedProperty; } - public UriParameterImpl setRefencedProperty(final String referencedProperty) { + public UriParameterImpl setReferencedProperty(final String referencedProperty) { this.referencedProperty = referencedProperty; return this; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java index 008d693..4126110 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceActionImpl.java @@ -76,12 +76,12 @@ public class UriResourceActionImpl extends UriResourceImpl implements UriResourc } @Override - public String getSegmentValue(final boolean includeFilters){ + public String getSegmentValue(final boolean includeFilters) { return actionImport == null ? (action == null ? "" : action.getName()) : actionImport.getName(); } @Override - public String getSegmentValue(){ + public String getSegmentValue() { return getSegmentValue(false); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceFunctionImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceFunctionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceFunctionImpl.java index 4cf1536..a47a6ab 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceFunctionImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceFunctionImpl.java @@ -18,7 +18,6 @@ */ package org.apache.olingo.server.core.uri; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -47,7 +46,7 @@ public class UriResourceFunctionImpl extends UriResourceWithKeysImpl implements public List<UriParameter> getParameters() { return parameters == null ? Collections.<UriParameter> emptyList() : - new ArrayList<UriParameter>(parameters); + Collections.unmodifiableList(parameters); } public UriResourceFunctionImpl setParameters(final List<UriParameter> parameters) { @@ -71,9 +70,9 @@ public class UriResourceFunctionImpl extends UriResourceWithKeysImpl implements return functionImport; } - public UriResourceFunctionImpl setFunctionImport(final EdmFunctionImport edmFI, + public UriResourceFunctionImpl setFunctionImport(final EdmFunctionImport edmFunctionImport, final List<UriParameter> parameters) { - functionImport = edmFI; + functionImport = edmFunctionImport; setParameters(parameters); return this; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java index 8732341..c5857c7 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/Parser.java @@ -39,10 +39,13 @@ import org.apache.olingo.server.api.uri.UriResourceCount; import org.apache.olingo.server.api.uri.UriResourcePartTyped; import org.apache.olingo.server.api.uri.UriResourceRef; import org.apache.olingo.server.api.uri.UriResourceValue; +import org.apache.olingo.server.api.uri.queryoption.AliasQueryOption; +import org.apache.olingo.server.api.uri.queryoption.CustomQueryOption; +import org.apache.olingo.server.api.uri.queryoption.FilterOption; import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption; import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind; +import org.apache.olingo.server.api.uri.queryoption.expression.Expression; import org.apache.olingo.server.core.uri.UriInfoImpl; -import org.apache.olingo.server.core.uri.UriParameterImpl; import org.apache.olingo.server.core.uri.antlr.UriLexer; import org.apache.olingo.server.core.uri.antlr.UriParserParser; import org.apache.olingo.server.core.uri.antlr.UriParserParser.AllEOFContext; @@ -55,6 +58,7 @@ import org.apache.olingo.server.core.uri.antlr.UriParserParser.MetadataEOFContex import org.apache.olingo.server.core.uri.antlr.UriParserParser.OrderByEOFContext; import org.apache.olingo.server.core.uri.antlr.UriParserParser.PathSegmentEOFContext; import org.apache.olingo.server.core.uri.antlr.UriParserParser.SelectEOFContext; +import org.apache.olingo.server.core.uri.queryoption.AliasQueryOptionImpl; import org.apache.olingo.server.core.uri.queryoption.CountOptionImpl; import org.apache.olingo.server.core.uri.queryoption.CustomQueryOptionImpl; import org.apache.olingo.server.core.uri.queryoption.ExpandOptionImpl; @@ -66,7 +70,6 @@ import org.apache.olingo.server.core.uri.queryoption.SelectOptionImpl; import org.apache.olingo.server.core.uri.queryoption.SkipOptionImpl; import org.apache.olingo.server.core.uri.queryoption.SkipTokenOptionImpl; import org.apache.olingo.server.core.uri.queryoption.TopOptionImpl; -import org.apache.olingo.server.core.uri.queryoption.expression.ExpressionImpl; public class Parser { private static final String ATOM = "atom"; @@ -274,30 +277,25 @@ public class Parser { throw new UriParserSyntaxException("Double system query option!", e, UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION, option.name); } - } else { - if (option.name.startsWith(AT)) { + } else if (option.name.startsWith(AT)) { + if (context.contextUriInfo.getAlias(option.name) == null) { final FilterExpressionEOFContext filterExpCtx = (FilterExpressionEOFContext) parseRule(option.value, ParserEntryRules.FilterExpression); - final ExpressionImpl expression = (ExpressionImpl)((FilterOptionImpl) uriParseTreeVisitor - .visitFilterExpressionEOF(filterExpCtx)).getExpression(); - - final UriParameterImpl parameter = new UriParameterImpl(); - parameter.setAlias(option.name); - parameter.setExpression(expression); - parameter.setText(NULL.equals(option.value) ? null : option.value); - - if(context.contextUriInfo.getAlias(option.name) == null) { - context.contextUriInfo.addAlias(option.name, parameter); - } else { - throw new UriParserSyntaxException("Alias already specified! Name: " + option.name, - UriParserSyntaxException.MessageKeys.DUPLICATED_ALIAS, option.name); - } + final Expression expression = ((FilterOption) uriParseTreeVisitor.visitFilterExpressionEOF(filterExpCtx)) + .getExpression(); + context.contextUriInfo.addAlias((AliasQueryOption) new AliasQueryOptionImpl() + .setAliasValue(expression) + .setName(option.name) + .setText(NULL.equals(option.value) ? null : option.value)); + } else { + throw new UriParserSyntaxException("Alias already specified! Name: " + option.name, + UriParserSyntaxException.MessageKeys.DUPLICATED_ALIAS, option.name); } - - final CustomQueryOptionImpl customOption = new CustomQueryOptionImpl(); - customOption.setName(option.name); - customOption.setText(option.value); - context.contextUriInfo.addCustomQueryOption(customOption); + } else { + context.contextUriInfo.addCustomQueryOption((CustomQueryOption) + new CustomQueryOptionImpl() + .setName(option.name) + .setText(option.value)); } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java index c155355..1e33a19 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java @@ -1473,11 +1473,10 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> { @Override public Object visitInlinecount(final InlinecountContext ctx) { - CountOptionImpl inlineCount = new CountOptionImpl(); - - String text = ctx.children.get(2).getText(); - - return inlineCount.setValue(text.toLowerCase().equals("true") ? true : false).setText(text); + final String text = ctx.children.get(2).getText(); + return new CountOptionImpl() + .setValue(text.equalsIgnoreCase("true") ? true : false) + .setText(text); } @Override @@ -1700,7 +1699,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> { for (String item : lastKeyPredicates) { String property = partner.getReferencingPropertyName(item); if (property != null) { - list.add(new UriParameterImpl().setName(item).setRefencedProperty(property)); + list.add(new UriParameterImpl().setName(item).setReferencedProperty(property)); } else { if (missedKey == null) { missedKey = item; @@ -1803,7 +1802,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> { String property = partner.getReferencingPropertyName(key); if (property != null) { // store the key name as referenced property - list.add(0, new UriParameterImpl().setName(key).setRefencedProperty(property)); + list.add(0, new UriParameterImpl().setName(key).setReferencedProperty(property)); } } } @@ -2408,20 +2407,16 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> { @Override public Object visitSkip(final SkipContext ctx) { - SkipOptionImpl skiptoken = new SkipOptionImpl(); - - String text = ctx.children.get(2).getText(); - - return skiptoken.setValue(Integer.parseInt(text)).setText(text); + final String text = ctx.children.get(2).getText(); + return new SkipOptionImpl() + .setValue(Integer.parseInt(text)) + .setText(text); } @Override public Object visitSkiptoken(final SkiptokenContext ctx) { - SkipTokenOptionImpl skiptoken = new SkipTokenOptionImpl(); - - String text = ctx.children.get(2).getText(); - - return skiptoken.setValue(text).setText(text); + final String text = ctx.children.get(2).getText(); + return new SkipTokenOptionImpl().setValue(text).setText(text); } @Override @@ -2456,11 +2451,10 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> { @Override public Object visitTop(final TopContext ctx) { - TopOptionImpl top = new TopOptionImpl(); - - String text = ctx.children.get(2).getText(); - - return top.setValue(Integer.parseInt(text)).setText(text); + final String text = ctx.children.get(2).getText(); + return new TopOptionImpl() + .setValue(Integer.parseInt(text)) + .setText(text); } @Override http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/AliasQueryOptionImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/AliasQueryOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/AliasQueryOptionImpl.java index a4df652..3a4fdf1 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/AliasQueryOptionImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/AliasQueryOptionImpl.java @@ -30,7 +30,7 @@ public class AliasQueryOptionImpl extends QueryOptionImpl implements AliasQueryO return aliasValue; } - public AliasQueryOption setAliasValue(final Expression aliasValue) { + public AliasQueryOptionImpl setAliasValue(final Expression aliasValue) { this.aliasValue = aliasValue; return this; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandOptionImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandOptionImpl.java index 1e1542e..bb4986d 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandOptionImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/ExpandOptionImpl.java @@ -19,6 +19,7 @@ package org.apache.olingo.server.core.uri.queryoption; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.apache.olingo.server.api.uri.queryoption.ExpandItem; @@ -39,11 +40,7 @@ public class ExpandOptionImpl extends SystemQueryOptionImpl implements ExpandOpt @Override public List<ExpandItem> getExpandItems() { - List<ExpandItem> retList = new ArrayList<ExpandItem>(); - for (ExpandItem item : expandItems) { - retList.add(item); - } - return retList; + return Collections.unmodifiableList(expandItems); } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/FormatOptionImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/FormatOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/FormatOptionImpl.java index a0baad7..607afbb 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/FormatOptionImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/FormatOptionImpl.java @@ -22,20 +22,19 @@ import org.apache.olingo.server.api.uri.queryoption.FormatOption; import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind; public class FormatOptionImpl extends SystemQueryOptionImpl implements FormatOption { - private String value; public FormatOptionImpl() { setKind(SystemQueryOptionKind.FORMAT); } public FormatOptionImpl setFormat(final String value) { - this.value = value; + setText(value); return this; } @Override public String getFormat() { - return value; + return getText(); } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/IdOptionImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/IdOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/IdOptionImpl.java index f7df825..309b30a 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/IdOptionImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/IdOptionImpl.java @@ -22,19 +22,18 @@ import org.apache.olingo.server.api.uri.queryoption.IdOption; import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind; public class IdOptionImpl extends SystemQueryOptionImpl implements IdOption { - private String value; public IdOptionImpl() { setKind(SystemQueryOptionKind.ID); } public IdOptionImpl setValue(final String value) { - this.value = value; + setText(value); return this; } @Override public String getValue() { - return value; + return getText(); } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByOptionImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByOptionImpl.java index 53f7225..5ff50dc 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByOptionImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByOptionImpl.java @@ -19,6 +19,7 @@ package org.apache.olingo.server.core.uri.queryoption; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.apache.olingo.server.api.uri.queryoption.OrderByItem; @@ -35,11 +36,7 @@ public class OrderByOptionImpl extends SystemQueryOptionImpl implements OrderByO @Override public List<OrderByItem> getOrders() { - List<OrderByItem> retList = new ArrayList<OrderByItem>(); - for (OrderByItem item : orders) { - retList.add(item); - } - return retList; + return Collections.unmodifiableList(orders); } public OrderByOptionImpl addOrder(final OrderByItem order) { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SelectOptionImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SelectOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SelectOptionImpl.java index a9caa47..d9147e5 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SelectOptionImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SelectOptionImpl.java @@ -18,7 +18,7 @@ */ package org.apache.olingo.server.core.uri.queryoption; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.apache.olingo.server.api.uri.queryoption.SelectItem; @@ -40,11 +40,7 @@ public class SelectOptionImpl extends SystemQueryOptionImpl implements SelectOpt @Override public List<SelectItem> getSelectItems() { - List<SelectItem> retList = new ArrayList<SelectItem>(); - for (SelectItem item : selectItems) { - retList.add(item); - } - return retList; + return selectItems == null ? Collections.<SelectItem> emptyList() : Collections.unmodifiableList(selectItems); } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SkipTokenOptionImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SkipTokenOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SkipTokenOptionImpl.java index f65115c..d440781 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SkipTokenOptionImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SkipTokenOptionImpl.java @@ -22,7 +22,6 @@ import org.apache.olingo.server.api.uri.queryoption.SkipTokenOption; import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind; public class SkipTokenOptionImpl extends SystemQueryOptionImpl implements SkipTokenOption { - private String skipTokenValue; public SkipTokenOptionImpl() { setKind(SystemQueryOptionKind.SKIPTOKEN); @@ -30,11 +29,11 @@ public class SkipTokenOptionImpl extends SystemQueryOptionImpl implements SkipTo @Override public String getValue() { - return skipTokenValue; + return getText(); } public SkipTokenOptionImpl setValue(final String skipTokenValue) { - this.skipTokenValue = skipTokenValue; + setText(skipTokenValue); return this; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SystemQueryOptionImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SystemQueryOptionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SystemQueryOptionImpl.java index 8ead93e..ac27a59 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SystemQueryOptionImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/SystemQueryOptionImpl.java @@ -30,7 +30,7 @@ public abstract class SystemQueryOptionImpl extends QueryOptionImpl implements S return kind; } - void setKind(final SystemQueryOptionKind kind) { + protected void setKind(final SystemQueryOptionKind kind) { this.kind = kind; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties index 046edfd..28c6dd7 100644 --- a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties +++ b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties @@ -118,7 +118,7 @@ DeserializerException.JSON_SYNTAX_EXCEPTION=The syntax of the JSON document is n DeserializerException.INVALID_NULL_PROPERTY=The property '%1$s' must not be null. DeserializerException.UNKNOWN_CONTENT='%1$s' can not be mapped as a property or an annotation. DeserializerException.INVALID_VALUE_FOR_PROPERTY=Invalid value for property '%1$s'. -DeserializerException.INVALID_TYPE_FOR_PROPERTY=Invalid JSON type for property '%1$s'. +DeserializerException.INVALID_JSON_TYPE_FOR_PROPERTY=Invalid JSON type for property '%1$s'. DeserializerException.VALUE_ARRAY_NOT_PRESENT=Cannot find the value array. A collection needs at least an empty array. DeserializerException.VALUE_TAG_MUST_BE_AN_ARRAY=Invalid JSON type for the value tag. Must be an Array. DeserializerException.INVALID_ENTITY=Invalid JSON type for an entity. Must be a JSON object. http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/ActionData.java ---------------------------------------------------------------------- diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/ActionData.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/ActionData.java index bc90090..4fae878 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/ActionData.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/ActionData.java @@ -53,19 +53,7 @@ public class ActionData { if ("UARTString".equals(name)) { return DataCreator.createPrimitive(null, "UARTString string value"); } else if ("UARTByteNineParam".equals(name)) { - short count = 0; // counts non-empty parameters - for (final Parameter parameter : parameters.values()) { - if (!(parameter.isNull() - || !parameter.isCollection() - && (parameter.isComplex() && parameter.asComplex().getValue().isEmpty() - || parameter.isEntity() && ((Entity) parameter.getValue()).getProperties().isEmpty()) - || parameter.isCollection() - && (parameter.isEntity() && ((EntityCollection) parameter.getValue()).getEntities().isEmpty() - || parameter.asCollection().isEmpty()))) { - count++; - } - } - return DataCreator.createPrimitive(null, count); + return FunctionData.primitiveComplexFunction("UFNRTByteNineParam", parameters, null); } throw new DataProviderException("Action " + name + " is not yet implemented.", HttpStatusCode.NOT_IMPLEMENTED); @@ -85,7 +73,7 @@ public class ActionData { name + " int16 value: " + param16String, name + " duration value: " + paramDurationString)); } catch (EdmPrimitiveTypeException e) { - throw new DataProviderException("EdmPrimitiveTypeException", e); + throw new DataProviderException("EdmPrimitiveTypeException", HttpStatusCode.BAD_REQUEST, e); } } short loopCount = (Short) paramInt16.asPrimitive(); @@ -98,7 +86,7 @@ public class ActionData { String value = primDuration.valueToString(duration, false, null, null, null, null); collectionValues.add(name + " duration value: " + value); } catch (EdmPrimitiveTypeException e) { - throw new DataProviderException("EdmPrimitiveTypeException", e); + throw new DataProviderException("EdmPrimitiveTypeException", HttpStatusCode.BAD_REQUEST, e); } duration = duration.add(addValue); } @@ -279,7 +267,7 @@ public class ActionData { entity.setId(URI.create(oData.createUriHelper().buildCanonicalURL( edm.getEntityContainer().getEntitySet(entitySetName), entity))); } catch (final SerializerException e) { - throw new DataProviderException("Unable to set entity ID!", e); + throw new DataProviderException("Unable to set entity ID!", HttpStatusCode.INTERNAL_SERVER_ERROR, e); } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3fa2b3df/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java ---------------------------------------------------------------------- diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java index d91f923..20cbf94 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java @@ -119,7 +119,7 @@ public class DataProvider { } return null; } catch (final EdmPrimitiveTypeException e) { - throw new DataProviderException("Wrong key!", e); + throw new DataProviderException("Wrong key!", HttpStatusCode.BAD_REQUEST, e); } } @@ -165,7 +165,7 @@ public class DataProvider { try { newEntity.setId(URI.create(odata.createUriHelper().buildCanonicalURL(edmEntitySet, newEntity))); } catch (final SerializerException e) { - throw new DataProviderException("Unable to set entity ID!", e); + throw new DataProviderException("Unable to set entity ID!", HttpStatusCode.INTERNAL_SERVER_ERROR, e); } entities.add(newEntity); @@ -518,48 +518,38 @@ public class DataProvider { public EntityCollection readFunctionEntityCollection(final EdmFunction function, final List<UriParameter> parameters, final UriInfoResource uriInfo) throws DataProviderException { return FunctionData.entityCollectionFunction(function.getName(), - getFunctionParameterValues(function, parameters, uriInfo), + getFunctionParameters(function, parameters, uriInfo), 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), + getFunctionParameters(function, parameters, uriInfo), data); } public Property readFunctionPrimitiveComplex(final EdmFunction function, final List<UriParameter> parameters, final UriInfoResource uriInfo) throws DataProviderException { return FunctionData.primitiveComplexFunction(function.getName(), - getFunctionParameterValues(function, parameters, uriInfo), + getFunctionParameters(function, parameters, uriInfo), data); } - private Map<String, Object> getFunctionParameterValues(final EdmFunction function, + private Map<String, Parameter> getFunctionParameters(final EdmFunction function, final List<UriParameter> parameters, final UriInfoResource uriInfo) throws DataProviderException { - Map<String, Object> values = new HashMap<String, Object>(); + Map<String, Parameter> values = new HashMap<String, Parameter>(); 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); + try { + values.put(parameter.getName(), + odata.createFixedFormatDeserializer().parameter(text, edmParameter)); + } catch (final DeserializerException e) { + throw new DataProviderException("Invalid function parameter.", HttpStatusCode.BAD_REQUEST, e); } } } @@ -654,23 +644,19 @@ public class DataProvider { throw new DataProviderException("Entity not found", HttpStatusCode.NOT_FOUND); } } catch (DeserializerException e) { - throw new DataProviderException("Invalid entity-id", HttpStatusCode.BAD_REQUEST); + throw new DataProviderException("Invalid entity-id", HttpStatusCode.BAD_REQUEST, e); } } public static class DataProviderException extends ODataApplicationException { private static final long serialVersionUID = 5098059649321796156L; - public DataProviderException(final String message, final Throwable throwable) { - super(message, HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.ROOT, throwable); - } - - public DataProviderException(final String message) { - this(message, HttpStatusCode.INTERNAL_SERVER_ERROR); - } - public DataProviderException(final String message, final HttpStatusCode statusCode) { super(message, statusCode.getStatusCode(), Locale.ROOT); } + + public DataProviderException(final String message, final HttpStatusCode statusCode, final Throwable throwable) { + super(message, statusCode.getStatusCode(), Locale.ROOT, throwable); + } } }
