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