Repository: olingo-odata2 Updated Branches: refs/heads/master 962d787cc -> 39e00568c
[OLINGO-1183,1118,1309,1313]Multiple JPA issues Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/39e00568 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/39e00568 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/39e00568 Branch: refs/heads/master Commit: 39e00568c13b5decc124256ecf8a83fa155f496a Parents: 962d787 Author: Archana Rai <archana....@sap.com> Authored: Tue Dec 4 16:18:00 2018 +0530 Committer: Archana Rai <archana....@sap.com> Committed: Tue Dec 4 16:18:00 2018 +0530 ---------------------------------------------------------------------- .../processor/core/ODataExpressionParser.java | 10 +- .../core/ODataJPAResponseBuilderDefault.java | 36 ++- .../processor/core/access/data/JPAEntity.java | 6 +- .../jpa/processor/core/access/data/JPAPage.java | 4 +- .../core/access/data/JPAProcessorImpl.java | 11 +- .../core/access/data/JPAQueryBuilder.java | 46 ++++ .../processor/core/jpql/JPQLSelectContext.java | 6 +- .../core/ODataJPAResponseBuilderTest.java | 8 +- .../core/access/data/JPAProcessorImplTest.java | 239 ++++++++++++++++++- .../core/access/data/JPAQueryBuilderTest.java | 125 +++++++++- .../core/mock/ODataJPAContextMock.java | 5 + .../ref/listeners/CustomerQueryExtension.java | 24 +- .../core/batch/BatchChangeSetPartImpl.java | 2 +- .../olingo/odata2/core/batch/BatchHelper.java | 4 +- .../odata2/core/debug/DebugInfoRuntime.java | 4 +- .../odata2/core/uri/expression/InfoMethod.java | 8 +- .../core/uri/expression/ParameterSet.java | 2 +- .../uri/expression/ParameterSetCombination.java | 2 +- .../helper/ODataMessageTextVerifier.java | 2 +- 19 files changed, 495 insertions(+), 49 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java index 78d04ee..25b4f9f 100644 --- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java @@ -167,9 +167,11 @@ public class ODataExpressionParser { case EQ: EdmSimpleType type = (EdmSimpleType)((BinaryExpression)whereExpression).getLeftOperand().getEdmType(); if(EdmSimpleTypeKind.String.getEdmSimpleTypeInstance().isCompatible(type)){ - return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE + if(edmMapping== null || (edmMapping!=null && !(((JPAEdmMappingImpl)edmMapping).getJPAType()).isEnum())){ + return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE + (!"null".equals(right) ? JPQLStatement.Operator.LIKE : "IS") + JPQLStatement.DELIMITER.SPACE + right + ("null".equals(right) ? "" : " ESCAPE '\\'") + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT; + } } return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE + (!"null".equals(right) ? JPQLStatement.Operator.EQ : "IS") + JPQLStatement.DELIMITER.SPACE + right @@ -272,6 +274,8 @@ public class ODataExpressionParser { } case TOLOWER: return String.format("LOWER(%s)", first); + case TOUPPER: + return String.format("UPPER(%s)", first); case STARTSWITH: return String.format("%s LIKE CONCAT(%s,'%%') ESCAPE '\\'", first, second); case ENDSWITH: @@ -633,6 +637,10 @@ public class ODataExpressionParser { positionalParameters.put(index, (Character)uriLiteral.charAt(0)); }else if(edmMappedType.equals(UUID.class)){ positionalParameters.put(index, UUID.fromString(uriLiteral)); + }else if (edmMappedType.isEnum()) { + Class enCl = (Class<? extends Enum>)edmMappedType; + positionalParameters.put(index, Enum.valueOf(enCl, + (String) uriLiteral)); }else { positionalParameters.put(index, String.valueOf(uriLiteral)); } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderDefault.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderDefault.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderDefault.java index b8ac74f..693453b 100644 --- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderDefault.java +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderDefault.java @@ -62,6 +62,7 @@ import org.apache.olingo.odata2.api.uri.info.GetEntityUriInfo; import org.apache.olingo.odata2.api.uri.info.GetFunctionImportUriInfo; import org.apache.olingo.odata2.api.uri.info.PostUriInfo; import org.apache.olingo.odata2.api.uri.info.PutMergePatchUriInfo; +import org.apache.olingo.odata2.core.uri.UriInfoImpl; import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext; import org.apache.olingo.odata2.jpa.processor.api.ODataJPAResponseBuilder; import org.apache.olingo.odata2.jpa.processor.api.ODataJPATombstoneContext; @@ -73,6 +74,7 @@ import org.apache.olingo.odata2.jpa.processor.core.callback.JPATombstoneCallBack public final class ODataJPAResponseBuilderDefault implements ODataJPAResponseBuilder { + private static final String COUNT = "count"; private final ODataJPAContext oDataJPAContext; public ODataJPAResponseBuilderDefault(final ODataJPAContext context) { @@ -482,13 +484,7 @@ public final class ODataJPAResponseBuilderDefault implements ODataJPAResponseBui Integer count = null; if (resultsView.getInlineCount() != null) { - if ((resultsView.getSkip() != null || resultsView.getTop() != null)) { - // when $skip and/or $top is present with $inlinecount - count = getInlineCountForNonFilterQueryEntitySet(edmEntityList, resultsView); - } else { - // In all other cases - count = resultsView.getInlineCount() == InlineCount.ALLPAGES ? edmEntityList.size() : null; - } + count = getInlineCountForNonFilterQueryEntitySet(edmEntityList, resultsView); } try { @@ -542,6 +538,10 @@ public final class ODataJPAResponseBuilderDefault implements ODataJPAResponseBui .replaceAll("\\$skip=.+?(?:&|$)", "") .replaceFirst("(?:\\?|&)$", ""); // Remove potentially trailing "?" or "&" left over from remove actions } + + public static boolean isNumeric(String strNum) { + return strNum.matches("-?\\d+(\\.\\d+)?"); +} /* * This method handles $inlinecount request. It also modifies the list of results in case of @@ -552,21 +552,15 @@ public final class ODataJPAResponseBuilderDefault implements ODataJPAResponseBui // when $skip and/or $top is present with $inlinecount, first get the total count Integer count = null; if (resultsView.getInlineCount() == InlineCount.ALLPAGES) { - if (resultsView.getSkip() != null || resultsView.getTop() != null) { - count = edmEntityList.size(); - // Now update the list - if (resultsView.getSkip() != null) { - // Index checks to avoid IndexOutOfBoundsException - if (resultsView.getSkip() > edmEntityList.size()) { - edmEntityList.clear(); - return count; + count = edmEntityList.size(); + if (resultsView.getCustomQueryOptions() != null) { + String countValue = resultsView.getCustomQueryOptions().get(COUNT); + if (countValue != null && isNumeric(countValue)) { + count = Integer.parseInt(countValue); + resultsView.getCustomQueryOptions().remove(COUNT); + if (resultsView.getCustomQueryOptions().size() == 0) { + ((UriInfoImpl) resultsView).setCustomQueryOptions(null); } - edmEntityList.subList(0, resultsView.getSkip()).clear(); - } - if (resultsView.getTop() != null && resultsView.getTop() >= 0 && resultsView.getTop() < edmEntityList.size()) { - final List<Map<String, Object>> edmEntitySubList = - new ArrayList<Map<String, Object>>(edmEntityList.subList(0, resultsView.getTop())); - edmEntityList.retainAll(edmEntitySubList); } } }// Inlinecount of None is handled by default - null http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/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 d278e4c..a3f5495 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 @@ -68,7 +68,7 @@ public class JPAEntity { private ODataJPAContext oDataJPAContext; private OnJPAWriteContent onJPAWriteContent = null; private List<String> relatedJPAEntityLink = new ArrayList<String>(); - public HashMap<String, List<Object>> relatedJPAEntityMap = null; + private HashMap<String, List<Object>> relatedJPAEntityMap = null; private EdmNavigationProperty viaNavigationProperty; public JPAEntity(final EdmEntityType oDataEntityType, final EdmEntitySet oDataEntitySet, @@ -553,6 +553,10 @@ public class JPAEntity { java.sql.Time t = entityPropertyValue != null ? new java.sql.Time(((Calendar) entityPropertyValue).getTimeInMillis()) : null; method.invoke(entity, t); + } else if (parameterType.equals(byte.class)) { + byte b = entityPropertyValue != null ? + Byte.parseByte(entityPropertyValue.toString()) : 0; + method.invoke(entity, b); } else { method.invoke(entity, entityPropertyValue); } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAPage.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAPage.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAPage.java index 4effd5b..4f95e51 100644 --- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAPage.java +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAPage.java @@ -72,8 +72,8 @@ public class JPAPage implements JPAPaging { private List<Object> pagedEntities; private static class TopSkip { - public Integer top; - public Integer skip; + private Integer top; + private Integer skip; } public JPAPageBuilder() {} http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/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 f2caceb..e8f3070 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 @@ -168,6 +168,9 @@ public class JPAProcessorImpl implements JPAProcessor { if (listener != null && listener.isTombstoneSupported()) { ODataJPATombstoneContext.setDeltaToken(listener.generateDeltaToken((List<Object>) result, query)); } + if(InlineCount.ALLPAGES.equals(uriParserResultView.getInlineCount())){ + queryBuilder.getCount(uriParserResultView); + } return result == null ? new ArrayList<Object>() : result; } catch (EdmException e) { throw ODataJPARuntimeException.throwException( @@ -420,11 +423,11 @@ public class JPAProcessorImpl implements JPAProcessor { .skipToken(uriParserResultView.getSkipToken()); // $top/$skip with $inlinecount case handled in response builder to avoid multiple DB call - if (uriParserResultView.getSkip() != null && uriParserResultView.getInlineCount() == null) { + if (uriParserResultView.getSkip() != null) { pageBuilder.skip(uriParserResultView.getSkip().intValue()); } - if (uriParserResultView.getTop() != null && uriParserResultView.getInlineCount() == null) { + if (uriParserResultView.getTop() != null) { pageBuilder.top(uriParserResultView.getTop().intValue()); } @@ -442,11 +445,11 @@ public class JPAProcessorImpl implements JPAProcessor { .skipToken(uriParserResultView.getSkipToken()); // $top/$skip with $inlinecount case handled in response builder to avoid multiple DB call - if (uriParserResultView.getSkip() != null && uriParserResultView.getInlineCount() == null) { + if (uriParserResultView.getSkip() != null) { pageBuilder.skip(uriParserResultView.getSkip().intValue()); } - if (uriParserResultView.getTop() != null && uriParserResultView.getInlineCount() == null) { + if (uriParserResultView.getTop() != null) { pageBuilder.top(uriParserResultView.getTop().intValue()); } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilder.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilder.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilder.java index d4b8c07..24290bf 100644 --- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilder.java +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilder.java @@ -22,6 +22,7 @@ import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -42,6 +43,7 @@ import org.apache.olingo.odata2.api.uri.info.GetEntitySetCountUriInfo; 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.PutMergePatchUriInfo; +import org.apache.olingo.odata2.core.uri.UriInfoImpl; import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext; import org.apache.olingo.odata2.jpa.processor.api.ODataJPAQueryExtensionEntityListener; import org.apache.olingo.odata2.jpa.processor.api.ODataJPATombstoneEntityListener; @@ -102,6 +104,50 @@ public class JPAQueryBuilder { return queryInfo; } + + public void getCount(GetEntitySetUriInfo uriInfo) throws ODataJPARuntimeException { + JPAQueryInfo queryInfo = new JPAQueryInfo(); + Query query = null; + UriInfoImpl info = (UriInfoImpl)uriInfo; + boolean count = info.isCount(); + info.setCount(true); + try { + ODataJPAQueryExtensionEntityListener listener = getODataJPAQueryEntityListener((UriInfo) uriInfo); + if (listener != null) { + query = listener.getQuery((GetEntitySetCountUriInfo)uriInfo, em); + if(query != null){ + JPQLContextType contextType = determineJPQLContextType(info, UriInfoType.GetEntitySetCount); + JPQLContext jpqlContext = buildJPQLContext(contextType, info); + JPQLStatement jpqlStatement = JPQLStatement.createBuilder(jpqlContext).build(); + jpqlContext.setJPQLStatement(jpqlStatement.toString()); + query = getParameterizedQueryForListeners(jpqlContext, query); + } + } + if (query == null) { + query = buildQuery((UriInfo) uriInfo, UriInfoType.GetEntitySetCount); + } else { + queryInfo.setTombstoneQuery(true); + } + } catch (Exception e) { + throw ODataJPARuntimeException.throwException( + ODataJPARuntimeException.ERROR_JPQL_QUERY_CREATE, e); + } finally { + JPQLContext.removeJPQLContext(); + ODataExpressionParser.removePositionalParametersThreadLocal(); + } + queryInfo.setQuery(query); + Query countQuery = queryInfo.getQuery(); + List<Object> countList = countQuery.getResultList(); + info.setCount(count); + if(countList!= null && !countList.isEmpty()){ + String countNumber = countList.get(0).toString(); + Map<String, String> customQueryOptions = new HashMap<String, String>(); + customQueryOptions.put("count", countNumber); + info.setCustomQueryOptions(customQueryOptions); + } + } + + public Query build(GetEntityUriInfo uriInfo) throws ODataJPARuntimeException { Query query = null; try { http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLSelectContext.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLSelectContext.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLSelectContext.java index aa0d98d..d071105 100644 --- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLSelectContext.java +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLSelectContext.java @@ -153,12 +153,12 @@ public class JPQLSelectContext extends JPQLContext implements JPQLSelectContextV */ protected String generateOrderByFileds() throws ODataJPARuntimeException, EdmException { - if (entitySetView.getOrderBy() != null) { + if (entitySetView.getOrderBy() != null && !isCountOnly) { return ODataExpressionParser.parseToJPAOrderByExpression(entitySetView.getOrderBy(), getJPAEntityAlias()); - } else if (entitySetView.getTop() != null || entitySetView.getSkip() != null || - pagingRequested == true) { + } else if ((entitySetView.getTop() != null || entitySetView.getSkip() != null || + pagingRequested) && !isCountOnly) { return ODataExpressionParser.parseKeyPropertiesToJPAOrderByExpression(entitySetView.getTargetEntitySet() .getEntityType().getKeyProperties(), getJPAEntityAlias()); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderTest.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderTest.java index ebf268f..09f9cc1 100644 --- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderTest.java +++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderTest.java @@ -57,6 +57,7 @@ import org.apache.olingo.odata2.api.uri.PathInfo; import org.apache.olingo.odata2.api.uri.SelectItem; import org.apache.olingo.odata2.api.uri.info.GetEntitySetUriInfo; import org.apache.olingo.odata2.api.uri.info.GetEntityUriInfo; +import org.apache.olingo.odata2.core.uri.UriInfoImpl; import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext; import org.apache.olingo.odata2.jpa.processor.api.ODataJPAResponseBuilder; import org.apache.olingo.odata2.jpa.processor.api.access.JPAPaging; @@ -570,12 +571,17 @@ public class ODataJPAResponseBuilderTest extends JPAEdmTestModelView { navigationPropertyList.add(navigationPropertySegment); expandList.add(navigationPropertyList); // Mocking EntityUriInfo - GetEntitySetUriInfo entitySetUriInfo = EasyMock.createMock(GetEntitySetUriInfo.class); + UriInfoImpl entitySetUriInfo = EasyMock.createMock(UriInfoImpl.class); EasyMock.expect(entitySetUriInfo.getSelect()).andStubReturn(selectItemList); EasyMock.expect(entitySetUriInfo.getExpand()).andStubReturn(expandList); EasyMock.expect(entitySetUriInfo.getInlineCount()).andStubReturn(InlineCount.ALLPAGES); EasyMock.expect(entitySetUriInfo.getSkip()).andStubReturn(new Integer(1)); EasyMock.expect(entitySetUriInfo.getTop()).andStubReturn(new Integer(2)); + Map<String, String> customQuery = new HashMap<String, String>(); + customQuery.put("count", "5"); + entitySetUriInfo.setCustomQueryOptions(null); + EasyMock.expectLastCall().times(1); + EasyMock.expect(entitySetUriInfo.getCustomQueryOptions()).andStubReturn(customQuery ); EasyMock.replay(entitySetUriInfo); return entitySetUriInfo; } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/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 7e8fccd..297ee02 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 @@ -25,6 +25,7 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -39,8 +40,6 @@ import javax.persistence.Query; import javax.persistence.TemporalType; import javax.persistence.metamodel.Metamodel; -import junit.framework.Assert; - import org.apache.olingo.odata2.api.commons.InlineCount; import org.apache.olingo.odata2.api.edm.EdmConcurrencyMode; import org.apache.olingo.odata2.api.edm.EdmEntityContainer; @@ -48,6 +47,7 @@ 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.api.edm.EdmFacets; +import org.apache.olingo.odata2.api.edm.EdmFunctionImport; import org.apache.olingo.odata2.api.edm.EdmMapping; import org.apache.olingo.odata2.api.edm.EdmProperty; import org.apache.olingo.odata2.api.edm.EdmType; @@ -64,19 +64,31 @@ import org.apache.olingo.odata2.api.uri.expression.FilterExpression; import org.apache.olingo.odata2.api.uri.expression.OrderByExpression; 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; import org.apache.olingo.odata2.api.uri.info.GetEntitySetCountUriInfo; +import org.apache.olingo.odata2.api.uri.info.GetEntitySetLinksUriInfo; 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.GetFunctionImportUriInfo; +import org.apache.olingo.odata2.api.uri.info.PutMergePatchUriInfo; +import org.apache.olingo.odata2.core.uri.UriInfoImpl; import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext; +import org.apache.olingo.odata2.jpa.processor.api.ODataJPAQueryExtensionEntityListener; +import org.apache.olingo.odata2.jpa.processor.api.ODataJPATombstoneEntityListener; import org.apache.olingo.odata2.jpa.processor.api.ODataJPATransaction; import org.apache.olingo.odata2.jpa.processor.api.access.JPAPaging; 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.model.JPAEdmMapping; import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants; +import org.apache.olingo.odata2.jpa.processor.core.mock.data.SalesOrderHeader; import org.apache.olingo.odata2.jpa.processor.core.model.JPAEdmMappingImpl; import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; +import junit.framework.Assert; + public class JPAProcessorImplTest { // -------------------------------- Common Start ------------------------------------common in @@ -127,6 +139,48 @@ public class JPAProcessorImplTest { fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); } } + + @Test + public void testProcessGetEntitySetUriInfoWithListener() throws EdmException { + try { + Assert.assertNotNull(objJPAProcessorImpl.process((GetEntitySetUriInfo)mockURIInfoWithTopSkipInlineListener())); + } catch (ODataJPAModelException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } catch (ODataJPARuntimeException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } + } + + @Test + public void testProcessGetEntityLinkUriInfo() { + try { + Assert.assertNotNull(objJPAProcessorImpl.process(getEntityLinkUriInfo())); + } catch (ODataJPAModelException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } catch (ODataJPARuntimeException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } + } + + @Test + public void testProcessGetEntitySetLinksUriInfo() { + try { + Assert.assertNotNull(objJPAProcessorImpl.process(getEntitySetLinksUriInfo())); + } catch (ODataJPAModelException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } catch (ODataJPARuntimeException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } + } + + @Test(expected = ODataJPARuntimeException.class) + public void testProcessFunctionImportUriInfo() throws ODataJPARuntimeException { + try { + objJPAProcessorImpl.process(getFunctionImportUriInfo()); + } catch (ODataJPAModelException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } + } @Test public void testProcessDeleteUriInfo() { @@ -184,6 +238,14 @@ public class JPAProcessorImplTest { private GetEntityCountUriInfo getEntityCountUriInfo() { return getLocalUriInfo(); } + + private GetFunctionImportUriInfo getFunctionImportUriInfo() { + + GetFunctionImportUriInfo objUriInfo = EasyMock.createMock(UriInfo.class); + EasyMock.expect(objUriInfo.getFunctionImport()).andStubReturn(getLocalEdmFunctionImport()); + EasyMock.replay(objUriInfo); + return objUriInfo; + } private GetEntitySetUriInfo getEntitySetUriInfo() { @@ -203,6 +265,54 @@ public class JPAProcessorImplTest { EasyMock.replay(objUriInfo); return objUriInfo; } + + private GetEntityLinkUriInfo getEntityLinkUriInfo () { + + UriInfo objUriInfo = EasyMock.createMock(UriInfo.class); + EasyMock.expect(objUriInfo.getStartEntitySet()).andStubReturn(getLocalEdmEntitySet()); + EasyMock.expect(objUriInfo.getTargetEntitySet()).andStubReturn(getLocalEdmEntitySet()); + EasyMock.expect(objUriInfo.getSelect()).andStubReturn(null); + EasyMock.expect(objUriInfo.getOrderBy()).andStubReturn(getOrderByExpression()); + EasyMock.expect(objUriInfo.getTop()).andStubReturn(getTop()); + EasyMock.expect(objUriInfo.getSkip()).andStubReturn(getSkip()); + EasyMock.expect(objUriInfo.getKeyPredicates()).andReturn(getKeyPredicates()); + EasyMock.expect(objUriInfo.getInlineCount()).andStubReturn(getInlineCount()); + EasyMock.expect(objUriInfo.getFilter()).andStubReturn(getFilter()); + EasyMock.expect(objUriInfo.getFunctionImport()).andStubReturn(null); + EasyMock.expect(objUriInfo.getCustomQueryOptions()).andStubReturn(null); + EasyMock.expect(objUriInfo.getNavigationSegments()).andStubReturn(new ArrayList<NavigationSegment>()); + EasyMock.replay(objUriInfo); + return objUriInfo; + } + + private GetEntitySetLinksUriInfo getEntitySetLinksUriInfo () { + + UriInfoImpl objUriInfo = EasyMock.createMock(UriInfoImpl.class); + EasyMock.expect(objUriInfo.getStartEntitySet()).andStubReturn(getLocalEdmEntitySet()); + EasyMock.expect(objUriInfo.getTargetEntitySet()).andStubReturn(getLocalEdmEntitySet()); + EasyMock.expect(objUriInfo.getSelect()).andStubReturn(null); + EasyMock.expect(objUriInfo.getOrderBy()).andStubReturn(getOrderByExpression()); + EasyMock.expect(objUriInfo.getTop()).andStubReturn(2); + EasyMock.expect(objUriInfo.getSkip()).andStubReturn(1); + EasyMock.expect(objUriInfo.getSkipToken()).andReturn("5"); + EasyMock.expect(objUriInfo.getInlineCount()).andStubReturn(InlineCount.ALLPAGES); + EasyMock.expect(objUriInfo.getFilter()).andStubReturn(getFilter()); + EasyMock.expect(objUriInfo.getFunctionImport()).andStubReturn(null); + EasyMock.expect(objUriInfo.isCount()).andStubReturn(false); + EasyMock.expect(objUriInfo.getCustomQueryOptions()).andStubReturn(null); + EasyMock.expect(objUriInfo.getNavigationSegments()).andStubReturn(new ArrayList<NavigationSegment>()); + objUriInfo.setCount(true); + EasyMock.expectLastCall().times(1); + objUriInfo.setCount(false); + EasyMock.expectLastCall().times(1); + Map<String, String> data = new HashMap<String, String>(); + data.put("count", "11"); + objUriInfo.setCustomQueryOptions(data ); + EasyMock.expectLastCall().times(1); + EasyMock.expect(objUriInfo.getCustomQueryOptions()).andStubReturn(data); + EasyMock.replay(objUriInfo); + return objUriInfo; + } /** * @return @@ -221,6 +331,31 @@ public class JPAProcessorImplTest { EasyMock.replay(objUriInfo); return objUriInfo; } + + /** + * @return + * @throws EdmException + */ + private EdmFunctionImport getLocalEdmFunctionImport() { + EdmFunctionImport edmFunction = EasyMock.createMock(EdmFunctionImport.class); + try { + EasyMock.expect(edmFunction.getName()).andStubReturn(SALES_ORDER_HEADERS); + EasyMock.expect(edmFunction.getEntityContainer()).andStubReturn(getLocalEdmEntityContainer()); + EasyMock.expect(edmFunction.getReturnType()).andStubReturn(null); + EasyMock.expect(edmFunction.getHttpMethod()).andStubReturn("GET"); + EasyMock.expect(edmFunction.getParameterNames()).andStubReturn(new ArrayList<String>()); + JPAEdmMappingImpl mockedEdmMapping = EasyMock.createMock(JPAEdmMappingImpl.class); + // ((Mapping) mockedEdmMapping).setInternalName(SALES_ORDER_HEADERS); + EasyMock.expect(edmFunction.getMapping()).andStubReturn(mockedEdmMapping); + EasyMock.expect(mockedEdmMapping.getInternalName()).andStubReturn(SALES_ORDER_HEADERS); + EasyMock.<Class<?>> expect(mockedEdmMapping.getJPAType()).andReturn(SalesOrderHeader.class); + EasyMock.replay(mockedEdmMapping); + EasyMock.replay(edmFunction); + } catch (EdmException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } + return edmFunction; + } /** * @return @@ -643,5 +778,105 @@ public class JPAProcessorImplTest { } // -------------------------------- Common End ------------------------------------ + private UriInfo mockURIInfoWithTopSkipInlineListener() throws EdmException { + + UriInfoImpl objUriInfo = EasyMock.createMock(UriInfoImpl.class); + EdmEntityType edmEntityType = EasyMock.createMock(EdmEntityType.class); + EasyMock.expect(edmEntityType.getMapping()).andStubReturn((EdmMapping) mockEdmMapping()); + EdmEntitySet edmEntitySet = EasyMock.createMock(EdmEntitySet.class); + EasyMock.expect(edmEntitySet.getEntityType()).andStubReturn(edmEntityType); + EasyMock.expect(edmEntityType.getKeyProperties()).andStubReturn(new ArrayList<EdmProperty>()); + EasyMock.expect(objUriInfo.getStartEntitySet()).andStubReturn(edmEntitySet); + EasyMock.expect(objUriInfo.getTargetEntitySet()).andStubReturn(edmEntitySet); + EasyMock.expect(objUriInfo.getSelect()).andStubReturn(null); + EasyMock.expect(objUriInfo.getOrderBy()).andStubReturn(getOrderByExpression()); + EasyMock.expect(objUriInfo.getTop()).andStubReturn(1); + EasyMock.expect(objUriInfo.getSkip()).andStubReturn(1); + EasyMock.expect(objUriInfo.getSkipToken()).andReturn("5"); + EasyMock.expect(objUriInfo.getFilter()).andStubReturn(getFilter()); + EasyMock.expect(objUriInfo.getFunctionImport()).andStubReturn(null); + Map<String, String> delta = new HashMap<String, String>(); + delta.put("!deltatoken", "!deltatoken"); + EasyMock.expect(objUriInfo.getCustomQueryOptions()).andStubReturn(delta ); + EasyMock.expect(objUriInfo.isCount()).andReturn(false); + EasyMock.expect(objUriInfo.getNavigationSegments()).andStubReturn(new ArrayList<NavigationSegment>()); + EasyMock.expect(objUriInfo.getInlineCount()).andStubReturn(InlineCount.ALLPAGES); + objUriInfo.setCount(true); + EasyMock.expectLastCall().times(1); + objUriInfo.setCount(false); + EasyMock.expectLastCall().times(1); + Map<String, String> data = new HashMap<String, String>(); + data.put("count", "11"); + objUriInfo.setCustomQueryOptions(data ); + EasyMock.expectLastCall().times(1); + EasyMock.replay(edmEntityType, edmEntitySet, objUriInfo); + return objUriInfo; + + } + + private JPAEdmMapping mockEdmMapping() { + JPATombstoneExtensionMock tombstone = new JPATombstoneExtensionMock(); + tombstone.handleDelta(new String("delta")); + JPAEdmMappingImpl mockedEdmMapping = new JPAEdmMappingImpl(); + mockedEdmMapping.setODataJPATombstoneEntityListener(JPAQueryExtensionMock.class); + mockedEdmMapping.setODataJPATombstoneEntityListener(JPATombstoneExtensionMock.class); + mockedEdmMapping.setInternalName(SALES_ORDER_HEADERS); + return mockedEdmMapping; + } + + public static final class JPATombstoneExtensionMock extends ODataJPATombstoneEntityListener { + + public void handleDelta(final Object entity) { + addToDelta(entity, SALES_ORDER_HEADERS); + } + @Override + public Query getQuery(GetEntitySetUriInfo resultsView, EntityManager em) throws ODataJPARuntimeException { + return null; + } + + @Override + public String generateDeltaToken(List<Object> deltas, Query query) { + return null; + } + + } + public static final class JPAQueryExtensionMock extends ODataJPAQueryExtensionEntityListener { + Query query = EasyMock.createMock(Query.class); + + @Override + public Query getQuery(GetEntityUriInfo uriInfo, EntityManager em) { + return query; + } + + @Override + public Query getQuery(GetEntitySetUriInfo uriInfo, EntityManager em) { + return null; + } + + @Override + public Query getQuery(GetEntitySetCountUriInfo uriInfo, EntityManager em) { + return query; + } + + @Override + public Query getQuery(DeleteUriInfo uriInfo, EntityManager em) { + return query; + } + + @Override + public Query getQuery(GetEntityCountUriInfo uriInfo, EntityManager em) { + return query; + } + + @Override + public Query getQuery(PutMergePatchUriInfo uriInfo, EntityManager em) { + return query; + } + + @Override + public boolean isTombstoneSupported() { + return true; + } + } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilderTest.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilderTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilderTest.java index e8a7192..27bdc63 100644 --- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilderTest.java +++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAQueryBuilderTest.java @@ -24,13 +24,16 @@ import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.UUID; import javax.persistence.EntityManager; import javax.persistence.Query; +import org.apache.olingo.odata2.api.commons.InlineCount; import org.apache.olingo.odata2.api.edm.EdmAssociation; import org.apache.olingo.odata2.api.edm.EdmAssociationEnd; import org.apache.olingo.odata2.api.edm.EdmEntitySet; @@ -64,6 +67,7 @@ import org.apache.olingo.odata2.api.uri.info.GetEntitySetCountUriInfo; 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.PutMergePatchUriInfo; +import org.apache.olingo.odata2.core.uri.UriInfoImpl; import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext; import org.apache.olingo.odata2.jpa.processor.api.ODataJPAQueryExtensionEntityListener; import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLContextType; @@ -440,8 +444,30 @@ public class JPAQueryBuilderTest { fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); } } + + @Test + public void buildQueryGetEntitySetTestWithNormalizationWithtoUpper() { + EdmMapping mapping = (EdmMapping) mockNormalizedMapping(); + try { + assertNotNull(builder.build((GetEntitySetUriInfo) + mockURIInfoForEntitySetWithBinaryFilterExpression(mapping, "toUpper"))); + } catch (ODataException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } + } @Test + public void buildQueryGetEntitySetTestWithNoNormalizationWithtoUpper() { + EdmMapping mapping = (EdmMapping) mockNormalizedValueMapping(); + try { + assertNotNull(builder.build((GetEntitySetUriInfo) + mockURIInfoForEntitySetWithBinaryFilterExpression(mapping, "toUpper"))); + } catch (ODataException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } + } + + @Test public void buildQueryGetEntitySetTestWithNormalizationWithSubstringof1() { EdmMapping mapping = (EdmMapping) mockNormalizedMapping1(); try { @@ -513,6 +539,28 @@ public class JPAQueryBuilderTest { } @Test + public void buildQueryWithTopSkipInline() { + EdmMapping mapping = (EdmMapping) mockMapping(); + try { + GetEntitySetUriInfo uriInfo = (GetEntitySetUriInfo) mockURIInfoWithTopSkipInline(mapping); + builder.getCount(uriInfo); + assertNotNull(uriInfo.getCustomQueryOptions().get("count")); + } catch (ODataException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } + } + + @Test + public void buildQueryWithTopSkipInlineWithListener() { + try { + GetEntitySetUriInfo uriInfo = (GetEntitySetUriInfo)mockURIInfoWithTopSkipInlineListener(); + builder.getCount(uriInfo); + } catch (ODataException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } + } + + @Test public void buildQueryWithKeyNavSegmentAndFilter() { EdmMapping mapping = (EdmMapping) mockMapping(); try { @@ -544,7 +592,71 @@ public class JPAQueryBuilderTest { EasyMock.replay(edmEntityType, edmEntitySet, uriInfo, keyPreds, edmProperty); return uriInfo; } + + @SuppressWarnings("unchecked") + private GetEntityUriInfo mockURIInfoWithTopSkipInline(EdmMapping mapping) throws EdmException { + UriInfoImpl uriInfo = EasyMock.createMock(UriInfoImpl.class); + List<NavigationSegment> navSegments = new ArrayList<NavigationSegment>(); + EasyMock.expect(uriInfo.getNavigationSegments()).andStubReturn(navSegments); + EdmEntityType edmEntityType = EasyMock.createMock(EdmEntityType.class); + EasyMock.expect(edmEntityType.getMapping()).andStubReturn(mapping); + EdmEntitySet edmEntitySet = EasyMock.createMock(EdmEntitySet.class); + EasyMock.expect(edmEntitySet.getEntityType()).andStubReturn(edmEntityType); + EasyMock.expect(uriInfo.getTargetEntitySet()).andStubReturn(edmEntitySet); + List<KeyPredicate> keyPreds = EasyMock.createMock(ArrayList.class); + EasyMock.expect(uriInfo.getKeyPredicates()).andStubReturn(keyPreds); + EasyMock.expect(uriInfo.getOrderBy()).andStubReturn(null); + EasyMock.expect(uriInfo.getTop()).andStubReturn(1); + EasyMock.expect(uriInfo.getSkip()).andStubReturn(2); + EasyMock.expect(uriInfo.isCount()).andStubReturn(false); + EasyMock.expect(uriInfo.getInlineCount()).andStubReturn(InlineCount.ALLPAGES); + EdmProperty edmProperty = EasyMock.createMock(EdmProperty.class); + EasyMock.expect(edmProperty.getMapping()).andStubReturn(mapping); + EasyMock.expect(edmEntityType.getKeyProperties()).andStubReturn(Arrays.asList(edmProperty)); + EasyMock.expect(uriInfo.getFilter()).andStubReturn(null); + uriInfo.setCount(true); + EasyMock.expectLastCall().times(1); + uriInfo.setCount(false); + EasyMock.expectLastCall().times(1); + Map<String, String> data = new HashMap<String, String>(); + data.put("count", "5"); + uriInfo.setCustomQueryOptions(data ); + EasyMock.expectLastCall().times(1); + EasyMock.expect(uriInfo.getCustomQueryOptions()).andStubReturn(data); + EasyMock.replay(edmEntityType, edmEntitySet, uriInfo, keyPreds, edmProperty); + return uriInfo; + } + + private UriInfo mockURIInfoWithTopSkipInlineListener() throws EdmException { + UriInfoImpl uriInfo = EasyMock.createMock(UriInfoImpl.class); + EdmEntityType edmEntityType = EasyMock.createMock(EdmEntityType.class); + EasyMock.expect(edmEntityType.getMapping()).andStubReturn((EdmMapping) mockEdmMapping()); + EdmEntitySet edmEntitySet = EasyMock.createMock(EdmEntitySet.class); + EasyMock.expect(edmEntitySet.getEntityType()).andStubReturn(edmEntityType); + EasyMock.expect(uriInfo.getTargetEntitySet()).andStubReturn(edmEntitySet); + EasyMock.expect(uriInfo.getNavigationSegments()).andReturn(null); + EasyMock.expect(uriInfo.getKeyPredicates()).andStubReturn(null); + EasyMock.expect(uriInfo.getStartEntitySet()).andStubReturn(edmEntitySet); + EasyMock.expect(uriInfo.getOrderBy()).andStubReturn(null); + EasyMock.expect(uriInfo.isCount()).andStubReturn(false); + EasyMock.expect(uriInfo.getFilter()).andStubReturn(null); + EasyMock.expect(uriInfo.getTop()).andStubReturn(1); + EasyMock.expect(uriInfo.getSkip()).andStubReturn(1); + EasyMock.expect(uriInfo.getInlineCount()).andStubReturn(InlineCount.ALLPAGES); + uriInfo.setCount(true); + EasyMock.expectLastCall().times(1); + uriInfo.setCount(false); + EasyMock.expectLastCall().times(1); + Map<String, String> data = new HashMap<String, String>(); + data.put("count", "5"); + uriInfo.setCustomQueryOptions(data ); + EasyMock.expectLastCall().times(1); + EasyMock.replay(edmEntityType, edmEntitySet, uriInfo); + return uriInfo; + + } + private UriInfo mockURIInfoWithListener(boolean isNavigationEnabled) throws EdmException { UriInfo uriInfo = EasyMock.createMock(UriInfo.class); if (isNavigationEnabled) { @@ -760,7 +872,8 @@ public class JPAQueryBuilderTest { EdmProperty edmProperty = mockEdmProperty(mapping, "String"); keyPreds.add(mockKeyPredicate(edmProperty, "Id")); EasyMock.expect(uriInfo.getKeyPredicates()).andStubReturn(keyPreds); - + EasyMock.expect(uriInfo.getTop()).andStubReturn(null); + EasyMock.expect(uriInfo.getSkip()).andStubReturn(null); OrderByExpression orderbyExpression = mockOrderByExpressions(uriInfo); EasyMock.replay(edmEntityType, edmEntitySet, uriInfo, navEntitySet, orderbyExpression); @@ -794,6 +907,8 @@ public class JPAQueryBuilderTest { List<KeyPredicate> keyPreds =EasyMock.createMock(ArrayList.class); EasyMock.expect(uriInfo.getKeyPredicates()).andStubReturn(keyPreds); OrderByExpression orderbyExpression = mockOrderByExpressions(uriInfo); + EasyMock.expect(uriInfo.getTop()).andStubReturn(null); + EasyMock.expect(uriInfo.getSkip()).andStubReturn(null); EasyMock.replay(edmEntityType, edmEntitySet, uriInfo, keyPreds,orderbyExpression); return uriInfo; @@ -953,6 +1068,14 @@ public class JPAQueryBuilderTest { EasyMock.expect(propExp.getKind()).andStubReturn(ExpressionKind.PROPERTY); parameterList.add(propExp); EasyMock.expect(methodExp.getParameters()).andStubReturn(parameterList); + } else if ("toUpper".equals(methodName)) { + EasyMock.expect(methodExp.getMethod()).andStubReturn(MethodOperator.TOUPPER); + EasyMock.expect(methodExp.getKind()).andStubReturn(ExpressionKind.METHOD); + EasyMock.expect(methodExp.getParameterCount()).andStubReturn(1); + EasyMock.expect(propExp.getEdmProperty()).andStubReturn(edmProperty); + EasyMock.expect(propExp.getKind()).andStubReturn(ExpressionKind.PROPERTY); + parameterList.add(propExp); + EasyMock.expect(methodExp.getParameters()).andStubReturn(parameterList); } EasyMock.expect(filterExpression.getExpression()).andStubReturn(commonExpression); EasyMock.expect(filterExpression.getKind()).andStubReturn(ExpressionKind.FILTER); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java index 69980e6..95b125f 100644 --- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java +++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java @@ -19,8 +19,10 @@ package org.apache.olingo.odata2.jpa.processor.core.mock; import java.sql.Time; +import java.util.ArrayList; import java.util.Calendar; import java.util.HashSet; +import java.util.List; import java.util.Set; import javax.persistence.EntityManager; @@ -85,6 +87,9 @@ public abstract class ODataJPAContextMock { EasyMock.anyObject(TemporalType.TIMESTAMP.getClass()))).andReturn(jpqlquery).anyTimes(); EasyMock.expect(jpqlquery.setParameter(EasyMock.anyInt(), (Time) EasyMock.anyObject(), EasyMock.anyObject(TemporalType.TIME.getClass()))).andReturn(jpqlquery).anyTimes(); + List<Object> result = new ArrayList<Object>(); + result.add(5); + EasyMock.expect(jpqlquery.getResultList()).andReturn(result).anyTimes(); EasyMock.replay(em, mm, jpqlquery); return em; http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/CustomerQueryExtension.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/CustomerQueryExtension.java b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/CustomerQueryExtension.java index 1babccd..9e05772 100644 --- a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/CustomerQueryExtension.java +++ b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/CustomerQueryExtension.java @@ -24,6 +24,7 @@ import javax.persistence.EntityManager; import javax.persistence.Query; import org.apache.olingo.odata2.api.uri.expression.FilterExpression; +import org.apache.olingo.odata2.api.uri.info.GetEntitySetCountUriInfo; import org.apache.olingo.odata2.api.uri.info.GetEntitySetUriInfo; import org.apache.olingo.odata2.api.uri.info.GetEntityUriInfo; import org.apache.olingo.odata2.jpa.processor.api.ODataJPAQueryExtensionEntityListener; @@ -45,6 +46,27 @@ public class CustomerQueryExtension extends ODataJPAQueryExtensionEntityListener } @Override + public Query getQuery(GetEntitySetCountUriInfo uriInfo, EntityManager em) throws ODataJPARuntimeException { + Query query = null; + JPQLContextType contextType = null; + if (uriInfo.getNavigationSegments().size() > 0) { + contextType = JPQLContextType.JOIN_SINGLE; + } else { + contextType = JPQLContextType.SELECT_COUNT; + } + JPQLContext jpqlContext; + try { + jpqlContext = JPQLContext.createBuilder(contextType, uriInfo).build(); + query = em.createQuery(JPQLStatement.createBuilder(jpqlContext).build().toString()); + } catch (ODataJPAModelException e) { + // Log and return null query object; + } catch (ODataJPARuntimeException e) { + // Log and return null query object; + } + return query; + } + + @Override public Query getQuery(GetEntityUriInfo uriInfo, EntityManager em) { Query query = null; JPQLContextType contextType = null; @@ -62,7 +84,7 @@ public class CustomerQueryExtension extends ODataJPAQueryExtensionEntityListener } catch (ODataJPARuntimeException e) { // Log and return null query object; } - return null; + return query; } @Override http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchChangeSetPartImpl.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchChangeSetPartImpl.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchChangeSetPartImpl.java index 3df9884..be88a0b 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchChangeSetPartImpl.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchChangeSetPartImpl.java @@ -30,7 +30,7 @@ public class BatchChangeSetPartImpl extends BatchChangeSetPart { private Map<String, String> headers = new HashMap<String, String>(); private Object body; private String uri; - public String cntId; + private String cntId; private static final String CHANGE_METHODS = "(PUT|POST|DELETE|MERGE|PATCH)"; @Override http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchHelper.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchHelper.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchHelper.java index 42cd445..3d2b78f 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchHelper.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchHelper.java @@ -42,13 +42,13 @@ public class BatchHelper { public static final String BINARY_ENCODING = "binary"; public static final String UTF8_ENCODING = "UTF-8"; public static final String ISO_ENCODING = "ISO-8859-1"; - public static String DEFAULT_ENCODING = "ISO-8859-1"; + private static String DEFAULT_ENCODING = "ISO-8859-1"; public static final String HTTP_CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding"; public static final String HTTP_CONTENT_ID = "Content-Id"; public static final String MIME_HEADER_CONTENT_ID = "MimeHeader-ContentId"; public static final String REQUEST_HEADER_CONTENT_ID = "RequestHeader-ContentId"; - public static Charset DEFAULT_CHARSET = Charset.forName(DEFAULT_ENCODING); + protected static Charset DEFAULT_CHARSET = Charset.forName(DEFAULT_ENCODING); protected static String generateBoundary(final String value) { return value + "_" + UUID.randomUUID().toString(); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/debug/DebugInfoRuntime.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/debug/DebugInfoRuntime.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/debug/DebugInfoRuntime.java index 90fdd37..e0a9ca3 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/debug/DebugInfoRuntime.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/debug/DebugInfoRuntime.java @@ -38,8 +38,8 @@ public class DebugInfoRuntime implements DebugInfo { protected long timeStarted; protected long timeStopped; protected List<RuntimeNode> children = new ArrayList<RuntimeNode>(); - public long memoryStarted; - public long memoryStopped; + protected long memoryStarted; + protected long memoryStopped; protected RuntimeNode() { timeStarted = 0; http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/InfoMethod.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/InfoMethod.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/InfoMethod.java index 400cbd0..4969aca 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/InfoMethod.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/InfoMethod.java @@ -29,10 +29,10 @@ import org.apache.olingo.odata2.api.uri.expression.MethodOperator; */ class InfoMethod { - public MethodOperator method; - public String syntax; - public int minParameter; - public int maxParameter; + private MethodOperator method; + private String syntax; + private int minParameter; + private int maxParameter; ParameterSetCombination combination; public InfoMethod(final MethodOperator method, final ParameterSetCombination combination) { http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ParameterSet.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ParameterSet.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ParameterSet.java index b9ce742..1a375ee 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ParameterSet.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ParameterSet.java @@ -36,7 +36,7 @@ import org.apache.olingo.odata2.api.edm.EdmTypeKind; @SuppressWarnings("javadoc") public class ParameterSet { private EdmType returnType = null; - public ArrayList<EdmSimpleType> types = new ArrayList<EdmSimpleType>(); + private ArrayList<EdmSimpleType> types = new ArrayList<EdmSimpleType>(); private EdmSimpleType furtherType = null; public ParameterSet(final EdmType returnType, final EdmSimpleType type1) { http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ParameterSetCombination.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ParameterSetCombination.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ParameterSetCombination.java index 72c8b54..9a6d05c 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ParameterSetCombination.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/expression/ParameterSetCombination.java @@ -34,7 +34,7 @@ public interface ParameterSetCombination { EdmType getReturnType(); public static class PSCflex implements ParameterSetCombination { - public List<ParameterSet> combinations = new ArrayList<ParameterSet>(); + private List<ParameterSet> combinations = new ArrayList<ParameterSet>(); @Override public void add(final ParameterSet parameterSet) { http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/39e00568/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/ODataMessageTextVerifier.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/ODataMessageTextVerifier.java b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/ODataMessageTextVerifier.java index 2f510bc..e78d6f0 100644 --- a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/ODataMessageTextVerifier.java +++ b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/helper/ODataMessageTextVerifier.java @@ -47,7 +47,7 @@ public class ODataMessageTextVerifier { private static final String BUNDLE_NAME = "i18n"; //$NON-NLS-1$ private static final Locale locale = Locale.ROOT; - public ResourceBundle resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME, locale); + private ResourceBundle resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME, locale); private final List<Throwable> errorCollector; public ODataMessageTextVerifier() {