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);
}
}