blob: 99772196215f18348528f587acebf2e8cb11d6a4 [file] [log] [blame]
/*******************************************************************************
* 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.odata2.jpa.processor.core;
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 org.apache.olingo.odata2.api.edm.Edm;
import org.apache.olingo.odata2.api.edm.EdmEntitySet;
import org.apache.olingo.odata2.api.ep.EntityProvider;
import org.apache.olingo.odata2.api.ep.EntityProviderException;
import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties;
import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
import org.apache.olingo.odata2.api.exception.ODataBadRequestException;
import org.apache.olingo.odata2.api.exception.ODataException;
import org.apache.olingo.odata2.api.processor.ODataContext;
import org.apache.olingo.odata2.api.uri.PathSegment;
import org.apache.olingo.odata2.api.uri.UriInfo;
import org.apache.olingo.odata2.api.uri.UriParser;
import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
public final class ODataEntityParser {
private ODataJPAContext context;
private Edm edm;
private String serviceRoot = null;
public ODataEntityParser(final ODataJPAContext context) {
this.context = context;
try {
serviceRoot = context.getODataContext().getPathInfo().getServiceRoot().toString();
} catch (ODataException e) {
serviceRoot = "";
}
}
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 parseURISegmentWithCustomOptions(final int segmentFromIndex, final int segmentToIndex,
final Map<String, String> options) throws ODataJPARuntimeException {
UriInfo uriInfo = null;
if (segmentFromIndex == segmentToIndex || segmentFromIndex > segmentToIndex || segmentFromIndex < 0) {
return uriInfo;
}
try {
edm = getEdm();
List<PathSegment> pathSegments = context.getODataContext().getPathInfo().getODataSegments();
List<PathSegment> subPathSegments = pathSegments.subList(segmentFromIndex, segmentToIndex);
uriInfo = UriParser.parse(edm, subPathSegments, options);
} catch (ODataException e) {
throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
}
return uriInfo;
}
public final UriInfo parseURISegment(final int segmentFromIndex, final int segmentToIndex)
throws ODataJPARuntimeException {
UriInfo uriInfo = null;
if (segmentFromIndex == segmentToIndex || segmentFromIndex > segmentToIndex || segmentFromIndex < 0) {
return uriInfo;
}
try {
edm = getEdm();
List<PathSegment> pathSegments = context.getODataContext().getPathInfo().getODataSegments();
List<PathSegment> subPathSegments = pathSegments.subList(segmentFromIndex, segmentToIndex);
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 List<PathSegment> pathSegment = getPathSegment(path);
edm = getEdm();
uri = UriParser.parse(edm, pathSegment, Collections.<String, String> emptyMap());
} catch (ODataException e) {
throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
}
return uri;
}
public UriInfo parseLinkSegments(final List<String> linkSegments, final Map<String, String> options)
throws ODataJPARuntimeException {
List<PathSegment> pathSegments = new ArrayList<PathSegment>();
for (String link : linkSegments) {
List<PathSegment> pathSegment = getPathSegment(link);
pathSegments.addAll(pathSegment);
}
UriInfo uriInfo = null;
try {
edm = getEdm();
uriInfo = UriParser.parse(edm, pathSegments, options);
} catch (ODataException e) {
throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
}
return uriInfo;
}
public UriInfo parseBindingLink(final String link, final Map<String, String> options)
throws ODataJPARuntimeException {
final List<PathSegment> pathSegment = getPathSegment(link);
UriInfo uriInfo = null;
try {
edm = getEdm();
uriInfo = UriParser.parse(edm, pathSegment, options);
} catch (ODataException e) {
throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
}
return uriInfo;
}
private Edm getEdm() throws ODataException {
if (edm == null) {
edm = context.getODataContext().getService().getEntityDataModel();
}
return edm;
}
private List<PathSegment> getPathSegment(final String path) {
String trimmedPath = path.replace(serviceRoot, "");
final String[] splittedPath = trimmedPath.split("/");
final List<PathSegment> pathSegments = new ArrayList<PathSegment>();
for (final String pathSegmentString : splittedPath) {
final PathSegment pathSegment = new PathSegment() {
@Override
public String getPath() {
return pathSegmentString;
}
@Override
public Map<String, List<String>> getMatrixParameters() {
return null;
}
};
pathSegments.add(pathSegment);
}
return pathSegments;
}
}