You are viewing a plain text version of this content. The canonical link for it is here .
Posted to commits@olingo.apache.org by ch...@apache.org on 2014/01/12 18:39:39 UTC[2/2] git commit: [OLINGO-49],
[OLINGO-51] Support for A) Linking entities using tag within
an OData Entry B) Updating links C) Deleting links D) Code Cleanup [OLINGO-49],[OLINGO-51]
Support for
A) Linking entities using <link> tag within an OData Entry
B) Updating links
C) Deleting links
D) Code Cleanup
Signed-off-by: Chandan V A <ch...@sap.com>
Project: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/commit/886d283d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/tree/886d283d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/diff/886d283d
Branch: refs/heads/master
Commit: 886d283dad40aa98d27a6d47b145063ea9626316
Parents: 2fb8b04
Author: Chandan V A <ch...@sap.com>
Authored: Sun Jan 12 23:09:04 2014 +0530
Committer: Chandan V A <ch...@sap.com>
Committed: Sun Jan 12 23:09:04 2014 +0530
----------------------------------------------------------------------
.../jpa/processor/api/ODataJPAProcessor.java | 2 +-
.../api/factory/JPQLBuilderFactory.java | 2 +-
.../api/model/JPAEdmComplexTypeView.java | 4 +-
.../processor/api/model/JPAEdmPropertyView.java | 9 +
.../jpa/processor/core/ODataEntityParser.java | 127 ++++----
.../core/ODataJPAProcessorDefault.java | 8 +
.../processor/core/access/data/JPAEntity.java | 28 +-
.../jpa/processor/core/access/data/JPALink.java | 318 ++++++++++++-------
.../core/access/data/JPAProcessorImpl.java | 18 +-
.../access/model/JPAEdmMappingModelService.java | 2 +-
.../core/access/model/JPAEdmNameBuilder.java | 9 +-
.../processor/core/model/JPAEdmMappingImpl.java | 1 -
.../processor/core/model/JPAEdmProperty.java | 81 +++--
.../core/model/JPAEdmReferentialConstraint.java | 2 +-
.../model/JPAEdmReferentialConstraintRole.java | 2 +-
.../processor/core/ODataEntityParserTest.java | 226 +++++++++++++
.../core/ODataExpressionParserTest.java | 1 -
.../processor/core/ODataJPAContextImplTest.java | 1 -
.../core/ODataJPAProcessorDefaultTest.java | 2 +-
.../core/access/data/JPAEntityParserTest.java | 1 -
.../JPAEntityParserTestForStaticMethods.java | 1 -
.../core/access/data/JPAEntityTest.java | 3 +-
.../core/access/data/JPAExpandCallBackTest.java | 1 -
.../access/data/JPAFunctionContextTest.java | 1 -
.../processor/core/access/data/JPALinkTest.java | 5 +
.../core/access/data/JPAProcessorImplTest.java | 2 +-
.../model/JPAEdmMappingModelServiceTest.java | 1 -
.../access/model/JPAEdmNameBuilderTest.java | 2 -
.../core/access/model/JPATypeConvertorTest.java | 1 -
.../edm/ODataJPAEdmProviderNegativeTest.java | 1 -
.../core/edm/ODataJPAEdmProviderTest.java | 1 -
.../core/jpql/JPQLBuilderFactoryTest.java | 6 +-
.../core/jpql/JPQLJoinContextTest.java | 1 -
.../jpql/JPQLJoinSelectSingleContextTest.java | 1 -
...PQLJoinSelectSingleStatementBuilderTest.java | 1 -
.../core/jpql/JPQLJoinStatementBuilderTest.java | 1 -
.../core/jpql/JPQLSelectContextImplTest.java | 1 -
.../jpql/JPQLSelectSingleContextImplTest.java | 1 -
.../JPQLSelectSingleStatementBuilderTest.java | 4 +-
.../jpql/JPQLSelectStatementBuilderTest.java | 4 +-
.../processor/core/mock/ODataContextMock.java | 48 +++
.../core/mock/ODataJPAContextMock.java | 15 +
.../processor/core/mock/ODataServiceMock.java | 106 +++++++
.../jpa/processor/core/mock/PathInfoMock.java | 51 +++
.../processor/core/mock/PathSegmentMock.java | 44 +++
.../processor/core/mock/data/EdmMockUtilV2.java | 27 +-
.../core/model/JPAEdmAssociationEndTest.java | 1 -
.../core/model/JPAEdmAssociationSetTest.java | 1 -
.../core/model/JPAEdmAssociationTest.java | 5 +-
.../core/model/JPAEdmBaseViewImplTest.java | 1 -
.../core/model/JPAEdmComplexTypeTest.java | 2 -
.../core/model/JPAEdmEntityContainerTest.java | 1 -
.../core/model/JPAEdmEntitySetTest.java | 1 -
.../core/model/JPAEdmEntityTypeTest.java | 1 -
.../core/model/JPAEdmFunctionImportTest.java | 1 -
.../jpa/processor/core/model/JPAEdmKeyTest.java | 1 -
.../processor/core/model/JPAEdmModelTest.java | 1 -
.../model/JPAEdmNavigationPropertyTest.java | 1 -
.../core/model/JPAEdmPropertyTest.java | 5 +-
.../JPAEdmReferentialConstraintRoleTest.java | 2 -
.../model/JPAEdmReferentialConstraintTest.java | 1 -
.../processor/core/model/JPAEdmSchemaTest.java | 1 -
.../core/model/JPAEdmTestModelView.java | 10 +-
.../core/model/_JPAEdmFunctionImportTest.java | 1 -
.../odata2/jpa/processor/ref/model/Address.java | 4 +-
.../jpa/processor/ref/model/Category.java | 10 +-
.../jpa/processor/ref/model/Customer.java | 6 +-
.../jpa/processor/ref/model/Material.java | 14 +-
.../processor/ref/model/SalesOrderHeader.java | 4 +-
.../src/main/resources/META-INF/persistence.xml | 4 +-
.../jpa/processor/ref/extension/OrderValue.java | 4 +-
.../SalesOrderProcessingExtension.java | 12 +-
72 files changed, 959 insertions(+), 310 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAProcessor.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAProcessor.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAProcessor.java
index d08eee9..127c79a 100644
--- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAProcessor.java
+++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAProcessor.java
@@ -28,7 +28,7 @@ import org.apache.olingo.odata2.jpa.processor.api.factory.ODataJPAFactory;
* behavior of OData JPA Processor library has to be overwritten.
*
* The class encapsulates a default processor for handling OData requests and
- * a default builder to build an OData response.
+ * a default builder to build an OData response.
*
*/
public abstract class ODataJPAProcessor extends ODataSingleProcessor {
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/factory/JPQLBuilderFactory.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/factory/JPQLBuilderFactory.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/factory/JPQLBuilderFactory.java
index 4880257..08aea25 100644
--- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/factory/JPQLBuilderFactory.java
+++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/factory/JPQLBuilderFactory.java
@@ -19,9 +19,9 @@
package org.apache.olingo.odata2.jpa.processor.api.factory;
import org.apache.olingo.odata2.jpa.processor.api.access.JPAMethodContext.JPAMethodContextBuilder;
+import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLContext.JPQLContextBuilder;
import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLContextType;
import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLContextView;
-import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLContext.JPQLContextBuilder;
import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLStatement.JPQLStatementBuilder;
/**
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmComplexTypeView.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmComplexTypeView.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmComplexTypeView.java
index 8b087c8..3b5a884 100644
--- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmComplexTypeView.java
+++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmComplexTypeView.java
@@ -126,11 +126,11 @@ public interface JPAEdmComplexTypeView extends JPAEdmBaseView {
*
*/
public boolean isReferencedInKey(String complexTypeName);
-
+
/**
* The method sets the given EDM complex type as referenced in an Entity as a key property
* @param complexTypeName
- * EDM complex Type name
+ * EDM complex Type name
*/
public void setReferencedInKey(String complexTypeName);
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmPropertyView.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmPropertyView.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmPropertyView.java
index c363844..ce06f68 100644
--- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmPropertyView.java
+++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmPropertyView.java
@@ -80,6 +80,15 @@ public interface JPAEdmPropertyView extends JPAEdmBaseView {
Attribute<?, ?> getJPAAttribute();
/**
+ * The method returns a JPA Attribute referenced by a JPA Attribute in the {@link javax.persistence.JoinColumn}
+ * annotation for the given JPA entity type .
+ *
+ * @return an instance of type {@link javax.persistence.metamodel.Attribute
+ * <?, ?>}
+ */
+ Attribute<?, ?> getJPAReferencedAttribute();
+
+ /**
* The method returns a JPA EDM navigation property view.
*
* @return an instance of type {@link org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmNavigationPropertyView}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParser.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParser.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParser.java
index 3823e2c..dccfc6c 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParser.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParser.java
@@ -43,6 +43,7 @@ import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeExcep
public final class ODataEntityParser {
private ODataJPAContext context;
+ private Edm edm;
public ODataEntityParser(final ODataJPAContext context) {
this.context = context;
@@ -63,21 +64,37 @@ public final class ODataEntityParser {
}
- public final UriInfo parseLinkURI() throws ODataJPARuntimeException {
+ public final UriInfo parseURISegmentWithCustomOptions(final int segmentFromIndex, final int segmentToIndex,
+ final Map<String, String> options) throws ODataJPARuntimeException {
UriInfo uriInfo = null;
-
- Edm edm;
+ if (segmentFromIndex == segmentToIndex || segmentFromIndex > segmentToIndex || segmentFromIndex < 0) {
+ return uriInfo;
+ }
try {
- edm = context.getODataContext().getService().getEntityDataModel();
-
+ edm = getEdm();
List<PathSegment> pathSegments = context.getODataContext().getPathInfo().getODataSegments();
- List<PathSegment> subPathSegments = pathSegments.subList(0, pathSegments.size() - 2);
+ 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;
}
@@ -86,78 +103,70 @@ public final class ODataEntityParser {
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();
-
+ final PathSegment pathSegment = getPathSegment(path);
+ edm = getEdm();
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)
+ public UriInfo parseLinkSegments(final List<String> linkSegments, final Map<String, String> options)
throws ODataJPARuntimeException {
-
- List<String> uriList = new ArrayList<String>();
- List<UriInfo> uriInfoList = new ArrayList<UriInfo>();
-
+ List<PathSegment> pathSegments = new ArrayList<PathSegment>();
+ for (String link : linkSegments) {
+ PathSegment pathSegment = getPathSegment(link);
+ pathSegments.add(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;
+ }
- 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;
+ public UriInfo parseBindingLink(final String link, final Map<String, String> options) throws ODataJPARuntimeException {
+ final PathSegment pathSegment = getPathSegment(link);
+ UriInfo uriInfo = null;
+ try {
+ edm = getEdm();
+ uriInfo = UriParser.parse(edm, Arrays.asList(pathSegment), options);
} catch (ODataException e) {
throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
}
+ return uriInfo;
+ }
- return uriInfoList;
+ private Edm getEdm() throws ODataException {
+ if (edm == null) {
+ edm = context.getODataContext().getService().getEntityDataModel();
+ }
+ return edm;
}
+ private PathSegment getPathSegment(final String path) {
+ final PathSegment pathSegment = new PathSegment() {
+
+ @Override
+ public String getPath() {
+ return path;
+ }
+
+ @Override
+ public Map<String, List<String>> getMatrixParameters() {
+ return null;
+ }
+ };
+ return pathSegment;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefault.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefault.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefault.java
index 96782b8..f59edf9 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefault.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefault.java
@@ -191,4 +191,12 @@ public class ODataJPAProcessorDefault extends ODataJPAProcessor {
return ODataResponse.newBuilder().build();
}
+ @Override
+ public ODataResponse deleteEntityLink(final DeleteUriInfo uriParserResultView, final String contentType)
+ throws ODataException {
+
+ jpaProcessor.process(uriParserResultView, contentType);
+ return ODataResponse.newBuilder().build();
+
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
index 6a3ab60..64b6f92 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
@@ -100,11 +100,20 @@ public class JPAEntity {
jpaEntityParser.getJPAEmbeddableKeyMap(jpaEntity.getClass().getName());
Set<String> propertyNames = null;
if (embeddableKeys != null) {
- setEmbeddableKeyProperty(embeddableKeys, oDataEntityType.getKeyProperties(), oDataEntryProperties, jpaEntity);
+ List<String> processedKeys =
+ setEmbeddableKeyProperty(embeddableKeys, oDataEntityType.getKeyProperties(), oDataEntryProperties,
+ jpaEntity);
+
propertyNames = new HashSet<String>();
propertyNames.addAll(oDataEntryProperties.keySet());
- for (String propertyName : oDataEntityType.getKeyPropertyNames()) {
- propertyNames.remove(propertyName);
+ if (processedKeys.isEmpty()) {
+ for (String key : embeddableKeys.keySet()) {
+ propertyNames.remove(key);
+ }
+ } else {
+ for (String propertyName : processedKeys) {
+ propertyNames.remove(propertyName);
+ }
}
} else {
propertyNames = oDataEntryProperties.keySet();
@@ -212,7 +221,7 @@ public class JPAEntity {
.throwException(ODataJPARuntimeException.GENERAL, null);
}
Map<String, Object> oDataEntryProperties = oDataEntry.getProperties();
- if(oDataEntry.containsInlineEntry()){
+ if (oDataEntry.containsInlineEntry()) {
normalizeInlineEntries(oDataEntryProperties);
}
write(oDataEntryProperties, false);
@@ -279,7 +288,7 @@ public class JPAEntity {
}
}
- protected void setEmbeddableKeyProperty(final HashMap<String, String> embeddableKeys,
+ protected List<String> setEmbeddableKeyProperty(final HashMap<String, String> embeddableKeys,
final List<EdmProperty> oDataEntryKeyProperties,
final Map<String, Object> oDataEntryProperties, final Object entity)
throws ODataJPARuntimeException, EdmException, IllegalAccessException, IllegalArgumentException,
@@ -288,6 +297,7 @@ public class JPAEntity {
HashMap<String, Object> embeddableObjMap = new HashMap<String, Object>();
List<EdmProperty> leftODataEntryKeyProperties = new ArrayList<EdmProperty>();
HashMap<String, String> leftEmbeddableKeys = new HashMap<String, String>();
+ List<String> processedKeys = new ArrayList<String>();
for (EdmProperty edmProperty : oDataEntryKeyProperties) {
if (oDataEntryProperties.containsKey(edmProperty.getName()) == false) {
@@ -296,6 +306,9 @@ public class JPAEntity {
String edmPropertyName = edmProperty.getName();
String embeddableKeyNameComposite = embeddableKeys.get(edmPropertyName);
+ if (embeddableKeyNameComposite == null) {
+ continue;
+ }
String embeddableKeyNameSplit[] = embeddableKeyNameComposite.split("\\.");
String methodPartName = null;
Method method = null;
@@ -320,10 +333,13 @@ public class JPAEntity {
leftODataEntryKeyProperties.add(edmProperty);
leftEmbeddableKeys
.put(edmPropertyName, embeddableKeyNameComposite.split(embeddableKeyNameSplit[0] + ".", 2)[1]);
- setEmbeddableKeyProperty(leftEmbeddableKeys, leftODataEntryKeyProperties, oDataEntryProperties, embeddableObj);
+ processedKeys.addAll(setEmbeddableKeyProperty(leftEmbeddableKeys, leftODataEntryKeyProperties,
+ oDataEntryProperties, embeddableObj));
}
+ processedKeys.add(edmPropertyName);
}
+ return processedKeys;
}
protected Object instantiateJPAEntity() throws InstantiationException, IllegalAccessException {
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
index 40e0792..f3b821b 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
@@ -22,6 +22,8 @@ import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
import java.util.List;
import javax.persistence.EntityManager;
@@ -30,7 +32,14 @@ import javax.persistence.EntityTransaction;
import org.apache.olingo.odata2.api.edm.EdmEntitySet;
import org.apache.olingo.odata2.api.edm.EdmException;
import org.apache.olingo.odata2.api.edm.EdmNavigationProperty;
+import org.apache.olingo.odata2.api.edm.EdmSimpleType;
+import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
+import org.apache.olingo.odata2.api.exception.ODataException;
+import org.apache.olingo.odata2.api.uri.KeyPredicate;
+import org.apache.olingo.odata2.api.uri.NavigationSegment;
import org.apache.olingo.odata2.api.uri.UriInfo;
+import org.apache.olingo.odata2.api.uri.info.DeleteUriInfo;
+import org.apache.olingo.odata2.api.uri.info.GetEntitySetUriInfo;
import org.apache.olingo.odata2.api.uri.info.GetEntityUriInfo;
import org.apache.olingo.odata2.api.uri.info.PostUriInfo;
import org.apache.olingo.odata2.api.uri.info.PutMergePatchUriInfo;
@@ -43,6 +52,11 @@ import org.apache.olingo.odata2.jpa.processor.core.ODataEntityParser;
public class JPALink {
+ private static final String SPACE = " ";
+ private static final String ODATA_COMMAND_FILTER = "$filter";
+ private static final String ODATA_OPERATOR_AND = "and";
+ private static final String ODATA_OPERATOR_NE = "ne";
+
private ODataJPAContext context;
private JPAProcessor jpaProcessor;
private ODataEntityParser parser;
@@ -59,80 +73,106 @@ public class JPALink {
sourceJPAEntity = jpaEntity;
}
- public void create(final PostUriInfo uriInfo, final InputStream content, final String requestContentType,
- final String contentType) throws ODataJPARuntimeException, ODataJPAModelException {
+ public void setTargetJPAEntity(final Object jpaEntity) {
+ targetJPAEntity = jpaEntity;
+ }
- EdmEntitySet targetEntitySet = uriInfo.getTargetEntitySet();
- String targerEntitySetName;
- EdmNavigationProperty navigationProperty = null;
- try {
- targerEntitySetName = targetEntitySet.getName();
- } catch (EdmException e) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
- }
+ public Object getTargetJPAEntity() {
+ return targetJPAEntity;
+ }
+
+ public Object getSourceJPAEntity() {
+ return sourceJPAEntity;
+ }
- List<UriInfo> uriInfoList = new ArrayList<UriInfo>();
+ public void create(final PostUriInfo uriInfo, final InputStream content, final String requestContentType,
+ final String contentType) throws ODataJPARuntimeException, ODataJPAModelException {
+ modifyLink((UriInfo) uriInfo, content, requestContentType, contentType);
+ }
- if (((UriInfo) uriInfo).isLinks()) {
- UriInfo getUriInfo = parser.parseLink(targetEntitySet, content, requestContentType);
- uriInfoList = new ArrayList<UriInfo>();
- uriInfoList.add(getUriInfo);
- navigationProperty = uriInfo.getNavigationSegments().get(0).getNavigationProperty();
- } else {
- uriInfoList = parser.parseLinks(targetEntitySet, content, contentType);
- }
+ public void update(final PutMergePatchUriInfo putUriInfo, final InputStream content, final String requestContentType,
+ final String contentType) throws ODataJPARuntimeException, ODataJPAModelException {
+ modifyLink((UriInfo) putUriInfo, content, requestContentType, contentType);
+ }
- if (uriInfoList == null) {
- return;
- }
+ public void delete(final DeleteUriInfo uriInfo) throws ODataJPARuntimeException {
try {
- for (UriInfo getUriInfo : uriInfoList) {
- if (!getUriInfo.getTargetEntitySet().getName().equals(targerEntitySetName)) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.RELATIONSHIP_INVALID, null);
- }
- if (!((UriInfo) uriInfo).isLinks()) {
- navigationProperty = getUriInfo.getNavigationSegments().get(0).getNavigationProperty();
+ int index = context.getODataContext().getPathInfo().getODataSegments().size() - 2;
+
+ List<String> linkSegments = new ArrayList<String>();
+ String customLinkSegment = context.getODataContext().getPathInfo().getODataSegments().get(0).getPath();
+ linkSegments.add(customLinkSegment);
+ customLinkSegment = uriInfo.getNavigationSegments().get(0).getNavigationProperty().getName();
+ linkSegments.add(customLinkSegment);
+
+ HashMap<String, String> options = new HashMap<String, String>();
+ List<KeyPredicate> keyPredicates = uriInfo.getNavigationSegments().get(0).getKeyPredicates();
+ StringBuffer condition = new StringBuffer();
+ String literal = null;
+ KeyPredicate keyPredicate = null;
+ int size = keyPredicates.size();
+ for (int i = 0; i < size; i++) {
+ keyPredicate = keyPredicates.get(i);
+
+ literal = ((EdmSimpleType) keyPredicate.getProperty().getType()).toUriLiteral(keyPredicate.getLiteral());
+ condition.append(keyPredicate.getProperty().getName()).append(SPACE);
+ condition.append(ODATA_OPERATOR_NE).append(SPACE);
+ condition.append(literal).append(SPACE);
+ if (i != size - 1) {
+ condition.append(ODATA_OPERATOR_AND).append(SPACE);
}
+ }
+ options.put(ODATA_COMMAND_FILTER, condition.toString());
- targetJPAEntity = jpaProcessor.process((GetEntityUriInfo) getUriInfo);
- if (targetJPAEntity != null && ((UriInfo) uriInfo).isLinks()) {
- getUriInfo = parser.parseLinkURI();
- sourceJPAEntity = jpaProcessor.process((GetEntityUriInfo) getUriInfo);
- if (sourceJPAEntity == null) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.RESOURCE_X_NOT_FOUND
- .addContent(getUriInfo.getTargetEntitySet().getName()), null);
- }
+ UriInfo parsedUriInfo = parser.parseLinkSegments(linkSegments, options);
+ List<Object> relatedEntities = jpaProcessor.process((GetEntitySetUriInfo) parsedUriInfo);
+
+ parsedUriInfo = parser.parseURISegment(0, index);
+ if (parsedUriInfo != null) {
+ targetJPAEntity = jpaProcessor.process((GetEntityUriInfo) parsedUriInfo);
+ if (targetJPAEntity == null) {
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.RESOURCE_X_NOT_FOUND
+ .addContent(parsedUriInfo.getTargetEntitySet().getName()), null);
}
+ NavigationSegment navigationSegment = uriInfo.getNavigationSegments().get(0);
+ EdmNavigationProperty navigationProperty = navigationSegment.getNavigationProperty();
+ delinkJPAEntities(targetJPAEntity, relatedEntities, navigationProperty);
+ }
- JPAEntityParser entityParser = new JPAEntityParser();
- Method setMethod =
- entityParser.getAccessModifier(sourceJPAEntity, navigationProperty, JPAEntityParser.ACCESS_MODIFIER_SET);
+ } catch (EdmException e) {
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
+ } catch (ODataException e) {
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
+ }
+ }
- Method getMethod =
- entityParser.getAccessModifier(sourceJPAEntity, navigationProperty, JPAEntityParser.ACCESS_MODIFIER_GET);
+ private void delinkJPAEntities(final Object targetJPAEntity,
+ final List<Object> relatedJPAEntities,
+ final EdmNavigationProperty targetNavigationProperty)
+ throws ODataJPARuntimeException {
- if (getMethod.getReturnType().getTypeParameters() != null) {
- @SuppressWarnings("unchecked")
- List<Object> relatedEntities = (List<Object>) getMethod.invoke(sourceJPAEntity);
- relatedEntities.add(targetJPAEntity);
- setMethod.invoke(sourceJPAEntity, relatedEntities);
- } else {
- setMethod.invoke(sourceJPAEntity, targetJPAEntity);
- }
+ try {
+ JPAEntityParser entityParser = new JPAEntityParser();
+ Method setMethod = entityParser.getAccessModifier(targetJPAEntity,
+ targetNavigationProperty, JPAEntityParser.ACCESS_MODIFIER_SET);
+
+ Method getMethod = entityParser.getAccessModifier(targetJPAEntity,
+ targetNavigationProperty, JPAEntityParser.ACCESS_MODIFIER_GET);
+
+ if (getMethod.getReturnType().getTypeParameters() != null
+ && getMethod.getReturnType().getTypeParameters().length != 0) {
+ setMethod.invoke(targetJPAEntity, relatedJPAEntities);
+ } else {
+ setMethod.invoke(targetJPAEntity, (Object) null);
}
} catch (IllegalAccessException e) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
- } catch (IllegalArgumentException e) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
} catch (InvocationTargetException e) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
- } catch (EdmException e) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
}
- }
- public void delete() {}
+ }
public void save() {
EntityManager em = context.getEntityManager();
@@ -140,86 +180,128 @@ public class JPALink {
if (!tx.isActive()) {
em.getTransaction().begin();
- em.persist(sourceJPAEntity);
+ if (sourceJPAEntity != null) {
+ em.persist(sourceJPAEntity);
+ }
+ if (targetJPAEntity != null) {
+ em.persist(targetJPAEntity);
+ em.flush();
+ }
em.getTransaction().commit();
}
}
- public void update(final PutMergePatchUriInfo putUriInfo, final InputStream content, final String requestContentType,
- final String contentType) throws ODataJPARuntimeException, ODataJPAModelException {
- UriInfo uriInfo = (UriInfo) putUriInfo;
-
- EdmEntitySet targetEntitySet = uriInfo.getTargetEntitySet();
- String targerEntitySetName;
- EdmNavigationProperty navigationProperty = null;
+ public void create(final PostUriInfo uriInfo, final ODataEntry oDataEntry) throws ODataJPARuntimeException,
+ ODataJPAModelException {
try {
- targerEntitySetName = targetEntitySet.getName();
- } catch (EdmException e) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
- }
+ EdmEntitySet targetEntitySet = uriInfo.getTargetEntitySet();
+ int index = context.getODataContext().getPathInfo().getODataSegments().size() - 2;
+ UriInfo parsedUriInfo = parser.parseURISegment(index, index + 1);
+ Object targetJPAEntity = null;
+
+ if (parsedUriInfo != null) {
+ targetJPAEntity = jpaProcessor.process((GetEntityUriInfo) parsedUriInfo);
+ if (targetJPAEntity == null) {
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.RESOURCE_X_NOT_FOUND
+ .addContent(parsedUriInfo.getTargetEntitySet().getName()), null);
+ }
+ linkJPAEntities(sourceJPAEntity, targetJPAEntity, uriInfo.getNavigationSegments().get(0)
+ .getNavigationProperty());
+ }
- List<UriInfo> uriInfoList = new ArrayList<UriInfo>();
+ List<String> navPropertyNames;
+ navPropertyNames = targetEntitySet.getEntityType().getNavigationPropertyNames();
- if (((UriInfo) uriInfo).isLinks()) {
- UriInfo getUriInfo = parser.parseLink(targetEntitySet, content, requestContentType);
- uriInfoList = new ArrayList<UriInfo>();
- uriInfoList.add(getUriInfo);
- navigationProperty = uriInfo.getNavigationSegments().get(0).getNavigationProperty();
- } else {
- uriInfoList = parser.parseLinks(targetEntitySet, content, contentType);
- }
+ for (String navPropertyName : navPropertyNames) {
+ List<String> links = oDataEntry.getMetadata().getAssociationUris(navPropertyName);
+ if (links != null && links.isEmpty() == false) {
+ for (String link : links) {
+ UriInfo bindingUriInfo = parser.parseBindingLink(link, new HashMap<String, String>());
+ targetJPAEntity = jpaProcessor.process((GetEntityUriInfo) bindingUriInfo);
- if (uriInfoList == null) {
- return;
+ linkJPAEntities(targetJPAEntity, sourceJPAEntity, (EdmNavigationProperty) targetEntitySet.getEntityType()
+ .getProperty(
+ navPropertyName));
+ }
+ }
+ }
+ } catch (EdmException e) {
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
+ } catch (ODataException e) {
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
}
- try {
- for (UriInfo getUriInfo : uriInfoList) {
+ }
- if (!getUriInfo.getTargetEntitySet().getName().equals(targerEntitySetName)) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.RELATIONSHIP_INVALID, null);
- }
- if (!((UriInfo) uriInfo).isLinks()) {
- navigationProperty = getUriInfo.getNavigationSegments().get(0).getNavigationProperty();
- }
+ private void modifyLink(final UriInfo uriInfo, final InputStream content, final String requestContentType,
+ final String contentType)
+ throws ODataJPARuntimeException, ODataJPAModelException {
+ try {
+ EdmEntitySet targetEntitySet = uriInfo.getTargetEntitySet();
+ String targerEntitySetName = targetEntitySet.getName();
+ EdmNavigationProperty navigationProperty = null;
+ UriInfo getUriInfo = null;
+
+ if (uriInfo.isLinks()) {
+ getUriInfo = parser.parseLink(targetEntitySet, content, requestContentType);
+ navigationProperty = uriInfo.getNavigationSegments().get(0).getNavigationProperty();
+ } else {
+ return;
+ }
- targetJPAEntity = jpaProcessor.process((GetEntityUriInfo) getUriInfo);
- if (targetJPAEntity != null && ((UriInfo) uriInfo).isLinks()) {
- getUriInfo = parser.parseLinkURI();
- sourceJPAEntity = jpaProcessor.process((GetEntityUriInfo) getUriInfo);
- if (sourceJPAEntity == null) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.RESOURCE_X_NOT_FOUND
- .addContent(getUriInfo.getTargetEntitySet().getName()), null);
- }
- }
+ if (!getUriInfo.getTargetEntitySet().getName().equals(targerEntitySetName))
+ {
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.RELATIONSHIP_INVALID, null);
+ }
- JPAEntityParser entityParser = new JPAEntityParser();
- Method setMethod =
- entityParser.getAccessModifier(sourceJPAEntity, navigationProperty, JPAEntityParser.ACCESS_MODIFIER_SET);
-
- Method getMethod =
- entityParser.getAccessModifier(sourceJPAEntity, navigationProperty, JPAEntityParser.ACCESS_MODIFIER_GET);
-
- if (getMethod.getReturnType().getTypeParameters() != null
- && getMethod.getReturnType().getTypeParameters().length != 0) {
- @SuppressWarnings("unchecked")
- List<Object> relatedEntities = (List<Object>) getMethod.invoke(sourceJPAEntity);
- relatedEntities.add(targetJPAEntity);
- setMethod.invoke(sourceJPAEntity, relatedEntities);
- } else {
- setMethod.invoke(sourceJPAEntity, targetJPAEntity);
+ targetJPAEntity = jpaProcessor.process((GetEntityUriInfo) getUriInfo);
+ if (targetJPAEntity != null && sourceJPAEntity == null) {
+ int index = context.getODataContext().getPathInfo().getODataSegments().size() - 2;
+ getUriInfo = parser.parseURISegment(0, index);
+ sourceJPAEntity = jpaProcessor.process((GetEntityUriInfo) getUriInfo);
+ if (sourceJPAEntity == null) {
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.RESOURCE_X_NOT_FOUND
+ .addContent(getUriInfo.getTargetEntitySet().getName()), null);
}
}
- } catch (IllegalAccessException e) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
+ if (targetJPAEntity != null && sourceJPAEntity != null) {
+ linkJPAEntities(targetJPAEntity, sourceJPAEntity, navigationProperty);
+ }
+
} catch (IllegalArgumentException e) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
- } catch (InvocationTargetException e) {
- throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
} catch (EdmException e) {
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
+ } catch (ODataException e) {
throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
}
-
}
+ private void
+ linkJPAEntities(final Object targetJPAEntity, final Object sourceJPAEntity,
+ final EdmNavigationProperty navigationProperty)
+ throws ODataJPARuntimeException {
+ try {
+ JPAEntityParser entityParser = new JPAEntityParser();
+ Method setMethod = entityParser.getAccessModifier(sourceJPAEntity,
+ navigationProperty, JPAEntityParser.ACCESS_MODIFIER_SET);
+
+ Method getMethod = entityParser.getAccessModifier(sourceJPAEntity,
+ navigationProperty, JPAEntityParser.ACCESS_MODIFIER_GET);
+
+ if (getMethod.getReturnType().getTypeParameters() != null
+ && getMethod.getReturnType().getTypeParameters().length != 0) {
+ @SuppressWarnings("unchecked")
+ Collection<Object> relatedEntities = (Collection<Object>) getMethod.invoke(sourceJPAEntity);
+ relatedEntities.add(targetJPAEntity);
+ setMethod.invoke(sourceJPAEntity, relatedEntities);
+ } else {
+ setMethod.invoke(sourceJPAEntity, targetJPAEntity);
+ }
+ } catch (IllegalAccessException e) {
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
+ } catch (InvocationTargetException e) {
+ throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java
index 6ca98e6..9a5b101 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java
@@ -33,6 +33,7 @@ import org.apache.olingo.odata2.api.edm.EdmEntityType;
import org.apache.olingo.odata2.api.edm.EdmException;
import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
+import org.apache.olingo.odata2.api.uri.UriInfo;
import org.apache.olingo.odata2.api.uri.info.DeleteUriInfo;
import org.apache.olingo.odata2.api.uri.info.GetEntityCountUriInfo;
import org.apache.olingo.odata2.api.uri.info.GetEntityLinkUriInfo;
@@ -314,8 +315,8 @@ public class JPAProcessorImpl implements JPAProcessor {
oDataEntityParser.parseEntry(oDataEntitySet, content, requestedContentType, false);
virtualJPAEntity.create(oDataEntry);
JPALink link = new JPALink(oDataJPAContext);
- link.setSourceJPAEntity(jpaEntity);
- link.create(createView, content, requestedContentType, requestedContentType);
+ link.setSourceJPAEntity(virtualJPAEntity.getJPAEntity());
+ link.create(createView, oDataEntry);
} else if (properties != null) {
virtualJPAEntity.create(properties);
} else {
@@ -396,6 +397,9 @@ public class JPAProcessorImpl implements JPAProcessor {
JPQLContextType contextType = null;
try {
if (uriParserResultView instanceof DeleteUriInfo) {
+ if (((UriInfo) uriParserResultView).isLinks()) {
+ return deleteLink(uriParserResultView);
+ }
uriParserResultView = ((DeleteUriInfo) uriParserResultView);
if (!((DeleteUriInfo) uriParserResultView).getStartEntitySet().getName()
.equals(((DeleteUriInfo) uriParserResultView).getTargetEntitySet().getName())) {
@@ -409,15 +413,14 @@ public class JPAProcessorImpl implements JPAProcessor {
ODataJPARuntimeException.GENERAL, e);
}
- // First read the entity with read operation.
Object selectedObject = readEntity(uriParserResultView, contextType);
- // Read operation done. This object would be passed on to entity manager for delete
if (selectedObject != null) {
try {
em.getTransaction().begin();
em.remove(selectedObject);
em.flush();
em.getTransaction().commit();
+
} catch (Exception e) {
throw ODataJPARuntimeException.throwException(
ODataJPARuntimeException.ERROR_JPQL_DELETE_REQUEST, e);
@@ -426,6 +429,13 @@ public class JPAProcessorImpl implements JPAProcessor {
return selectedObject;
}
+ private Object deleteLink(final DeleteUriInfo uriParserResultView) throws ODataJPARuntimeException {
+ JPALink link = new JPALink(oDataJPAContext);
+ link.delete(uriParserResultView);
+ link.save();
+ return link.getTargetJPAEntity();
+ }
+
/* Process Get Entity Link Request */
@Override
public Object process(final GetEntityLinkUriInfo uriParserResultView)
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmMappingModelService.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmMappingModelService.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmMappingModelService.java
index 97e438e..dd453ac 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmMappingModelService.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmMappingModelService.java
@@ -27,11 +27,11 @@ import javax.xml.bind.Unmarshaller;
import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext;
import org.apache.olingo.odata2.jpa.processor.api.access.JPAEdmMappingModelAccess;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPAModelException;
+import org.apache.olingo.odata2.jpa.processor.api.model.mapping.JPAAttributeMapType.JPAAttribute;
import org.apache.olingo.odata2.jpa.processor.api.model.mapping.JPAEdmMappingModel;
import org.apache.olingo.odata2.jpa.processor.api.model.mapping.JPAEmbeddableTypeMapType;
import org.apache.olingo.odata2.jpa.processor.api.model.mapping.JPAEntityTypeMapType;
import org.apache.olingo.odata2.jpa.processor.api.model.mapping.JPAPersistenceUnitMapType;
-import org.apache.olingo.odata2.jpa.processor.api.model.mapping.JPAAttributeMapType.JPAAttribute;
import org.apache.olingo.odata2.jpa.processor.api.model.mapping.JPARelationshipMapType.JPARelationship;
public class JPAEdmMappingModelService implements JPAEdmMappingModelAccess {
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java
index 5c8c999..9c22364 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java
@@ -22,6 +22,7 @@ import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Field;
import javax.persistence.Column;
+import javax.persistence.JoinColumn;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.ManagedType;
import javax.persistence.metamodel.PluralAttribute;
@@ -149,7 +150,6 @@ public class JPAEdmNameBuilder {
view.getEdmSimpleProperty().setName(propertyName);
JPAEdmMapping mapping = new JPAEdmMappingImpl();
- ((Mapping) mapping).setInternalName(jpaAttributeName);
mapping.setJPAType(jpaAttribute.getJavaType());
AnnotatedElement annotatedElement = (AnnotatedElement) jpaAttribute.getJavaMember();
@@ -157,6 +157,12 @@ public class JPAEdmNameBuilder {
Column column = annotatedElement.getAnnotation(Column.class);
if (column != null) {
mapping.setJPAColumnName(column.name());
+ } else {
+ JoinColumn joinColumn = annotatedElement.getAnnotation(JoinColumn.class);
+ if (joinColumn != null) {
+ mapping.setJPAColumnName(joinColumn.name());
+ jpaAttributeName += "." + view.getJPAReferencedAttribute().getName();
+ }
}
} else {
ManagedType<?> managedType = jpaAttribute.getDeclaringType();
@@ -176,6 +182,7 @@ public class JPAEdmNameBuilder {
}
}
+ ((Mapping) mapping).setInternalName(jpaAttributeName);
view.getEdmSimpleProperty().setMapping((Mapping) mapping);
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmMappingImpl.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmMappingImpl.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmMappingImpl.java
index f930d20..fc9f3fd 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmMappingImpl.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmMappingImpl.java
@@ -47,5 +47,4 @@ public class JPAEdmMappingImpl extends Mapping implements JPAEdmMapping {
public Class<?> getJPAType() {
return type;
}
-
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java
index 0923176..e23f3b1 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java
@@ -18,6 +18,7 @@
******************************************************************************/
package org.apache.olingo.odata2.jpa.processor.core.model;
+import java.lang.reflect.AnnotatedElement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@@ -25,8 +26,12 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import javax.persistence.Column;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Attribute.PersistentAttributeType;
+import javax.persistence.metamodel.EntityType;
import javax.persistence.metamodel.PluralAttribute;
import javax.persistence.metamodel.SingularAttribute;
@@ -66,6 +71,7 @@ public class JPAEdmProperty extends JPAEdmBaseViewImpl implements
private SimpleProperty currentSimpleProperty = null;
private ComplexProperty currentComplexProperty = null;
private Attribute<?, ?> currentAttribute;
+ private Attribute<?, ?> currentRefAttribute;
private boolean isBuildModeComplexType;
private Map<String, Integer> associationCount;
@@ -118,6 +124,11 @@ public class JPAEdmProperty extends JPAEdmBaseViewImpl implements
}
@Override
+ public Attribute<?, ?> getJPAReferencedAttribute() {
+ return currentRefAttribute;
+ }
+
+ @Override
public ComplexProperty getEdmComplexProperty() {
return currentComplexProperty;
}
@@ -167,9 +178,7 @@ public class JPAEdmProperty extends JPAEdmBaseViewImpl implements
*/
@Override
public void build() throws ODataJPAModelException, ODataJPARuntimeException {
-
JPAEdmBuilder keyViewBuilder = null;
-
properties = new ArrayList<Property>();
List<Attribute<?, ?>> jpaAttributes = null;
@@ -200,29 +209,15 @@ public class JPAEdmProperty extends JPAEdmBaseViewImpl implements
switch (attributeType) {
case BASIC:
-
currentSimpleProperty = new SimpleProperty();
- JPAEdmNameBuilder
- .build((JPAEdmPropertyView) JPAEdmProperty.this, isBuildModeComplexType, skipDefaultNaming);
-
- EdmSimpleTypeKind simpleTypeKind = JPATypeConvertor
- .convertToEdmSimpleType(currentAttribute
- .getJavaType(), currentAttribute);
-
- currentSimpleProperty.setType(simpleTypeKind);
- JPAEdmFacets.setFacets(currentAttribute, currentSimpleProperty);
-
- properties.add(currentSimpleProperty);
-
+ properties.add(buildSimpleProperty(currentAttribute, currentSimpleProperty));
if (((SingularAttribute<?, ?>) currentAttribute).isId()) {
if (keyView == null) {
keyView = new JPAEdmKey(JPAEdmProperty.this);
keyViewBuilder = keyView.getBuilder();
}
-
keyViewBuilder.build();
}
-
break;
case EMBEDDED:
ComplexType complexType = complexTypeView
@@ -234,7 +229,6 @@ public class JPAEdmProperty extends JPAEdmBaseViewImpl implements
complexTypeViewLocal.getBuilder().build();
complexType = complexTypeViewLocal.getEdmComplexType();
complexTypeView.addJPAEdmCompleTypeView(complexTypeViewLocal);
-
}
if (isBuildModeComplexType == false
@@ -276,6 +270,8 @@ public class JPAEdmProperty extends JPAEdmBaseViewImpl implements
case ONE_TO_ONE:
case MANY_TO_ONE:
+ addForeignKey(currentAttribute);
+
JPAEdmAssociationEndView associationEndView = new JPAEdmAssociationEnd(entityTypeView, JPAEdmProperty.this);
associationEndView.getBuilder().build();
JPAEdmAssociationView associationView = schemaView.getJPAEdmAssociationView();
@@ -325,6 +321,54 @@ public class JPAEdmProperty extends JPAEdmBaseViewImpl implements
}
+ private SimpleProperty buildSimpleProperty(final Attribute<?, ?> jpaAttribute, final SimpleProperty simpleProperty)
+ throws ODataJPAModelException,
+ ODataJPARuntimeException {
+
+ JPAEdmNameBuilder
+ .build((JPAEdmPropertyView) JPAEdmProperty.this, isBuildModeComplexType, skipDefaultNaming);
+ EdmSimpleTypeKind simpleTypeKind = JPATypeConvertor
+ .convertToEdmSimpleType(jpaAttribute
+ .getJavaType(), jpaAttribute);
+ simpleProperty.setType(simpleTypeKind);
+ JPAEdmFacets.setFacets(jpaAttribute, simpleProperty);
+
+ return simpleProperty;
+
+ }
+
+ private void addForeignKey(final Attribute<?, ?> jpaAttribute) throws ODataJPAModelException,
+ ODataJPARuntimeException {
+
+ AnnotatedElement annotatedElement = (AnnotatedElement) jpaAttribute.getJavaMember();
+ if (annotatedElement == null) {
+ return;
+ }
+ JoinColumn joinColumn = annotatedElement.getAnnotation(JoinColumn.class);
+ if (joinColumn == null) {
+ JoinColumns joinColumns = annotatedElement.getAnnotation(JoinColumns.class);
+ if (joinColumns != null) {
+ return;
+ }
+ } else {
+ if (joinColumn.insertable() && joinColumn.updatable()) {
+ EntityType<?> referencedEntityType = metaModel.entity(jpaAttribute.getJavaType());
+ for (Attribute<?, ?> referencedAttribute : referencedEntityType.getAttributes()) {
+ AnnotatedElement annotatedElement2 = (AnnotatedElement) referencedAttribute.getJavaMember();
+ if (annotatedElement2 != null) {
+ Column referencedColumn = annotatedElement2.getAnnotation(Column.class);
+ if (referencedColumn != null && referencedColumn.name().equals((joinColumn.referencedColumnName()))) {
+ currentRefAttribute = referencedAttribute;
+ currentSimpleProperty = new SimpleProperty();
+ properties.add(buildSimpleProperty(currentRefAttribute, currentSimpleProperty));
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
@SuppressWarnings("rawtypes")
private List<Attribute<?, ?>> sortInAscendingOrder(final Set<?> jpaAttributes) {
List<Attribute<?, ?>> jpaAttributeList = new ArrayList<Attribute<?, ?>>();
@@ -374,4 +418,5 @@ public class JPAEdmProperty extends JPAEdmBaseViewImpl implements
}
return isExcluded;
}
+
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraint.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraint.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraint.java
index cd80e70..07b4480 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraint.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraint.java
@@ -26,8 +26,8 @@ import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmAssociationView;
import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmEntityTypeView;
import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmPropertyView;
import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmReferentialConstraintRoleView;
-import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmReferentialConstraintView;
import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmReferentialConstraintRoleView.RoleType;
+import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmReferentialConstraintView;
public class JPAEdmReferentialConstraint extends JPAEdmBaseViewImpl implements JPAEdmReferentialConstraintView {
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraintRole.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraintRole.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraintRole.java
index 6358774..2a2426b 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraintRole.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraintRole.java
@@ -168,7 +168,7 @@ public class JPAEdmReferentialConstraintRole extends JPAEdmBaseViewImpl implemen
if (roleType == RoleType.PRINCIPAL) {
jpaAttributeType = jpaAttribute.getJavaType().getSimpleName();
- if (jpaAttributeType.equals("List")) {
+ if (jpaAttribute.isCollection()) {
Type type =
((ParameterizedType) jpaAttribute.getJavaMember().getDeclaringClass().getDeclaredField(
jpaAttribute.getName()).getGenericType()).getActualTypeArguments()[0];
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParserTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParserTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParserTest.java
new file mode 100644
index 0000000..93587a8
--- /dev/null
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParserTest.java
@@ -0,0 +1,226 @@
+package org.apache.olingo.odata2.jpa.processor.core;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.olingo.odata2.api.edm.EdmException;
+import org.apache.olingo.odata2.api.exception.ODataException;
+import org.apache.olingo.odata2.api.uri.PathSegment;
+import org.apache.olingo.odata2.api.uri.UriInfo;
+import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext;
+import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
+import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
+import org.apache.olingo.odata2.jpa.processor.core.mock.ODataContextMock;
+import org.apache.olingo.odata2.jpa.processor.core.mock.ODataJPAContextMock;
+import org.apache.olingo.odata2.jpa.processor.core.mock.ODataServiceMock;
+import org.apache.olingo.odata2.jpa.processor.core.mock.PathInfoMock;
+import org.apache.olingo.odata2.jpa.processor.core.mock.PathSegmentMock;
+import org.apache.olingo.odata2.jpa.processor.core.mock.data.EdmMockUtilV2;
+import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock;
+import org.junit.Test;
+
+public class ODataEntityParserTest {
+
+ private ODataEntityParser parser;
+
+ private ODataJPAContext mock(final String path) {
+ ODataServiceMock serviceMock = new ODataServiceMock();
+ ODataContextMock contextMock = new ODataContextMock();
+ PathInfoMock pathInfoMock = new PathInfoMock();
+ PathSegmentMock pathSegmentMock = new PathSegmentMock();
+ ODataJPAContext odataJPAContext = null;
+
+ try {
+
+ pathSegmentMock.setPath(path);
+
+ List<PathSegment> pathSegments = new ArrayList<PathSegment>();
+ pathSegments.add(pathSegmentMock);
+ pathInfoMock.setPathSegments(pathSegments);
+ pathInfoMock.setServiceRootURI(ODataServiceMock.SERVICE_ROOT);
+
+ contextMock.setPathInfo(pathInfoMock.mock());
+ contextMock.setODataService(serviceMock.mock());
+
+ odataJPAContext = ODataJPAContextMock.mockODataJPAContext(contextMock.mock());
+ } catch (ODataJPARuntimeException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ } catch (ODataException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ } catch (URISyntaxException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ }
+
+ return odataJPAContext;
+ }
+
+ @Test
+ public void testParseURISegment() {
+
+ try {
+ parser = new ODataEntityParser(mock("JPATypeMock(2)"));
+ UriInfo uriInfo = parser.parseURISegment(0, 1);
+ assertNotNull(uriInfo);
+ } catch (ODataJPARuntimeException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ }
+ }
+
+ @Test
+ public void testParseURISegmentInvalidIndex00() {
+ try {
+ parser = new ODataEntityParser(mock("JPATypeMock(2)"));
+ UriInfo uriInfo = parser.parseURISegment(0, 0);
+ assertNull(uriInfo);
+ } catch (ODataJPARuntimeException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ }
+ }
+
+ @Test
+ public void testParseURISegmentInvalidIndex01() {
+ try {
+ parser = new ODataEntityParser(mock("JPATypeMock(2)"));
+ UriInfo uriInfo = parser.parseURISegment(-1, -1);
+ assertNull(uriInfo);
+ } catch (ODataJPARuntimeException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ }
+ }
+
+ @Test
+ public void testParseURISegmentInvalidIndex02() {
+ try {
+ parser = new ODataEntityParser(mock("JPATypeMock(2)"));
+ UriInfo uriInfo = parser.parseURISegment(3, -1);
+ assertNull(uriInfo);
+ } catch (ODataJPARuntimeException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ }
+ }
+
+ @Test
+ public void testParseURISegmentInvalidEntityType() {
+ try {
+ parser = new ODataEntityParser(mock("JPATypeMockInvalid(2)"));
+ parser.parseURISegment(0, 1);
+ fail("Exception Expected");
+ } catch (ODataJPARuntimeException e) {
+ assertEquals(true, true);
+ }
+ }
+
+ @Test
+ public void testParseBindingLink() {
+ try {
+ parser = new ODataEntityParser(mock("JPATypeMock(2)"));
+ UriInfo uriInfo = parser.parseBindingLink("JPATypeMock(2)", new HashMap<String, String>());
+ assertNotNull(uriInfo);
+ } catch (ODataJPARuntimeException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ }
+
+ }
+
+ @Test
+ public void testParseBindingLinkNegative() {
+ try {
+ parser = new ODataEntityParser(mock("JPATypeMock(2)"));
+ parser.parseBindingLink("JPATypeMockInvalid(2)", new HashMap<String, String>());
+ fail("Exception Expected");
+ } catch (ODataJPARuntimeException e) {
+ assertEquals(true, true);
+ }
+ }
+
+ @Test
+ public void testParseLink() {
+ parser = new ODataEntityParser(mock("JPATypeMock(2)"));
+ try {
+ UriInfo uriInfo =
+ parser.parseLink(EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, false), mockURIContent(0),
+ "application/json");
+ assertNotNull(uriInfo);
+ } catch (ODataJPARuntimeException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ } catch (EdmException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ }
+ }
+
+ @Test
+ public void testParseLinkWithoutServiceRoot() {
+ parser = new ODataEntityParser(mock("JPATypeMock(2)"));
+ try {
+ UriInfo uriInfo =
+ parser.parseLink(EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, false), mockURIContent(1),
+ "application/json");
+ assertNotNull(uriInfo);
+ } catch (ODataJPARuntimeException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ } catch (EdmException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ }
+ }
+
+ @Test
+ public void testParseLinkNegative() {
+ parser = new ODataEntityParser(mock("JPATypeMock(2)"));
+ try {
+ parser.parseLink(EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, false), mockURIContent(2),
+ "application/json");
+ fail("Exception Expected");
+ } catch (ODataJPARuntimeException e) {
+ assertEquals(true, true);
+ } catch (EdmException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ }
+ }
+
+ private InputStream mockURIContent(final int variant) {
+ String uri = null;
+ InputStream is = null;
+ switch (variant) {
+ case 0:
+ uri = "{ \"uri\": \"" + ODataServiceMock.SERVICE_ROOT + "JPATypeMock(2)\" }";
+ break;
+ case 1:
+ uri = "{ \"uri\": \"JPATypeMock(2)\" }";
+ break;
+ case 2:
+ uri = "{ \"uri\": \"" + ODataServiceMock.SERVICE_ROOT + "JPATypeMockInvalid(2)\" }";
+ }
+
+ try {
+ is = new ByteArrayInputStream(uri.getBytes("utf-8"));
+ } catch (UnsupportedEncodingException e) {
+ fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+ + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+ }
+ return is;
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParserTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParserTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParserTest.java
index c0d364c..422b5ab 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParserTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParserTest.java
@@ -48,7 +48,6 @@ import org.apache.olingo.odata2.api.uri.expression.PropertyExpression;
import org.apache.olingo.odata2.api.uri.expression.UnaryExpression;
import org.apache.olingo.odata2.api.uri.expression.UnaryOperator;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
-import org.apache.olingo.odata2.jpa.processor.core.ODataExpressionParser;
import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
import org.easymock.EasyMock;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAContextImplTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAContextImplTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAContextImplTest.java
index fe981fc..7550c00 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAContextImplTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAContextImplTest.java
@@ -31,7 +31,6 @@ import org.apache.olingo.odata2.api.edm.provider.EdmProvider;
import org.apache.olingo.odata2.api.processor.ODataContext;
import org.apache.olingo.odata2.api.processor.ODataProcessor;
import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext;
-import org.apache.olingo.odata2.jpa.processor.core.ODataJPAContextImpl;
import org.apache.olingo.odata2.jpa.processor.core.edm.ODataJPAEdmProvider;
import org.apache.olingo.odata2.jpa.processor.core.mock.ODataJPAContextMock;
import org.easymock.EasyMock;
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefaultTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefaultTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefaultTest.java
index ced012e..6317a4b 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefaultTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefaultTest.java
@@ -69,7 +69,6 @@ import org.apache.olingo.odata2.api.uri.info.PutMergePatchUriInfo;
import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPAModelException;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
-import org.apache.olingo.odata2.jpa.processor.core.ODataJPAProcessorDefault;
import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
import org.apache.olingo.odata2.jpa.processor.core.model.JPAEdmTestModelView;
import org.easymock.EasyMock;
@@ -227,6 +226,7 @@ public class ODataJPAProcessorDefaultTest extends JPAEdmTestModelView {
EasyMock.expect(objUriInfo.getInlineCount()).andStubReturn(getInlineCount());
EasyMock.expect(objUriInfo.getFilter()).andStubReturn(getFilter());
EasyMock.expect(objUriInfo.getKeyPredicates()).andStubReturn(getKeyPredicates());
+ EasyMock.expect(objUriInfo.isLinks()).andStubReturn(false);
EasyMock.replay(objUriInfo);
return objUriInfo;
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTest.java
index 213b51b..e1c7c35 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTest.java
@@ -38,7 +38,6 @@ import org.apache.olingo.odata2.api.edm.EdmStructuralType;
import org.apache.olingo.odata2.api.edm.EdmType;
import org.apache.olingo.odata2.api.edm.EdmTypeKind;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
-import org.apache.olingo.odata2.jpa.processor.core.access.data.JPAEntityParser;
import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
import org.easymock.EasyMock;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTestForStaticMethods.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTestForStaticMethods.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTestForStaticMethods.java
index d87d2c1..e75b060 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTestForStaticMethods.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParserTestForStaticMethods.java
@@ -26,7 +26,6 @@ import static org.junit.Assert.fail;
import java.lang.reflect.Method;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
-import org.apache.olingo.odata2.jpa.processor.core.access.data.JPAEntityParser;
import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
index a93c4e0..6b81805 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
@@ -27,14 +27,13 @@ import org.apache.olingo.odata2.api.edm.EdmEntitySet;
import org.apache.olingo.odata2.api.edm.EdmEntityType;
import org.apache.olingo.odata2.api.edm.EdmException;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
-import org.apache.olingo.odata2.jpa.processor.core.access.data.JPAEntity;
import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
import org.apache.olingo.odata2.jpa.processor.core.mock.data.EdmMockUtilV2;
import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock;
-import org.apache.olingo.odata2.jpa.processor.core.mock.data.ODataEntryMockUtil;
import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock.JPARelatedTypeMock;
import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock.JPATypeEmbeddableMock;
import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock.JPATypeEmbeddableMock2;
+import org.apache.olingo.odata2.jpa.processor.core.mock.data.ODataEntryMockUtil;
import org.junit.Test;
public class JPAEntityTest {
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAExpandCallBackTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAExpandCallBackTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAExpandCallBackTest.java
index d6f9153..efa230c 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAExpandCallBackTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAExpandCallBackTest.java
@@ -40,7 +40,6 @@ import org.apache.olingo.odata2.api.ep.callback.WriteFeedCallbackContext;
import org.apache.olingo.odata2.api.ep.callback.WriteFeedCallbackResult;
import org.apache.olingo.odata2.api.uri.ExpandSelectTreeNode;
import org.apache.olingo.odata2.api.uri.NavigationPropertySegment;
-import org.apache.olingo.odata2.jpa.processor.core.access.data.JPAExpandCallBack;
import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
import org.apache.olingo.odata2.jpa.processor.core.mock.data.EdmMockUtil;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAFunctionContextTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAFunctionContextTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAFunctionContextTest.java
index 359ddfa..f9d0999 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAFunctionContextTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAFunctionContextTest.java
@@ -37,7 +37,6 @@ import org.apache.olingo.odata2.jpa.processor.api.access.JPAMethodContext;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPAModelException;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLContextType;
-import org.apache.olingo.odata2.jpa.processor.core.access.data.JPAFunctionContext;
import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
import org.apache.olingo.odata2.jpa.processor.core.model.JPAEdmMappingImpl;
import org.easymock.EasyMock;
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALinkTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALinkTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALinkTest.java
new file mode 100644
index 0000000..db0f6fb
--- /dev/null
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALinkTest.java
@@ -0,0 +1,5 @@
+package org.apache.olingo.odata2.jpa.processor.core.access.data;
+
+public class JPALinkTest {
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImplTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImplTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImplTest.java
index 915a7d3..bafef01 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImplTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImplTest.java
@@ -59,7 +59,6 @@ import org.apache.olingo.odata2.api.uri.info.GetEntitySetUriInfo;
import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPAModelException;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
-import org.apache.olingo.odata2.jpa.processor.core.access.data.JPAProcessorImpl;
import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
import org.easymock.EasyMock;
import org.junit.Before;
@@ -154,6 +153,7 @@ public class JPAProcessorImplTest {
EasyMock.expect(objUriInfo.getInlineCount()).andStubReturn(getInlineCount());
EasyMock.expect(objUriInfo.getFilter()).andStubReturn(getFilter());
EasyMock.expect(objUriInfo.getKeyPredicates()).andStubReturn(getKeyPredicates());
+ EasyMock.expect(objUriInfo.isLinks()).andStubReturn(false);
EasyMock.replay(objUriInfo);
return objUriInfo;
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmMappingModelServiceTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmMappingModelServiceTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmMappingModelServiceTest.java
index 073cd1f..bb0c1d3 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmMappingModelServiceTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmMappingModelServiceTest.java
@@ -26,7 +26,6 @@ import static org.junit.Assert.assertTrue;
import java.io.InputStream;
-import org.apache.olingo.odata2.jpa.processor.core.access.model.JPAEdmMappingModelService;
import org.apache.olingo.odata2.jpa.processor.core.mock.ODataJPAContextMock;
import org.junit.BeforeClass;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilderTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilderTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilderTest.java
index 73af3e9..542d37f 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilderTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilderTest.java
@@ -26,8 +26,6 @@ import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmComplexPropertyVie
import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmEntityTypeView;
import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmPropertyView;
import org.apache.olingo.odata2.jpa.processor.core.ODataJPAContextImpl;
-import org.apache.olingo.odata2.jpa.processor.core.access.model.JPAEdmMappingModelService;
-import org.apache.olingo.odata2.jpa.processor.core.access.model.JPAEdmNameBuilder;
import org.apache.olingo.odata2.jpa.processor.core.mock.model.JPAAttributeMock;
import org.apache.olingo.odata2.jpa.processor.core.mock.model.JPAEntityTypeMock;
import org.easymock.EasyMock;
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/886d283d/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPATypeConvertorTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPATypeConvertorTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPATypeConvertorTest.java
index cdcf3b1..29462c9 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPATypeConvertorTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPATypeConvertorTest.java
@@ -26,7 +26,6 @@ import java.util.UUID;
import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPAModelException;
-import org.apache.olingo.odata2.jpa.processor.core.access.model.JPATypeConvertor;
import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
import org.junit.Test;