public Response postNewEntity()

in fit/src/main/java/org/apache/olingo/fit/Services.java [1205:1331]


  public Response postNewEntity(
      @Context final UriInfo uriInfo,
      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
      @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
      @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
      @PathParam("entitySetName") final String entitySetName,
      final String entity) {

    try {
      final Accept acceptType = Accept.parse(accept);
      if (acceptType == Accept.XML || acceptType == Accept.TEXT) {
        throw new UnsupportedMediaTypeException("Unsupported media type");
      }

      final ResWrap<Entity> container;

      final org.apache.olingo.fit.metadata.EntitySet entitySet = metadata.getEntitySet(entitySetName);

      final Entity entry;
      final String entityKey;
      if (xml.isMediaContent(entitySetName)) {
        entry = new Entity();
        entry.setMediaContentType(ContentType.APPLICATION_OCTET_STREAM.toContentTypeString());
        entry.setType(entitySet.getType());

        entityKey = xml.getDefaultEntryKey(entitySetName, entry);

        xml.addMediaEntityValue(entitySetName, entityKey, IOUtils.toInputStream(entity, Constants.ENCODING));

        final Pair<String, EdmPrimitiveTypeKind> id = Commons.getMediaContent().get(entitySetName);
        if (id != null) {
          final Property prop = new Property();
          prop.setName(id.getKey());
          prop.setType(id.getValue().toString());
          prop.setValue(ValueType.PRIMITIVE,
              id.getValue() == EdmPrimitiveTypeKind.Int32
              ? Integer.parseInt(entityKey)
                  : id.getValue() == EdmPrimitiveTypeKind.Guid
                  ? UUID.fromString(entityKey)
                      : entityKey);
          entry.getProperties().add(prop);
        }

        final Link editLink = new Link();
        editLink.setHref(Commons.getEntityURI(entitySetName, entityKey));
        editLink.setRel("edit");
        editLink.setTitle(entitySetName);
        entry.setEditLink(editLink);

        entry.setMediaContentSource(URI.create(editLink.getHref() + "/$value"));

        container = new ResWrap<Entity>((URI) null, null, entry);
      } else {
        final Accept contentTypeValue = Accept.parse(contentType);
        if (Accept.ATOM == contentTypeValue) {
          container = atomDeserializer.toEntity(IOUtils.toInputStream(entity, Constants.ENCODING));
        } else {
          container = jsonDeserializer.toEntity(IOUtils.toInputStream(entity, Constants.ENCODING));
        }
        entry = container.getPayload();
        updateInlineEntities(entry);

        entityKey = xml.getDefaultEntryKey(entitySetName, entry);
      }

      normalizeAtomEntry(entry, entitySetName, entityKey);

      final ByteArrayOutputStream content = new ByteArrayOutputStream();
      final OutputStreamWriter writer = new OutputStreamWriter(content, Constants.ENCODING);
      atomSerializer.write(writer, container);
      writer.flush();
      writer.close();

      final InputStream serialization =
          xml.addOrReplaceEntity(entityKey, entitySetName, new ByteArrayInputStream(content.toByteArray()), entry);

      ResWrap<Entity> result = atomDeserializer.toEntity(serialization);
      result = new ResWrap<Entity>(
          URI.create(Constants.get(ConstantKey.ODATA_METADATA_PREFIX)
              + entitySetName + Constants.get(ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
              null, result.getPayload());

      final String path = Commons.getEntityBasePath(entitySetName, entityKey);
      FSManager.instance().putInMemory(result, path + Constants.get(ConstantKey.ENTITY));

      final String location;

      if ((this instanceof KeyAsSegment)) {
        location = uriInfo.getRequestUri().toASCIIString() + "/" + entityKey;

        final Link editLink = new Link();
        editLink.setRel("edit");
        editLink.setTitle(entitySetName);
        editLink.setHref(location);

        result.getPayload().setEditLink(editLink);
      } else {
        location = uriInfo.getRequestUri().toASCIIString() + "(" + entityKey + ")";
      }

      final Response response;
      if ("return-no-content".equalsIgnoreCase(prefer)) {
        response = xml.createResponse(
            location,
            null,
            null,
            acceptType,
            Response.Status.NO_CONTENT);
      } else {
        response = xml.createResponse(
            location,
            xml.writeEntity(acceptType, result),
            null,
            acceptType,
            Response.Status.CREATED);
      }

      if (StringUtils.isNotBlank(prefer)) {
        response.getHeaders().put("Preference-Applied", Collections.<Object> singletonList(prefer));
      }

      return response;
    } catch (Exception e) {
      LOG.error("While creating new entity", e);
      return xml.createFaultResponse(accept, e);
    }
  }