You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@olingo.apache.org by "Patel, Yesha" <ye...@sap.com> on 2021/12/13 16:51:45 UTC
OData V2 URIUtils
Hi,
When we use URIBuilder<eclipse-javadoc:%E2%98%82=DataServices/D:%5C/DS_4.3.0_PI%5C/win64_x64%5C/release%5C/bin%5C/tp.apache.olingo.client.java%5C/java%5C/org.apache.olingo-odata-client-api-4.6.0.jar%3Corg.apache.olingo.client.api.uri(URIBuilder.class%E2%98%83URIBuilder~appendKeySegment~Ljava.util.Map%5C%3CLjava.lang.String;Ljava.lang.Object;%3E;%E2%98%82org.apache.olingo.client.api.uri.URIBuilder> org<eclipse-javadoc:%E2%98%82=DataServices/D:%5C/DS_4.3.0_PI%5C/win64_x64%5C/release%5C/bin%5C/tp.apache.olingo.client.java%5C/java%5C/org.apache.olingo-odata-client-api-4.6.0.jar%3Corg>.apache<eclipse-javadoc:%E2%98%82=DataServices/D:%5C/DS_4.3.0_PI%5C/win64_x64%5C/release%5C/bin%5C/tp.apache.olingo.client.java%5C/java%5C/org.apache.olingo-odata-client-api-4.6.0.jar%3Corg.apache>.olingo<eclipse-javadoc:%E2%98%82=DataServices/D:%5C/DS_4.3.0_PI%5C/win64_x64%5C/release%5C/bin%5C/tp.apache.olingo.client.java%5C/java%5C/org.apache.olingo-odata-client-api-4.6.0.jar%3Corg.apache.olingo>.client<eclipse-javadoc:%E2%98%82=DataServices/D:%5C/DS_4.3.0_PI%5C/win64_x64%5C/release%5C/bin%5C/tp.apache.olingo.client.java%5C/java%5C/org.apache.olingo-odata-client-api-4.6.0.jar%3Corg.apache.olingo.client>.api<eclipse-javadoc:%E2%98%82=DataServices/D:%5C/DS_4.3.0_PI%5C/win64_x64%5C/release%5C/bin%5C/tp.apache.olingo.client.java%5C/java%5C/org.apache.olingo-odata-client-api-4.6.0.jar%3Corg.apache.olingo.client.api>.uri<eclipse-javadoc:%E2%98%82=DataServices/D:%5C/DS_4.3.0_PI%5C/win64_x64%5C/release%5C/bin%5C/tp.apache.olingo.client.java%5C/java%5C/org.apache.olingo-odata-client-api-4.6.0.jar%3Corg.apache.olingo.client.api.uri>.URIBuilder<eclipse-javadoc:%E2%98%82=DataServices/D:%5C/DS_4.3.0_PI%5C/win64_x64%5C/release%5C/bin%5C/tp.apache.olingo.client.java%5C/java%5C/org.apache.olingo-odata-client-api-4.6.0.jar%3Corg.apache.olingo.client.api.uri(URIBuilder.class%E2%98%83URIBuilder>.appendKeySegment(Map<eclipse-javadoc:%E2%98%82=DataServices/D:%5C/DS_4.3.0_PI%5C/win64_x64%5C/release%5C/bin%5C/tp.apache.olingo.client.java%5C/java%5C/org.apache.olingo-odata-client-api-4.6.0.jar%3Corg.apache.olingo.client.api.uri(URIBuilder.class%E2%98%83URIBuilder~appendKeySegment~Ljava.util.Map%5C%3CLjava.lang.String;Ljava.lang.Object;%3E;%E2%98%82java.util.Map><String<eclipse-javadoc:%E2%98%82=DataServices/D:%5C/DS_4.3.0_PI%5C/win64_x64%5C/release%5C/bin%5C/tp.apache.olingo.client.java%5C/java%5C/org.apache.olingo-odata-client-api-4.6.0.jar%3Corg.apache.olingo.client.api.uri(URIBuilder.class%E2%98%83URIBuilder~appendKeySegment~Ljava.util.Map%5C%3CLjava.lang.String;Ljava.lang.Object;%3E;%E2%98%82java.lang.String>, Object<eclipse-javadoc:%E2%98%82=DataServices/D:%5C/DS_4.3.0_PI%5C/win64_x64%5C/release%5C/bin%5C/tp.apache.olingo.client.java%5C/java%5C/org.apache.olingo-odata-client-api-4.6.0.jar%3Corg.apache.olingo.client.api.uri(URIBuilder.class%E2%98%83URIBuilder~appendKeySegment~Ljava.util.Map%5C%3CLjava.lang.String;Ljava.lang.Object;%3E;%E2%98%82java.lang.Object>> segmentValues) like below:
URI targetUri = client.newURIBuilder(entityName).appendKeySegment(keyValues).build();
This internally calls below method escape() from URIUtils, however this method does not have any condition for edm.date property type and treats it as string and quotes the value for that column when it is a Key value.
Problem occurs when you do PUT or PATCH request where key values are part of the URI. Highlighted in yellow is the quoted key value. However, odata service that I am working with expects it to be unquoted.
How do I submit bug request for this?
For example: in a changeset:
--changeset_87d3-dbcd-8a5c
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: 1
PATCH A_Product (A='0001',testdate='2022-10-09') HTTP/1.1
/**
* Turns primitive values into their respective URI representation.
*
* @param obj primitive value
* @return URI representation
*/
public static String escape(final Object obj) {
return escape(obj, true);
}
private static String escape(final Object obj, final boolean singleQuoteEscape) {
String value;
try {
if (obj == null) {
value = Constants.ATTR_NULL;
} else if (obj instanceof Collection) {
final StringBuilder buffer = new StringBuilder("[");
for (@SuppressWarnings("unchecked")
final Iterator<Object> itor = ((Collection<Object>) obj).iterator(); itor.hasNext();) {
buffer.append(escape(itor.next(), false));
if (itor.hasNext()) {
buffer.append(',');
}
}
buffer.append(']');
value = buffer.toString();
} else if (obj instanceof Map) {
final StringBuilder buffer = new StringBuilder("{");
for (@SuppressWarnings("unchecked")
final Iterator<Map.Entry<String, Object>> itor =
((Map<String, Object>) obj).entrySet().iterator(); itor.hasNext();) {
final Map.Entry<String, Object> entry = itor.next();
buffer.append("\"").append(entry.getKey()).append("\");<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
buffer.append(':').append(escape(entry.getValue(), false));<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
if (itor.hasNext()) {<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
buffer.append(',');<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
}<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
}<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
buffer.append('}');<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
value = buffer.toString();<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
} else {<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
value =<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
(obj instanceof ParameterAlias)<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@>
? "@<mailto:%22);%0d%20%20%20%20%20%20%20%20%20%20buffer.append(':').append(escape(entry.getValue(),%20false));%0d%0d%20%20%20%20%20%20%20%20%20%20if%20(itor.hasNext())%20%7b%0d%20%20%20%20%20%20%20%20%20%20%20%20buffer.append(',');%0d%20%20%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20%7d%0d%20%20%20%20%20%20%20%20buffer.append('%7d');%0d%0d%20%20%20%20%20%20%20%20value%20=%20buffer.toString();%0d%20%20%20%20%20%20%7d%20else%20%7b%0d%20%20%20%20%20%20%20%20value%20=%0d%20%20%20%20%20%20%20%20%20%20%20%20(obj%20instanceof%20ParameterAlias)%0d%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20%22@> + ((ParameterAlias) obj).getAlias()
: (obj instanceof Boolean)
? BooleanUtils.toStringTrueFalse((Boolean) obj)
: (obj instanceof UUID)
? obj.toString()
: (obj instanceof byte[])
? EdmBinary.getInstance().toUriLiteral(Hex.encodeHexString((byte[]) obj))
: (obj instanceof Timestamp)
? timestamp((Timestamp) obj)
: (obj instanceof Calendar)
? calendar((Calendar) obj)
: (obj instanceof Duration)
? duration((Duration) obj)
: (obj instanceof BigDecimal)
? EdmDecimal.getInstance().valueToString(obj, null, null,
Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
: (obj instanceof Double)
? EdmDouble.getInstance().valueToString(obj, null, null,
Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
: (obj instanceof Float)
? EdmSingle.getInstance().valueToString(obj, null, null,
Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
: (obj instanceof Long)
? EdmInt64.getInstance().valueToString(obj, null, null,
Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
: (obj instanceof Geospatial)
? Encoder.encode(EdmPrimitiveTypeFactory.getInstance(
((Geospatial) obj).getEdmPrimitiveTypeKind()).
valueToString(obj, null, null,
Constants.DEFAULT_PRECISION,
Constants.DEFAULT_SCALE, null))
: (obj instanceof String)
? quoteString((String) obj, singleQuoteEscape)
: obj.toString();
}
} catch (final EdmPrimitiveTypeException e) {
value = obj.toString();
} catch (final UnsupportedEncodingException e) {
value = obj.toString();
}
return value;
}
Thanks,
Yesha