You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2015/11/28 06:30:33 UTC
[25/47] olingo-odata4 git commit: [OLINGO-801] support for
non-primitive function parameters
[OLINGO-801] support for non-primitive function parameters
Signed-off-by: Christian Amend <ch...@sap.com>
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 <kl...@sap.com>
Authored: Fri Nov 13 16:46:04 2015 +0100
Committer: Christian Amend <ch...@sap.com>
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);
+ }
}
}