MetadataTestITCase for V4

This commit is contained in:
Francesco Chicchiriccò 2014-05-07 17:44:22 +02:00
parent 6b7be9deb6
commit 58ecb3f5d9
40 changed files with 752 additions and 262 deletions

View File

@ -342,9 +342,9 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
res = type == null
? EngineUtils.getValueFromProperty(
client.getCachedEdm(), entity.getProperty(name))
client.getCachedEdm(), entity.getProperty(name))
: EngineUtils.getValueFromProperty(
client.getCachedEdm(), entity.getProperty(name), type);
client.getCachedEdm(), entity.getProperty(name), type);
if (res != null) {
int checkpoint = propertyChanges.hashCode();
@ -475,19 +475,17 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
public InputStream getStream() {
final String contentSource = entity.getMediaContentSource();
final URI contentSource = entity.getMediaContentSource();
if (this.stream == null
&& typeRef.getAnnotation(EntityType.class).hasStream()
&& StringUtils.isNotBlank(contentSource)) {
&& contentSource != null) {
final String comntentType =
final String contentType =
StringUtils.isBlank(entity.getMediaContentType()) ? "*/*" : entity.getMediaContentType();
final URI contentSourceURI = URIUtils.getURI(containerHandler.getFactory().getServiceRoot(), contentSource);
final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory().getMediaRequest(contentSourceURI);
retrieveReq.setFormat(ODataMediaFormat.fromFormat(comntentType));
final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory().getMediaRequest(contentSource);
retrieveReq.setFormat(ODataMediaFormat.fromFormat(contentType));
this.stream = retrieveReq.execute().getBody();
}

View File

@ -181,7 +181,8 @@ public final class EngineUtils {
} else {
oprop = ((org.apache.olingo.commons.api.domain.v4.ODataObjectFactory) client.getObjectFactory()).
newEnumProperty(name,
((org.apache.olingo.commons.api.domain.v4.ODataValue) getODataValue(client, type, obj)).asEnum());
((org.apache.olingo.commons.api.domain.v4.ODataValue) getODataValue(client, type, obj)).
asEnum());
}
} else {
throw new UnsupportedOperationException("Usupported object type " + type.getFullQualifiedName());
@ -412,7 +413,7 @@ public final class EngineUtils {
}
public static URI getEditMediaLink(final String name, final CommonODataEntity entity) {
for (ODataLink editMediaLink : entity.getEditMediaLinks()) {
for (ODataLink editMediaLink : entity.getMediaEditLinks()) {
if (name.equalsIgnoreCase(editMediaLink.getName())) {
return editMediaLink.getLink();
}

View File

@ -582,7 +582,7 @@ public abstract class AbstractServices {
editLink.setTitle(entitySetName);
entry.setEditLink(editLink);
entry.setMediaContentSource(editLink.getHref() + "/$value");
entry.setMediaContentSource(URI.create(editLink.getHref() + "/$value"));
container = new ResWrap<AtomEntityImpl>((URI) null, null, entry);
} else {

View File

@ -0,0 +1,157 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.fit;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.fit.metadata.Metadata;
import org.apache.olingo.fit.utils.Accept;
import org.apache.olingo.fit.utils.ConstantKey;
import org.apache.olingo.fit.utils.Constants;
import org.apache.olingo.fit.utils.FSManager;
import org.springframework.stereotype.Service;
@Service
@Path("/V40/Demo.svc")
public class V4Demo {
private final Metadata demoMetadata;
private final V4Services services;
public V4Demo() throws Exception {
this.demoMetadata = new Metadata(FSManager.instance(ODataServiceVersion.V40).
readFile("demo" + StringUtils.capitalize(Constants.get(ODataServiceVersion.V40, ConstantKey.METADATA)),
Accept.XML), ODataServiceVersion.V40);
this.services = new V4Services() {
@Override
protected Metadata getMetadataObj() {
return demoMetadata;
}
};
}
private Response replaceServiceName(final Response response) {
try {
final String content = IOUtils.toString((InputStream) response.getEntity(), Constants.ENCODING).
replaceAll("Static\\.svc", "Demo.svc");
final Response.ResponseBuilder builder = Response.status(response.getStatus());
for (String headerName : response.getHeaders().keySet()) {
for (Object headerValue : response.getHeaders().get(headerName)) {
builder.header(headerName, headerValue);
}
}
final InputStream toBeStreamedBack = IOUtils.toInputStream(content, Constants.ENCODING);
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy(toBeStreamedBack, baos);
IOUtils.closeQuietly(toBeStreamedBack);
builder.header("Content-Length", baos.size());
builder.entity(new ByteArrayInputStream(baos.toByteArray()));
return builder.build();
} catch (Exception e) {
return response;
}
}
@GET
@Path("/$metadata")
@Produces(MediaType.APPLICATION_XML)
public Response getMetadata() {
return services.getMetadata(
"demo" + StringUtils.capitalize(Constants.get(ODataServiceVersion.V40, ConstantKey.METADATA)));
}
@GET
@Path("/{entitySetName}({entityId})")
public Response getEntity(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@PathParam("entitySetName") String entitySetName,
@PathParam("entityId") String entityId,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format,
@QueryParam("$expand") @DefaultValue(StringUtils.EMPTY) String expand,
@QueryParam("$select") @DefaultValue(StringUtils.EMPTY) String select) {
return replaceServiceName(services.getEntityInternal(uriInfo.getRequestUri().toASCIIString(),
accept, entitySetName, entityId, format, expand, select, false));
}
@GET
@Path("/{entitySetName}({entityId})/$value")
public Response getMediaEntity(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@PathParam("entitySetName") String entitySetName,
@PathParam("entityId") String entityId) {
return services.getMediaEntity(uriInfo, accept, entitySetName, entityId);
}
@POST
@Path("/{entitySetName}")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_OCTET_STREAM})
public Response postNewEntity(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
@HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) String prefer,
@PathParam("entitySetName") String entitySetName,
final String entity) {
return replaceServiceName(services.postNewEntity(uriInfo, accept, contentType, prefer, entitySetName, entity));
}
@PUT
@Produces({MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
@Consumes({MediaType.WILDCARD, MediaType.APPLICATION_OCTET_STREAM})
@Path("/{entitySetName}({entityId})/$value")
public Response replaceMediaEntity(
@Context UriInfo uriInfo,
@HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) String prefer,
@PathParam("entitySetName") String entitySetName,
@PathParam("entityId") String entityId,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format,
String value) {
return services.replaceMediaEntity(uriInfo, prefer, entitySetName, entityId, format, value);
}
}

View File

@ -0,0 +1,16 @@
{
"@odata.context": "http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/$metadata#Advertisements/$entity",
"@odata.type": "#ODataDemo.Advertisement",
"@odata.id": "http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)",
"@odata.editLink": "Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)",
"@odata.mediaEditLink": "Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/$value",
"@odata.mediaContentType": "*/*",
"@odata.mediaEtag": "\"8zOOKKvgOtptr4gt8IrnapX3jds=\"",
"ID@odata.type": "#Guid",
"ID": "f89dee73-af9f-4cd4-b330-db93c25ff3c7",
"Name": "Old School Lemonade Store, Retro Style",
"AirDate@odata.type": "#DateTimeOffset",
"AirDate": "2012-11-07T00:00:00Z",
"FeaturedProduct@odata.associationLink": "Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/FeaturedProduct/$ref",
"FeaturedProduct@odata.navigationLink": "Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/FeaturedProduct"
}

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<entry xml:base="http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://docs.oasis-open.org/odata/ns/data" xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" m:context="http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/$metadata#Advertisements/$entity">
<id>http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)</id>
<category term="#ODataDemo.Advertisement" scheme="http://docs.oasis-open.org/odata/ns/scheme"/>
<link rel="edit" title="Advertisement" href="Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)"/>
<link rel="http://docs.oasis-open.org/odata/ns/relatedlinks/FeaturedProduct" type="application/xml" title="FeaturedProduct" href="Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/FeaturedProduct/$ref"/>
<link rel="http://docs.oasis-open.org/odata/ns/related/FeaturedProduct" type="application/atom+xml;type=entry" title="FeaturedProduct" href="Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/FeaturedProduct"/>
<title/>
<updated>2014-05-07T13:42:01Z</updated>
<author>
<name/>
</author>
<link rel="edit-media" title="Advertisement" href="Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/$value" m:etag="&quot;8zOOKKvgOtptr4gt8IrnapX3jds=&quot;"/>
<content type="*/*" src="Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/$value"/>
<m:properties>
<d:ID m:type="Guid">f89dee73-af9f-4cd4-b330-db93c25ff3c7</d:ID>
<d:Name>Old School Lemonade Store, Retro Style</d:Name>
<d:AirDate m:type="DateTimeOffset">2012-11-07T00:00:00Z</d:AirDate>
</m:properties>
</entry>

View File

@ -0,0 +1,31 @@
{
"@odata.context": "http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/$metadata#Advertisements",
"value": [{
"@odata.type": "#ODataDemo.Advertisement",
"@odata.id": "http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)",
"@odata.editLink": "Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)",
"@odata.mediaEditLink": "Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/$value",
"@odata.mediaContentType": "*/*",
"@odata.mediaEtag": "\"8zOOKKvgOtptr4gt8IrnapX3jds=\"",
"ID@odata.type": "#Guid",
"ID": "f89dee73-af9f-4cd4-b330-db93c25ff3c7",
"Name": "Old School Lemonade Store, Retro Style",
"AirDate@odata.type": "#DateTimeOffset",
"AirDate": "2012-11-07T00:00:00Z",
"FeaturedProduct@odata.associationLink": "Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/FeaturedProduct/$ref",
"FeaturedProduct@odata.navigationLink": "Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/FeaturedProduct"
}, {
"@odata.type": "#ODataDemo.Advertisement",
"@odata.id": "http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/Advertisements(db2d2186-1c29-4d1e-88ef-a127f521b9c6)",
"@odata.editLink": "Advertisements(db2d2186-1c29-4d1e-88ef-a127f521b9c6)",
"@odata.mediaEditLink": "Advertisements(db2d2186-1c29-4d1e-88ef-a127f521b9c6)/$value",
"@odata.mediaContentType": "*/*",
"ID@odata.type": "#Guid",
"ID": "db2d2186-1c29-4d1e-88ef-a127f521b9c6",
"Name": "Early morning start, need coffee",
"AirDate@odata.type": "#DateTimeOffset",
"AirDate": "2000-02-29T00:00:00Z",
"FeaturedProduct@odata.associationLink": "Advertisements(db2d2186-1c29-4d1e-88ef-a127f521b9c6)/FeaturedProduct/$ref",
"FeaturedProduct@odata.navigationLink": "Advertisements(db2d2186-1c29-4d1e-88ef-a127f521b9c6)/FeaturedProduct"
}]
}

View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<feed xml:base="http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://docs.oasis-open.org/odata/ns/data" xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" m:context="http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/$metadata#Advertisements">
<id>http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/Advertisements</id>
<title type="text">Advertisements</title>
<updated>2014-05-07T13:39:27Z</updated>
<link rel="self" title="Advertisements" href="Advertisements"/>
<entry>
<id>http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)</id>
<category term="#ODataDemo.Advertisement" scheme="http://docs.oasis-open.org/odata/ns/scheme"/>
<link rel="edit" title="Advertisement" href="Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)"/>
<link rel="http://docs.oasis-open.org/odata/ns/relatedlinks/FeaturedProduct" type="application/xml" title="FeaturedProduct" href="Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/FeaturedProduct/$ref"/>
<link rel="http://docs.oasis-open.org/odata/ns/related/FeaturedProduct" type="application/atom+xml;type=entry" title="FeaturedProduct" href="Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/FeaturedProduct"/>
<title/>
<updated>2014-05-07T13:39:27Z</updated>
<author>
<name/>
</author>
<link rel="edit-media" title="Advertisement" href="Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/$value" m:etag="&quot;8zOOKKvgOtptr4gt8IrnapX3jds=&quot;"/>
<content type="*/*" src="Advertisements(f89dee73-af9f-4cd4-b330-db93c25ff3c7)/$value"/>
<m:properties>
<d:ID m:type="Guid">f89dee73-af9f-4cd4-b330-db93c25ff3c7</d:ID>
<d:Name>Old School Lemonade Store, Retro Style</d:Name>
<d:AirDate m:type="DateTimeOffset">2012-11-07T00:00:00Z</d:AirDate>
</m:properties>
</entry>
<entry>
<id>http://localhost:${cargo.servlet.port}/stub/StaticService/V40/Demo.svc/Advertisements(db2d2186-1c29-4d1e-88ef-a127f521b9c6)</id>
<category term="#ODataDemo.Advertisement" scheme="http://docs.oasis-open.org/odata/ns/scheme"/>
<link rel="edit" title="Advertisement" href="Advertisements(db2d2186-1c29-4d1e-88ef-a127f521b9c6)"/>
<link rel="http://docs.oasis-open.org/odata/ns/relatedlinks/FeaturedProduct" type="application/xml" title="FeaturedProduct" href="Advertisements(db2d2186-1c29-4d1e-88ef-a127f521b9c6)/FeaturedProduct/$ref"/>
<link rel="http://docs.oasis-open.org/odata/ns/related/FeaturedProduct" type="application/atom+xml;type=entry" title="FeaturedProduct" href="Advertisements(db2d2186-1c29-4d1e-88ef-a127f521b9c6)/FeaturedProduct"/>
<title/>
<updated>2014-05-07T13:39:27Z</updated>
<author>
<name/>
</author>
<link rel="edit-media" title="Advertisement" href="Advertisements(db2d2186-1c29-4d1e-88ef-a127f521b9c6)/$value"/>
<content type="*/*" src="Advertisements(db2d2186-1c29-4d1e-88ef-a127f521b9c6)/$value"/>
<m:properties>
<d:ID m:type="Guid">db2d2186-1c29-4d1e-88ef-a127f521b9c6</d:ID>
<d:Name>Early morning start, need coffee</d:Name>
<d:AirDate m:type="DateTimeOffset">2000-02-29T00:00:00Z</d:AirDate>
</m:properties>
</entry>
</feed>

View File

@ -0,0 +1,172 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:DataServices>
<Schema Namespace="ODataDemo" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<EntityType Name="Product">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" />
<Property Name="Description" Type="Edm.String" />
<Property Name="ReleaseDate" Type="Edm.DateTimeOffset" Nullable="false" />
<Property Name="DiscontinuedDate" Type="Edm.DateTimeOffset" />
<Property Name="Rating" Type="Edm.Int16" Nullable="false" />
<Property Name="Price" Type="Edm.Double" Nullable="false" />
<NavigationProperty Name="Categories" Type="Collection(ODataDemo.Category)" Partner="Products" />
<NavigationProperty Name="Supplier" Type="ODataDemo.Supplier" Partner="Products" />
<NavigationProperty Name="ProductDetail" Type="ODataDemo.ProductDetail" Partner="Product" />
</EntityType>
<EntityType Name="FeaturedProduct" BaseType="ODataDemo.Product">
<NavigationProperty Name="Advertisement" Type="ODataDemo.Advertisement" Partner="FeaturedProduct" />
</EntityType>
<EntityType Name="ProductDetail">
<Key>
<PropertyRef Name="ProductID" />
</Key>
<Property Name="ProductID" Type="Edm.Int32" Nullable="false" />
<Property Name="Details" Type="Edm.String" />
<NavigationProperty Name="Product" Type="ODataDemo.Product" Partner="ProductDetail" />
</EntityType>
<EntityType Name="Category" OpenType="true">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" />
<NavigationProperty Name="Products" Type="Collection(ODataDemo.Product)" Partner="Categories" />
</EntityType>
<EntityType Name="Supplier">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" />
<Property Name="Address" Type="ODataDemo.Address" />
<Property Name="Location" Type="Edm.GeographyPoint" SRID="Variable" />
<Property Name="Concurrency" Type="Edm.Int32" ConcurrencyMode="Fixed" Nullable="false" />
<NavigationProperty Name="Products" Type="Collection(ODataDemo.Product)" Partner="Supplier" />
</EntityType>
<ComplexType Name="Address">
<Property Name="Street" Type="Edm.String" />
<Property Name="City" Type="Edm.String" />
<Property Name="State" Type="Edm.String" />
<Property Name="ZipCode" Type="Edm.String" />
<Property Name="Country" Type="Edm.String" />
</ComplexType>
<EntityType Name="Person">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" />
<NavigationProperty Name="PersonDetail" Type="ODataDemo.PersonDetail" Partner="Person" />
</EntityType>
<EntityType Name="Customer" BaseType="ODataDemo.Person">
<Property Name="TotalExpense" Type="Edm.Decimal" Nullable="false" />
</EntityType>
<EntityType Name="Employee" BaseType="ODataDemo.Person">
<Property Name="EmployeeID" Type="Edm.Int64" Nullable="false" />
<Property Name="HireDate" Type="Edm.DateTimeOffset" Nullable="false" />
<Property Name="Salary" Type="Edm.Single" Nullable="false" />
</EntityType>
<EntityType Name="PersonDetail">
<Key>
<PropertyRef Name="PersonID" />
</Key>
<Property Name="PersonID" Type="Edm.Int32" Nullable="false" />
<Property Name="Age" Type="Edm.Byte" Nullable="false" />
<Property Name="Gender" Type="Edm.Boolean" Nullable="false" />
<Property Name="Phone" Type="Edm.String" />
<Property Name="Address" Type="ODataDemo.Address" />
<Property Name="Photo" Type="Edm.Stream" Nullable="false" />
<NavigationProperty Name="Person" Type="ODataDemo.Person" Partner="PersonDetail" />
</EntityType>
<EntityType Name="Advertisement" HasStream="true">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Guid" Nullable="false" />
<Property Name="Name" Type="Edm.String" />
<Property Name="AirDate" Type="Edm.DateTimeOffset" Nullable="false" />
<NavigationProperty Name="FeaturedProduct" Type="ODataDemo.FeaturedProduct" Partner="Advertisement" />
</EntityType>
<Action Name="Discount" IsBound="true">
<Parameter Name="product" Type="ODataDemo.Product" />
<Parameter Name="discountPercentage" Type="Edm.Int32" Nullable="false" />
<ReturnType Type="Edm.Double" Nullable="false" />
</Action>
<Action Name="IncreaseSalaries">
<Parameter Name="percentage" Type="Edm.Int32" Nullable="false" />
</Action>
<EntityContainer Name="DemoService">
<EntitySet Name="Products" EntityType="ODataDemo.Product">
<NavigationPropertyBinding Path="ODataDemo.FeaturedProduct/Advertisement" Target="Advertisements" />
<NavigationPropertyBinding Path="Categories" Target="Categories" />
<NavigationPropertyBinding Path="Supplier" Target="Suppliers" />
<NavigationPropertyBinding Path="ProductDetail" Target="ProductDetails" />
</EntitySet>
<EntitySet Name="ProductDetails" EntityType="ODataDemo.ProductDetail">
<NavigationPropertyBinding Path="Product" Target="Products" />
</EntitySet>
<EntitySet Name="Categories" EntityType="ODataDemo.Category">
<NavigationPropertyBinding Path="Products" Target="Products" />
</EntitySet>
<EntitySet Name="Suppliers" EntityType="ODataDemo.Supplier">
<NavigationPropertyBinding Path="Products" Target="Products" />
</EntitySet>
<EntitySet Name="Persons" EntityType="ODataDemo.Person">
<NavigationPropertyBinding Path="PersonDetail" Target="PersonDetails" />
</EntitySet>
<EntitySet Name="PersonDetails" EntityType="ODataDemo.PersonDetail">
<NavigationPropertyBinding Path="Person" Target="Persons" />
</EntitySet>
<EntitySet Name="Advertisements" EntityType="ODataDemo.Advertisement">
<NavigationPropertyBinding Path="FeaturedProduct" Target="Products" />
</EntitySet>
<ActionImport Name="IncreaseSalaries" Action="ODataDemo.IncreaseSalaries" />
</EntityContainer>
<Annotations Target="ODataDemo.DemoService">
<Annotation Term="Org.OData.Display.V1.Description" String="This is a sample OData service with vocabularies" />
</Annotations>
<Annotations Target="ODataDemo.Product">
<Annotation Term="Org.OData.Display.V1.Description" String="All Products available in the online store" />
</Annotations>
<Annotations Target="ODataDemo.Product/Name">
<Annotation Term="Org.OData.Display.V1.DisplayName" String="Product Name" />
</Annotations>
<Annotations Target="ODataDemo.DemoService/Suppliers">
<Annotation Term="Org.OData.Publication.V1.PublisherName" String="Microsoft Corp." />
<Annotation Term="Org.OData.Publication.V1.PublisherId" String="MSFT" />
<Annotation Term="Org.OData.Publication.V1.Keywords" String="Inventory, Supplier, Advertisers, Sales, Finance" />
<Annotation Term="Org.OData.Publication.V1.AttributionUrl" String="http://www.odata.org/" />
<Annotation Term="Org.OData.Publication.V1.AttributionDescription" String="All rights reserved" />
<Annotation Term="Org.OData.Publication.V1.DocumentationUrl " String="http://www.odata.org/" />
<Annotation Term="Org.OData.Publication.V1.TermsOfUseUrl" String="All rights reserved" />
<Annotation Term="Org.OData.Publication.V1.PrivacyPolicyUrl" String="http://www.odata.org/" />
<Annotation Term="Org.OData.Publication.V1.LastModified" String="4/2/2013" />
<Annotation Term="Org.OData.Publication.V1.ImageUrl " String="http://www.odata.org/" />
</Annotations>
</Schema>
</edmx:DataServices>
</edmx:Edmx>

View File

@ -49,6 +49,7 @@
<bean class="org.apache.olingo.fit.V4NorthWindExt"/>
<bean class="org.apache.olingo.fit.V4OpenType"/>
<bean class="org.apache.olingo.fit.V4Vocabularies"/>
<bean class="org.apache.olingo.fit.V4Demo"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
<bean class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider"/>

View File

@ -375,7 +375,7 @@ public abstract class AbstractTestITCase extends AbstractBaseTestITCase {
// check defined links
checkLinks(original.getAssociationLinks(), actual.getAssociationLinks());
checkLinks(original.getEditMediaLinks(), actual.getEditMediaLinks());
checkLinks(original.getMediaEditLinks(), actual.getMediaEditLinks());
checkLinks(original.getNavigationLinks(), actual.getNavigationLinks());
// check defined properties equality

View File

@ -70,7 +70,7 @@ public class AsyncTestITCase extends AbstractTestITCase {
final ODataEntity entity = entityRes.getBody();
entity.getAssociationLinks().clear();
entity.getNavigationLinks().clear();
entity.getEditMediaLinks().clear();
entity.getMediaEditLinks().clear();
entity.getProperties().remove(entity.getProperty("Description"));
getClient().getBinder().add(entity,

View File

@ -18,6 +18,9 @@
*/
package org.apache.olingo.fit.v3;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;
@ -38,11 +41,6 @@ import org.apache.olingo.commons.api.domain.v3.ODataEntity;
import org.apache.olingo.commons.api.domain.v3.ODataProperty;
import org.apache.olingo.commons.api.format.ODataMediaFormat;
import org.apache.olingo.commons.api.format.ODataPubFormat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
public class MediaEntityTestITCase extends AbstractTestITCase {
@ -84,6 +82,28 @@ public class MediaEntityTestITCase extends AbstractTestITCase {
retrieveReq.execute();
}
private void updateMediaEntity(final ODataPubFormat format, final int id) throws Exception {
final URIBuilder builder = client.getURIBuilder(testStaticServiceRootURL).
appendEntitySetSegment("Car").appendKeySegment(id).appendValueSegment();
final String TO_BE_UPDATED = "new buffered stream sample";
final InputStream input = IOUtils.toInputStream(TO_BE_UPDATED);
final ODataMediaEntityUpdateRequest<ODataEntity> updateReq =
client.getStreamedRequestFactory().getMediaEntityUpdateRequest(builder.build(), input);
updateReq.setFormat(format);
final MediaEntityUpdateStreamManager<ODataEntity> streamManager = updateReq.execute();
final ODataMediaEntityUpdateResponse<ODataEntity> updateRes = streamManager.getResponse();
assertEquals(204, updateRes.getStatusCode());
final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory().getMediaRequest(builder.build());
final ODataRetrieveResponse<InputStream> retrieveRes = retrieveReq.execute();
assertEquals(200, retrieveRes.getStatusCode());
assertEquals(TO_BE_UPDATED, IOUtils.toString(retrieveRes.getBody()));
}
@Test
public void updateMediaEntityAsAtom() throws Exception {
updateMediaEntity(ODataPubFormat.ATOM, 14);
@ -94,6 +114,38 @@ public class MediaEntityTestITCase extends AbstractTestITCase {
updateMediaEntity(ODataPubFormat.JSON, 15);
}
private void createMediaEntity(final ODataPubFormat format, final InputStream input) throws Exception {
final URIBuilder builder = client.getURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("Car");
final ODataMediaEntityCreateRequest<ODataEntity> createReq =
client.getStreamedRequestFactory().getMediaEntityCreateRequest(builder.build(), input);
createReq.setFormat(format);
final MediaEntityCreateStreamManager<ODataEntity> streamManager = createReq.execute();
final ODataMediaEntityCreateResponse<ODataEntity> createRes = streamManager.getResponse();
assertEquals(201, createRes.getStatusCode());
final ODataEntity created = createRes.getBody();
assertNotNull(created);
assertEquals(2, created.getProperties().size());
Integer id = null;
for (ODataProperty prop : created.getProperties()) {
if ("VIN".equals(prop.getName())) {
id = prop.getPrimitiveValue().toCastValue(Integer.class);
}
}
assertNotNull(id);
builder.appendKeySegment(id).appendValueSegment();
final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory().getMediaRequest(builder.build());
final ODataRetrieveResponse<InputStream> retrieveRes = retrieveReq.execute();
assertEquals(200, retrieveRes.getStatusCode());
assertNotNull(retrieveRes.getBody());
}
@Test
public void createMediaEntityAsAtom() throws Exception {
createMediaEntity(ODataPubFormat.ATOM, IOUtils.toInputStream("buffered stream sample"));
@ -131,59 +183,4 @@ public class MediaEntityTestITCase extends AbstractTestITCase {
assertEquals(200, retrieveRes.getStatusCode());
assertEquals(TO_BE_UPDATED, IOUtils.toString(retrieveRes.getBody()));
}
private void updateMediaEntity(final ODataPubFormat format, final int id) throws Exception {
URIBuilder builder = client.getURIBuilder(testStaticServiceRootURL).
appendEntitySetSegment("Car").appendKeySegment(id).appendValueSegment();
final String TO_BE_UPDATED = "new buffered stream sample";
final InputStream input = IOUtils.toInputStream(TO_BE_UPDATED);
final ODataMediaEntityUpdateRequest<ODataEntity> updateReq =
client.getStreamedRequestFactory().getMediaEntityUpdateRequest(builder.build(), input);
updateReq.setFormat(format);
final MediaEntityUpdateStreamManager<ODataEntity> streamManager = updateReq.execute();
final ODataMediaEntityUpdateResponse<ODataEntity> updateRes = streamManager.getResponse();
assertEquals(204, updateRes.getStatusCode());
final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory().getMediaRequest(builder.build());
final ODataRetrieveResponse<InputStream> retrieveRes = retrieveReq.execute();
assertEquals(200, retrieveRes.getStatusCode());
assertEquals(TO_BE_UPDATED, IOUtils.toString(retrieveRes.getBody()));
}
private void createMediaEntity(final ODataPubFormat format, final InputStream input) throws Exception {
final URIBuilder builder = client.getURIBuilder(testStaticServiceRootURL).
appendEntitySetSegment("Car");
final ODataMediaEntityCreateRequest<ODataEntity> createReq =
client.getStreamedRequestFactory().getMediaEntityCreateRequest(builder.build(), input);
createReq.setFormat(format);
final MediaEntityCreateStreamManager<ODataEntity> streamManager = createReq.execute();
final ODataMediaEntityCreateResponse<ODataEntity> createRes = streamManager.getResponse();
assertEquals(201, createRes.getStatusCode());
final ODataEntity created = createRes.getBody();
assertNotNull(created);
assertEquals(2, created.getProperties().size());
Integer id = null;
for (ODataProperty prop : created.getProperties()) {
if ("VIN".equals(prop.getName())) {
id = prop.getPrimitiveValue().toCastValue(Integer.class);
}
}
assertNotNull(id);
builder.appendKeySegment(id).appendValueSegment();
final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory().getMediaRequest(builder.build());
final ODataRetrieveResponse<InputStream> retrieveRes = retrieveReq.execute();
assertEquals(200, retrieveRes.getStatusCode());
assertNotNull(retrieveRes.getBody());
}
}

View File

@ -49,6 +49,8 @@ public abstract class AbstractTestITCase extends AbstractBaseTestITCase {
protected static String testStaticServiceRootURL;
protected static String testDemoServiceRootURL;
protected static String testVocabulariesServiceRootURL;
protected static String testNorthwindRootURL;
@ -64,6 +66,7 @@ public abstract class AbstractTestITCase extends AbstractBaseTestITCase {
@BeforeClass
public static void setUpODataServiceRoot() throws IOException {
testStaticServiceRootURL = "http://localhost:9080/stub/StaticService/V40/Static.svc";
testDemoServiceRootURL = "http://localhost:9080/stub/StaticService/V40/Demo.svc";
testVocabulariesServiceRootURL = "http://localhost:9080/stub/StaticService/V40/Vocabularies.svc";
testNorthwindRootURL = "http://localhost:9080/stub/StaticService/V40/NorthWind.svc";
testKeyAsSegmentServiceRootURL = "http://localhost:9080/stub/StaticService/V40/KeyAsSegment.svc";

View File

@ -0,0 +1,122 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.fit.v4;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.UUID;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
import org.apache.olingo.client.api.communication.request.retrieve.ODataMediaRequest;
import org.apache.olingo.client.api.communication.request.streamed.MediaEntityUpdateStreamManager;
import org.apache.olingo.client.api.communication.request.streamed.ODataMediaEntityUpdateRequest;
import org.apache.olingo.client.api.communication.response.ODataMediaEntityUpdateResponse;
import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
import org.apache.olingo.client.api.uri.v4.URIBuilder;
import org.apache.olingo.client.api.v4.ODataClient;
import org.apache.olingo.client.core.ODataClientFactory;
import org.apache.olingo.commons.api.domain.v4.ODataEntity;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.format.ODataPubFormat;
import org.junit.Test;
public class MediaEntityTestITCase extends AbstractTestITCase {
private void read(final ODataClient client, final ODataPubFormat format) throws IOException {
final URIBuilder builder = client.getURIBuilder(testDemoServiceRootURL).
appendEntitySetSegment("Advertisements").
appendKeySegment(UUID.fromString("f89dee73-af9f-4cd4-b330-db93c25ff3c7"));
final ODataEntityRequest<ODataEntity> entityReq =
client.getRetrieveRequestFactory().getEntityRequest(builder.build());
final ODataEntity entity = entityReq.execute().getBody();
assertNotNull(entity);
assertTrue(entity.isMediaEntity());
assertEquals(EdmPrimitiveTypeKind.DateTimeOffset.getFullQualifiedName().toString(),
entity.getProperty("AirDate").getValue().getTypeName());
final ODataMediaRequest streamReq = client.getRetrieveRequestFactory().
getMediaRequest(entity.getMediaContentSource());
final ODataRetrieveResponse<InputStream> streamRes = streamReq.execute();
assertEquals(200, streamRes.getStatusCode());
final byte[] actual = new byte[Integer.parseInt(streamRes.getHeader("Content-Length").iterator().next())];
IOUtils.read(streamRes.getBody(), actual, 0, actual.length);
}
@Test
public void readAsAtom() throws IOException {
read(client, ODataPubFormat.ATOM);
}
@Test
public void readAsJSON() throws IOException {
read(ODataClientFactory.getEdmEnabledV4(testDemoServiceRootURL), ODataPubFormat.JSON);
}
@Test
public void readAsJSONFull() throws IOException {
read(client, ODataPubFormat.JSON_FULL_METADATA);
}
private void update(final ODataClient client, final ODataPubFormat format)
throws IOException, EdmPrimitiveTypeException {
final URI uri = client.getURIBuilder(testDemoServiceRootURL).
appendEntitySetSegment("Advertisements").
appendKeySegment(UUID.fromString("f89dee73-af9f-4cd4-b330-db93c25ff3c7")).appendValueSegment().build();
final String random = RandomStringUtils.random(124);
// 1. update providing media content
final ODataMediaEntityUpdateRequest<ODataEntity> updateReq = client.getStreamedRequestFactory().
getMediaEntityUpdateRequest(uri, IOUtils.toInputStream(random));
updateReq.setFormat(format);
final MediaEntityUpdateStreamManager<ODataEntity> streamManager = updateReq.execute();
final ODataMediaEntityUpdateResponse<ODataEntity> createRes = streamManager.getResponse();
assertEquals(204, createRes.getStatusCode());
// 2. check that media content was effectively uploaded
final ODataMediaRequest streamReq = client.getRetrieveRequestFactory().getMediaRequest(uri);
final ODataRetrieveResponse<InputStream> streamRes = streamReq.execute();
assertEquals(200, streamRes.getStatusCode());
final byte[] actual = new byte[Integer.parseInt(streamRes.getHeader("Content-Length").iterator().next())];
IOUtils.read(streamRes.getBody(), actual, 0, actual.length);
assertEquals(random, new String(actual));
}
@Test
public void updateAsAtom() throws IOException, EdmPrimitiveTypeException {
update(client, ODataPubFormat.ATOM);
}
@Test
public void updateAsJSON() throws IOException, EdmPrimitiveTypeException {
update(client, ODataPubFormat.JSON);
}
}

View File

@ -18,12 +18,12 @@
*/
package org.apache.olingo.fit.v4;
import java.io.IOException;
import org.apache.olingo.client.api.communication.request.cud.ODataPropertyUpdateRequest;
import org.apache.olingo.client.api.communication.request.cud.v4.UpdateType;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.IOException;
import org.apache.olingo.client.api.communication.request.cud.ODataPropertyUpdateRequest;
import org.apache.olingo.client.api.communication.request.cud.v4.UpdateType;
import org.apache.olingo.client.api.communication.request.retrieve.ODataPropertyRequest;
import org.apache.olingo.client.api.communication.response.ODataPropertyUpdateResponse;
import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
@ -112,16 +112,6 @@ public class PropertyTestITCase extends AbstractTestITCase {
complex(edmClient, ODataFormat.JSON);
}
@Test
public void complexFromFullJSON() {
complex(client, ODataFormat.JSON_FULL_METADATA);
}
@Test
public void patchComplexPropertyAsJSON() throws IOException {
updateComplexProperty(ODataFormat.JSON_FULL_METADATA, UpdateType.PATCH);
}
private void updateComplexProperty(final ODataFormat format, final UpdateType type) throws IOException {
final URIBuilder uriBuilder = client.getURIBuilder(testStaticServiceRootURL).
appendEntitySetSegment("Customers").appendKeySegment(1).appendPropertySegment("HomeAddress");
@ -135,7 +125,7 @@ public class PropertyTestITCase extends AbstractTestITCase {
ODataProperty homeAddress =
client.getObjectFactory().newComplexProperty("HomeAddress",
client.getObjectFactory().newComplexValue(retrieveRes.getBody().getComplexValue().getTypeName()));
client.getObjectFactory().newComplexValue(retrieveRes.getBody().getComplexValue().getTypeName()));
homeAddress.getComplexValue().add(client.getObjectFactory().
newPrimitiveProperty("City", client.getObjectFactory().newPrimitiveValueBuilder().buildString("Pescara")));
@ -161,4 +151,15 @@ public class PropertyTestITCase extends AbstractTestITCase {
homeAddress = retrieveRes.getBody();
assertEquals("Pescara", homeAddress.getComplexValue().get("City").getPrimitiveValue().toString());
}
@Test
public void complexFromFullJSON() {
complex(client, ODataFormat.JSON_FULL_METADATA);
}
@Test
public void patchComplexPropertyAsJSON() throws IOException {
updateComplexProperty(ODataFormat.JSON_FULL_METADATA, UpdateType.PATCH);
}
}

View File

@ -25,7 +25,7 @@ import org.apache.olingo.client.api.communication.request.cud.CommonCUDRequestFa
import org.apache.olingo.client.api.communication.request.cud.CommonUpdateType;
import org.apache.olingo.client.api.communication.request.invoke.InvokeRequestFactory;
import org.apache.olingo.client.api.communication.request.retrieve.CommonRetrieveRequestFactory;
import org.apache.olingo.client.api.communication.request.streamed.CommonStreamedRequestFactory;
import org.apache.olingo.client.api.communication.request.streamed.StreamedRequestFactory;
import org.apache.olingo.client.api.op.ClientODataDeserializer;
import org.apache.olingo.commons.api.domain.CommonODataObjectFactory;
import org.apache.olingo.client.api.op.CommonODataBinder;
@ -71,7 +71,7 @@ public interface CommonODataClient<UT extends CommonUpdateType> {
CommonCUDRequestFactory<UT> getCUDRequestFactory();
CommonStreamedRequestFactory getStreamedRequestFactory();
StreamedRequestFactory getStreamedRequestFactory();
InvokeRequestFactory getInvokeRequestFactory();

View File

@ -26,7 +26,7 @@ import org.apache.olingo.commons.api.domain.CommonODataEntity;
/**
* OData request factory class.
*/
public interface CommonStreamedRequestFactory extends Serializable {
public interface StreamedRequestFactory extends Serializable {
/**
* Gets a media entity create request object instance.

View File

@ -1,24 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.client.api.communication.request.streamed.v3;
import org.apache.olingo.client.api.communication.request.streamed.CommonStreamedRequestFactory;
public interface StreamedRequestFactory extends CommonStreamedRequestFactory {
}

View File

@ -1,24 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.client.api.communication.request.streamed.v4;
import org.apache.olingo.client.api.communication.request.streamed.CommonStreamedRequestFactory;
public interface StreamedRequestFactory extends CommonStreamedRequestFactory {
}

View File

@ -23,7 +23,6 @@ import org.apache.olingo.client.api.communication.request.batch.v3.BatchRequestF
import org.apache.olingo.client.api.communication.request.cud.v3.CUDRequestFactory;
import org.apache.olingo.client.api.communication.request.cud.v3.UpdateType;
import org.apache.olingo.client.api.communication.request.retrieve.v3.RetrieveRequestFactory;
import org.apache.olingo.client.api.communication.request.streamed.v3.StreamedRequestFactory;
import org.apache.olingo.client.api.op.v3.ODataBinder;
import org.apache.olingo.client.api.op.v3.ODataDeserializer;
import org.apache.olingo.client.api.op.v3.ODataReader;
@ -60,9 +59,6 @@ public interface ODataClient extends CommonODataClient<UpdateType> {
@Override
CUDRequestFactory getCUDRequestFactory();
@Override
StreamedRequestFactory getStreamedRequestFactory();
@Override
BatchRequestFactory getBatchRequestFactory();
}

View File

@ -23,7 +23,6 @@ import org.apache.olingo.client.api.communication.request.batch.v4.BatchRequestF
import org.apache.olingo.client.api.communication.request.cud.v4.CUDRequestFactory;
import org.apache.olingo.client.api.communication.request.cud.v4.UpdateType;
import org.apache.olingo.client.api.communication.request.retrieve.v4.RetrieveRequestFactory;
import org.apache.olingo.client.api.communication.request.streamed.v4.StreamedRequestFactory;
import org.apache.olingo.client.api.communication.request.v4.AsyncRequestFactory;
import org.apache.olingo.client.api.op.v4.ODataBinder;
import org.apache.olingo.client.api.op.v4.ODataDeserializer;
@ -63,9 +62,6 @@ public interface ODataClient extends CommonODataClient<UpdateType> {
@Override
CUDRequestFactory getCUDRequestFactory();
@Override
StreamedRequestFactory getStreamedRequestFactory();
@Override
BatchRequestFactory getBatchRequestFactory();
}

View File

@ -42,7 +42,7 @@ public class ODataMediaRequestImpl extends AbstractODataRetrieveRequest<InputStr
* @param odataClient client instance getting this request
* @param query query to be executed.
*/
ODataMediaRequestImpl(final CommonODataClient odataClient, final URI query) {
ODataMediaRequestImpl(final CommonODataClient<?> odataClient, final URI query) {
super(odataClient, ODataMediaFormat.class, query);
setAccept(ODataMediaFormat.APPLICATION_OCTET_STREAM.toString());
@ -75,6 +75,7 @@ public class ODataMediaRequestImpl extends AbstractODataRetrieveRequest<InputStr
* Just to create response templates to be initialized from batch.
*/
private ODataMediaResponseImpl() {
super();
}
/**

View File

@ -24,17 +24,17 @@ import org.apache.olingo.client.api.CommonODataClient;
import org.apache.olingo.client.api.communication.request.streamed.ODataMediaEntityCreateRequest;
import org.apache.olingo.client.api.communication.request.streamed.ODataMediaEntityUpdateRequest;
import org.apache.olingo.client.api.communication.request.streamed.ODataStreamUpdateRequest;
import org.apache.olingo.client.api.communication.request.streamed.CommonStreamedRequestFactory;
import org.apache.olingo.client.api.communication.request.streamed.StreamedRequestFactory;
import org.apache.olingo.client.api.http.HttpMethod;
import org.apache.olingo.commons.api.domain.CommonODataEntity;
public abstract class AbstractStreamedRequestFactory implements CommonStreamedRequestFactory {
public class StreamedRequestFactoryImpl implements StreamedRequestFactory {
private static final long serialVersionUID = -2438839640443961168L;
protected final CommonODataClient<?> client;
protected AbstractStreamedRequestFactory(final CommonODataClient<?> client) {
public StreamedRequestFactoryImpl(final CommonODataClient<?> client) {
this.client = client;
}

View File

@ -1,33 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.client.core.communication.request.streamed.v3;
import org.apache.olingo.client.api.v3.ODataClient;
import org.apache.olingo.client.api.communication.request.streamed.v3.StreamedRequestFactory;
import org.apache.olingo.client.core.communication.request.streamed.AbstractStreamedRequestFactory;
public class StreamedRequestFactoryImpl extends AbstractStreamedRequestFactory
implements StreamedRequestFactory {
private static final long serialVersionUID = 2255688283995758441L;
public StreamedRequestFactoryImpl(final ODataClient client) {
super(client);
}
}

View File

@ -1,33 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.client.core.communication.request.streamed.v4;
import org.apache.olingo.client.api.v4.ODataClient;
import org.apache.olingo.client.api.communication.request.streamed.v4.StreamedRequestFactory;
import org.apache.olingo.client.core.communication.request.streamed.AbstractStreamedRequestFactory;
public class StreamedRequestFactoryImpl extends AbstractStreamedRequestFactory
implements StreamedRequestFactory {
private static final long serialVersionUID = 960862845654673053L;
public StreamedRequestFactoryImpl(final ODataClient client) {
super(client);
}
}

View File

@ -179,7 +179,7 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
// -------------------------------------------------------------
// Append edit-media links
// -------------------------------------------------------------
for (ODataLink link : odataEntity.getEditMediaLinks()) {
for (ODataLink link : odataEntity.getMediaEditLinks()) {
LOG.debug("Append edit-media link\n{}", link);
entity.getMediaEditLinks().add(getLink(link,
ResourceFactory.formatForEntityClass(reference) == ODataPubFormat.ATOM));
@ -417,9 +417,8 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
odataNavigationLinks(edmType, resource.getPayload(), entity, resource.getMetadataETag(), base);
for (Link link : resource.getPayload().getMediaEditLinks()) {
entity.addLink(new ODataLink.Builder().setVersion(client.getServiceVersion()).
setURI(URIUtils.getURI(base, link.getHref())).
setType(ODataLinkType.MEDIA_EDIT).setTitle(link.getTitle()).build());
entity.addLink(client.getObjectFactory().
newMediaEditLink(link.getTitle(), URIUtils.getURI(base, link.getHref())));
}
for (ODataOperation operation : resource.getPayload().getOperations()) {
@ -429,7 +428,7 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
if (resource.getPayload().isMediaEntity()) {
entity.setMediaEntity(true);
entity.setMediaContentSource(resource.getPayload().getMediaContentSource());
entity.setMediaContentSource(URIUtils.getURI(base, resource.getPayload().getMediaContentSource()));
entity.setMediaContentType(resource.getPayload().getMediaContentType());
entity.setMediaETag(resource.getPayload().getMediaETag());
}

View File

@ -27,7 +27,7 @@ import org.apache.olingo.client.api.communication.request.cud.v3.CUDRequestFacto
import org.apache.olingo.client.api.communication.request.cud.v3.UpdateType;
import org.apache.olingo.client.api.communication.request.invoke.InvokeRequestFactory;
import org.apache.olingo.client.api.communication.request.retrieve.v3.RetrieveRequestFactory;
import org.apache.olingo.client.api.communication.request.streamed.v3.StreamedRequestFactory;
import org.apache.olingo.client.api.communication.request.streamed.StreamedRequestFactory;
import org.apache.olingo.commons.api.op.ODataSerializer;
import org.apache.olingo.client.api.op.v3.ODataDeserializer;
import org.apache.olingo.client.api.op.v3.ODataBinder;
@ -40,7 +40,7 @@ import org.apache.olingo.client.core.communication.request.batch.v3.BatchRequest
import org.apache.olingo.client.core.communication.request.cud.v3.CUDRequestFactoryImpl;
import org.apache.olingo.client.core.communication.request.invoke.v3.InvokeRequestFactoryImpl;
import org.apache.olingo.client.core.communication.request.retrieve.v3.RetrieveRequestFactoryImpl;
import org.apache.olingo.client.core.communication.request.streamed.v3.StreamedRequestFactoryImpl;
import org.apache.olingo.client.core.communication.request.streamed.StreamedRequestFactoryImpl;
import org.apache.olingo.client.core.op.impl.v3.ODataBinderImpl;
import org.apache.olingo.client.core.op.impl.v3.ODataDeserializerImpl;
import org.apache.olingo.client.core.op.impl.v3.ODataReaderImpl;

View File

@ -27,7 +27,7 @@ import org.apache.olingo.client.api.communication.request.cud.v4.CUDRequestFacto
import org.apache.olingo.client.api.communication.request.cud.v4.UpdateType;
import org.apache.olingo.client.api.communication.request.invoke.InvokeRequestFactory;
import org.apache.olingo.client.api.communication.request.retrieve.v4.RetrieveRequestFactory;
import org.apache.olingo.client.api.communication.request.streamed.v4.StreamedRequestFactory;
import org.apache.olingo.client.api.communication.request.streamed.StreamedRequestFactory;
import org.apache.olingo.client.api.communication.request.v4.AsyncRequestFactory;
import org.apache.olingo.commons.api.op.ODataSerializer;
import org.apache.olingo.client.api.op.v4.ODataBinder;
@ -41,7 +41,7 @@ import org.apache.olingo.client.core.communication.request.batch.v4.BatchRequest
import org.apache.olingo.client.core.communication.request.cud.v4.CUDRequestFactoryImpl;
import org.apache.olingo.client.core.communication.request.invoke.v4.InvokeRequestFactoryImpl;
import org.apache.olingo.client.core.communication.request.retrieve.v4.RetrieveRequestFactoryImpl;
import org.apache.olingo.client.core.communication.request.streamed.v4.StreamedRequestFactoryImpl;
import org.apache.olingo.client.core.communication.request.streamed.StreamedRequestFactoryImpl;
import org.apache.olingo.client.core.communication.request.v4.AsyncRequestFactoryImpl;
import org.apache.olingo.client.core.op.impl.v4.ODataBinderImpl;
import org.apache.olingo.client.core.op.impl.v4.ODataDeserializerImpl;

View File

@ -55,7 +55,7 @@ public class EntityTest extends AbstractTest {
assertEquals("Microsoft.Test.OData.Services.AstoriaDefaultService.Customer", entity.getTypeName().toString());
assertTrue(entity.getEditLink().toASCIIString().endsWith("/Customer(-10)"));
assertEquals(5, entity.getNavigationLinks().size());
assertEquals(2, entity.getEditMediaLinks().size());
assertEquals(2, entity.getMediaEditLinks().size());
boolean check = false;

View File

@ -217,7 +217,7 @@ public class EntityTest extends AbstractTest {
assertFalse(entity.isMediaEntity());
final ODataLink editMedia = entity.getEditMediaLink("Photo");
final ODataLink editMedia = entity.getMediaEditLink("Photo");
assertNotNull(editMedia);
final ODataEntity written = getClient().getBinder().getODataEntity(

View File

@ -135,14 +135,14 @@ public interface Entity extends Linked, Annotatable {
*
* @return media content resource.
*/
String getMediaContentSource();
URI getMediaContentSource();
/**
* Set media content source.
*
* @param mediaContentSource media content source.
*/
void setMediaContentSource(String mediaContentSource);
void setMediaContentSource(URI mediaContentSource);
/**
* Set media content type.

View File

@ -101,14 +101,14 @@ public interface CommonODataEntity extends ODataLinked, ODataInvokeResult {
* @param name candidate link name
* @return media-edit link with given name, if available, otherwise <tt>null</tt>
*/
ODataLink getEditMediaLink(String name);
ODataLink getMediaEditLink(final String name);
/**
* Returns all entity media edit links.
* Returns entity media edit links.
*
* @return OData entity links.
*/
List<ODataLink> getEditMediaLinks();
List<ODataLink> getMediaEditLinks();
/**
* TRUE if read-only entity.
@ -150,14 +150,14 @@ public interface CommonODataEntity extends ODataLinked, ODataInvokeResult {
*
* @return media content source.
*/
String getMediaContentSource();
URI getMediaContentSource();
/**
* Sets media content source.
*
* @param mediaContentSource media content source.
*/
void setMediaContentSource(String mediaContentSource);
void setMediaContentSource(URI mediaContentSource);
/**
* ETag of the binary stream represented by this media entity or named stream property.

View File

@ -18,9 +18,9 @@
*/
package org.apache.olingo.commons.core.data;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.Link;
import org.apache.olingo.commons.api.data.Property;
@ -51,7 +51,7 @@ public abstract class AbstractEntity extends AbstractODataObject implements Enti
private final List<Property> properties = new ArrayList<Property>();
private String mediaContentSource;
private URI mediaContentSource;
private String mediaContentType;
@ -167,12 +167,12 @@ public abstract class AbstractEntity extends AbstractODataObject implements Enti
}
@Override
public String getMediaContentSource() {
public URI getMediaContentSource() {
return this.mediaContentSource;
}
@Override
public void setMediaContentSource(final String mediaContentSource) {
public void setMediaContentSource(final URI mediaContentSource) {
this.mediaContentSource = mediaContentSource;
}
@ -188,6 +188,6 @@ public abstract class AbstractEntity extends AbstractODataObject implements Enti
@Override
public boolean isMediaEntity() {
return StringUtils.isNotBlank(this.mediaContentSource);
return this.mediaContentSource != null;
}
}

View File

@ -677,7 +677,7 @@ public class AtomDeserializer extends AbstractAtomDealer {
entity.setMediaContentType(type.getValue());
final Attribute src = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATOM_ATTR_SRC));
if (src != null) {
entity.setMediaContentSource(src.getValue());
entity.setMediaContentSource(URI.create(src.getValue()));
}
}
} else if (propertiesQName.equals(event.asStartElement().getName())) {

View File

@ -309,8 +309,8 @@ public class AtomSerializer extends AbstractAtomDealer {
if (StringUtils.isNotBlank(entity.getMediaContentType())) {
writer.writeAttribute(Constants.ATTR_TYPE, entity.getMediaContentType());
}
if (StringUtils.isNotBlank(entity.getMediaContentSource())) {
writer.writeAttribute(Constants.ATOM_ATTR_SRC, entity.getMediaContentSource());
if (entity.getMediaContentSource() != null) {
writer.writeAttribute(Constants.ATOM_ATTR_SRC, entity.getMediaContentSource().toASCIIString());
}
writer.writeEndElement();

View File

@ -121,11 +121,11 @@ public class JSONEntityDeserializer extends AbstractJsonDeserializer<JSONEntityI
}
if (tree.hasNonNull(jsonMediaReadLink)) {
entity.setMediaContentSource(tree.get(jsonMediaReadLink).textValue());
entity.setMediaContentSource(URI.create(tree.get(jsonMediaReadLink).textValue()));
tree.remove(jsonMediaReadLink);
}
if (tree.hasNonNull(jsonMediaEditLink)) {
entity.setMediaContentSource(tree.get(jsonMediaEditLink).textValue());
entity.setMediaContentSource(URI.create(tree.get(jsonMediaEditLink).textValue()));
tree.remove(jsonMediaEditLink);
}
if (tree.hasNonNull(jsonMediaContentType)) {

View File

@ -26,10 +26,10 @@ import java.net.URI;
import org.apache.commons.lang3.StringUtils;
import org.apache.olingo.commons.api.Constants;
import org.apache.olingo.commons.api.data.Annotation;
import org.apache.olingo.commons.api.data.ResWrap;
import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.Link;
import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.data.ResWrap;
import org.apache.olingo.commons.api.domain.ODataOperation;
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.commons.core.edm.EdmTypeInfo;
@ -87,12 +87,20 @@ public class JSONEntitySerializer extends AbstractJsonSerializer<JSONEntityImpl>
valuable(jgen, property, property.getName());
}
if (serverMode && entity.getEditLink() != null && StringUtils.isNotBlank(entity.getEditLink().getHref())) {
final URI link = URI.create(entity.getEditLink().getHref());
final String editLink = link.isAbsolute() ? link.toASCIIString()
: URI.create(entity.getBaseURI() + "/" + link.toASCIIString()).normalize().toASCIIString();
if (serverMode) {
if (entity.getEditLink() != null && StringUtils.isNotBlank(entity.getEditLink().getHref())) {
final URI link = URI.create(entity.getEditLink().getHref());
final String editLink = link.isAbsolute() ? link.toASCIIString()
: URI.create(entity.getBaseURI() + "/" + link.toASCIIString()).normalize().toASCIIString();
jgen.writeStringField(version.getJSONMap().get(ODataServiceVersion.JSON_EDIT_LINK), editLink);
jgen.writeStringField(
version.getJSONMap().get(ODataServiceVersion.JSON_EDIT_LINK), editLink);
if (entity.isMediaEntity()) {
jgen.writeStringField(
version.getJSONMap().get(ODataServiceVersion.JSON_MEDIAREAD_LINK), editLink + "/$value");
}
}
}
links(entity, jgen);

View File

@ -56,7 +56,7 @@ public abstract class AbstractODataEntity extends AbstractODataPayload implement
/**
* In case of media entity, media content source.
*/
private String mediaContentSource;
private URI mediaContentSource;
/**
* Media ETag.
@ -81,7 +81,7 @@ public abstract class AbstractODataEntity extends AbstractODataPayload implement
/**
* Media edit links.
*/
private final List<ODataLink> editMediaLinks = new ArrayList<ODataLink>();
private final List<ODataLink> mediaEditLinks = new ArrayList<ODataLink>();
/**
* Operations (legacy, functions, actions).
@ -89,7 +89,7 @@ public abstract class AbstractODataEntity extends AbstractODataPayload implement
private final List<ODataOperation> operations = new ArrayList<ODataOperation>();
public AbstractODataEntity(final FullQualifiedName typeName) {
super(typeName == null? null: typeName.toString());
super(typeName == null ? null : typeName.toString());
this.typeName = typeName;
}
@ -160,7 +160,7 @@ public abstract class AbstractODataEntity extends AbstractODataPayload implement
break;
case MEDIA_EDIT:
result = editMediaLinks.contains(link) ? false : editMediaLinks.add(link);
result = mediaEditLinks.contains(link) ? false : mediaEditLinks.add(link);
break;
default:
@ -171,7 +171,7 @@ public abstract class AbstractODataEntity extends AbstractODataPayload implement
@Override
public boolean removeLink(final ODataLink link) {
return associationLinks.remove(link) || navigationLinks.remove(link) || editMediaLinks.remove(link);
return associationLinks.remove(link) || navigationLinks.remove(link);
}
private ODataLink getLink(final List<ODataLink> links, final String name) {
@ -206,13 +206,13 @@ public abstract class AbstractODataEntity extends AbstractODataPayload implement
}
@Override
public ODataLink getEditMediaLink(final String name) {
return getLink(editMediaLinks, name);
public ODataLink getMediaEditLink(final String name) {
return getLink(mediaEditLinks, name);
}
@Override
public List<ODataLink> getEditMediaLinks() {
return editMediaLinks;
public List<ODataLink> getMediaEditLinks() {
return mediaEditLinks;
}
@Override
@ -256,12 +256,12 @@ public abstract class AbstractODataEntity extends AbstractODataPayload implement
}
@Override
public String getMediaContentSource() {
public URI getMediaContentSource() {
return mediaContentSource;
}
@Override
public void setMediaContentSource(final String mediaContentSource) {
public void setMediaContentSource(final URI mediaContentSource) {
this.mediaContentSource = mediaContentSource;
}