package com.sap.core.odata.processor.core.jpa; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import com.sap.core.odata.api.edm.Edm; import com.sap.core.odata.api.edm.EdmEntitySet; import com.sap.core.odata.api.ep.EntityProvider; import com.sap.core.odata.api.ep.EntityProviderException; import com.sap.core.odata.api.ep.EntityProviderReadProperties; import com.sap.core.odata.api.ep.entry.ODataEntry; import com.sap.core.odata.api.exception.ODataBadRequestException; import com.sap.core.odata.api.exception.ODataException; import com.sap.core.odata.api.processor.ODataContext; import com.sap.core.odata.api.uri.PathSegment; import com.sap.core.odata.api.uri.UriInfo; import com.sap.core.odata.api.uri.UriParser; import com.sap.core.odata.processor.api.jpa.ODataJPAContext; import com.sap.core.odata.processor.api.jpa.exception.ODataJPARuntimeException; public final class ODataEntityParser { private ODataJPAContext context; public ODataEntityParser(final ODataJPAContext context) { this.context = context; } public final ODataEntry parseEntry(final EdmEntitySet entitySet, final InputStream content, final String requestContentType, final boolean merge) throws ODataBadRequestException { ODataEntry entryValues; try { EntityProviderReadProperties entityProviderProperties = EntityProviderReadProperties.init().mergeSemantic(merge).build(); entryValues = EntityProvider.readEntry(requestContentType, entitySet, content, entityProviderProperties); } catch (EntityProviderException e) { throw new ODataBadRequestException(ODataBadRequestException.BODY, e); } return entryValues; } public final UriInfo parseLinkURI() throws ODataJPARuntimeException { UriInfo uriInfo = null; Edm edm; try { edm = context.getODataContext().getService().getEntityDataModel(); List<PathSegment> pathSegments = context.getODataContext().getPathInfo().getODataSegments(); List<PathSegment> subPathSegments = pathSegments.subList(0, pathSegments.size() - 2); uriInfo = UriParser.parse(edm, subPathSegments, Collections.<String, String> emptyMap()); } catch (ODataException e) { throw ODataJPARuntimeException .throwException(ODataJPARuntimeException.GENERAL .addContent(e.getMessage()), e); } return uriInfo; } public final UriInfo parseLink(final EdmEntitySet entitySet, final InputStream content, final String contentType) throws ODataJPARuntimeException { String uriString = null; UriInfo uri = null; try { uriString = EntityProvider.readLink(contentType, entitySet, content); ODataContext odataContext = context.getODataContext(); final String serviceRoot = odataContext.getPathInfo().getServiceRoot().toString(); final String path = uriString.startsWith(serviceRoot.toString()) ? uriString.substring(serviceRoot.length()) : uriString; final PathSegment pathSegment = new PathSegment() { @Override public String getPath() { return path; } @Override public Map<String, List<String>> getMatrixParameters() { return null; } }; final Edm edm = odataContext.getService().getEntityDataModel(); uri = UriParser.parse(edm, Arrays.asList(pathSegment), Collections.<String, String> emptyMap()); } catch (ODataException e) { throw ODataJPARuntimeException .throwException(ODataJPARuntimeException.GENERAL .addContent(e.getMessage()), e); } return uri; } public List<UriInfo> parseLinks(final EdmEntitySet entitySet, final InputStream content, final String contentType) throws ODataJPARuntimeException { List<String> uriList = new ArrayList<String>(); List<UriInfo> uriInfoList = new ArrayList<UriInfo>(); try { uriList = EntityProvider.readLinks(contentType, entitySet, content); ODataContext odataContext = context.getODataContext(); final String serviceRoot = odataContext.getPathInfo().getServiceRoot().toString(); final int length = serviceRoot.length(); final Edm edm = odataContext.getService().getEntityDataModel(); for (String uriString : uriList) { final String path = uriString.startsWith(serviceRoot) ? uriString.substring(length) : uriString; final PathSegment pathSegment = new PathSegment() { @Override public String getPath() { return path; } @Override public Map<String, List<String>> getMatrixParameters() { return null; } }; UriInfo uriInfo = UriParser.parse(edm, Arrays.asList(pathSegment), Collections.<String, String> emptyMap()); uriInfoList.add(uriInfo); } } catch (EntityProviderException e) { return null; } catch (ODataException e) { throw ODataJPARuntimeException .throwException(ODataJPARuntimeException.GENERAL .addContent(e.getMessage()), e); } return uriInfoList; } }