@Override
 public void readPrimitiveValue(
     ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType format)
     throws ODataApplicationException, SerializerException {
   // First we have to figure out which entity set the requested entity is in
   final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
   // Next we fetch the requested entity from the database
   final Entity entity;
   try {
     entity = readEntityInternal(uriInfo.asUriInfoResource(), edmEntitySet);
   } catch (DataProviderException e) {
     throw new ODataApplicationException(e.getMessage(), 500, Locale.ENGLISH);
   }
   if (entity == null) {
     // If no entity was found for the given key we throw an exception.
     throw new ODataApplicationException(
         "No entity found for this key", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ENGLISH);
   } else {
     // Next we get the property value from the entity and pass the value to serialization
     UriResourceProperty uriProperty =
         (UriResourceProperty)
             uriInfo.getUriResourceParts().get(uriInfo.getUriResourceParts().size() - 1);
     EdmProperty edmProperty = uriProperty.getProperty();
     Property property = entity.getProperty(edmProperty.getName());
     if (property == null) {
       throw new ODataApplicationException(
           "No property found", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ENGLISH);
     } else {
       if (property.getValue() == null) {
         response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
       } else {
         String value = String.valueOf(property.getValue());
         ByteArrayInputStream serializerContent =
             new ByteArrayInputStream(value.getBytes(Charset.forName("UTF-8")));
         response.setContent(serializerContent);
         response.setStatusCode(HttpStatusCode.OK.getStatusCode());
         response.setHeader(HttpHeader.CONTENT_TYPE, ContentType.TEXT_PLAIN.toContentTypeString());
       }
     }
   }
 }
 private static boolean isTrue(final SearchTerm term, final Property property) {
   if (property.isNull()) {
     return false;
   } else if (property.isPrimitive()) {
     if (property.isCollection()) {
       for (final Object primitive : property.asCollection()) {
         final String propertyString = asString(primitive);
         if (propertyString != null && propertyString.contains(term.getSearchTerm())) {
           return true;
         }
       }
       return false;
     } else {
       final String propertyString = asString(property.asPrimitive());
       return propertyString != null && propertyString.contains(term.getSearchTerm());
     }
   } else if (property.isComplex()) {
     if (property.isCollection()) {
       for (final Object member : property.asCollection()) {
         if (isTrue(term, (Property) member)) {
           return true;
         }
       }
       return false;
     } else {
       for (final Property innerProperty : property.asComplex().getValue()) {
         if (isTrue(term, innerProperty)) {
           return true;
         }
       }
       return false;
     }
   } else {
     return false;
   }
 }
  @Override
  public Property getProperty(
      final ODataProperty property, final Class<? extends Entry> reference, final boolean setType) {

    final Property propertyResource = ResourceFactory.newProperty(reference);
    propertyResource.setName(property.getName());
    propertyResource.setValue(getValue(property.getValue(), reference, setType));

    if (setType) {
      if (property.hasPrimitiveValue()) {
        propertyResource.setType(property.getPrimitiveValue().getType().toString());
      } else if (property.hasComplexValue()) {
        propertyResource.setType(property.getComplexValue().getType());
      } else if (property.hasCollectionValue()) {
        propertyResource.setType(property.getCollectionValue().getType());
      }
    }

    return propertyResource;
  }
  private void readProperty(
      ODataResponse response, UriInfo uriInfo, ContentType contentType, boolean complex)
      throws ODataApplicationException, SerializerException {
    // To read a property we have to first get the entity out of the entity set
    final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
    Entity entity;
    try {
      entity = readEntityInternal(uriInfo.asUriInfoResource(), edmEntitySet);
    } catch (DataProviderException e) {
      throw new ODataApplicationException(
          e.getMessage(), HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.ENGLISH);
    }

    if (entity == null) {
      // If no entity was found for the given key we throw an exception.
      throw new ODataApplicationException(
          "No entity found for this key", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ENGLISH);
    } else {
      // Next we get the property value from the entity and pass the value to serialization
      UriResourceProperty uriProperty =
          (UriResourceProperty)
              uriInfo.getUriResourceParts().get(uriInfo.getUriResourceParts().size() - 1);
      EdmProperty edmProperty = uriProperty.getProperty();
      Property property = entity.getProperty(edmProperty.getName());
      if (property == null) {
        throw new ODataApplicationException(
            "No property found", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ENGLISH);
      } else {
        if (property.getValue() == null) {
          response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
        } else {
          ODataSerializer serializer = odata.createSerializer(contentType);
          final ContextURL contextURL =
              isODataMetadataNone(contentType)
                  ? null
                  : getContextUrl(edmEntitySet, true, null, null, edmProperty.getName());
          InputStream serializerContent =
              complex
                  ? serializer
                      .complex(
                          edm,
                          (EdmComplexType) edmProperty.getType(),
                          property,
                          ComplexSerializerOptions.with().contextURL(contextURL).build())
                      .getContent()
                  : serializer
                      .primitive(
                          edm,
                          (EdmPrimitiveType) edmProperty.getType(),
                          property,
                          PrimitiveSerializerOptions.with()
                              .contextURL(contextURL)
                              .scale(edmProperty.getScale())
                              .nullable(edmProperty.isNullable())
                              .precision(edmProperty.getPrecision())
                              .maxLength(edmProperty.getMaxLength())
                              .unicode(edmProperty.isUnicode())
                              .build())
                      .getContent();
          response.setContent(serializerContent);
          response.setStatusCode(HttpStatusCode.OK.getStatusCode());
          response.setHeader(HttpHeader.CONTENT_TYPE, contentType.toContentTypeString());
        }
      }
    }
  }
  private ODataValue getODataValue(final Property resource) {
    ODataValue value = null;

    if (resource.getValue().isSimple()) {
      value =
          client
              .getPrimitiveValueBuilder()
              .setText(resource.getValue().asSimple().get())
              .setType(
                  resource.getType() == null
                      ? null
                      : EdmPrimitiveTypeKind.valueOfFQN(
                          client.getServiceVersion(), resource.getType()))
              .build();
    } else if (resource.getValue().isGeospatial()) {
      value =
          client
              .getGeospatialValueBuilder()
              .setValue(resource.getValue().asGeospatial().get())
              .setType(
                  resource.getType() == null
                          || EdmPrimitiveTypeKind.Geography.getFullQualifiedName()
                              .toString()
                              .equals(resource.getType())
                          || EdmPrimitiveTypeKind.Geometry.getFullQualifiedName()
                              .toString()
                              .equals(resource.getType())
                      ? null
                      : EdmPrimitiveTypeKind.valueOfFQN(
                          client.getServiceVersion(), resource.getType()))
              .build();
    } else if (resource.getValue().isComplex()) {
      value = new ODataComplexValue(resource.getType());

      for (Property property : resource.getValue().asComplex().get()) {
        value.asComplex().add(getODataProperty(property));
      }
    } else if (resource.getValue().isCollection()) {
      value = new ODataCollectionValue(resource.getType());

      for (Value _value : resource.getValue().asCollection().get()) {
        final JSONPropertyImpl fake = new JSONPropertyImpl();
        fake.setValue(_value);
        value.asCollection().add(getODataValue(fake));
      }
    }

    return value;
  }
 @Override
 public ODataProperty getODataProperty(final Property property) {
   return new ODataProperty(property.getName(), getODataValue(property));
 }