From 6200a5fef913501dcd526ec9c726fb69a7f1e792 Mon Sep 17 00:00:00 2001
From: Oliver Grande
Date: Tue, 14 Apr 2020 17:12:22 +0200
Subject: [PATCH 001/192] Feature/transient fields (#142)
* Fix null pointer if no enumerations are part of servcie
* Enable HAS and enumeration as return type of operations
* Allow Enumerations as operation parameter
* Provide java based operations converted enumeration
* Add SourceClear addon
* Delete SourceClean addon
* Enumerations at UDF functions
- Works for bound functions
- Works for functions with import
* Correct unit tests
* Enable multiple values for flags enumerations
* Switch detection default between Embedded and Entity type
* Allow collection attributes for metadata
* Enable query without collection attributes
* Rework query result conversion to reduce memory consumtion
* Missing Metadata pom
* First step entity with collections as return of function/action
* Bugfix: Expand on Parent with $filter on navigation path
* Enable the use of Join Tables
- Filter on navigation via Join Table generally not supported
* Create new query for inlinecount
* Enable Join Tables@Navigation Filter
- Not working mapped associations
- Not working $count
* Enable Join Tables@Navigation Filter
- With mapped associations
- With $count, know issue EclipsLink two sub types
* Increase Version --> 0.2.6
* Remove deprecated JPAExecutableQuery
* Bugfix: unidirectional join table based association
* Access collection properties via navigation
- New version
* Access collection properties w and w/o $select
* Access collection properties which are part of complex property
* CUD operations on collection properties
* Filter on collection properties pre optimization
* Filter on collection properties any/all
* Filter on collection w/o filter on $count and orderby $count
* Correct issue #29
- Correct /$count implementation in JPAJoinQuery
- Clean-up Hibernate differences
-- Subquery from clause
-- Id Class determination
* Increase Version to 0.2.7
* Enable ..@odata.navigationLink in case of odata.metadata=full
- links@complex types not yet working
* Preparation for solution of issue OLINGO-1143
* Correct NullPointer and some clean-ups
* Support order by $count
- Increase version to 0.2.8
* Intermediate merge clean-up
* Solve merge problem navigate complex collections
* Resolve merge conflict converter
* Correct error collection property and expand=*
* Enable filter $count on collection property
* Update version and url
* Create and use page provider
* Recreate change for solution of issue OLINGO-1143
* Finalize top level server driven paging
* Correct string handling error
* Correct link problem
* Enable skiptoken to have other type than String
* Move paging so next request injects old uriInfo correctly
* Enable deep insert via complex properties
* Ignore test for next commit
* Enable create of a new entity linked by a to one using PATCH
* Update to Olingo 4.5.0
- use new Olingo version
- adopt one test to changed @odata.context content
* Collection attributes rework. Issue #60
- Change processor pom -> javax.servlet became provided
* Enable annotation for properties to mark them authorization relevant
* Enable multiple protected properties at complex attributes
* Rework EdmProtectedBy annotation to handle multiple claims at complex
* Process protection
* Rework handling of ignored protected
* Made inner class static
* Fixing issue #60
* $count query not working correctly on complex collection attributes
* Various small bugs
- Reorg. pom.xml
- Correct http status on empty result
- Correct empty check for collection properties
* Correct typo in interface JPAODataPagingProvider
* Prepare JPAODataDatabaseTableFunction for paging
* Change to HSQLDB
* Remove function from sql-file to work around problems with Derby
* Correct NullPointerException EdmEntitySetResult
* Determine result of create dependent based on before image
* EntityType getAttribute did not return value for embedded id
* Provide CUD example and correct query status codes
* Correct query response
* Maven Archetype for Spring based service
* Upgrade to Junit5 to get support for Java > 1.8
* Extract interface for better unit test support
- Cleanup tests
* Clean-up interface implementation
* Add SQL function handling
* Complete DB function changes
* Clean-up test class
* Clean-up test class
* Update Version number
* Update Version number
* Additional test for API classes
* Enable suppress of wildcard in metadata
* Enable wildcards during query processing
* Increase information on error during filter
* Support of PUT on collection properties and primitive properties
* Fix Null Pointer on PATCH with return != minimal
* Claims where not respected by queries issue #69 part one
- /$count
- ?$count=true
- paging queries
* Claims where not respected by queries issue #69 part two
- $filter
- Update on Olingo 4.6.0
* Restrict the DISTINCT to protections only
* Increase test coverage
- New tests
- Rework vocabulary handling
* Cleanup Vocabularies II
- Add Action and Function
- Remove NavigationProperty and dependent
* Additional test and solution of issue #78
* Enable new annotation EdmVisibleFor at properties
* Introduction of Request Context
- Deprecation of two variants of JPAODataGetHandler.process
- Increase test coverage
* Restrict EdmVisiableFor to nullable non key attributes
* Skip properties from selection that do not belong to provided group
* Handle collection properties and navigation path
* Enable groups at complex collections
* Handle OrderBy clause
* Correct unit test
* Rework test containing images
* Rework context handling
- Move of cud handler to request context
- Move of DebugSupport to request context (is request specific because
of isUserAuthorized)
- Introduction of builder for Service Context to get a leaner creation
of handler
* Providing groups during modifying requests
* Re-enable old shortcut with late metadata provisioning
* Update pom for missing jackson dependency
* Update Archetype to version 0.3.4
* Update Version
* Extension of session context, so an emf can be provided
* Ignore annotation qualified if empty
* Go back to Olingo JSON deserializer
* Add qualifier to annotation
* Increase release
* Clean-up JPAEdmNameBuilder
* Preparation of custom name builder
- Create public interface
- replace class by new interface
* Revoke test adoption
* Providing custome name builder
* Update annotation EdmFunction
* Increase release
* Adopt archetype
- Simplify service
- Add integration test
* Modify example did not persist on create
* Deep Insert did not responded deep
* Always select ETag
* Complete ETag handling
* Missing Context Changes
* Reset unit test to current pushed state
* Increase test coverage
* Adopt test to real number of complex types
* Enable V4.01 JSON format as request and response
* Additional Integration tests support OData V4.01 JSON
* Allow usage of different types of transaction
* Increase Spring support
* Bugfix/issue83 (#120)
* Update Version
* Extension of session context, so an emf can be provided
* Preparation of custom name builder
- Create public interface
- replace class by new interface
* Revoke test adoption
* Providing custome name builder
* Update annotation EdmFunction
* Increase release
* Adopt archetype
- Simplify service
- Add integration test
* Modify example did not persist on create
* Deep Insert did not responded deep
* Always select ETag
* Complete ETag handling
* Missing Context Changes
* Reset unit test to current pushed state
* Increase test coverage
* Adopt test to real number of complex types
* Enable V4.01 JSON format as request and response
* Additional Integration tests support OData V4.01 JSON
* Allow usage of different types of transaction
* Increase Spring support
* Restrict $expand select by key range
* Support root with navigation like AdministrativeDivision(...)/Children
* Protect dilution of test coverage by test package (#133)
* Increase release
* Increase release (#136)
* Protect dilution of test coverage by test package (#135)
* Remove deprecated artifacts (#134)
* Remove deprecated artefacts
* Missing test adoptions
* Upgrade Olingo version and processor version
* Feature/transient fields (#137)
* Increase release
* Upgrade Olingo version and processor version
* Prevent NPE on expand empty result (#138)
* Correct SonarQube and SpotBug hints
* Feature/transient fields (#139)
* Increase release
* Upgrade Olingo version and processor version
* Correct SonarQube and SpotBug hints
* SpotBugs and clean-ups
* Build metadata I
* First draft of criteria builder and query implementation (#140)
* First draft of criteria builder and query implementation
* Add Transient
* First join version
* Correct structured type
* Test adoption was missing
* Update criteria builder
* Solve enum error
* Support aggregation function
* Correct buildInverseJoinColumns() error
* Add Test buildInverseJoinColumns() error
* Enable table join without entity type
* Correct Error table name
* Own test for JPAEdmProvider and correct name builder error
* Additional test
* Support parallel processing of batch requests
* Complete synchronized creation of metadata
* Enable transient field calculator
* Suppress transient fields at $filter and $orderby
* Enable transient collections and collections with transient attributes
* Additional tests for changing operations
* Enable absolute path in url
---
README.md | 2 +-
jpa-archetype/jpa-archetype-spring/pom.xml | 36 +
.../META-INF/maven/archetype-metadata.xml | 50 +
.../resources/archetype-resources/pom.xml | 124 ++
.../src/main/java/SpringApp.java | 12 +
.../config/EclipseLinkJpaConfiguration.java | 76 +
.../java/config/ProcessorConfiguration.java | 31 +
.../main/java/controller/ODataController.java | 33 +
.../src/main/java/model/EntityTemplate.java | 59 +
.../main/java/model/ValueObjectTemplate.java | 52 +
.../java/model/ValueObjectTemplateKey.java | 56 +
.../src/main/resources/application-test.yml | 25 +
.../src/main/resources/application.yml | 25 +
.../main/resources/db/migration/V1_0__jpa.sql | 10 +
.../src/test/java/AppTest.java | 20 +
.../java/integrationtest/ControllerTest.java | 158 ++
.../requests/CreateEntityViaBatch.txt | 38 +
jpa-archetype/pom.xml | 21 +
jpa-tutorial/.gitignore | 1 +
jpa/.classpath | 26 -
jpa/.gitignore | 7 +
jpa/odata-jpa-annotation/.classpath | 27 -
jpa/odata-jpa-annotation/.gitignore | 4 +
.../.settings/org.eclipse.jdt.core.prefs | 9 +-
.../org.eclipse.wst.common.component | 5 -
....eclipse.wst.common.project.facet.core.xml | 2 +-
jpa/odata-jpa-annotation/pom.xml | 57 +-
.../core/edm/annotation/EdmAnnotation.java | 2 +-
.../core/edm/annotation/EdmEnumeration.java | 62 +
.../core/edm/annotation/EdmFunction.java | 7 +-
.../core/edm/annotation/EdmProtectedBy.java | 40 +
.../core/edm/annotation/EdmProtections.java | 19 +
.../core/edm/annotation/EdmTransient.java | 34 +
.../EdmTransientPropertyCalculator.java | 45 +
.../core/edm/annotation/EdmVisibleFor.java | 29 +
.../odata/v4/core/annotation/Immutable.java | 16 +
jpa/odata-jpa-coverage/pom.xml | 80 +
jpa/odata-jpa-metadata/.classpath | 37 -
jpa/odata-jpa-metadata/.gitignore | 5 +
.../.settings/org.eclipse.jdt.core.prefs | 9 +-
.../org.eclipse.wst.common.component | 6 -
....eclipse.wst.common.project.facet.core.xml | 2 +-
jpa/odata-jpa-metadata/model/.gitignore | 3 +
jpa/odata-jpa-metadata/pom.xml | 33 +-
.../jpa/metadata/api/JPAEdmProvider.java | 172 +-
.../metadata/api/JPAEntityManagerFactory.java | 15 +-
.../jpa/metadata/api/JPAJoinColumn.java | 17 +
.../annotation/AbstractVocabularyReader.java | 70 +
.../core/edm/mapper/annotation/Action.java | 43 +
.../core/edm/mapper/annotation/AppliesTo.java | 20 +-
.../edm/mapper/annotation/ComplexType.java | 148 +-
.../mapper/annotation/EntityKeyElement.java | 23 -
.../edm/mapper/annotation/EntityType.java | 132 --
.../core/edm/mapper/annotation/EnumType.java | 96 +-
.../core/edm/mapper/annotation/Function.java | 53 +
.../core/edm/mapper/annotation/Member.java | 28 +-
.../mapper/annotation/NavigationProperty.java | 148 --
.../core/edm/mapper/annotation/Parameter.java | 62 +
.../core/edm/mapper/annotation/Property.java | 185 +-
.../edm/mapper/annotation/PropertyRef.java | 24 -
.../annotation/ReferentialConstraint.java | 31 -
.../edm/mapper/annotation/ReturnType.java | 56 +
.../core/edm/mapper/annotation/Schema.java | 172 +-
.../edm/mapper/annotation/SchemaReader.java | 68 +-
.../core/edm/mapper/annotation/Term.java | 160 +-
.../edm/mapper/annotation/TermReader.java | 63 +-
.../edm/mapper/annotation/TypeDefinition.java | 120 +-
.../core/edm/mapper/api/JPAAction.java | 4 +-
.../mapper/api/JPAAssociationAttribute.java | 5 +-
.../edm/mapper/api/JPAAssociationPath.java | 26 +-
.../core/edm/mapper/api/JPAAttribute.java | 58 +-
.../mapper/api/JPACollectionAttribute.java | 27 +
.../mapper/api/JPADescriptionAttribute.java | 9 +-
.../edm/mapper/api/JPAEdmNameBuilder.java | 103 +
.../core/edm/mapper/api/JPAElement.java | 16 +-
.../core/edm/mapper/api/JPAEntityType.java | 30 +-
.../mapper/api/JPAEnumerationAttribute.java | 27 +
.../core/edm/mapper/api/JPAFunction.java | 2 +
.../core/edm/mapper/api/JPAJoinTable.java | 30 +
.../metadata/core/edm/mapper/api/JPAPath.java | 39 +-
.../edm/mapper/api/JPAProtectionInfo.java | 32 +
.../edm/mapper/api/JPAServiceDocument.java | 24 +-
.../edm/mapper/api/JPAStructuredType.java | 115 +-
.../exception/ODataJPAModelException.java | 45 +-
.../IntermediateModelItemAccess.java | 9 +-
.../IntermediateNavigationPropertyAccess.java | 5 +-
.../extention/IntermediatePropertyAccess.java | 11 +-
.../mapper/impl/DefaultEdmPostProcessor.java | 19 +-
.../IntermediatOperationResultParameter.java | 18 +-
.../impl/IntermediateActionFactory.java | 5 +-
.../impl/IntermediateCollectionProperty.java | 341 ++++
.../mapper/impl/IntermediateComplexType.java | 26 +-
.../impl/IntermediateDataBaseFunction.java | 96 +-
.../impl/IntermediateDescriptionProperty.java | 283 ++-
.../impl/IntermediateEmbeddedIdProperty.java | 26 +-
.../impl/IntermediateEntityContainer.java | 56 +-
.../mapper/impl/IntermediateEntitySet.java | 11 +-
.../mapper/impl/IntermediateEntityType.java | 305 ++-
.../impl/IntermediateEnumerationType.java | 186 +-
.../edm/mapper/impl/IntermediateFunction.java | 27 +-
.../impl/IntermediateFunctionFactory.java | 7 +-
.../mapper/impl/IntermediateJavaAction.java | 107 +-
.../mapper/impl/IntermediateJavaFunction.java | 57 +-
.../mapper/impl/IntermediateJoinColumn.java | 17 +-
.../mapper/impl/IntermediateJoinTable.java | 191 ++
.../mapper/impl/IntermediateModelElement.java | 110 +-
.../impl/IntermediateNavigationProperty.java | 337 +++-
.../mapper/impl/IntermediateOperation.java | 1 +
.../impl/IntermediateOperationFactory.java | 3 +-
.../impl/IntermediateOperationHelper.java | 33 +-
.../impl/IntermediateOperationParameter.java | 15 +-
.../edm/mapper/impl/IntermediateProperty.java | 644 ++++---
.../mapper/impl/IntermediateReferences.java | 36 +-
.../edm/mapper/impl/IntermediateSchema.java | 194 +-
.../impl/IntermediateServiceDocument.java | 103 +-
.../impl/IntermediateSimpleProperty.java | 164 ++
.../impl/IntermediateStructuredType.java | 773 ++++++--
.../mapper/impl/JPAAssociationPathImpl.java | 206 +-
.../mapper/impl/JPADefaultEdmNameBuilder.java | 136 ++
.../edm/mapper/impl/JPAEdmNameBuilder.java | 227 ---
.../core/edm/mapper/impl/JPANameBuilder.java | 9 +-
.../mapper/impl/JPAOnConditionItemImpl.java | 5 +
.../core/edm/mapper/impl/JPAPathImpl.java | 89 +-
.../edm/mapper/impl/JPAProtectionInfo.java | 43 +
.../impl/JPAServiceDocumentFactory.java | 14 +-
.../edm/mapper/impl/JPATypeConvertor.java | 62 +-
.../core/edm/mapper/impl/ODataEnum.java | 5 -
.../edm/mapper/impl/ODataEnumerationType.java | 5 -
.../mapper/impl/OffsetDateTimeConverter.java | 29 +
.../metadata-exceptions-i18n.properties | 104 +-
.../metadata-exceptions-i18n_de.properties | 45 -
.../jpa/metadata/api/TestJPAEdmProvider.java | 314 +++
.../mapper/annotation/TestAnnotationPOJO.java | 10 +-
.../mapper/annotation/TestSchemaReader.java | 393 +++-
.../edm/mapper/annotation/TestTermReader.java | 71 +-
.../TestODataJPAMessageTextBuffer.java | 14 +-
.../exception/TestODataJPAModelException.java | 9 +-
.../edm/mapper/impl/CustomJPANameBuilder.java | 76 +
.../core/edm/mapper/impl/TestHelper.java | 86 +-
.../impl/TestIntermediateActionFactory.java | 22 +-
.../TestIntermediateCollectionProperty.java | 211 ++
.../impl/TestIntermediateComplexType.java | 196 +-
.../impl/TestIntermediateContainer.java | 84 +-
.../TestIntermediateDataBaseFunction.java | 165 +-
.../TestIntermediateDescriptionProperty.java | 307 ++-
.../TestIntermediateEmbeddedIdProperty.java | 64 +
.../impl/TestIntermediateEntitySet.java | 41 +-
.../impl/TestIntermediateEntityType.java | 370 +++-
.../impl/TestIntermediateEnumerationType.java | 147 +-
.../impl/TestIntermediateFunctionFactory.java | 22 +-
.../impl/TestIntermediateJavaAction.java | 115 +-
.../impl/TestIntermediateJavaFunction.java | 127 +-
.../impl/TestIntermediateModelElement.java | 82 +
.../TestIntermediateNavigationProperty.java | 417 +++-
.../mapper/impl/TestIntermediateProperty.java | 384 ----
.../impl/TestIntermediateReferences.java | 33 +-
.../mapper/impl/TestIntermediateSchema.java | 54 +-
.../impl/TestIntermediateServiceDocument.java | 276 ++-
.../impl/TestIntermediateSimpleProperty.java | 706 +++++++
.../impl/TestIntermediateWrongAnnotation.java | 179 ++
.../mapper/impl/TestJPAEdmNameBuilder.java | 15 +-
.../impl/TestJPAOnConditionItemImpl.java | 42 +
.../core/edm/mapper/impl/TestJPAPath.java | 160 +-
.../mapper/impl/TestJPAProtectionInfo.java | 64 +
.../edm/mapper/impl/TestJPATypeConvertor.java | 339 ++++
.../core/edm/mapper/impl/TestMappingRoot.java | 13 +-
.../impl/TestOffsetDateTimeConverter.java | 56 +
.../core/edm/mapper/testaction/Actions.java | 30 +
.../mapper/testaction/function/Function.java | 14 +
.../edm/mapper/testobjects/DayOfWeek.java | 19 +-
.../testobjects/ExampleJavaActions.java | 11 +-
.../testobjects/ExampleJavaFunctions.java | 18 +-
.../testobjects/ExampleJavaOneFunction.java | 2 +-
.../edm/mapper/testobjects/FileAccess.java | 22 +
.../testobjects/FileAccessConverter.java | 28 +
.../edm/mapper/testobjects/WrongMember.java | 18 +
.../testobjects/WrongMemberConverter.java | 28 +
.../edm/mapper/testobjects/WrongType.java | 20 +
.../testobjects/WrongTypeConverter.java | 19 +
.../core/edm/mapper/util/MemberDouble.java | 63 +
.../annotations/Org.OData.Aggregation.V1.xml | 202 ++
.../annotations/Org.OData.Capabilities.V1.xml | 774 ++++----
.../annotations/Org.OData.Core.V1.xml | 251 ++-
.../Org.OData.Repeatability.V1.xml | 85 +
.../annotations/Org.Olingo.Test.V1.xml | 50 +-
.../src/test/resources/annotations/empty.xml | 0
.../src/test/resources/metadata/TripPin.xml | 2 +-
jpa/odata-jpa-processor-cb/.gitignore | 14 +
jpa/odata-jpa-processor-cb/pom.xml | 36 +
.../cb/api/EntityManagerFactoryWrapper.java | 99 +
.../processor/cb/api/ProcessorSelection.java | 77 +
.../processor/cb/api/ProcessorSubquery.java | 20 +
.../jpa/processor/cb/api/SqlAggregation.java | 19 +
.../jpa/processor/cb/api/SqlArithmetic.java | 21 +
.../jpa/processor/cb/api/SqlConvertable.java | 8 +
.../jpa/processor/cb/api/SqlJoinType.java | 44 +
.../jpa/processor/cb/api/SqlKeyWords.java | 39 +
.../jpa/processor/cb/api/SqlNullCheck.java | 18 +
.../processor/cb/api/SqlStringFunctions.java | 23 +
.../jpa/processor/cb/api/SqlSubQuery.java | 20 +
.../processor/cb/api/SqlTimeFunctions.java | 19 +
.../cb/exeptions/InternalServerError.java | 12 +
.../cb/exeptions/NotImplementedException.java | 10 +
.../processor/cb/impl/AbstractJoinImp.java | 206 ++
.../jpa/processor/cb/impl/AliasBuilder.java | 19 +
.../processor/cb/impl/CollectionJoinImpl.java | 119 ++
.../cb/impl/CriteriaBuilderImpl.java | 1691 +++++++++++++++++
.../processor/cb/impl/CriteriaQueryImpl.java | 758 ++++++++
.../cb/impl/EntityManagerWrapper.java | 301 +++
.../jpa/processor/cb/impl/ExpressionImpl.java | 460 +++++
.../jpa/processor/cb/impl/FromImpl.java | 585 ++++++
.../jpa/processor/cb/impl/JoinTableJoin.java | 95 +
.../jpa/processor/cb/impl/OrderImpl.java | 40 +
.../processor/cb/impl/ParameterBuffer.java | 36 +
.../jpa/processor/cb/impl/PathImpl.java | 231 +++
.../jpa/processor/cb/impl/PathJoin.java | 60 +
.../jpa/processor/cb/impl/PredicateImpl.java | 385 ++++
.../jpa/processor/cb/impl/RootImpl.java | 20 +
.../jpa/processor/cb/impl/SimpleJoin.java | 46 +
.../jpa/processor/cb/impl/SubqueryImpl.java | 296 +++
.../jpa/processor/cb/impl/TupleImpl.java | 169 ++
.../jpa/processor/cb/impl/TypedQueryImpl.java | 311 +++
.../cb/joiner/ExpressionCollector.java | 48 +
.../processor/cb/joiner/ExpressionJoiner.java | 42 +
.../cb/joiner/StringBuilderCollector.java | 60 +
.../cb/joiner/StringBuilderJoiner.java | 39 +
.../processor/cb/impl/AliasBuilderTest.java | 26 +
.../processor/cb/impl/BuilderBaseTest.java | 33 +
.../cb/impl/CriteriaBuilderDerbyTest.java | 38 +
.../cb/impl/CriteriaBuilderH2Test.java | 36 +
.../cb/impl/CriteriaBuilderHSQLDBTest.java | 36 +
.../cb/impl/CriteriaBuilderImplTest.java | 785 ++++++++
.../cb/impl/CriteriaBuilderOverallTest.java | 282 +++
.../cb/impl/CritertaQueryImplTest.java | 141 ++
.../jpa/processor/cb/impl/FromImplTest.java | 196 ++
.../jpa/processor/cb/impl/PathImplTest.java | 54 +
.../jpa/processor/cb/impl/TupleImplTest.java | 137 ++
jpa/odata-jpa-processor-parallel/.gitignore | 1 +
jpa/odata-jpa-processor-parallel/pom.xml | 45 +
.../JPAODataBatchParallelRequestGroup.java | 66 +
.../core/api/JPAODataBatchRequestGroup.java | 16 +
.../JPAODataBatchSequentialRequestGroup.java | 48 +
.../api/JPAODataParallelBatchProcessor.java | 99 +
...JPAODataParallelBatchProcessorFactory.java | 14 +
.../exception/ODataJPABatchException.java | 36 +
.../ODataJPABatchRuntimeException.java | 15 +
.../processor-exceptions-i18n.properties | 21 +
...AODataBatchSequentialRequestGroupTest.java | 104 +
...JPAODataBatchAbstractRequestGroupTest.java | 61 +
...JPAODataBatchParallelRequestGroupTest.java | 146 ++
...AODataBatchSequentialRequestGroupTest.java | 88 +
...ParallelBatchProcessorIntegrationTest.java | 143 ++
.../JPAODataParallelBatchProcessorTest.java | 218 +++
.../test/util/IntegrationTestHelper.java | 113 ++
jpa/odata-jpa-processor/.classpath | 33 -
jpa/odata-jpa-processor/.gitignore | 5 +
.../.settings/org.eclipse.jdt.core.prefs | 9 +-
.../org.eclipse.wst.common.component | 13 +-
....eclipse.wst.common.project.facet.core.xml | 2 +-
jpa/odata-jpa-processor/pom.xml | 146 +-
.../api/JPAAbstractCUDRequestHandler.java | 10 +-
.../core/api/JPACUDRequestHandler.java | 72 +
.../jpa/processor/core/api/JPAClaimsPair.java | 43 +
.../api/JPADefaultBatchProcessorFactory.java | 11 +
.../core/api/JPADefaultErrorProcessor.java | 33 +
.../processor/core/api/JPAEmptyDebugger.java | 23 -
.../processor/core/api/JPAErrorProcessor.java | 8 +
.../core/api/JPAErrorProcessorWrapper.java | 35 +
.../core/api/JPAODataBatchProcessor.java | 209 +-
.../api/JPAODataBatchProcessorFactory.java | 9 +
.../core/api/JPAODataCRUDContext.java | 7 -
.../core/api/JPAODataCRUDContextAccess.java | 64 +
.../core/api/JPAODataCRUDHandler.java | 23 +-
.../core/api/JPAODataCRUDRequestContext.java | 7 +
.../core/api/JPAODataClaimProvider.java | 16 +
.../core/api/JPAODataClaimsProvider.java | 37 +
.../core/api/JPAODataContextImpl.java | 151 --
.../core/api/JPAODataDatabaseProcessor.java | 5 +
.../JPAODataDefaultTransactionFactory.java | 98 +
.../core/api/JPAODataGetContext.java | 53 -
.../core/api/JPAODataGetHandler.java | 160 +-
.../core/api/JPAODataGroupProvider.java | 17 +
.../core/api/JPAODataGroupsProvider.java | 43 +
.../jpa/processor/core/api/JPAODataPage.java | 34 +
.../core/api/JPAODataPagingProvider.java | 33 +
.../core/api/JPAODataRequestContext.java | 21 +
.../api/JPAODataRequestContextAccess.java | 29 +-
.../core/api/JPAODataRequestProcessor.java | 306 +--
.../core/api/JPAODataServiceContext.java | 393 ++++
.../api/JPAODataServiceDocumentProcessor.java | 72 +
.../api/JPAODataSessionContextAccess.java | 29 -
.../core/api/JPAODataTransactionFactory.java | 48 +
.../core/api/JPAServiceDebugger.java | 9 +-
.../example/JPAExampleCUDRequestHandler.java | 195 ++
.../example/JPAExampleModifyException.java | 33 +
.../api/example/JPAExamplePagingProvider.java | 120 ++
.../core/converter/JPACollectionResult.java | 18 +
.../converter/JPAComplexResultConverter.java | 5 +-
.../core/converter/JPAExpandResult.java | 20 +-
.../core/converter/JPAResultConverter.java | 14 +
.../JPAStructuredResultConverter.java | 121 +-
.../core/{modify => converter}/JPATuple.java | 24 +-
.../converter/JPATupleAbstractConverter.java | 241 ---
.../converter/JPATupleChildConverter.java | 298 +++
.../JPATupleCollectionConverter.java | 138 ++
.../JPATupleExpandResultConverter.java | 78 -
.../converter/JPATupleResultConverter.java | 316 ++-
.../JPAAbstractDatabaseProcessor.java | 154 ++
.../database/JPADefaultDatabaseProcessor.java | 132 +-
.../database/JPAODataDatabaseOperations.java | 5 +-
.../JPAODataDatabaseProcessorFactory.java | 27 +-
.../core/database/JPAODataDatabaseSearch.java | 20 +-
.../JPAODataDatabaseTableFunction.java | 8 +-
.../database/JPA_DERBY_DatabaseProcessor.java | 90 +-
.../database/JPA_HANA_DatabaseProcessor.java | 147 --
.../JPA_HSQLDB_DatabaseProcessor.java | 104 +-
.../JPA_POSTSQL_DatabaseProcessor.java | 64 +
.../exception/ODataJPAFilterException.java | 7 +-
.../ODataJPAIllegalAccessException.java | 17 +
.../ODataJPAInvocationTargetException.java | 43 +
.../exception/ODataJPAProcessException.java | 22 +-
.../exception/ODataJPAProcessorException.java | 155 +-
.../exception/ODataJPAQueryException.java | 16 +-
.../ODataJPASerializerException.java | 2 +-
.../ODataJPATransactionException.java | 33 +
.../core/exception/ODataJPAUtilException.java | 2 +-
.../core/filter/JPAAbstractFilter.java | 41 +-
.../filter/JPAAggregationOperationImp.java | 13 +-
.../core/filter/JPAArithmeticOperatorImp.java | 7 +-
.../core/filter/JPABinaryExpression.java | 30 +
.../core/filter/JPABooleanOperatorImp.java | 12 +-
.../core/filter/JPAComparisonOperatorImp.java | 8 +-
.../filter/JPAEnumerationBasedOperator.java | 14 +
.../core/filter/JPAEnumerationOperator.java | 63 +
.../core/filter/JPAExistsOperation.java | 69 +-
.../processor/core/filter/JPAExpression.java | 11 +
.../core/filter/JPAExpressionOperator.java | 11 +-
.../core/filter/JPAExpressionVisitor.java | 4 +-
.../core/filter/JPAFilterComplier.java | 3 +-
.../core/filter/JPAFilterComplierAccess.java | 15 +
.../core/filter/JPAFilterCrossComplier.java | 75 +-
.../core/filter/JPAFilterElementComplier.java | 34 +-
.../core/filter/JPAFilterExpression.java | 18 +-
.../core/filter/JPAFunctionOperator.java | 17 +-
.../core/filter/JPALambdaAllOperation.java | 5 +
.../core/filter/JPALambdaAnyOperation.java | 9 +-
.../core/filter/JPALambdaOperation.java | 23 +-
.../core/filter/JPALiteralOperator.java | 53 +-
.../core/filter/JPAMemberOperator.java | 117 +-
.../core/filter/JPAMemberVisitor.java | 9 +-
.../core/filter/JPAMethodBasedExpression.java | 22 +
.../processor/core/filter/JPAMethodCall.java | 17 +-
.../core/filter/JPAMethodCallImp.java | 27 +-
.../core/filter/JPAMethodExpression.java | 40 +
.../core/filter/JPANavigationOperation.java | 149 +-
.../core/filter/JPAOperationConverter.java | 338 ++--
.../processor/core/filter/JPAOperator.java | 2 +
.../core/filter/JPAPrimitiveTypeOperator.java | 7 +
.../core/filter/JPAUnaryBooleanOperator.java | 1 +
.../filter/JPAUnaryBooleanOperatorImp.java | 5 +
.../core/filter/JPAVisitableExpression.java | 9 +
.../jpa/processor/core/filter/JPAVisitor.java | 194 +-
.../core/modify/JPACUDRequestHandler.java | 50 -
.../core/modify/JPAConversionHelper.java | 370 ++--
.../core/modify/JPACreateResult.java | 69 +-
.../core/modify/JPACreateResultFactory.java | 15 +-
.../core/modify/JPAEntityBasedResult.java | 51 +
.../modify/JPAEntityCollectionResult.java | 71 +
.../modify/JPAEntityNavigationLinkResult.java | 67 +-
.../core/modify/JPAEntityResult.java | 82 +-
.../core/modify/JPAMapBaseResult.java | 53 +
.../core/modify/JPAMapCollectionResult.java | 69 +
.../modify/JPAMapNavigationLinkResult.java | 36 +-
.../processor/core/modify/JPAMapResult.java | 71 +-
.../core/modify/JPAUpdateResult.java | 4 +-
.../JPAAbstractGetRequestProcessor.java | 5 +-
.../JPAAbstractRequestProcessor.java | 15 +-
.../processor/JPAActionRequestProcessor.java | 142 +-
.../processor/JPACUDRequestProcessor.java | 579 ++++--
.../JPACoreDebugger.java} | 12 +-
.../processor/JPACountRequestProcessor.java | 25 +-
.../core/processor/JPAEmptyDebugger.java | 26 +
.../JPAFunctionRequestProcessor.java | 92 +-
.../processor/core/processor/JPALogger.java | 93 +
.../core/processor/JPAModifyUtil.java | 424 ++++-
.../JPANavigationRequestProcessor.java | 262 ++-
.../processor/JPAODataRequestContextImpl.java | 345 ++++
.../JPAOperationRequestProcessor.java | 98 +-
.../core/processor/JPAProcessorFactory.java | 163 +-
.../core/processor/JPARequestContext.java | 43 +-
.../core/processor/JPARequestEntity.java | 56 +-
.../core/processor/JPARequestEntityImpl.java | 41 +-
.../core/processor/JPARequestLink.java | 6 +-
.../core/processor/JPARequestLinkImpl.java | 17 +-
.../core/processor/JPARequestProcessor.java | 4 +-
.../deserializer/JsonDeserializer.java | 854 ---------
.../processor/deserializer/package-info.java | 8 -
.../core/query/EdmEntitySetInfo.java | 4 +
.../core/query/EdmEntitySetResult.java | 24 +-
.../processor/core/query/ExpressionUtil.java | 34 +-
.../core/query/JPAAbstractJoinQuery.java | 981 ++++++++++
.../core/query/JPAAbstractQuery.java | 215 ++-
.../query/JPACollectionExpandWrapper.java | 120 ++
.../core/query/JPACollectionFilterQuery.java | 161 ++
.../core/query/JPACollectionItemInfo.java | 25 +
.../core/query/JPACollectionJoinQuery.java | 338 ++++
.../core/query/JPACollectionQueryResult.java | 152 ++
.../core/query/JPAConvertableResult.java | 48 +
.../processor/core/query/JPACountQuery.java | 16 +
.../core/query/JPAExecutableQuery.java | 573 ------
.../core/query/JPAExpandItemInfo.java | 45 +-
.../core/query/JPAExpandItemInfoFactory.java | 216 ++-
.../core/query/JPAExpandItemWrapper.java | 9 +-
.../core/query/JPAExpandJoinQuery.java | 417 ++++
.../core/query/JPAExpandLevelWrapper.java | 16 +-
.../processor/core/query/JPAExpandQuery.java | 250 ---
.../core/query/JPAExpandQueryResult.java | 212 ++-
.../core/query/JPAInlineItemInfo.java | 44 +
.../processor/core/query/JPAJoinQuery.java | 229 +++
.../processor/core/query/JPAKeyBoundary.java | 37 +
.../jpa/processor/core/query/JPAKeyPair.java | 76 +
.../core/query/JPANavigationFilterQuery.java | 147 +-
.../JPANavigationInheritFilterQuery.java | 40 -
.../query/JPANavigationProptertyInfo.java | 107 +-
.../core/query/JPANavigationQuery.java | 274 ++-
.../core/query/JPANoSelectionException.java | 15 +
.../jpa/processor/core/query/JPAQuery.java | 165 +-
.../core/query/SelectOptionUtil.java | 51 +
.../core/query/SelectionPathInfo.java | 88 +
.../olingo/jpa/processor/core/query/Util.java | 207 +-
.../serializer/JPAOperationSerializer.java | 3 +-
.../core/serializer/JPASerializeComplex.java | 119 +-
.../JPASerializeComplexCollection.java | 48 +-
.../core/serializer/JPASerializeCount.java | 6 +
.../core/serializer/JPASerializeCreate.java | 171 +-
.../core/serializer/JPASerializeEntity.java | 71 +-
.../JPASerializeEntityCollection.java | 57 +-
.../core/serializer/JPASerializeFunction.java | 24 +-
.../serializer/JPASerializePrimitive.java | 74 +-
.../JPASerializePrimitiveAbstract.java | 19 +-
.../JPASerializePrimitiveCollection.java | 43 +-
.../core/serializer/JPASerializeValue.java | 25 +-
.../core/serializer/JPASerializer.java | 19 +-
.../core/serializer/JPASerializerFactory.java | 159 +-
.../example-exceptions-i18n.properties | 21 +
.../processor-exceptions-i18n.properties | 59 +-
.../processor/core/api/JPAClaimsPairTest.java | 35 +
.../core/api/JPAODataBatchProcessorTest.java | 165 +-
.../core/api/JPAODataClaimsProviderTest.java | 58 +
.../core/api/JPAODataContextAccessDouble.java | 32 +-
...JPAODataDefaultTransactionFactoryTest.java | 180 ++
.../processor/core/api/TestBatchRequests.java | 18 +-
.../api/TestJPAAbstractCUDRequestHandler.java | 44 +
.../core/api/TestJPAODataGetHandler.java | 158 ++
.../core/api/TestJPAODataGroupsProvider.java | 65 +
.../api/TestJPAODataRequestProcessor.java | 143 ++
.../TestJPAODataServiceContextBuilder.java | 334 ++++
.../TestJPAODataServiceDocumentProcessor.java | 80 +
.../JPAExampleCUDRequestHandlerTest.java | 525 +++++
.../example/JPAExamplePagingProviderTest.java | 298 +++
.../TestJPADefaultDatabaseProcessor.java | 122 ++
.../TestJPA_DERBY_DatabaseProcessor.java | 44 +
.../TestJPA_HSQLDB_DatabaseProcessor.java | 44 +
.../TestJPA_POSTSQL_DatabaseProcessor.java | 43 +
.../TestJPA_XXX_DatabaseProcessor.java | 396 ++++
.../TestODataJPAProcessorException.java | 11 +-
.../filter/TestJPAArithmeticOperator.java | 16 +-
.../filter/TestJPACustomScalarFunctions.java | 34 +-
.../core/filter/TestJPAFunctionOperator.java | 14 +-
.../filter/TestJPAOperationConverter.java | 15 +-
.../core/filter/TestJPAQueryWhereClause.java | 588 +++++-
.../processor/core/filter/TestJPAVisitor.java | 17 +-
.../core/filter/TestRetrieveSingleEntity.java | 4 +-
.../core/modify/TestJPACUDRequestHelper.java | 815 ++++++--
.../core/modify/TestJPAConversionHelper.java | 30 +-
.../modify/TestJPAConversionHelperEntity.java | 9 +-
.../modify/TestJPAConversionHelperMap.java | 18 +-
.../core/modify/TestJPACreateResult.java | 239 ++-
.../core/modify/TestJPAEntityResult.java | 194 +-
.../core/modify/TestJPAMapResult.java | 202 +-
.../core/processor/JPACoreDebuggerTest.java | 56 +
.../processor/TestCreateDeltaBasedResult.java | 162 ++
.../processor/TestCreateRequestEntity.java | 221 ++-
.../processor/TestJPAActionProcessor.java | 272 ++-
.../core/processor/TestJPAClearProcessor.java | 279 ++-
.../processor/TestJPACreateProcessor.java | 459 ++++-
.../processor/TestJPADeleteProcessor.java | 260 ++-
.../processor/TestJPAModifyProcessor.java | 189 +-
.../TestJPAODataRequestContextImpl.java | 300 +++
.../processor/TestJPARequestLinkImpl.java | 22 +-
.../processor/TestJPAUpdateProcessor.java | 404 +++-
.../core/processor/TestModifyUtil.java | 278 ++-
.../core/query/TestEdmEntitySetResult.java | 88 +
.../core/query/TestJPAExpandJoinQuery.java | 259 +++
.../query/TestJPAExpandQueryCreateResult.java | 96 +-
.../core/query/TestJPAExpandQueryResult.java | 229 +++
.../core/query/TestJPAExpandResult.java | 156 --
.../processor/core/query/TestJPAFunction.java | 63 +-
.../core/query/TestJPAFunctionDB.java | 149 ++
.../core/query/TestJPAFunctionJava.java | 38 +-
.../core/query/TestJPAFunctionSerializer.java | 68 +-
.../query/TestJPAInstanceResultConverter.java | 14 +-
.../processor/core/query/TestJPAKeyPair.java | 198 ++
.../core/query/TestJPAProcessorExpand.java | 288 ++-
.../TestJPAQueryBuildSelectionPathList.java | 282 +++
.../core/query/TestJPAQueryCollection.java | 356 ++++
.../core/query/TestJPAQueryFromClause.java | 209 +-
.../query/TestJPAQueryJSONAnnotations.java | 79 +
.../core/query/TestJPAQueryNavigation.java | 145 +-
.../query/TestJPAQueryNavigationCount.java | 23 +-
.../TestJPAQueryODataVersionSupport.java | 118 ++
.../core/query/TestJPAQueryOrderByClause.java | 116 +-
.../core/query/TestJPAQuerySelectByPath.java | 165 +-
.../core/query/TestJPAQuerySelectClause.java | 245 ++-
.../TestJPAQuerySelectWithGroupClause.java | 133 ++
.../query/TestJPAQueryWithProtection.java | 561 ++++++
.../core/query/TestJPAServerDrivenPaging.java | 330 ++++
.../query/TestJPATupleChildConverter.java | 327 ++++
...estJPATupleChildConverterCompoundKey.java} | 55 +-
.../query/TestJPATupleResultConverter.java | 240 ---
.../core/query/TestSelectionPathInfo.java | 90 +
.../TestJPAOperationSerializer.java | 40 +
.../serializer/TestJPASerializeComplex.java | 71 +
.../serializer/TestJPASerializeCreate.java | 44 +
.../serializer/TestJPASerializeEntity.java | 55 +
.../TestJPASerializeEntityCollection.java | 59 +
.../serializer/TestJPASerializePrimitive.java | 70 +
.../serializer/TestJPASerializeValue.java | 85 +
.../core/serializer/TestJPASerializer.java | 124 ++
.../TestJPASerializerCollection.java | 137 ++
.../TestJPASerializerComplexCollection.java | 42 +
.../TestJPASerializerPrimitiveCollection.java | 43 +
.../BusinessPartnerRoleWithoutSetter.java | 13 +
.../core/testobjects/FileAccess.java | 22 +
.../core/testobjects/FileAccessConverter.java | 28 +
...HeaderParamTransientPropertyConverter.java | 27 +
.../OrganizationWithoutGetter.java | 17 +
.../testobjects/TestFunctionParameter.java | 6 +-
.../testobjects/TestFunctionReturnType.java | 45 +-
.../TestJavaActionNoParameter.java | 22 +-
.../core/testobjects/TestJavaActions.java | 25 +-
...woParameterTransientPropertyConverter.java | 35 +
.../core/util/CountQueryMatcher.java | 34 +
.../core/util/EdmEntitySetDouble.java | 12 +-
.../core/util/EdmEntityTypeDouble.java | 8 +-
.../util/EdmNavigationPropertyDouble.java | 2 +-
.../core/util/EdmPropertyDouble.java | 8 +-
.../processor/core/util/ExpandItemDouble.java | 8 +-
.../core/util/ExpandOptionDouble.java | 2 +-
.../core/util/IntegrationTestHelper.java | 114 +-
.../core/util/JPAEntityTypeDouble.java | 214 +++
.../core/util/SelectOptionDouble.java | 46 +-
.../core/util/ServiceMetadataDouble.java | 22 +-
.../jpa/processor/core/util/TestBase.java | 22 +-
.../processor/core/util/TestGroupBase.java | 104 +
.../jpa/processor/core/util/TestHelper.java | 10 +-
.../processor/core/util/TestQueryBase.java | 105 +
.../jpa/processor/core/util/TupleDouble.java | 12 +-
.../processor/core/util/UriHelperDouble.java | 2 +-
.../processor/core/util/UriInfoDouble.java | 18 +-
.../core/util/UriInfoResourceDouble.java | 10 +-
.../util/UriResourceNavigationDouble.java | 2 +-
.../core/util/UriResourcePropertyDouble.java | 3 +-
.../ComplexSerializerOptionsMatcher.java | 17 +
.../core/util/matcher/CountQueryMatcher.java | 34 +
...ityCollectionSerializerOptionsMatcher.java | 18 +
.../EntitySerializerOptionsMatcher.java | 17 +
.../core/util/matcher/InputStreamMatcher.java | 34 +
.../PrimitiveSerializerOptionsMatcher.java | 17 +
.../matcher/SerializerOptionsMatcher.java | 29 +
jpa/odata-jpa-spring-support/pom.xml | 22 +
...itional-spring-configuration-metadata.json | 14 +
jpa/odata-jpa-test/.classpath | 32 -
jpa/odata-jpa-test/.gitignore | 4 +
.../.settings/org.eclipse.jdt.core.prefs | 9 +-
.../org.eclipse.wst.common.component | 6 -
....eclipse.wst.common.project.facet.core.xml | 3 +-
jpa/odata-jpa-test/pom.xml | 202 +-
.../errormodel/AdministrativeInformation.java | 53 +
.../core/errormodel/ChangeInformation.java | 28 +
.../CollectionAttributeProtected.java | 76 +
.../errormodel/ComplextProtectedNoPath.java | 64 +
.../ComplextProtectedWrongPath.java | 63 +
.../core/errormodel/CompoundKey.java | 31 +
.../errormodel/DummyPropertyCalculator.java | 37 +
.../errormodel/EmbeddedKeyPartOfGroup.java | 30 +
.../core/errormodel/KeyPartOfGroup.java | 29 +
.../core/errormodel/MandatoryPartOfGroup.java | 39 +
.../NavigationAttributeProtected.java | 62 +
.../NavigationPropertyPartOfGroup.java | 39 +
.../PersonDeepCollectionProtected.java | 39 +
.../jpa/processor/core/errormodel/Team.java | 24 +
...thTransientCalculatorConstructorError.java | 23 +
.../TeamWithTransientCalculatorError.java | 23 +
.../TeamWithTransientEmbeddableKey.java | 17 +
.../errormodel/TeamWithTransientError.java | 23 +
.../core/errormodel/TeamWithTransientKey.java | 24 +
...ientPropertyCalculatorTwoConstructors.java | 32 +
...entPropertyCalculatorWrongConstructor.java | 33 +
.../core/testmodel/ABCClassifiaction.java | 8 +
.../core/testmodel/AccessRights.java | 22 +
.../core/testmodel/AccessRightsConverter.java | 36 +
.../core/testmodel/AddressDeepProtected.java | 18 +
.../AddressDeepThreeProtections.java | 20 +
.../testmodel/AdministrativeDivision.java | 238 ++-
.../AdministrativeDivisionDescriptionKey.java | 26 +-
.../testmodel/AdministrativeDivisionKey.java | 42 +-
.../testmodel/AdministrativeInformation.java | 31 +-
.../processor/core/testmodel/AssertList.java | 11 -
.../core/testmodel/BestOrganization.java | 2 -
.../core/testmodel/BusinessPartner.java | 77 +-
.../testmodel/BusinessPartnerProtected.java | 116 ++
.../core/testmodel/BusinessPartnerRole.java | 47 +-
.../testmodel/BusinessPartnerRoleKey.java | 10 +
.../BusinessPartnerRoleProtected.java | 82 +
.../BusinessPartnerRoleWithGroup.java | 100 +
.../testmodel/BusinessPartnerWithGroups.java | 261 +++
.../core/testmodel/ChangeInformation.java | 18 +-
.../testmodel/CollcetionInnerComplex.java | 42 +
.../testmodel/CollcetionNestedComplex.java | 31 +
.../CollcetionNestedComplexWithTransient.java | 38 +
.../processor/core/testmodel/Collection.java | 77 +
.../core/testmodel/CollectionDeep.java | 57 +
.../CollectionFirstLevelComplex.java | 42 +
.../testmodel/CollectionPartOfComplex.java | 55 +
.../CollectionSecondLevelComplex.java | 59 +
.../testmodel/CollectionWithTransient.java | 84 +
.../jpa/processor/core/testmodel/Comment.java | 57 +-
.../core/testmodel/CommunicationData.java | 1 +
.../ComplexWithTransientComplexCollction.java | 30 +
.../processor/core/testmodel/CountryKey.java | 22 +-
.../core/testmodel/CountryRestriction.java | 45 +
.../core/testmodel/DataSourceHelper.java | 64 +-
.../core/testmodel/DateTimeConverter.java | 24 +
.../core/testmodel/DeepProtectedExample.java | 31 +
.../core/testmodel/DummyToBeIgnored.java | 22 +-
.../core/testmodel/FullNameCalculator.java | 25 +
.../processor/core/testmodel/ImageLoader.java | 122 +-
.../core/testmodel/InhouseAddress.java | 65 +
.../core/testmodel/InhouseAddressTable.java | 60 +
.../testmodel/InhouseAddressWithGroup.java | 71 +
.../InhouseAddressWithProtection.java | 62 +
.../InhouseAddressWithThreeProtections.java | 64 +
.../testmodel/InstanceRestrictionKey.java | 48 +
.../processor/core/testmodel/JoinComplex.java | 22 +
.../core/testmodel/JoinRelation.java | 13 +
.../core/testmodel/JoinRelationKey.java | 61 +
.../processor/core/testmodel/JoinSource.java | 36 +
.../processor/core/testmodel/JoinTarget.java | 14 +
.../core/testmodel/LogarithmCalculator.java | 32 +
.../processor/core/testmodel/Membership.java | 22 +
.../core/testmodel/MembershipKey.java | 56 +
.../core/testmodel/Organization.java | 49 +-
.../core/testmodel/OrganizationImage.java | 34 +-
.../jpa/processor/core/testmodel/Person.java | 90 +-
.../core/testmodel/PersonDeepProtected.java | 66 +
.../testmodel/PersonDeepProtectedHidden.java | 55 +
.../core/testmodel/PostalAddressData.java | 47 +-
.../testmodel/PostalAddressDataWithGroup.java | 114 ++
.../testmodel/StreetPropertyCalculator.java | 27 +
.../core/testmodel/SupportRelationship.java | 23 +
.../jpa/processor/core/testmodel/Team.java | 24 +
.../core/testmodel/TestDataConstants.java | 10 +-
.../core/testmodel/TransientRefComplex.java | 33 +
.../jpa/processor/core/testmodel/User.java | 53 +
.../jpa/processor/core/util/Assertions.java | 67 +
.../core/util/HttpRequestHeaderDouble.java | 33 +-
.../core/util/HttpServletRequestDouble.java | 66 +-
.../core/util/HttpServletResponseDouble.java | 4 +-
.../core/util/ServletInputStreamDouble.java | 0
.../main/resources/META-INF/persistence.xml | 104 +-
.../resources/db/migration/V1_0__olingo.sql | 300 ++-
.../jpa/processor/test/TestAssociations.java | 18 +-
.../processor/test/TestCriteriaBuilder.java | 120 +-
.../test/TestEqualHashCodeMethods.java | 202 ++
.../TestEqualHashCodeMethodsErrorModel.java | 34 +
.../TestEqualHashCodeMethodsTestModel.java | 91 +
.../jpa/processor/test/TestFunctions.java | 24 +-
.../processor/test/TestFunctionsHSQLDB.java | 16 +-
.../test/TestStandardMethodsOfTestModel.java | 255 +++
jpa/pom.xml | 139 +-
681 files changed, 51777 insertions(+), 11998 deletions(-)
create mode 100644 jpa-archetype/jpa-archetype-spring/pom.xml
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/META-INF/maven/archetype-metadata.xml
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/pom.xml
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/SpringApp.java
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/config/EclipseLinkJpaConfiguration.java
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/config/ProcessorConfiguration.java
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/controller/ODataController.java
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/model/EntityTemplate.java
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/model/ValueObjectTemplate.java
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/model/ValueObjectTemplateKey.java
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/resources/application-test.yml
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/resources/application.yml
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/resources/db/migration/V1_0__jpa.sql
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/test/java/AppTest.java
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/test/java/integrationtest/ControllerTest.java
create mode 100644 jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/test/resources/requests/CreateEntityViaBatch.txt
create mode 100644 jpa-archetype/pom.xml
create mode 100644 jpa-tutorial/.gitignore
delete mode 100644 jpa/.classpath
delete mode 100644 jpa/odata-jpa-annotation/.classpath
delete mode 100644 jpa/odata-jpa-annotation/.settings/org.eclipse.wst.common.component
create mode 100644 jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmEnumeration.java
create mode 100644 jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmProtectedBy.java
create mode 100644 jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmProtections.java
create mode 100644 jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmTransient.java
create mode 100644 jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmTransientPropertyCalculator.java
create mode 100644 jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmVisibleFor.java
create mode 100644 jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/odata/v4/core/annotation/Immutable.java
create mode 100644 jpa/odata-jpa-coverage/pom.xml
delete mode 100644 jpa/odata-jpa-metadata/.classpath
delete mode 100644 jpa/odata-jpa-metadata/.settings/org.eclipse.wst.common.component
create mode 100644 jpa/odata-jpa-metadata/model/.gitignore
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/api/JPAJoinColumn.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/AbstractVocabularyReader.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Action.java
delete mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/EntityKeyElement.java
delete mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/EntityType.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Function.java
delete mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/NavigationProperty.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Parameter.java
delete mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/PropertyRef.java
delete mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/ReferentialConstraint.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/ReturnType.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPACollectionAttribute.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAEdmNameBuilder.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAEnumerationAttribute.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAJoinTable.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAProtectionInfo.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateCollectionProperty.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateJoinTable.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateSimpleProperty.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/JPADefaultEdmNameBuilder.java
delete mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/JPAEdmNameBuilder.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/JPAProtectionInfo.java
delete mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/ODataEnum.java
delete mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/ODataEnumerationType.java
create mode 100644 jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/OffsetDateTimeConverter.java
delete mode 100644 jpa/odata-jpa-metadata/src/main/resources/metadata-exceptions-i18n_de.properties
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/api/TestJPAEdmProvider.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/CustomJPANameBuilder.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/TestIntermediateCollectionProperty.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/TestIntermediateEmbeddedIdProperty.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/TestIntermediateModelElement.java
delete mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/TestIntermediateProperty.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/TestIntermediateSimpleProperty.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/TestIntermediateWrongAnnotation.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/TestJPAOnConditionItemImpl.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/TestJPAProtectionInfo.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/TestJPATypeConvertor.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/TestOffsetDateTimeConverter.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/testaction/Actions.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/testaction/function/Function.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/testobjects/FileAccess.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/testobjects/FileAccessConverter.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/testobjects/WrongMember.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/testobjects/WrongMemberConverter.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/testobjects/WrongType.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/testobjects/WrongTypeConverter.java
create mode 100644 jpa/odata-jpa-metadata/src/test/java/com/sap/olingo/jpa/metadata/core/edm/mapper/util/MemberDouble.java
create mode 100644 jpa/odata-jpa-metadata/src/test/resources/annotations/Org.OData.Aggregation.V1.xml
create mode 100644 jpa/odata-jpa-metadata/src/test/resources/annotations/Org.OData.Repeatability.V1.xml
create mode 100644 jpa/odata-jpa-metadata/src/test/resources/annotations/empty.xml
create mode 100644 jpa/odata-jpa-processor-cb/.gitignore
create mode 100644 jpa/odata-jpa-processor-cb/pom.xml
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/api/EntityManagerFactoryWrapper.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/api/ProcessorSelection.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/api/ProcessorSubquery.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/api/SqlAggregation.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/api/SqlArithmetic.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/api/SqlConvertable.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/api/SqlJoinType.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/api/SqlKeyWords.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/api/SqlNullCheck.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/api/SqlStringFunctions.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/api/SqlSubQuery.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/api/SqlTimeFunctions.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/exeptions/InternalServerError.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/exeptions/NotImplementedException.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/AbstractJoinImp.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/AliasBuilder.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/CollectionJoinImpl.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/CriteriaBuilderImpl.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/CriteriaQueryImpl.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/EntityManagerWrapper.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/ExpressionImpl.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/FromImpl.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/JoinTableJoin.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/OrderImpl.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/ParameterBuffer.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/PathImpl.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/PathJoin.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/PredicateImpl.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/RootImpl.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/SimpleJoin.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/SubqueryImpl.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/TupleImpl.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/impl/TypedQueryImpl.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/joiner/ExpressionCollector.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/joiner/ExpressionJoiner.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/joiner/StringBuilderCollector.java
create mode 100644 jpa/odata-jpa-processor-cb/src/main/java/com/sap/olingo/jpa/processor/cb/joiner/StringBuilderJoiner.java
create mode 100644 jpa/odata-jpa-processor-cb/src/test/java/com/sap/olingo/jpa/processor/cb/impl/AliasBuilderTest.java
create mode 100644 jpa/odata-jpa-processor-cb/src/test/java/com/sap/olingo/jpa/processor/cb/impl/BuilderBaseTest.java
create mode 100644 jpa/odata-jpa-processor-cb/src/test/java/com/sap/olingo/jpa/processor/cb/impl/CriteriaBuilderDerbyTest.java
create mode 100644 jpa/odata-jpa-processor-cb/src/test/java/com/sap/olingo/jpa/processor/cb/impl/CriteriaBuilderH2Test.java
create mode 100644 jpa/odata-jpa-processor-cb/src/test/java/com/sap/olingo/jpa/processor/cb/impl/CriteriaBuilderHSQLDBTest.java
create mode 100644 jpa/odata-jpa-processor-cb/src/test/java/com/sap/olingo/jpa/processor/cb/impl/CriteriaBuilderImplTest.java
create mode 100644 jpa/odata-jpa-processor-cb/src/test/java/com/sap/olingo/jpa/processor/cb/impl/CriteriaBuilderOverallTest.java
create mode 100644 jpa/odata-jpa-processor-cb/src/test/java/com/sap/olingo/jpa/processor/cb/impl/CritertaQueryImplTest.java
create mode 100644 jpa/odata-jpa-processor-cb/src/test/java/com/sap/olingo/jpa/processor/cb/impl/FromImplTest.java
create mode 100644 jpa/odata-jpa-processor-cb/src/test/java/com/sap/olingo/jpa/processor/cb/impl/PathImplTest.java
create mode 100644 jpa/odata-jpa-processor-cb/src/test/java/com/sap/olingo/jpa/processor/cb/impl/TupleImplTest.java
create mode 100644 jpa/odata-jpa-processor-parallel/.gitignore
create mode 100644 jpa/odata-jpa-processor-parallel/pom.xml
create mode 100644 jpa/odata-jpa-processor-parallel/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataBatchParallelRequestGroup.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataBatchRequestGroup.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataBatchSequentialRequestGroup.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataParallelBatchProcessor.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataParallelBatchProcessorFactory.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/main/java/com/sap/olingo/jpa/processor/core/exception/ODataJPABatchException.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/main/java/com/sap/olingo/jpa/processor/core/exception/ODataJPABatchRuntimeException.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/main/resources/processor-exceptions-i18n.properties
create mode 100644 jpa/odata-jpa-processor-parallel/src/test/JPAODataBatchSequentialRequestGroupTest.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/test/java/com/sap/olingo/jpa/processor/core/api/JPAODataBatchAbstractRequestGroupTest.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/test/java/com/sap/olingo/jpa/processor/core/api/JPAODataBatchParallelRequestGroupTest.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/test/java/com/sap/olingo/jpa/processor/core/api/JPAODataBatchSequentialRequestGroupTest.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/test/java/com/sap/olingo/jpa/processor/core/api/JPAODataParallelBatchProcessorIntegrationTest.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/test/java/com/sap/olingo/jpa/processor/core/api/JPAODataParallelBatchProcessorTest.java
create mode 100644 jpa/odata-jpa-processor-parallel/src/test/java/com/sap/olingo/jpa/processor/test/util/IntegrationTestHelper.java
delete mode 100644 jpa/odata-jpa-processor/.classpath
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPACUDRequestHandler.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAClaimsPair.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPADefaultBatchProcessorFactory.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPADefaultErrorProcessor.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAEmptyDebugger.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAErrorProcessor.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAErrorProcessorWrapper.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataBatchProcessorFactory.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataCRUDContext.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataCRUDContextAccess.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataCRUDRequestContext.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataClaimProvider.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataClaimsProvider.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataContextImpl.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataDefaultTransactionFactory.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataGetContext.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataGroupProvider.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataGroupsProvider.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataPage.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataPagingProvider.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataRequestContext.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataServiceContext.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataServiceDocumentProcessor.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataSessionContextAccess.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/JPAODataTransactionFactory.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/example/JPAExampleCUDRequestHandler.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/example/JPAExampleModifyException.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/api/example/JPAExamplePagingProvider.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/converter/JPACollectionResult.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/converter/JPAResultConverter.java
rename jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/{modify => converter}/JPATuple.java (63%)
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/converter/JPATupleAbstractConverter.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/converter/JPATupleChildConverter.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/converter/JPATupleCollectionConverter.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/converter/JPATupleExpandResultConverter.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/database/JPAAbstractDatabaseProcessor.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/database/JPA_HANA_DatabaseProcessor.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/database/JPA_POSTSQL_DatabaseProcessor.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/exception/ODataJPAIllegalAccessException.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/exception/ODataJPAInvocationTargetException.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/exception/ODataJPATransactionException.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/filter/JPABinaryExpression.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/filter/JPAEnumerationBasedOperator.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/filter/JPAEnumerationOperator.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/filter/JPAExpression.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/filter/JPAMethodBasedExpression.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/filter/JPAMethodExpression.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/filter/JPAPrimitiveTypeOperator.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/filter/JPAVisitableExpression.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/modify/JPACUDRequestHandler.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/modify/JPAEntityBasedResult.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/modify/JPAEntityCollectionResult.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/modify/JPAMapBaseResult.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/modify/JPAMapCollectionResult.java
rename jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/{api/JPACoreDeugger.java => processor/JPACoreDebugger.java} (72%)
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/processor/JPAEmptyDebugger.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/processor/JPALogger.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/processor/JPAODataRequestContextImpl.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/processor/deserializer/JsonDeserializer.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/processor/deserializer/package-info.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPAAbstractJoinQuery.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPACollectionExpandWrapper.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPACollectionFilterQuery.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPACollectionItemInfo.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPACollectionJoinQuery.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPACollectionQueryResult.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPAConvertableResult.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPACountQuery.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPAExecutableQuery.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPAExpandJoinQuery.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPAExpandQuery.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPAInlineItemInfo.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPAJoinQuery.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPAKeyBoundary.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPAKeyPair.java
delete mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPANavigationInheritFilterQuery.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/JPANoSelectionException.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/SelectOptionUtil.java
create mode 100644 jpa/odata-jpa-processor/src/main/java/com/sap/olingo/jpa/processor/core/query/SelectionPathInfo.java
create mode 100644 jpa/odata-jpa-processor/src/main/resources/example-exceptions-i18n.properties
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/api/JPAClaimsPairTest.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/api/JPAODataClaimsProviderTest.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/api/JPAODataDefaultTransactionFactoryTest.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/api/TestJPAAbstractCUDRequestHandler.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/api/TestJPAODataGetHandler.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/api/TestJPAODataGroupsProvider.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/api/TestJPAODataRequestProcessor.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/api/TestJPAODataServiceContextBuilder.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/api/TestJPAODataServiceDocumentProcessor.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/api/example/JPAExampleCUDRequestHandlerTest.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/api/example/JPAExamplePagingProviderTest.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/database/TestJPADefaultDatabaseProcessor.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/database/TestJPA_DERBY_DatabaseProcessor.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/database/TestJPA_HSQLDB_DatabaseProcessor.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/database/TestJPA_POSTSQL_DatabaseProcessor.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/database/TestJPA_XXX_DatabaseProcessor.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/processor/JPACoreDebuggerTest.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/processor/TestCreateDeltaBasedResult.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/processor/TestJPAODataRequestContextImpl.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestEdmEntitySetResult.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPAExpandJoinQuery.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPAExpandQueryResult.java
delete mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPAExpandResult.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPAFunctionDB.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPAKeyPair.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPAQueryBuildSelectionPathList.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPAQueryCollection.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPAQueryJSONAnnotations.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPAQueryODataVersionSupport.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPAQuerySelectWithGroupClause.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPAQueryWithProtection.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPAServerDrivenPaging.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPATupleChildConverter.java
rename jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/{TestJPATupleResultConverterCompoundKey.java => TestJPATupleChildConverterCompoundKey.java} (66%)
delete mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestJPATupleResultConverter.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/query/TestSelectionPathInfo.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/serializer/TestJPAOperationSerializer.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/serializer/TestJPASerializeComplex.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/serializer/TestJPASerializeCreate.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/serializer/TestJPASerializeEntity.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/serializer/TestJPASerializeEntityCollection.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/serializer/TestJPASerializePrimitive.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/serializer/TestJPASerializeValue.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/serializer/TestJPASerializer.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/serializer/TestJPASerializerCollection.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/serializer/TestJPASerializerComplexCollection.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/serializer/TestJPASerializerPrimitiveCollection.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/testobjects/BusinessPartnerRoleWithoutSetter.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/testobjects/FileAccess.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/testobjects/FileAccessConverter.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/testobjects/HeaderParamTransientPropertyConverter.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/testobjects/OrganizationWithoutGetter.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/testobjects/TwoParameterTransientPropertyConverter.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/util/CountQueryMatcher.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/util/JPAEntityTypeDouble.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/util/TestGroupBase.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/util/TestQueryBase.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/util/matcher/ComplexSerializerOptionsMatcher.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/util/matcher/CountQueryMatcher.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/util/matcher/EntityCollectionSerializerOptionsMatcher.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/util/matcher/EntitySerializerOptionsMatcher.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/util/matcher/InputStreamMatcher.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/util/matcher/PrimitiveSerializerOptionsMatcher.java
create mode 100644 jpa/odata-jpa-processor/src/test/java/com/sap/olingo/jpa/processor/core/util/matcher/SerializerOptionsMatcher.java
create mode 100644 jpa/odata-jpa-spring-support/pom.xml
create mode 100644 jpa/odata-jpa-spring-support/src/main/resources/META-INF/additional-spring-configuration-metadata.json
delete mode 100644 jpa/odata-jpa-test/.classpath
delete mode 100644 jpa/odata-jpa-test/.settings/org.eclipse.wst.common.component
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/AdministrativeInformation.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/ChangeInformation.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/CollectionAttributeProtected.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/ComplextProtectedNoPath.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/ComplextProtectedWrongPath.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/CompoundKey.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/DummyPropertyCalculator.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/EmbeddedKeyPartOfGroup.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/KeyPartOfGroup.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/MandatoryPartOfGroup.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/NavigationAttributeProtected.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/NavigationPropertyPartOfGroup.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/PersonDeepCollectionProtected.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/Team.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/TeamWithTransientCalculatorConstructorError.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/TeamWithTransientCalculatorError.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/TeamWithTransientEmbeddableKey.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/TeamWithTransientError.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/TeamWithTransientKey.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/TransientPropertyCalculatorTwoConstructors.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/errormodel/TransientPropertyCalculatorWrongConstructor.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/ABCClassifiaction.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/AccessRights.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/AccessRightsConverter.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/AddressDeepProtected.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/AddressDeepThreeProtections.java
delete mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/AssertList.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/BusinessPartnerProtected.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/BusinessPartnerRoleProtected.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/BusinessPartnerRoleWithGroup.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/BusinessPartnerWithGroups.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/CollcetionInnerComplex.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/CollcetionNestedComplex.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/CollcetionNestedComplexWithTransient.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/Collection.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/CollectionDeep.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/CollectionFirstLevelComplex.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/CollectionPartOfComplex.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/CollectionSecondLevelComplex.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/CollectionWithTransient.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/ComplexWithTransientComplexCollction.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/CountryRestriction.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/DateTimeConverter.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/DeepProtectedExample.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/FullNameCalculator.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/InhouseAddress.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/InhouseAddressTable.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/InhouseAddressWithGroup.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/InhouseAddressWithProtection.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/InhouseAddressWithThreeProtections.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/InstanceRestrictionKey.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/JoinComplex.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/JoinRelation.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/JoinRelationKey.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/JoinSource.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/JoinTarget.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/LogarithmCalculator.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/Membership.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/MembershipKey.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/PersonDeepProtected.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/PersonDeepProtectedHidden.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/PostalAddressDataWithGroup.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/StreetPropertyCalculator.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/SupportRelationship.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/Team.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/TransientRefComplex.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/testmodel/User.java
create mode 100644 jpa/odata-jpa-test/src/main/java/com/sap/olingo/jpa/processor/core/util/Assertions.java
rename jpa/{odata-jpa-processor/src/test => odata-jpa-test/src/main}/java/com/sap/olingo/jpa/processor/core/util/HttpRequestHeaderDouble.java (74%)
rename jpa/{odata-jpa-processor/src/test => odata-jpa-test/src/main}/java/com/sap/olingo/jpa/processor/core/util/HttpServletRequestDouble.java (80%)
rename jpa/{odata-jpa-processor/src/test => odata-jpa-test/src/main}/java/com/sap/olingo/jpa/processor/core/util/HttpServletResponseDouble.java (91%)
rename jpa/{odata-jpa-processor/src/test => odata-jpa-test/src/main}/java/com/sap/olingo/jpa/processor/core/util/ServletInputStreamDouble.java (100%)
create mode 100644 jpa/odata-jpa-test/src/test/java/com/sap/olingo/jpa/processor/test/TestEqualHashCodeMethods.java
create mode 100644 jpa/odata-jpa-test/src/test/java/com/sap/olingo/jpa/processor/test/TestEqualHashCodeMethodsErrorModel.java
create mode 100644 jpa/odata-jpa-test/src/test/java/com/sap/olingo/jpa/processor/test/TestEqualHashCodeMethodsTestModel.java
create mode 100644 jpa/odata-jpa-test/src/test/java/com/sap/olingo/jpa/processor/test/TestStandardMethodsOfTestModel.java
diff --git a/README.md b/README.md
index 4106331e2..4438ea891 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ At the current state the JPA Processor provide support for:
2. Processing Get requests by converting them into Criteria Builder queries.
3. Supporting entity manipulations.
-More details can be found in the [Tutorial](/jpa-tutorial/Tutorials/Introduction/Introduction.md)
+More details can be found in the [Tutorial](https://github.com/SAP/olingo-jpa-processor-v4/blob/develop/jpa-tutorial/Tutorials/Introduction/Introduction.md)
## Dependencies
## License
This project is licensed under the Apache Software License Version 2.0, except as noted otherwise in the [License file](/LICENSE.txt).
diff --git a/jpa-archetype/jpa-archetype-spring/pom.xml b/jpa-archetype/jpa-archetype-spring/pom.xml
new file mode 100644
index 000000000..5356bc57b
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/pom.xml
@@ -0,0 +1,36 @@
+
+ 4.0.0
+
+
+ com.sap.olingo
+ odata-jpa-archetype
+ 0.3.8
+
+ odata-jpa-archetype-spring
+ Archetype - odata-jpa-archetype-spring
+
+ https://github.com/SAP/olingo-jpa-processor-v4
+ jar
+
+
+ 1.8
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ ${project.build.source}
+ ${project.build.source}
+ true
+ true
+ -Xlint:unchecked
+ ${project.build.sourceEncoding}
+
+
+
+
+
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/META-INF/maven/archetype-metadata.xml b/jpa-archetype/jpa-archetype-spring/src/main/resources/META-INF/maven/archetype-metadata.xml
new file mode 100644
index 000000000..a55ac5309
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -0,0 +1,50 @@
+
+
+
+ src/main/java
+
+ **/*.java
+
+
+
+ src/test/java
+
+ **/*.java
+
+
+
+ src/main/resources
+
+ **/*.sql
+ **/*.json
+ **/*.xml
+ **/*.properties
+ **/*.yml
+
+
+
+ src/test/resources
+
+ **/*.txt
+
+
+
+
+
+
+
+
+ EntityTemplate
+
+
+ ValueObjectTemplate
+
+
+ 9010
+
+
+
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/pom.xml b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/pom.xml
new file mode 100644
index 000000000..6a53e085b
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/pom.xml
@@ -0,0 +1,124 @@
+
+
+ 4.0.0
+ ${groupId}
+ ${artifactId}
+ ${version}
+ jar
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.0.RELEASE
+
+
+
+
+ 0.3.8-SNAPSHOT
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ junit
+ junit
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.hibernate
+ hibernate-entitymanager
+
+
+ org.hibernate
+ hibernate-core
+
+
+
+
+ org.eclipse.persistence
+ javax.persistence
+ 2.1.1
+ compile
+
+
+ org.eclipse.persistence
+ eclipselink
+ 2.7.1
+
+
+ com.sap.olingo
+ odata-jpa-processor
+ ${jpa-processor}
+
+
+ com.sap.olingo
+ odata-jpa-spring-support
+ ${jpa-processor}
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ org.flywaydb
+ flyway-core
+
+
+ org.hsqldb
+ hsqldb
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+
+
+ io.rest-assured
+ spring-mock-mvc
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter
+ 5.4.2
+ test
+
+
+ org.junit.platform
+ junit-platform-launcher
+ 1.4.2
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/SpringApp.java b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/SpringApp.java
new file mode 100644
index 000000000..c704b151d
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/SpringApp.java
@@ -0,0 +1,12 @@
+package $package;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringApp {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringApp.class, args);
+ }
+}
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/config/EclipseLinkJpaConfiguration.java b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/config/EclipseLinkJpaConfiguration.java
new file mode 100644
index 000000000..8568f3b79
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/config/EclipseLinkJpaConfiguration.java
@@ -0,0 +1,76 @@
+package ${package}.config;
+
+import static org.eclipse.persistence.config.PersistenceUnitProperties.CACHE_SHARED_DEFAULT;
+import static org.eclipse.persistence.config.PersistenceUnitProperties.CONNECTION_POOL_MAX;
+import static org.eclipse.persistence.config.PersistenceUnitProperties.DDL_GENERATION;
+import static org.eclipse.persistence.config.PersistenceUnitProperties.LOGGING_LEVEL;
+import static org.eclipse.persistence.config.PersistenceUnitProperties.TRANSACTION_TYPE;
+import static org.eclipse.persistence.config.PersistenceUnitProperties.WEAVING;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.sql.DataSource;
+
+import org.eclipse.persistence.config.PersistenceUnitProperties;
+import org.eclipse.persistence.logging.SessionLog;
+import ${package}.model.EntityTemplate;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
+import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
+import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter;
+import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter;
+import org.springframework.transaction.jta.JtaTransactionManager;
+
+@Configuration
+public class EclipseLinkJpaConfiguration extends JpaBaseConfiguration {
+ @Value("${odata.jpa.punit_name}")
+ private String punit;
+
+ protected EclipseLinkJpaConfiguration(DataSource dataSource, JpaProperties properties,
+ ObjectProvider jtaTransactionManager,
+ ObjectProvider transactionManagerCustomizers) {
+ super(dataSource, properties, jtaTransactionManager, transactionManagerCustomizers);
+ }
+
+ @Override
+ protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
+ return new EclipseLinkJpaVendorAdapter();
+ }
+
+ @Override
+ protected Map getVendorProperties() {
+ // https://stackoverflow.com/questions/10769051/eclipselinkjpavendoradapter-instead-of-hibernatejpavendoradapter-issue
+ HashMap jpaProperties = new HashMap<>();
+ jpaProperties.put(WEAVING, "false");
+ // No table generation by JPA
+ jpaProperties.put(DDL_GENERATION, "none");
+ jpaProperties.put(LOGGING_LEVEL, SessionLog.FINE_LABEL);
+ jpaProperties.put(TRANSACTION_TYPE, "RESOURCE_LOCAL");
+ // do not cache entities locally, as this causes problems if multiple application instances are used
+ jpaProperties.put(CACHE_SHARED_DEFAULT, "false");
+ // You can also tweak your application performance by configuring your database connection pool.
+ // https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#connectionpool
+ jpaProperties.put(CONNECTION_POOL_MAX, 50);
+ return jpaProperties;
+ }
+
+ @Bean
+ public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(
+ final EntityManagerFactoryBuilder builder, @Autowired final DataSource ds) {
+
+ return builder
+ .dataSource(ds)
+ .packages(EntityTemplate.class)
+ .properties(getVendorProperties())
+ .jta(false)
+ .build();
+ }
+}
\ No newline at end of file
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/config/ProcessorConfiguration.java b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/config/ProcessorConfiguration.java
new file mode 100644
index 000000000..a6094b493
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/config/ProcessorConfiguration.java
@@ -0,0 +1,31 @@
+package ${package}.config;
+
+import javax.persistence.EntityManagerFactory;
+
+import org.apache.olingo.commons.api.ex.ODataException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.sap.olingo.jpa.processor.core.api.JPAODataCRUDContextAccess;
+import com.sap.olingo.jpa.processor.core.api.JPAODataServiceContext;
+
+@Configuration
+public class ProcessorConfiguration {
+ @Value("${odata.jpa.punit_name}")
+ private String punit;
+ @Value("${odata.jpa.root_packages}")
+ private String rootPackages;
+
+ @Bean
+ public JPAODataCRUDContextAccess sessionContext(@Autowired final EntityManagerFactory emf) throws ODataException {
+
+ return JPAODataServiceContext.with()
+ .setPUnit(punit)
+ .setEntityManagerFactory(emf)
+ .setTypePackage(rootPackages)
+ .setRequestMappingPath("${punit}/v1")
+ .build();
+ }
+}
\ No newline at end of file
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/controller/ODataController.java b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/controller/ODataController.java
new file mode 100644
index 000000000..e35f40e08
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/controller/ODataController.java
@@ -0,0 +1,33 @@
+package ${package}.controller;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.olingo.commons.api.ex.ODataException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.annotation.RequestScope;
+
+import com.sap.olingo.jpa.processor.core.api.JPAODataCRUDContextAccess;
+import com.sap.olingo.jpa.processor.core.api.JPAODataCRUDHandler;
+import com.sap.olingo.jpa.processor.core.api.example.JPAExampleCUDRequestHandler;
+
+@RestController
+@RequestMapping("${punit}/v1/**")
+@RequestScope
+public class ODataController {
+
+ @Autowired
+ private JPAODataCRUDContextAccess serviceContext;
+
+ @RequestMapping(value = "**", method = { RequestMethod.GET, RequestMethod.PATCH, // NOSONAR
+ RequestMethod.POST, RequestMethod.DELETE })
+ public void crud(final HttpServletRequest req, final HttpServletResponse resp) throws ODataException {
+
+ final JPAODataCRUDHandler handler = new JPAODataCRUDHandler(serviceContext);
+ handler.getJPAODataRequestContext().setCUDRequestHandler(new JPAExampleCUDRequestHandler());
+ handler.process(req, resp);
+ }
+}
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/model/EntityTemplate.java b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/model/EntityTemplate.java
new file mode 100644
index 000000000..626823973
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/model/EntityTemplate.java
@@ -0,0 +1,59 @@
+package ${package}.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity(name = "${entity-table}")
+@Table(schema = "\"${schema}\"", name = "\"${entity-table}\"")
+public class EntityTemplate {
+ @Id
+ @Column(name = "\"ID\"", length = 32)
+ private String id;
+
+ @OneToMany(mappedBy = "entity", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+ private Collection valueObjects = new ArrayList<>();
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Collection getValueObjects() {
+ return valueObjects;
+ }
+
+ public void setValueObjects(Collection valueObjects) {
+ this.valueObjects = valueObjects;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+ EntityTemplate other = (EntityTemplate) obj;
+ if (id == null) {
+ if (other.id != null) return false;
+ } else if (!id.equals(other.id)) return false;
+ return true;
+ }
+}
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/model/ValueObjectTemplate.java b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/model/ValueObjectTemplate.java
new file mode 100644
index 000000000..c92a04239
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/model/ValueObjectTemplate.java
@@ -0,0 +1,52 @@
+package ${package}.model;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@IdClass(ValueObjectTemplateKey.class)
+@Entity(name = "${value-object-table}")
+@Table(schema = "\"${schema}\"", name = "\"${value-object-table}\"")
+public class ValueObjectTemplate {
+ @Id
+ @Column(name = "\"ID\"", length = 32)
+ private String id;
+
+ @Id
+ @Column(name = "\"Entity\"", length = 32)
+ private String entityId;
+
+ @ManyToOne(optional = false, fetch = FetchType.LAZY)
+ @JoinColumn(name = "\"Entity\"", insertable = false, updatable = false)
+ private EntityTemplate entity;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ public String getEntityId() {
+ return entityId;
+ }
+
+ public void setEntityId(final String entityId) {
+ this.entityId = entityId;
+ }
+
+ public EntityTemplate getEntity() {
+ return entity;
+ }
+
+ public void setEntity(final EntityTemplate entity) {
+ this.entityId = entity.getId();
+ this.entity = entity;
+ }
+}
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/model/ValueObjectTemplateKey.java b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/model/ValueObjectTemplateKey.java
new file mode 100644
index 000000000..6b1ab103c
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/java/model/ValueObjectTemplateKey.java
@@ -0,0 +1,56 @@
+package ${package}.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Id;
+
+public class ValueObjectTemplateKey implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ private String id;
+
+ @Id
+ private String entityId;
+
+ String getEmploymentId() {
+ return entityId;
+ }
+
+ void setEmploymentId(String employmentId) {
+ this.entityId = employmentId;
+ }
+
+ String getId() {
+ return id;
+ }
+
+ void setId(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((entityId == null) ? 0 : entityId.hashCode());
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+ ValueObjectTemplateKey other = (ValueObjectTemplateKey) obj;
+ if (entityId == null) {
+ if (other.entityId != null) return false;
+ } else if (!entityId.equals(other.entityId)) return false;
+ if (id == null) {
+ if (other.id != null) return false;
+ } else if (!id.equals(other.id)) return false;
+ return true;
+ }
+}
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/resources/application-test.yml b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/resources/application-test.yml
new file mode 100644
index 000000000..ae68ff530
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/resources/application-test.yml
@@ -0,0 +1,25 @@
+logging:
+ level:
+ org:
+ springframework: DEBUG
+odata:
+ jpa:
+ punit_name: ${punit}
+ root_packages: ${package}
+server:
+ port: 9010
+spring:
+ datasource:
+ driver-class-name: org.hsqldb.jdbc.JDBCDriver
+ password: ''
+ url: jdbc:hsqldb:mem:${schema};DB_CLOSE_DELAY=-1
+ username: sa
+ flyway:
+ password: ''
+ schemas:
+ - ${schema}
+ url: jdbc:hsqldb:mem:${schema};DB_CLOSE_DELAY=-1
+ user: sa
+ servlet:
+ multipart:
+ enabled: false
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/resources/application.yml b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/resources/application.yml
new file mode 100644
index 000000000..95f10b92e
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/resources/application.yml
@@ -0,0 +1,25 @@
+logging:
+ level:
+ org:
+ springframework: INFO
+odata:
+ jpa:
+ punit_name: ${punit}
+ root_packages: ${package}
+server:
+ port: ${port}
+spring:
+ datasource:
+ driver-class-name: org.hsqldb.jdbc.JDBCDriver
+ password: ''
+ url: jdbc:hsqldb:file:${punit};DB_CLOSE_DELAY=-1
+ username: sa
+ flyway:
+ password: ''
+ schemas:
+ - ${schema}
+ url: jdbc:hsqldb:file:${punit};DB_CLOSE_DELAY=-1
+ user: sa
+ servlet:
+ multipart:
+ enabled: false
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/resources/db/migration/V1_0__jpa.sql b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/resources/db/migration/V1_0__jpa.sql
new file mode 100644
index 000000000..b7152652d
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/main/resources/db/migration/V1_0__jpa.sql
@@ -0,0 +1,10 @@
+SET schema "${schema}";
+
+CREATE TABLE "${entity-table}"(
+ "ID" VARCHAR(32) NOT NULL ,
+ PRIMARY KEY ("ID"));
+
+CREATE TABLE "${value-object-table}"(
+ "Entity" VARCHAR(32) NOT NULL ,
+ "ID" VARCHAR(32) NOT NULL ,
+ PRIMARY KEY ("Entity", "ID"));
\ No newline at end of file
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/test/java/AppTest.java b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/test/java/AppTest.java
new file mode 100644
index 000000000..183a67179
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/test/java/AppTest.java
@@ -0,0 +1,20 @@
+package ${package};
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * Unit test for simple App.
+ */
+
+public class AppTest {
+
+ /**
+ * Rigourous Test :-)
+ */
+ @Test
+ public void testApp() {
+ assertTrue(true);
+ }
+}
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/test/java/integrationtest/ControllerTest.java b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/test/java/integrationtest/ControllerTest.java
new file mode 100644
index 000000000..2e8c041d5
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/test/java/integrationtest/ControllerTest.java
@@ -0,0 +1,158 @@
+package ${package}.integrationtest;
+
+import static io.restassured.module.mockmvc.RestAssuredMockMvc.given;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.hasItems;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Collection;
+
+import org.apache.olingo.commons.api.http.HttpStatusCode;
+import ${package}.SpringApp;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.web.context.WebApplicationContext;
+
+import io.restassured.http.ContentType;
+import io.restassured.module.mockmvc.RestAssuredMockMvc;
+import io.restassured.path.xml.XmlPath;
+import io.restassured.path.xml.element.Node;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = SpringApp.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@TestPropertySource(properties = { "spring.config.location=classpath:application-test.yml" })
+public class ControllerTest {
+
+ @Autowired
+ private WebApplicationContext context;
+ @LocalServerPort
+ private int port;
+
+ @BeforeEach
+ public void setup() {
+ RestAssuredMockMvc.webAppContextSetup(context);
+ }
+
+ @Test
+ public void testRetrieveServiceDocument() {
+ final String xml = given()
+ .accept(ContentType.XML)
+ .when()
+ .get("/${punit}/v1/")
+ .then()
+ .statusCode(HttpStatusCode.OK.getStatusCode())
+ .contentType(ContentType.XML)
+ .extract()
+ .asString();
+
+ final XmlPath path = new XmlPath(xml);
+ final Collection n = ((Node) ((Node) path.get("service")).get("workspace")).get("collection");
+ assertNotNull(n);
+ assertFalse(n.isEmpty());
+ }
+
+ @Test
+ public void testRetrieveMetadataDocument() {
+ final String xml = given()
+ .when()
+ .get("/${punit}/v1/$metadata")
+ .then()
+ .statusCode(HttpStatusCode.OK.getStatusCode())
+ .contentType(ContentType.XML)
+ .extract()
+ .asString();
+
+ final XmlPath path = new XmlPath(xml);
+ final Node n = ((Node) ((Node) path.get("edmx:Edmx")).get("DataServices")).get("Schema");
+ assertNotNull(n);
+ assertEquals("${punit}", n.getAttribute("Namespace"));
+ assertNotNull(n.get("EntityContainer"));
+ }
+
+ @Test
+ public void testCreateInstance() {
+ given()
+ .contentType("application/json")
+ .body("{ \"Id\" : \"1\" }")
+ .when()
+ .post("/${punit}/v1/${entity-table}s")
+ .then()
+ .statusCode(HttpStatusCode.CREATED.getStatusCode());
+ given()
+ .accept(ContentType.JSON)
+ .when()
+ .get("/${punit}/v1/${entity-table}s('1')")
+ .then()
+ .statusCode(HttpStatusCode.OK.getStatusCode());
+ }
+
+ @Test
+ public void testCreateInstanceWithBatch() throws URISyntaxException {
+
+ URI uri = getClass().getClassLoader()
+ .getResource("requests/CreateEntityViaBatch.txt").toURI();
+
+ File myFile = new File(uri);
+ final String responce = given()
+ .contentType("multipart/mixed;boundary=abc")
+ .body(myFile)
+ .when()
+ .post("/${punit}/v1/$batch")
+ .then()
+ .statusCode(HttpStatusCode.ACCEPTED.getStatusCode())
+ .extract()
+ .asString();
+
+ given()
+ .accept(ContentType.JSON)
+ .when()
+ .get("/${punit}/v1/${entity-table}s('2')")
+ .then()
+ .statusCode(HttpStatusCode.OK.getStatusCode());
+
+ final String[] partResults = responce.split("--changeset");
+ assertTrue(partResults[1].contains("HTTP/1.1 201"));
+ assertTrue(partResults[2].contains("HTTP/1.1 400"));
+ }
+
+ @Test
+ public void testCreateInstanceDeep() {
+ given()
+ .contentType(ContentType.JSON)
+ .accept(ContentType.JSON)
+ .body("{ \"Id\" : \"3\", \"ValueObjects\" : [{\"Id\" : \"1\"}, {\"Id\" : \"2\"}] }")
+ .when()
+ .post("/${punit}/v1/${entity-table}s")
+ .then()
+ .statusCode(HttpStatusCode.CREATED.getStatusCode())
+ .body("ValueObjects.Id", hasItems("1", "2"))
+ .body("Id", equalTo("3"))
+ .extract()
+ .asString();
+ given()
+ .accept(ContentType.JSON)
+ .when()
+ .get("/${punit}/v1/${value-object-table}s(EntityId='3',Id='2')")
+ .then()
+ .statusCode(HttpStatusCode.OK.getStatusCode());
+
+ }
+
+ @AfterEach
+ public void teardown() {
+ RestAssuredMockMvc.reset();
+ }
+}
diff --git a/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/test/resources/requests/CreateEntityViaBatch.txt b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/test/resources/requests/CreateEntityViaBatch.txt
new file mode 100644
index 000000000..3b62af6ed
--- /dev/null
+++ b/jpa-archetype/jpa-archetype-spring/src/main/resources/archetype-resources/src/test/resources/requests/CreateEntityViaBatch.txt
@@ -0,0 +1,38 @@
+--abc
+Content-Type: multipart/mixed; boundary=xyz
+
+--xyz
+Content-Type: application/http
+Content-Transfer-Encoding: binary
+Content-Id: 1
+Prefer: return=minimal
+
+POST ${entity-table}s HTTP/1.1
+Accept: application/json
+Content-Type: application/json
+
+{
+ "Id" : "2"
+}
+
+--xyz--
+
+--abc
+Content-Type: multipart/mixed; boundary=xyz2
+
+--xyz2
+Content-Type: application/http
+Content-Transfer-Encoding: binary
+Content-Id: 1
+Prefer: return=minimal
+
+POST ${entity-table}s HTTP/1.1
+Accept: application/json
+Content-Type: application/json
+
+{
+ "Id" : "2"
+}
+
+--xyz2--
+--abc--
\ No newline at end of file
diff --git a/jpa-archetype/pom.xml b/jpa-archetype/pom.xml
new file mode 100644
index 000000000..dcb266346
--- /dev/null
+++ b/jpa-archetype/pom.xml
@@ -0,0 +1,21 @@
+
+
+ 4.0.0
+ com.sap.olingo
+ odata-jpa-archetype
+ 0.3.8
+ pom
+ https://github.com/SAP/olingo-jpa-processor-v4
+
+
+ UTF-8
+ 1.8
+ 0.3.8-SNAPSHOT
+
+
+
+ odata-jpa-archetype-spring
+
+
\ No newline at end of file
diff --git a/jpa-tutorial/.gitignore b/jpa-tutorial/.gitignore
new file mode 100644
index 000000000..4b7c4ed07
--- /dev/null
+++ b/jpa-tutorial/.gitignore
@@ -0,0 +1 @@
+/*.txt
diff --git a/jpa/.classpath b/jpa/.classpath
deleted file mode 100644
index e506d29d5..000000000
--- a/jpa/.classpath
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/jpa/.gitignore b/jpa/.gitignore
index 41c1f923c..6012aab3d 100644
--- a/jpa/.gitignore
+++ b/jpa/.gitignore
@@ -1,4 +1,11 @@
+.settings/
target/
**/target/
/target/
/.pmd
+.classpath
+
+# --- EclipseIDE stuff START
+.settings/
+.metadata
+*.log
diff --git a/jpa/odata-jpa-annotation/.classpath b/jpa/odata-jpa-annotation/.classpath
deleted file mode 100644
index 7b6b45925..000000000
--- a/jpa/odata-jpa-annotation/.classpath
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/jpa/odata-jpa-annotation/.gitignore b/jpa/odata-jpa-annotation/.gitignore
index f39050ae3..bcb74aa8a 100644
--- a/jpa/odata-jpa-annotation/.gitignore
+++ b/jpa/odata-jpa-annotation/.gitignore
@@ -1,3 +1,7 @@
target/
**/target/
/.pmd
+
+# JDT-specific (Eclipse Java Development Tools)
+.classpath
+/.sts4-cache/
diff --git a/jpa/odata-jpa-annotation/.settings/org.eclipse.jdt.core.prefs b/jpa/odata-jpa-annotation/.settings/org.eclipse.jdt.core.prefs
index 62a317c86..d2ac26b61 100644
--- a/jpa/odata-jpa-annotation/.settings/org.eclipse.jdt.core.prefs
+++ b/jpa/odata-jpa-annotation/.settings/org.eclipse.jdt.core.prefs
@@ -1,8 +1,11 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/jpa/odata-jpa-annotation/.settings/org.eclipse.wst.common.component b/jpa/odata-jpa-annotation/.settings/org.eclipse.wst.common.component
deleted file mode 100644
index d7da6d749..000000000
--- a/jpa/odata-jpa-annotation/.settings/org.eclipse.wst.common.component
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/jpa/odata-jpa-annotation/.settings/org.eclipse.wst.common.project.facet.core.xml b/jpa/odata-jpa-annotation/.settings/org.eclipse.wst.common.project.facet.core.xml
index 0ae797003..ee260d978 100644
--- a/jpa/odata-jpa-annotation/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ b/jpa/odata-jpa-annotation/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/jpa/odata-jpa-annotation/pom.xml b/jpa/odata-jpa-annotation/pom.xml
index e52857bf9..3c62aac71 100644
--- a/jpa/odata-jpa-annotation/pom.xml
+++ b/jpa/odata-jpa-annotation/pom.xml
@@ -1,29 +1,32 @@
-
- 4.0.0
-
- com.sap.olingo
- odata-jpa
- 0.1.9-SNAPSHOT
-
- odata-jpa-annotation
- odata-jpa-annotation
- http://maven.apache.org
-
- UTF-8
-
-
-
- junit
- junit
- 4.12
- test
-
-
- org.apache.olingo
- odata-commons-api
- ${odata.version}
-
-
+
+ 4.0.0
+
+ com.sap.olingo
+ odata-jpa
+ 0.3.8-SNAPSHOT
+
+ odata-jpa-annotation
+ odata-jpa-annotation
+ https://github.com/SAP/olingo-jpa-processor-v4
+
+
+
+ org.apache.olingo
+ odata-commons-api
+ ${odata.version}
+
+
+ org.eclipse.persistence
+ javax.persistence
+ ${jpa.version}
+
+
+ com.google.code.findbugs
+ jsr305
+ 3.0.2
+
+
\ No newline at end of file
diff --git a/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmAnnotation.java b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmAnnotation.java
index 911f92ee5..ad8abc703 100644
--- a/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmAnnotation.java
+++ b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmAnnotation.java
@@ -9,7 +9,7 @@
/**
* Can be used to annotate attributes. The annotations are converted into OData annotations.
- * For detaials see
+ * For details see
* OData Version 4.0 Part 3 - 14.3 Element edm:Annotation
diff --git a/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmEnumeration.java b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmEnumeration.java
new file mode 100644
index 000000000..08d3ceeb6
--- /dev/null
+++ b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmEnumeration.java
@@ -0,0 +1,62 @@
+package com.sap.olingo.jpa.metadata.core.edm.annotation;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Enumerated;
+
+/**
+ * Annotation to tag Java enumerations that shall be provided via an OData service. For details about OData Enumerations
+ * see: 10
+ * Enumeration Type .
+ * The following conversion rule have been established:
+ *
+ * Name is taken from the enumeration name
+ * UnderlyingType is derived from the converter, if no converter is provided Edm.Int32 is taken and a
+ * field in an entity pojo needed to be annotated with @Enumerated
.
+ * Member
+ *
+ * Name is the name of a constant
+ * Value is determined via the converter, if no converter is provided the value is determined via the method
+ * ordinal
+ *
+ *
+ * @author Oliver Grande
+ *
+ */
+
+@Retention(RUNTIME)
+@Target(TYPE)
+public @interface EdmEnumeration {
+
+ /**
+ * Converter to convert that converts the enumeration value. If no converter is provided, the ordinal is taken.
+ */
+ Class extends AttributeConverter extends Enum>[], ? extends Number>> converter() default DummyConverter.class;
+
+ boolean isFlags() default false;
+
+ /**
+ * Converter shall be optional, as java does not support default null
a
+ * dummy converter implementation is needed.
+ */
+ static class DummyConverter implements AttributeConverter[], Integer> {
+
+ @Override
+ public Integer convertToDatabaseColumn(Enum>[] attributes) {
+ return attributes[0].ordinal();
+ }
+
+ @Enumerated
+ @Override
+ public Enum>[] convertToEntityAttribute(Integer dbData) {
+ return null; // NOSONAR
+ }
+
+ }
+}
diff --git a/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmFunction.java b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmFunction.java
index 31aa5eb11..96abfb37d 100644
--- a/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmFunction.java
+++ b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmFunction.java
@@ -1,6 +1,7 @@
package com.sap.olingo.jpa.metadata.core.edm.annotation;
import java.lang.annotation.ElementType;
+import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@@ -12,6 +13,7 @@
* @author Oliver Grande
*
*/
+@Repeatable(EdmFunctions.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface EdmFunction {
@@ -51,10 +53,11 @@
}
/**
- * Defines the name of the function in the service document
+ * Defines the name of the function in the service document. This is a required attribute for database based functions
+ * and can be omitted for java based functions.
* @return
*/
- String name();
+ String name() default "";
EdmParameter[] parameter() default {};
diff --git a/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmProtectedBy.java b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmProtectedBy.java
new file mode 100644
index 000000000..1d71b389a
--- /dev/null
+++ b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmProtectedBy.java
@@ -0,0 +1,40 @@
+package com.sap.olingo.jpa.metadata.core.edm.annotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * Describes which authorization claim shall be used to filter the annotated attribute. In case multiple attributes of
+ * an entity are annotated they are connected via an AND operation. This annotation is respected also if the attribute
+ * is marked to be ignored.
+ * @author Oliver Grande
+ *
+ */
+@Repeatable(EdmProtections.class)
+@Retention(RUNTIME)
+@Target(FIELD)
+public @interface EdmProtectedBy {
+ /**
+ * Name of the authorization claim
+ * @return
+ */
+ String name();
+
+ /**
+ * Optional: At embedded attributes the path to the attribute that shall be protected by the claim. In case the path
+ * is composed, path segments joined together by forward slashes (/).
The correctness of the pass is check late
+ * during request processing.
+ * @return
+ */
+ String path() default "";
+
+ /**
+ * Optional: In case the protected attributes is of type string also wildcards are supported. '*' and '%' representing
+ * zero or more characters and '+' as well as '_' for a single character.
+ */
+ boolean wildcardSupported() default true;
+}
diff --git a/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmProtections.java b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmProtections.java
new file mode 100644
index 000000000..2e3308092
--- /dev/null
+++ b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmProtections.java
@@ -0,0 +1,19 @@
+package com.sap.olingo.jpa.metadata.core.edm.annotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Allows to combine either multiple claims for a simple attribute, which will be combined with AND,
+ * or to be able to protect multiple attributes at a complex attribute.
+ * @author Oliver Grande
+ *
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(FIELD)
+public @interface EdmProtections {
+ public abstract EdmProtectedBy[] value();
+}
diff --git a/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmTransient.java b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmTransient.java
new file mode 100644
index 000000000..6fcb40cf6
--- /dev/null
+++ b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmTransient.java
@@ -0,0 +1,34 @@
+/**
+ *
+ */
+package com.sap.olingo.jpa.metadata.core.edm.annotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * The annotation marks properties that are transient, but shall be part of the Edm.
+ * @author Oliver Grande
+ * Created: 25.11.2019
+ */
+
+@Target({ FIELD })
+@Retention(value = RUNTIME)
+public @interface EdmTransient {
+ /**
+ * Optional: An array of path to attributes that need to be present to build the annotated one. In case the path
+ * is composed, path segments joined together by forward slashes (/) e.g address/cityName . The correctness
+ * of the path is check when the entity type is build.
+ */
+ String[] requiredAttributes() default {};
+
+ /**
+ * A calculator is an implementation of {@link EdmTransientPropertyCalculator}. It provides the transient property or
+ * property collection.
+ * @return
+ */
+ Class extends EdmTransientPropertyCalculator>> calculator();
+}
diff --git a/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmTransientPropertyCalculator.java b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmTransientPropertyCalculator.java
new file mode 100644
index 000000000..956a27e31
--- /dev/null
+++ b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmTransientPropertyCalculator.java
@@ -0,0 +1,45 @@
+/**
+ *
+ */
+package com.sap.olingo.jpa.metadata.core.edm.annotation;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.persistence.Tuple;
+
+/**
+ * Transient property converter.
+ * The converter provides the
+ * An instance of the converter is created once per OData request. That is it could be created multiple times per http
+ * request in case of a $batch request.
+ * An implementing class may provide one constructor having no parameter or a combination of the following:
+ *
+ * An Entity Manager: javax.persistence.EntityManager
+ * All header: java.util.Map>
+ *
+ * @author Oliver Grande
+ * Created: 14.03.2020
+ *
+ */
+public interface EdmTransientPropertyCalculator {
+ /**
+ * This method is called in case the transient property is a primitive, simple property.
+ * @param row one row read from the database
+ * @return calculated value for the property
+ */
+ default @Nullable I calculateProperty(@Nonnull final Tuple row) {
+ return null;
+ }
+
+ /**
+ * This method is called in case the transient property is a collection property.
+ * @param row one row read from the database
+ * @return list of calculated values for the collection property
+ */
+ default @Nonnull List calculateCollectionProperty(@Nonnull final Tuple row) {
+ return Collections.emptyList();
+ }
+}
diff --git a/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmVisibleFor.java b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmVisibleFor.java
new file mode 100644
index 000000000..d06d750fb
--- /dev/null
+++ b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/core/edm/annotation/EdmVisibleFor.java
@@ -0,0 +1,29 @@
+package com.sap.olingo.jpa.metadata.core.edm.annotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * The annotation can be used to assign attributes or properties to field or visibility groups. On case such a group is
+ * provided during a GET request all properties that are assigned to that group and all properties that are assigned to
+ * no group, or in other words that are not annotated, get selected. In case properties that belong to another group are
+ * requested, a null value is returned.
+ *
+ * Note: Keys, mandatory fields as well as association or navigation properties can not be annotated
+ *
+ * @author Oliver Grande
+ *
+ */
+@Retention(RUNTIME)
+@Target(FIELD)
+public @interface EdmVisibleFor {
+ /**
+ * List of field groups an attribute or property belongs to.
+ * @return
+ */
+ String[] value();
+
+}
diff --git a/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/odata/v4/core/annotation/Immutable.java b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/odata/v4/core/annotation/Immutable.java
new file mode 100644
index 000000000..b8052823c
--- /dev/null
+++ b/jpa/odata-jpa-annotation/src/main/java/com/sap/olingo/jpa/metadata/odata/v4/core/annotation/Immutable.java
@@ -0,0 +1,16 @@
+package com.sap.olingo.jpa.metadata.odata.v4.core.annotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+
+import java.lang.annotation.Target;
+
+/**
+ * OData core annotation Immutable
+ * A value for this non-key property can be provided on insert and remains unchanged on update
+ * @author Oliver Grande
+ *
+ */
+@Target(FIELD)
+public @interface Immutable {
+ boolean value() default true;
+}
diff --git a/jpa/odata-jpa-coverage/pom.xml b/jpa/odata-jpa-coverage/pom.xml
new file mode 100644
index 000000000..1634474ef
--- /dev/null
+++ b/jpa/odata-jpa-coverage/pom.xml
@@ -0,0 +1,80 @@
+
+ 4.0.0
+
+ com.sap.olingo
+ odata-jpa
+ 0.3.8-SNAPSHOT
+
+
+ odata-jpa-coverage
+ odata-jpa-coverage
+ https://github.com/SAP/olingo-jpa-processor-v4
+
+
+ UTF-8
+
+
+
+
+ com.sap.olingo
+ odata-jpa-annotation
+ ${project.version}
+
+
+ com.sap.olingo
+ odata-jpa-metadata
+ ${project.version}
+
+
+ com.sap.olingo
+ odata-jpa-processor
+ ${project.version}
+
+
+ com.sap.olingo
+ odata-jpa-processor-cb
+ ${project.version}
+
+
+ com.sap.olingo
+ odata-jpa-test
+ ${project.version}
+
+
+ com.sap.olingo
+ odata-jpa-processor-parallel
+ ${project.version}
+
+
+
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.8.5
+
+
+
+ prepare-agent
+
+
+
+ report
+ prepare-package
+
+ report-aggregate
+
+
+
+
+
+ org.eluder.coveralls
+ coveralls-maven-plugin
+ ${coveralls.version}
+
+
+
+ pom
+
\ No newline at end of file
diff --git a/jpa/odata-jpa-metadata/.classpath b/jpa/odata-jpa-metadata/.classpath
deleted file mode 100644
index cc14032cb..000000000
--- a/jpa/odata-jpa-metadata/.classpath
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/jpa/odata-jpa-metadata/.gitignore b/jpa/odata-jpa-metadata/.gitignore
index 6975666da..79ed6e80d 100644
--- a/jpa/odata-jpa-metadata/.gitignore
+++ b/jpa/odata-jpa-metadata/.gitignore
@@ -1,4 +1,9 @@
+.settings/
target/
**/target/
/.pmd
/*.log
+
+# JDT-specific (Eclipse Java Development Tools)
+.classpath
+/.sts4-cache/
diff --git a/jpa/odata-jpa-metadata/.settings/org.eclipse.jdt.core.prefs b/jpa/odata-jpa-metadata/.settings/org.eclipse.jdt.core.prefs
index 14f521d2a..13ba4736b 100644
--- a/jpa/odata-jpa-metadata/.settings/org.eclipse.jdt.core.prefs
+++ b/jpa/odata-jpa-metadata/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,8 @@
eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/jpa/odata-jpa-metadata/.settings/org.eclipse.wst.common.component b/jpa/odata-jpa-metadata/.settings/org.eclipse.wst.common.component
deleted file mode 100644
index f58abccb8..000000000
--- a/jpa/odata-jpa-metadata/.settings/org.eclipse.wst.common.component
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/jpa/odata-jpa-metadata/.settings/org.eclipse.wst.common.project.facet.core.xml b/jpa/odata-jpa-metadata/.settings/org.eclipse.wst.common.project.facet.core.xml
index 0ae797003..ee260d978 100644
--- a/jpa/odata-jpa-metadata/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ b/jpa/odata-jpa-metadata/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/jpa/odata-jpa-metadata/model/.gitignore b/jpa/odata-jpa-metadata/model/.gitignore
new file mode 100644
index 000000000..b57e6db1d
--- /dev/null
+++ b/jpa/odata-jpa-metadata/model/.gitignore
@@ -0,0 +1,3 @@
+/model.di
+/model.notation
+/model.uml
diff --git a/jpa/odata-jpa-metadata/pom.xml b/jpa/odata-jpa-metadata/pom.xml
index 8aedf8ce7..0fdcd2c39 100644
--- a/jpa/odata-jpa-metadata/pom.xml
+++ b/jpa/odata-jpa-metadata/pom.xml
@@ -5,31 +5,27 @@
4.0.0
com.sap.olingo
- odata-jpa
- 0.1.9-SNAPSHOT
+ odata-jpa
+ 0.3.8-SNAPSHOT
odata-jpa-metadata
odata-jpa-metadata
- http://maven.apache.org
+ https://github.com/SAP/olingo-jpa-processor-v4
UTF-8
-
-
- junit
- junit
- 4.12
- test
-
+
+
com.sap.olingo
odata-jpa-test
test
${project.version}
+
com.sap.olingo
odata-jpa-annotation
@@ -38,7 +34,7 @@
org.eclipse.persistence
javax.persistence
- 2.1.0
+ 2.2.0
org.apache.olingo
@@ -51,14 +47,6 @@
odata-commons-api
${odata.version}
-
-
- org.mockito
- mockito-all
- 1.9.5
- test
-
org.apache.olingo
odata-server-api
@@ -79,7 +67,12 @@
reflections
0.9.11
+
+ com.google.code.findbugs
+ jsr305
+ 3.0.2
+
-
+
\ No newline at end of file
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/api/JPAEdmProvider.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/api/JPAEdmProvider.java
index 6baa966a9..a0d94d229 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/api/JPAEdmProvider.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/api/JPAEdmProvider.java
@@ -3,7 +3,9 @@
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
+import java.util.Objects;
+import javax.annotation.Nonnull;
import javax.persistence.EntityManagerFactory;
import javax.persistence.metamodel.Metamodel;
@@ -17,6 +19,7 @@
import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainerInfo;
import org.apache.olingo.commons.api.edm.provider.CsdlEntitySet;
import org.apache.olingo.commons.api.edm.provider.CsdlEntityType;
+import org.apache.olingo.commons.api.edm.provider.CsdlEnumType;
import org.apache.olingo.commons.api.edm.provider.CsdlFunction;
import org.apache.olingo.commons.api.edm.provider.CsdlFunctionImport;
import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
@@ -25,9 +28,10 @@
import org.apache.olingo.commons.api.edmx.EdmxReference;
import org.apache.olingo.commons.api.ex.ODataException;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAEdmNameBuilder;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAServiceDocument;
import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAException;
-import com.sap.olingo.jpa.metadata.core.edm.mapper.impl.JPAEdmNameBuilder;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.impl.JPADefaultEdmNameBuilder;
import com.sap.olingo.jpa.metadata.core.edm.mapper.impl.JPAServiceDocumentFactory;
public class JPAEdmProvider extends CsdlAbstractEdmProvider {
@@ -36,22 +40,33 @@ public class JPAEdmProvider extends CsdlAbstractEdmProvider {
private final JPAServiceDocument serviceDocument;
// http://docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/part3-csdl/odata-v4.0-errata02-os-part3-csdl-complete.html#_Toc406397930
- public JPAEdmProvider(final String namespace, final EntityManagerFactory emf,
- final JPAEdmMetadataPostProcessor postProcessor, final String packageName[]) throws ODataException {
- super();
- this.nameBuilder = new JPAEdmNameBuilder(namespace);
- serviceDocument = new JPAServiceDocumentFactory(namespace, emf.getMetamodel(), postProcessor, packageName)
- .getServiceDocument();
+ public JPAEdmProvider(@Nonnull final String namespace, @Nonnull final EntityManagerFactory emf,
+ final JPAEdmMetadataPostProcessor postProcessor, final String[] packageName) throws ODataException {
+ this(namespace, Objects.requireNonNull(emf.getMetamodel()), postProcessor, packageName);
+ }
+
+ public JPAEdmProvider(@Nonnull final String namespace, final Metamodel jpaMetamodel,
+ final JPAEdmMetadataPostProcessor postProcessor, final String[] packageName) throws ODataException {
+
+ this(jpaMetamodel, postProcessor, packageName, new JPADefaultEdmNameBuilder(namespace));
}
- public JPAEdmProvider(final String namespace, final Metamodel jpaMetamodel,
- final JPAEdmMetadataPostProcessor postProcessor, final String packageName[]) throws ODataException {
+ public JPAEdmProvider(final Metamodel jpaMetamodel, final JPAEdmMetadataPostProcessor postProcessor,
+ final String[] packageName, final JPAEdmNameBuilder nameBuilder) throws ODataException {
super();
- this.nameBuilder = new JPAEdmNameBuilder(namespace);
- serviceDocument = new JPAServiceDocumentFactory(namespace, jpaMetamodel, postProcessor, packageName)
+ this.nameBuilder = nameBuilder;
+ // After this call either a schema exists or an exception has been thrown
+ this.serviceDocument = new JPAServiceDocumentFactory(nameBuilder, jpaMetamodel, postProcessor, packageName)
.getServiceDocument();
}
+ /**
+ * This method should return a {@link CsdlComplexType} or null if nothing is found.
+ *
+ * @param complexTypeName full qualified name of complex type
+ * @return for the given name
+ * @throws ODataException
+ */
@Override
public CsdlComplexType getComplexType(final FullQualifiedName complexTypeName) throws ODataException {
for (final CsdlSchema schema : serviceDocument.getAllSchemas()) {
@@ -63,35 +78,61 @@ public CsdlComplexType getComplexType(final FullQualifiedName complexTypeName) t
return null;
}
+ /**
+ * Returns the entity container of this edm
+ * @return of this edm
+ * @throws ODataException
+ */
@Override
public CsdlEntityContainer getEntityContainer() throws ODataException {
return serviceDocument.getEdmEntityContainer();
}
+ /**
+ * This method should return an {@link CsdlEntityContainerInfo} or null if nothing is found
+ *
+ * @param entityContainerName (null for default container)
+ * @return for the given name
+ * @throws ODataException
+ */
@Override
public CsdlEntityContainerInfo getEntityContainerInfo(final FullQualifiedName entityContainerName)
throws ODataException {
- // This method is invoked when displaying the Service Document at e.g.
- // .../DemoService.svc
+ // This method is invoked when displaying the Service Document at e.g.: .../DemoService.svc
if (entityContainerName == null
- || entityContainerName.equals(nameBuilder.buildFQN(nameBuilder.buildContainerName()))) {
+ || entityContainerName.equals(buildFQN(nameBuilder.buildContainerName()))) {
final CsdlEntityContainerInfo entityContainerInfo = new CsdlEntityContainerInfo();
- entityContainerInfo.setContainerName(nameBuilder.buildFQN(nameBuilder.buildContainerName()));
+ entityContainerInfo.setContainerName(buildFQN(nameBuilder.buildContainerName()));
return entityContainerInfo;
}
return null;
}
+ /**
+ * This method should return an {@link CsdlEntitySet} or null if nothing is found
+ *
+ * @param entityContainer this EntitySet is contained in
+ * @param entitySetName name of entity set
+ * @return for the given container and entityset name
+ * @throws ODataException
+ */
@Override
public CsdlEntitySet getEntitySet(final FullQualifiedName entityContainerFQN, final String entitySetName)
throws ODataException {
final CsdlEntityContainer container = serviceDocument.getEdmEntityContainer();
- if (entityContainerFQN.equals(nameBuilder.buildFQN(container.getName()))) {
+ if (entityContainerFQN.equals(buildFQN(container.getName()))) {
return container.getEntitySet(entitySetName);
}
return null;
}
+ /**
+ * This method should return an {@link CsdlEntityType} or null if nothing is found
+ *
+ * @param entityTypeName full qualified name of entity type
+ * @return for the given name
+ * @throws ODataException
+ */
@Override
public CsdlEntityType getEntityType(final FullQualifiedName entityTypeName) throws ODataException {
@@ -103,26 +144,52 @@ public CsdlEntityType getEntityType(final FullQualifiedName entityTypeName) thro
return null;
}
+ /**
+ * This method should return a {@link CsdlFunctionImport} or null if nothing is found
+ *
+ * @param entityContainer this FunctionImport is contained in
+ * @param functionImportName name of function import
+ * @return for the given container name and function import name
+ * @throws ODataException
+ */
@Override
public CsdlFunctionImport getFunctionImport(final FullQualifiedName entityContainerFQN,
final String functionImportName) throws ODataException {
final CsdlEntityContainer container = serviceDocument.getEdmEntityContainer();
- if (entityContainerFQN.equals(nameBuilder.buildFQN(container.getName()))) {
+ if (entityContainerFQN.equals(buildFQN(container.getName()))) {
return container.getFunctionImport(functionImportName);
}
return null;
}
+ /**
+ * This method should return a list of all {@link CsdlFunction} for the FullQualifiedname or null if nothing is
+ * found
+ *
+ * @param functionName full qualified name of function
+ * @return List of or null
+ * @throws ODataException
+ */
@Override
public List getFunctions(final FullQualifiedName functionName) throws ODataException {
for (final CsdlSchema schema : serviceDocument.getEdmSchemas()) {
if (schema.getNamespace().equals(functionName.getNamespace())) {
- return schema.getFunctions(functionName.getName());
+ final List functions = schema.getFunctions(functionName.getName());
+ return functions.isEmpty() ? null : functions;
}
}
- return null;
+ return null; // NOSONAR see documentation
}
+ /**
+ * This method should return a list of all {@link CsdlAction} for the FullQualifiedname
+ * or null if nothing is found
+ *
+ * @param actionName full qualified name of action
+ * @return List of
+ * or null
+ * @throws ODataException
+ */
@Override
public List getActions(final FullQualifiedName actionName) throws ODataException {
for (final CsdlSchema schema : serviceDocument.getEdmSchemas()) {
@@ -130,30 +197,77 @@ public List getActions(final FullQualifiedName actionName) throws OD
return schema.getActions(actionName.getName());
}
}
- return null;
+ return null; // NOSONAR see documentation
}
+ /**
+ * This method should return an {@link CsdlActionImport} or null if nothing is found
+ *
+ * @param entityContainer this ActionImport is contained in
+ * @param actionImportName name of action import
+ * @return for the given container and ActionImport name
+ * @throws ODataException
+ */
@Override
public CsdlActionImport getActionImport(final FullQualifiedName entityContainerFQN, final String actionImportName)
throws ODataException {
final CsdlEntityContainer container = serviceDocument.getEdmEntityContainer();
- if (entityContainerFQN.equals(nameBuilder.buildFQN(container.getName()))) {
+ if (entityContainerFQN.equals(buildFQN(container.getName()))) {
return container.getActionImport(actionImportName);
}
return null;
}
+ /**
+ * This method should return an {@link CsdlEnumType} or null if nothing is found
+ *
+ * @param enumTypeName full qualified name of enum type
+ * @return for given name
+ * @throws ODataException
+ */
@Override
- public CsdlAnnotations getAnnotationsGroup(final FullQualifiedName targetName, String qualifier)
+ public CsdlEnumType getEnumType(final FullQualifiedName enumTypeNameFQN) throws ODataException {
+
+ for (final CsdlSchema schema : serviceDocument.getEdmSchemas()) {
+ if (schema.getNamespace().equals(enumTypeNameFQN.getNamespace())) {
+ return schema.getEnumType(enumTypeNameFQN.getName());
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Gets annotations group.
+ *
+ * @param targetName full qualified name of target
+ * @param qualifier for the given target. Might be null.
+ * @return group for the given Target
+ * @throws ODataException
+ */
+ @Override
+ public CsdlAnnotations getAnnotationsGroup(final FullQualifiedName targetName, final String qualifier)
throws ODataException {
return null;
}
+ /**
+ * This method should return a {@link CsdlTerm} for the FullQualifiedName or null if nothing is found.
+ * @param termName the name of the Term
+ * @return or null
+ * @throws ODataException
+ */
@Override
public CsdlTerm getTerm(final FullQualifiedName termName) throws ODataException {
return serviceDocument.getTerm(termName);
}
+ /**
+ * This method should return an {@link CsdlTypeDefinition} or null if nothing is found
+ *
+ * @param typeDefinitionName full qualified name of type definition
+ * @return for given name
+ * @throws ODataException
+ */
@Override
public CsdlTypeDefinition getTypeDefinition(final FullQualifiedName typeDefinitionName) throws ODataException {
for (final CsdlSchema schema : serviceDocument.getAllSchemas()) {
@@ -164,6 +278,12 @@ public CsdlTypeDefinition getTypeDefinition(final FullQualifiedName typeDefiniti
return null;
}
+ /**
+ * This method should return a collection of all {@link CsdlSchema}
+ *
+ * @return List of
+ * @throws ODataException
+ */
@Override
public List getSchemas() throws ODataException {
return serviceDocument.getEdmSchemas();
@@ -181,4 +301,12 @@ public List getReferences() {
return serviceDocument.getReferences();
}
+ public JPAEdmNameBuilder getEdmNameBuilder() {
+ return nameBuilder;
+ }
+
+ protected final FullQualifiedName buildFQN(final String name) {
+ return new FullQualifiedName(nameBuilder.getNamespace(), name);
+ }
+
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/api/JPAEntityManagerFactory.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/api/JPAEntityManagerFactory.java
index 5dac2b23b..50f23c3b1 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/api/JPAEntityManagerFactory.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/api/JPAEntityManagerFactory.java
@@ -11,17 +11,21 @@ public class JPAEntityManagerFactory {
private static final String ENTITY_MANAGER_DATA_SOURCE = "javax.persistence.nonJtaDataSource";
private static Map> emfMap;
+ private JPAEntityManagerFactory() {
+ throw new IllegalStateException("JPAEntityManagerFactory class");
+ }
+
public static EntityManagerFactory getEntityManagerFactory(final String pUnit, final Map ds) {
if (pUnit == null) {
return null;
}
if (emfMap == null) {
- emfMap = new HashMap>();
+ emfMap = new HashMap<>();
}
- Integer dsKey = new Integer(ds.hashCode());
+ Integer dsKey = ds.hashCode();
if (emfMap.containsKey(pUnit)) {
final Map dsMap = emfMap.get(pUnit);
- EntityManagerFactory emf = dsMap.get(ds);
+ EntityManagerFactory emf = dsMap.get(dsKey);
if (emf != null)
return emf;
@@ -30,7 +34,7 @@ public static EntityManagerFactory getEntityManagerFactory(final String pUnit, f
return emf;
} else {
- final Map dsMap = new HashMap();
+ final Map dsMap = new HashMap<>();
emfMap.put(pUnit, dsMap);
final EntityManagerFactory emf = Persistence.createEntityManagerFactory(pUnit, ds);
dsMap.put(dsKey, emf);
@@ -39,9 +43,8 @@ public static EntityManagerFactory getEntityManagerFactory(final String pUnit, f
}
public static EntityManagerFactory getEntityManagerFactory(final String pUnit, final DataSource ds) {
- final Map properties = new HashMap();
+ final Map properties = new HashMap<>();
properties.put(ENTITY_MANAGER_DATA_SOURCE, ds);
return getEntityManagerFactory(pUnit, properties);
}
-
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/api/JPAJoinColumn.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/api/JPAJoinColumn.java
new file mode 100644
index 000000000..3a00be8ff
--- /dev/null
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/api/JPAJoinColumn.java
@@ -0,0 +1,17 @@
+/**
+ *
+ */
+package com.sap.olingo.jpa.metadata.api;
+
+/**
+ * @author Oliver Grande
+ * Created: 02.02.2020
+ *
+ */
+public interface JPAJoinColumn {
+
+ String getReferencedColumnName();
+
+ String getName();
+
+}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/AbstractVocabularyReader.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/AbstractVocabularyReader.java
new file mode 100644
index 000000000..c50661106
--- /dev/null
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/AbstractVocabularyReader.java
@@ -0,0 +1,70 @@
+/**
+ *
+ */
+package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+import javax.annotation.Nonnull;
+
+import org.apache.olingo.commons.api.edm.provider.CsdlAbstractEdmItem;
+
+import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException.MessageKeys;
+
+/**
+ * @author Oliver Grande
+ * Created: 15.12.2019
+ *
+ */
+abstract class AbstractVocabularyReader {
+ final JacksonXmlModule module;
+ final XmlMapper xmlMapper;
+
+ /**
+ *
+ */
+ AbstractVocabularyReader() {
+ super();
+ module = new JacksonXmlModule();
+ module.setDefaultUseWrapper(false);
+ xmlMapper = new XmlMapper(module);
+ }
+
+ protected String loadXML(@Nonnull final String path) throws IOException, ODataJPAModelException {
+ final Optional url = Optional.ofNullable(this.getClass().getClassLoader().getResource(path));
+ final File file = new File(url.orElseThrow(
+ () -> new ODataJPAModelException(MessageKeys.FILE_NOT_FOUND, path)).getFile());
+ final StringBuilder content = new StringBuilder();
+ try (final FileReader reader = new FileReader(file);
+ final BufferedReader br = new BufferedReader(reader)) {
+ String line;
+ while ((line = br.readLine()) != null) {
+ content.append(line);
+ }
+ }
+ return content.toString();
+ }
+
+ protected abstract Map convertEDMX(Edmx edmx);
+
+ public Edmx readFromResource(@Nonnull final String path) throws IOException, ODataJPAModelException {
+ return xmlMapper.readValue(loadXML(Objects.requireNonNull(path)), Edmx.class);
+ }
+
+ public Edmx readFromURI(@Nonnull final URI uri) throws IOException {
+ return xmlMapper.readValue(uri.toURL(), Edmx.class);
+
+ }
+
+}
\ No newline at end of file
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Action.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Action.java
new file mode 100644
index 000000000..7a5a34648
--- /dev/null
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Action.java
@@ -0,0 +1,43 @@
+package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+import org.apache.olingo.commons.api.edm.provider.CsdlAction;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Action extends CsdlAction {
+
+ @Override
+ @JacksonXmlProperty(localName = "Name")
+ public CsdlAction setName(final String name) {
+ Objects.requireNonNull(name, "Name is a required attribute of actions");
+ return super.setName(name);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "IsBound")
+ public CsdlAction setBound(final boolean isBound) {
+ return super.setBound(isBound);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "EntitySetPath")
+ public CsdlAction setEntitySetPath(String entitySetPath) {
+ return super.setEntitySetPath(entitySetPath);
+ }
+
+ @JacksonXmlProperty(localName = "Parameter")
+ public void setParameters(final Parameter[] parameters) {
+ this.parameters.addAll(Arrays.asList(parameters));
+ }
+
+ @JacksonXmlProperty(localName = "ReturnType")
+ public void setReturnType(final ReturnType returnType) {
+ super.setReturnType(returnType);
+ }
+
+}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/AppliesTo.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/AppliesTo.java
index 6f2bcd6d1..37c2dec29 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/AppliesTo.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/AppliesTo.java
@@ -92,21 +92,21 @@ public enum AppliesTo {
private final String value;
- AppliesTo(String v) {
+ private AppliesTo(String v) {
value = v;
}
public String value() {
return value;
}
-
- public static AppliesTo fromValue(String v) {
- for (AppliesTo c : AppliesTo.values()) {
- if (c.value.equals(v)) {
- return c;
- }
- }
- throw new IllegalArgumentException(v);
- }
+//
+// public static AppliesTo fromValue(String v) {
+// for (AppliesTo c : AppliesTo.values()) {
+// if (c.value.equals(v)) {
+// return c;
+// }
+// }
+// throw new IllegalArgumentException(v);
+// }
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/ComplexType.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/ComplexType.java
index 63a4e3aca..51c45c753 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/ComplexType.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/ComplexType.java
@@ -1,154 +1,48 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.edm.provider.CsdlComplexType;
-import org.apache.olingo.commons.api.edm.provider.CsdlNavigationProperty;
-import org.apache.olingo.commons.api.edm.provider.CsdlProperty;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+/**
+ * Complex Type for vocabulary definitions
+ * Not supported: NavigationProperty
, no use case known
+ * @author Oliver Grande
+ *
+ */
@JsonIgnoreProperties(ignoreUnknown = true)
class ComplexType extends CsdlComplexType {
- @JacksonXmlProperty(localName = "Name", isAttribute = true)
- private String name;
- @JacksonXmlProperty(localName = "Abstract", isAttribute = true)
- private Boolean isAbstract;
- @JacksonXmlProperty(localName = "OpenType", isAttribute = true)
- private Boolean isOpenType;
- @JacksonXmlProperty(localName = "BaseType", isAttribute = true)
- private FullQualifiedName baseType;
- @JacksonXmlProperty(localName = "Property")
- private List properties = new ArrayList();
- @JacksonXmlProperty(localName = "NavigationProperty")
- private List navigationProperties = new ArrayList();
-
-//@JacksonXmlProperty(localName = "Annotation")
-//protected List annotations;
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public boolean isOpenType() {
- return isOpenType;
- }
-
- @Override
- public String getBaseType() {
- return baseType.getFullQualifiedNameAsString();
- }
-
- @Override
- public FullQualifiedName getBaseTypeFQN() {
- return baseType;
- }
-
- @Override
- public boolean isAbstract() {
- return isAbstract;
- }
-
@Override
- public List getProperties() {
- List csdlProperties = new ArrayList();
-
- for (Property p : properties) {
- csdlProperties.add(p);
- }
- return csdlProperties;
- }
-
- @Override
- public CsdlProperty getProperty(String name) {
-
- for (Property p : properties) {
- if (p.getName().equals(name))
- return p;
- }
- return null;
- }
-
- @Override
- public List getNavigationProperties() {
- List csdlNaviProperties = new ArrayList();
-
- for (NavigationProperty p : navigationProperties) {
- csdlNaviProperties.add(p);
- }
- return csdlNaviProperties;
- }
-
- @Override
- public CsdlNavigationProperty getNavigationProperty(String name) {
-
- for (NavigationProperty p : navigationProperties) {
- if (p.getName().equals(name))
- return p;
- }
- return null;
- }
-
- @Override
- public CsdlComplexType setName(String name) {
- this.name = name;
- return this;
+ @JacksonXmlProperty(localName = "Name", isAttribute = true)
+ public CsdlComplexType setName(final String name) {
+ return super.setName(name);
}
@Override
- public CsdlComplexType setOpenType(boolean isOpenType) {
- this.isOpenType = isOpenType;
- return this;
- }
+ @JacksonXmlProperty(localName = "OpenType", isAttribute = true)
+ public CsdlComplexType setOpenType(final boolean isOpenType) {
+ return super.setOpenType(isOpenType);
- @JsonSetter
- @Override
- public CsdlComplexType setBaseType(String baseType) {
- this.baseType = new FullQualifiedName(baseType);
- return this;
}
@Override
- public CsdlComplexType setBaseType(FullQualifiedName baseType) {
- this.baseType = baseType;
- return this;
+ @JacksonXmlProperty(localName = "BaseType", isAttribute = true)
+ public CsdlComplexType setBaseType(final String baseType) {
+ return super.setBaseType(baseType);
}
@Override
- public CsdlComplexType setAbstract(boolean isAbstract) {
- this.isAbstract = isAbstract;
- return this;
+ @JacksonXmlProperty(localName = "Abstract", isAttribute = true)
+ public CsdlComplexType setAbstract(final boolean isAbstract) {
+ return super.setAbstract(isAbstract);
}
- @JsonSetter
- void setProperties(Property[] properties) {
- for (Property p : properties) {
+ @JacksonXmlProperty(localName = "Property")
+ public void setProperties(Property[] properties) {
+ for (final Property p : properties) {
this.properties.add(p);
}
}
-
- @JsonSetter
- public void setNavigationProperties(NavigationProperty[] navigationProperties) {
- for (NavigationProperty p : navigationProperties) {
- this.navigationProperties.add(p);
- }
- }
-
-// @Override
-// public CsdlComplexType setAnnotations(List annotations) {
-// // TODO Auto-generated method stub
-// return super.setAnnotations(annotations);
-// }
-
-// @Override
-// public List getAnnotations() {
-// return annotations();
-// }
-
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/EntityKeyElement.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/EntityKeyElement.java
deleted file mode 100644
index bc18fdae0..000000000
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/EntityKeyElement.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.olingo.commons.api.edm.provider.CsdlPropertyRef;
-
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-
-public class EntityKeyElement {
-
- @JacksonXmlProperty(localName = "PropertyRef")
- protected List propertyRefs;
-
- List getPropertyRef() {
- List csdlPropertyRefs = new ArrayList();
- for (PropertyRef p : propertyRefs) {
- csdlPropertyRefs.add(p);
- }
- return csdlPropertyRefs;
- }
-
-}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/EntityType.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/EntityType.java
deleted file mode 100644
index cab6cc369..000000000
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/EntityType.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.olingo.commons.api.edm.FullQualifiedName;
-import org.apache.olingo.commons.api.edm.provider.CsdlEntityType;
-import org.apache.olingo.commons.api.edm.provider.CsdlNavigationProperty;
-import org.apache.olingo.commons.api.edm.provider.CsdlProperty;
-import org.apache.olingo.commons.api.edm.provider.CsdlPropertyRef;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class EntityType extends CsdlEntityType {
-
-//protected List keyOrPropertyOrNavigationProperty;
-
- @JacksonXmlProperty(localName = "Name", isAttribute = true)
- private String name;
- @JacksonXmlProperty(localName = "Abstract", isAttribute = true)
- private Boolean isAbstract;
- @JacksonXmlProperty(localName = "BaseType", isAttribute = true)
- private String baseType;
- @JacksonXmlProperty(localName = "OpenType", isAttribute = true)
- protected Boolean isOpenType;
- @JacksonXmlProperty(localName = "HasStream", isAttribute = true)
- protected Boolean hasStream;
-
- @JacksonXmlProperty(localName = "Property")
- private List properties;
- @JacksonXmlProperty(localName = "NavigationProperty")
- private List navigationProperties;
- @JacksonXmlProperty(localName = "Key")
- private List key;
-//@XmlElement(name = "Annotation", type = Annotation.class)
-
- @Override
- public boolean hasStream() {
- return hasStream;
- }
-
- @Override
- public List getKey() {
-//
- if (key != null || !key.isEmpty())
- return key.get(0).getPropertyRef();
- return new ArrayList();
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public boolean isOpenType() {
- return isOpenType;
- }
-
- @Override
- public String getBaseType() {
- return baseType;
- }
-
- @Override
- public FullQualifiedName getBaseTypeFQN() {
- return new FullQualifiedName(baseType);
- }
-
- @Override
- public boolean isAbstract() {
- return isAbstract;
- }
-
- @Override
- public List getProperties() {
- List csdlProperties = new ArrayList();
-
- for (Property p : properties) {
- csdlProperties.add(p);
- }
- return csdlProperties;
- }
-
- @Override
- public CsdlProperty getProperty(String name) {
-
- for (Property p : properties) {
- if (p.getName().equals(name))
- return p;
- }
- return null;
- }
-
- @Override
- public List getNavigationProperties() {
- List csdlNaviProperties = new ArrayList();
-
- for (NavigationProperty p : navigationProperties) {
- csdlNaviProperties.add(p);
- }
- return csdlNaviProperties;
- }
-
- @Override
- public CsdlNavigationProperty getNavigationProperty(String name) {
-
- for (NavigationProperty p : navigationProperties) {
- if (p.getName().equals(name))
- return p;
- }
- return null;
- }
-
-// @Override
-// public List getAnnotations() {
-// // TODO Auto-generated method stub
-// return super.getAnnotations();
-// }
-
-// @Override
-// protected T getOneByName(String name, Collection items) {
-// return super.getOneByName(name, items);
-// }
-
-// @Override
-// protected List getAllByName(String name, Collection items) {
-// return super.getAllByName(name, items);
-// }
-}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/EnumType.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/EnumType.java
index c3f136b74..177ba1139 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/EnumType.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/EnumType.java
@@ -1,105 +1,35 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.olingo.commons.api.edm.FullQualifiedName;
-import org.apache.olingo.commons.api.edm.provider.CsdlEnumMember;
import org.apache.olingo.commons.api.edm.provider.CsdlEnumType;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
@JsonIgnoreProperties(ignoreUnknown = true)
public class EnumType extends CsdlEnumType {
- @JacksonXmlProperty(localName = "Name", isAttribute = true)
- private String name;
-
- @JacksonXmlProperty(localName = "IsFlags", isAttribute = true)
- private boolean isFlags;
-
- @JacksonXmlProperty(localName = "UnderlyingType")
- private FullQualifiedName underlyingType;
-
- @JacksonXmlProperty(localName = "Member")
- private Member[] members;
-
@Override
- public String getName() {
- return name;
- }
-
- @Override
- public boolean isFlags() {
- return isFlags;
+ @JacksonXmlProperty(localName = "Name", isAttribute = true)
+ public CsdlEnumType setName(final String name) {
+ return super.setName(name);
}
@Override
- public String getUnderlyingType() {
- return underlyingType.getFullQualifiedNameAsString();
+ @JacksonXmlProperty(localName = "IsFlags", isAttribute = true)
+ public CsdlEnumType setFlags(final boolean isFlags) {
+ return super.setFlags(isFlags);
}
@Override
- public List getMembers() {
- List csdlMembers = new ArrayList();
- for (CsdlEnumMember m : members) {
- csdlMembers.add(m);
- }
- return csdlMembers;
+ @JacksonXmlProperty(localName = "UnderlyingType")
+ public CsdlEnumType setUnderlyingType(final String underlyingType) {
+ return super.setUnderlyingType(underlyingType);
}
- @Override
- public CsdlEnumMember getMember(String name) {
- for (CsdlEnumMember m : members) {
- if (m.getName().equals(name))
- return super.getMember(name);
+ @JacksonXmlProperty(localName = "Member")
+ public void setMembers(final Member[] members) {
+ for (final Member m : members) {
+ this.getMembers().add(m);
}
- return null;
- }
-
- @Override
- public CsdlEnumMember getMember(Integer index) {
- return members[index];
- }
-
- @Override
- public CsdlEnumType setName(String name) {
- this.name = name;
- return this;
}
-
- @Override
- public CsdlEnumType setFlags(boolean isFlags) {
- this.isFlags = isFlags;
- return this;
- }
-
- @Override
- @JsonSetter
- public CsdlEnumType setUnderlyingType(String underlyingType) {
- this.underlyingType = new FullQualifiedName(underlyingType);
- return this;
- }
-
- @Override
- public CsdlEnumType setUnderlyingType(FullQualifiedName underlyingType) {
- this.underlyingType = underlyingType;
- return this;
- }
-
- @JsonSetter
- public void setMembers(Member[] members) {
- this.members = members;
- }
-
-// @Override
-// public List getAnnotations() {
-// return annotations;
-// }
-
-//@JacksonXmlProperty(localName = "Annotation")
-//protected List annotations;
-
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Function.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Function.java
new file mode 100644
index 000000000..cf5108f0f
--- /dev/null
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Function.java
@@ -0,0 +1,53 @@
+package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+import org.apache.olingo.commons.api.edm.provider.CsdlFunction;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+/**
+ * Function as part of a OData vocabulary.
+ * @author Oliver Grande
+ *
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Function extends CsdlFunction {
+
+ @Override
+ @JacksonXmlProperty(localName = "IsBound")
+ public CsdlFunction setBound(final boolean isBound) {
+ return super.setBound(isBound);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "IsComposable")
+ public CsdlFunction setComposable(final boolean isComposable) {
+ return super.setComposable(isComposable);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "EntitySetPath")
+ public CsdlFunction setEntitySetPath(String entitySetPath) {
+ return super.setEntitySetPath(entitySetPath);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "Name")
+ public CsdlFunction setName(final String name) {
+ Objects.requireNonNull(name, "Name is a required attribute of functions");
+ return super.setName(name);
+ }
+
+ @JacksonXmlProperty(localName = "Parameter")
+ public void setParameters(final Parameter[] parameters) {
+ this.parameters.addAll(Arrays.asList(parameters));
+ }
+
+ @JacksonXmlProperty(localName = "ReturnType")
+ public void setReturnType(final ReturnType returnType) {
+ super.setReturnType(returnType);
+ }
+}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Member.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Member.java
index 3ebee0bdb..1896c8327 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Member.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Member.java
@@ -8,31 +8,15 @@
@JsonIgnoreProperties(ignoreUnknown = true)
public class Member extends CsdlEnumMember {
- @JacksonXmlProperty(localName = "Name", isAttribute = true)
- private String name;
-
- @JacksonXmlProperty(localName = "Value", isAttribute = true)
- private String value;
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public String getValue() {
- return value;
- }
-
@Override
- public CsdlEnumMember setName(String name) {
- this.name = name;
- return this;
+ @JacksonXmlProperty(localName = "Name", isAttribute = true)
+ public CsdlEnumMember setName(final String name) {
+ return super.setName(name);
}
@Override
- public CsdlEnumMember setValue(String value) {
- this.value = value;
- return this;
+ @JacksonXmlProperty(localName = "Value", isAttribute = true)
+ public CsdlEnumMember setValue(final String value) {
+ return super.setValue(value);
}
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/NavigationProperty.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/NavigationProperty.java
deleted file mode 100644
index a4d97fb38..000000000
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/NavigationProperty.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.olingo.commons.api.edm.FullQualifiedName;
-import org.apache.olingo.commons.api.edm.provider.CsdlNavigationProperty;
-import org.apache.olingo.commons.api.edm.provider.CsdlReferentialConstraint;
-
-import com.fasterxml.jackson.annotation.JsonSetter;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-
-public class NavigationProperty extends CsdlNavigationProperty {
-
- @JacksonXmlProperty(localName = "Name", isAttribute = true)
- private String name;
- @JacksonXmlProperty(localName = "Type", isAttribute = true)
- private FullQualifiedName type;
- @JacksonXmlProperty(localName = "Nullable", isAttribute = true)
- private Boolean isNullable;
- @JacksonXmlProperty(localName = "Partner", isAttribute = true)
- private String partner;
- @JacksonXmlProperty(localName = "ContainsTarget", isAttribute = true)
- private Boolean containsTarget;
-
- @JacksonXmlProperty(localName = "ReferentialConstraint")
- List referentialConstraints;
-
-// @JacksonXmlProperty(localName = "OnDelete")
-// List oneDelete;
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public boolean isCollection() {
- return super.isCollection();
- }
-
- @Override
- public FullQualifiedName getTypeFQN() {
- // TODO Auto-generated method stub
- return super.getTypeFQN();
- }
-
- @Override
- public String getType() {
- // TODO Auto-generated method stub
- return super.getType();
- }
-
- @Override
- public String getPartner() {
- return partner;
- }
-
- @Override
- public boolean isContainsTarget() {
- return containsTarget;
- }
-
- @Override
- public List getReferentialConstraints() {
- List csdlConstraints = new ArrayList();
- for (CsdlReferentialConstraint rc : referentialConstraints) {
- csdlConstraints.add(rc);
- }
- return csdlConstraints;
- }
-
- @Override
- public Boolean isNullable() {
- return isNullable;
- }
-
- @Override
- public CsdlNavigationProperty setCollection(boolean isCollection) {
- return this;
- }
-
- @Override
- public CsdlNavigationProperty setName(String name) {
- this.name = name;
- return this;
- }
-
- @Override
- public CsdlNavigationProperty setType(FullQualifiedName type) {
- this.type = type;
- return this;
- }
-
- @JsonSetter
- @Override
- public CsdlNavigationProperty setType(String type) {
- this.type = new FullQualifiedName(type);
- return this;
- }
-
- @Override
- public CsdlNavigationProperty setPartner(String partner) {
- this.partner = partner;
- return this;
- }
-
- @Override
- public CsdlNavigationProperty setContainsTarget(boolean containsTarget) {
- this.containsTarget = containsTarget;
- return this;
- }
-
- @Override
- public CsdlNavigationProperty setReferentialConstraints(List referentialConstraints) {
- return this;
- }
-
- @JsonSetter
- void setReferentialConstraints(ReferentialConstraint[] referentialConstraints) {
- for (ReferentialConstraint rc : referentialConstraints) {
- this.referentialConstraints.add(rc);
- }
- }
-
- @Override
- public CsdlNavigationProperty setNullable(Boolean nullable) {
- this.isNullable = nullable;
- return this;
- }
-
-// @Override
-// public List getAnnotations() {
-// return super.getAnnotations();
-// }
-
-// @Override
-// public CsdlOnDelete getOnDelete() {
-// // TODO Auto-generated method stub
-// return super.getOnDelete();
-// }
-
-// @Override
-// public List getAnnotations() {
-// // TODO Auto-generated method stub
-// return super.getAnnotations();
-// }
-}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Parameter.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Parameter.java
new file mode 100644
index 000000000..ec8b05d29
--- /dev/null
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Parameter.java
@@ -0,0 +1,62 @@
+package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
+
+import java.util.Objects;
+
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.geo.SRID;
+import org.apache.olingo.commons.api.edm.provider.CsdlParameter;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Parameter extends CsdlParameter {
+
+ @Override
+ @JacksonXmlProperty(localName = "Name")
+ public CsdlParameter setName(final String name) {
+ Objects.requireNonNull(name, "Name is a required attribute of parameter");
+ return super.setName(name);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "Type")
+ public CsdlParameter setType(final String type) {
+ Objects.requireNonNull(type, "Type is a required attribute of parameters");
+ if (type.startsWith("Collection")) {
+ setCollection(true);
+ return super.setType(new FullQualifiedName(type.split("[()]")[1]));
+ }
+ return super.setType(new FullQualifiedName(type));
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "Nullable")
+ public CsdlParameter setNullable(final boolean nullable) {
+ return super.setNullable(nullable);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "MaxLength", isAttribute = true)
+ public CsdlParameter setMaxLength(Integer maxLength) {
+ return super.setMaxLength(maxLength);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "Precision", isAttribute = true)
+ public CsdlParameter setPrecision(final Integer precision) {
+ return super.setPrecision(precision);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "Scale", isAttribute = true)
+ public CsdlParameter setScale(final Integer scale) {
+ return super.setScale(scale);
+ }
+
+ @JacksonXmlProperty(localName = "SRID", isAttribute = true)
+ void setSrid(final String srid) {
+ Objects.requireNonNull(srid);
+ super.setSrid(SRID.valueOf(srid));
+ }
+}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Property.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Property.java
index a66b6fc9e..4d29923d6 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Property.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Property.java
@@ -1,187 +1,74 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
+import java.util.Objects;
+
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.edm.geo.SRID;
-import org.apache.olingo.commons.api.edm.provider.CsdlMapping;
import org.apache.olingo.commons.api.edm.provider.CsdlProperty;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Property extends CsdlProperty {
- @JacksonXmlProperty(localName = "Name", isAttribute = true)
- private String name;
- @JacksonXmlProperty(localName = "Type", isAttribute = true)
- private FullQualifiedName type;
- @JacksonXmlProperty(localName = "Nullable", isAttribute = true)
- private Boolean isNullable;
- @JacksonXmlProperty(localName = "DefaultValue", isAttribute = true)
- private String defaultValue;
- @JacksonXmlProperty(localName = "Unicode", isAttribute = true)
- private Boolean isUnicode;
- @JacksonXmlProperty(localName = "MaxLength", isAttribute = true)
- private Integer maxLength;
- @JacksonXmlProperty(localName = "Precision", isAttribute = true)
- private Integer precision;
- @JacksonXmlProperty(localName = "Scale", isAttribute = true)
- private Integer scale;
- @JacksonXmlProperty(localName = "SRID", isAttribute = true)
- private SRID srid;
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public String getType() {
- // TODO Auto-generated method stub
- return super.getType();
- }
-
- @Override
- public FullQualifiedName getTypeAsFQNObject() {
- // TODO Auto-generated method stub
- return super.getTypeAsFQNObject();
- }
-
- @Override
- public boolean isCollection() {
-// final int collStartIdx = typeExpression.indexOf("Collection(");
-// final int collEndIdx = typeExpression.lastIndexOf(')');
- return false;
- }
-
- @Override
- public String getDefaultValue() {
- return defaultValue;
- }
-
- @Override
- public boolean isNullable() {
- return isNullable;
- }
-
- @Override
- public Integer getMaxLength() {
- return new Integer(maxLength);
- }
-
- @Override
- public Integer getPrecision() {
- return precision;
- }
-
- @Override
- public Integer getScale() {
- return scale;
- }
-
@Override
- public boolean isUnicode() {
- return isUnicode;
- }
-
- @Override
- public String getMimeType() {
- return super.getMimeType();
- }
-
- @Override
- public CsdlMapping getMapping() {
- return super.getMapping();
- }
-
- @Override
- public SRID getSrid() {
- return srid;
- }
-
- @Override
- public CsdlProperty setName(String name) {
- this.name = name;
- return this;
- }
-
- @Override
- public CsdlProperty setType(FullQualifiedName type) {
- this.type = type;
- return this;
- }
-
- @JsonSetter
- @Override
- public CsdlProperty setType(String type) {
- this.type = new FullQualifiedName(type);
- return this;
- }
-
- @Override
- public CsdlProperty setCollection(boolean isCollection) {
- return this;
- }
-
- @Override
- public CsdlProperty setDefaultValue(String defaultValue) {
- this.defaultValue = defaultValue;
- return this;
- }
-
- @Override
- public CsdlProperty setNullable(boolean nullable) {
- this.isNullable = nullable;
- return this;
+ @JacksonXmlProperty(localName = "Name", isAttribute = true)
+ public CsdlProperty setName(final String name) {
+ Objects.requireNonNull(name);
+ return super.setName(name);
}
@Override
- public CsdlProperty setMaxLength(Integer maxLength) {
- this.maxLength = maxLength;
- return this;
+ @JacksonXmlProperty(localName = "Type", isAttribute = true)
+ public CsdlProperty setType(final String type) {
+ Objects.requireNonNull(type);
+ if (type.startsWith("Collection")) {
+ setCollection(true);
+ return super.setType(new FullQualifiedName(type.split("[()]")[1]));
+ }
+ return super.setType(new FullQualifiedName(type));
}
@Override
- public CsdlProperty setPrecision(Integer precision) {
- this.precision = precision;
- return this;
+ @JacksonXmlProperty(localName = "DefaultValue", isAttribute = true)
+ public CsdlProperty setDefaultValue(final String defaultValue) {
+ return super.setDefaultValue(defaultValue);
}
@Override
- public CsdlProperty setScale(Integer scale) {
- this.scale = scale;
- return this;
+ @JacksonXmlProperty(localName = "Nullable", isAttribute = true)
+ public CsdlProperty setNullable(final boolean nullable) {
+ return super.setNullable(nullable);
}
@Override
- public CsdlProperty setUnicode(boolean unicode) {
- this.isUnicode = unicode;
- return this;
+ @JacksonXmlProperty(localName = "MaxLength", isAttribute = true)
+ public CsdlProperty setMaxLength(final Integer maxLength) {
+ return super.setMaxLength(maxLength);
}
@Override
- public CsdlProperty setMimeType(String mimeType) {
- return this;
+ @JacksonXmlProperty(localName = "Precision", isAttribute = true)
+ public CsdlProperty setPrecision(final Integer precision) {
+ return super.setPrecision(precision);
}
@Override
- public CsdlProperty setMapping(CsdlMapping mapping) {
- return this;
+ @JacksonXmlProperty(localName = "Scale", isAttribute = true)
+ public CsdlProperty setScale(final Integer scale) {
+ return super.setScale(scale);
}
@Override
- public CsdlProperty setSrid(SRID srid) {
- this.srid = srid;
- return this;
+ @JacksonXmlProperty(localName = "Unicode", isAttribute = true)
+ public CsdlProperty setUnicode(final boolean unicode) {
+ return super.setUnicode(unicode);
}
- @JsonSetter
- void setSrid(String srid) {
- if (srid != null)
- this.srid = SRID.valueOf(srid);
- else
- this.srid = null;
+ @JacksonXmlProperty(localName = "SRID", isAttribute = true)
+ void setSrid(final String srid) {
+ Objects.requireNonNull(srid);
+ super.setSrid(SRID.valueOf(srid));
}
-
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/PropertyRef.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/PropertyRef.java
deleted file mode 100644
index c0f5ed156..000000000
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/PropertyRef.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
-
-import org.apache.olingo.commons.api.edm.provider.CsdlPropertyRef;
-
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-
-public class PropertyRef extends CsdlPropertyRef {
-
- @JacksonXmlProperty(localName = "Name", isAttribute = true)
- private String name;
-
- @JacksonXmlProperty(localName = "Alias", isAttribute = true)
- private String alias;
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public String getAlias() {
- return alias;
- }
-}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/ReferentialConstraint.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/ReferentialConstraint.java
deleted file mode 100644
index ebac51c62..000000000
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/ReferentialConstraint.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
-
-import org.apache.olingo.commons.api.edm.provider.CsdlReferentialConstraint;
-
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-
-public class ReferentialConstraint extends CsdlReferentialConstraint {
-
- @JacksonXmlProperty(localName = "Property", isAttribute = true)
- protected String property;
- @JacksonXmlProperty(localName = "ReferencedProperty", isAttribute = true)
- protected String referencedProperty;
-
- @Override
- public String getProperty() {
- return property;
- }
-
- @Override
- public String getReferencedProperty() {
- return referencedProperty;
- }
-
-// @Override
-// public List getAnnotations() {
-// return super.getAnnotations();
-// }
-
-// @XmlElement(name = "Annotation")
-// protected List annotation;
-}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/ReturnType.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/ReturnType.java
new file mode 100644
index 000000000..787396299
--- /dev/null
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/ReturnType.java
@@ -0,0 +1,56 @@
+package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
+
+import java.util.Objects;
+
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.geo.SRID;
+import org.apache.olingo.commons.api.edm.provider.CsdlReturnType;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ReturnType extends CsdlReturnType {
+
+ @Override
+ @JacksonXmlProperty(localName = "Type")
+ public CsdlReturnType setType(final String type) {
+ Objects.requireNonNull(type, "Type is a required attribute of return type");
+ if (type.startsWith("Collection")) {
+ setCollection(true);
+ return super.setType(new FullQualifiedName(type.split("[()]")[1]));
+ }
+ return super.setType(new FullQualifiedName(type));
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "Nullable")
+ public CsdlReturnType setNullable(final boolean nullable) {
+ return super.setNullable(nullable);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "MaxLength", isAttribute = true)
+ public CsdlReturnType setMaxLength(final Integer maxLength) {
+ return super.setMaxLength(maxLength);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "Precision", isAttribute = true)
+ public CsdlReturnType setPrecision(final Integer precision) {
+ return super.setPrecision(precision);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = "Scale", isAttribute = true)
+ public CsdlReturnType setScale(final Integer scale) {
+ return super.setScale(scale);
+ }
+
+ @JacksonXmlProperty(localName = "SRID", isAttribute = true)
+ void setSrid(final String srid) {
+ Objects.requireNonNull(srid);
+ super.setSrid(SRID.valueOf(srid));
+ }
+
+}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Schema.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Schema.java
index f902c739b..d02b00ce9 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Schema.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Schema.java
@@ -1,14 +1,14 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-import javax.xml.bind.annotation.XmlAccessOrder;
-import javax.xml.bind.annotation.XmlAccessorOrder;
-
+import org.apache.olingo.commons.api.edm.provider.CsdlAction;
import org.apache.olingo.commons.api.edm.provider.CsdlComplexType;
import org.apache.olingo.commons.api.edm.provider.CsdlEnumType;
+import org.apache.olingo.commons.api.edm.provider.CsdlFunction;
import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
import org.apache.olingo.commons.api.edm.provider.CsdlTerm;
import org.apache.olingo.commons.api.edm.provider.CsdlTypeDefinition;
@@ -17,7 +17,12 @@
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-@XmlAccessorOrder(XmlAccessOrder.UNDEFINED)
+/**
+ * http://docs.oasis-open.org/odata/ns/edmx
+ * @author Oliver Grande
+ *
+ */
+
@JsonIgnoreProperties(ignoreUnknown = true)
class Schema {
@JacksonXmlProperty(isAttribute = true)
@@ -30,19 +35,22 @@ class Schema {
private String alias;
@JacksonXmlProperty(localName = "EnumType")
- private List enumerations = new ArrayList();
+ private List enumerations = new ArrayList<>();
@JacksonXmlProperty(localName = "TypeDefinition")
- private List typeDefinitions = new ArrayList();
-//
-// @JacksonXmlProperty(localName = "EntityType")
-// private List entityTypes = new ArrayList();
-//
+ private List typeDefinitions = new ArrayList<>();
+
@JacksonXmlProperty(localName = "ComplexType")
- private List complexTypes = new ArrayList();
+ private List complexTypes = new ArrayList<>();
@JacksonXmlProperty(localName = "Term")
- private List terms = new ArrayList();
+ private List terms = new ArrayList<>();
+
+ @JacksonXmlProperty(localName = "Function")
+ private List functions = new ArrayList<>();
+
+ @JacksonXmlProperty(localName = "Action")
+ private List actions = new ArrayList<>();
CsdlSchema asCsdlSchema() {
CsdlSchema csdlSchema = new CsdlSchema();
@@ -52,143 +60,73 @@ CsdlSchema asCsdlSchema() {
csdlSchema.setEnumTypes(asEnumTypes());
csdlSchema.setComplexTypes(asComplexTypes());
csdlSchema.setTypeDefinitions(asTypeDefinitions());
+ csdlSchema.setFunctions(asFunctions());
+ csdlSchema.setActions(asActions());
return csdlSchema;
}
- String getAlias() {
- return alias;
- }
-
- ComplexType getComplexType(String name) {
-
- for (ComplexType c : complexTypes) {
- if (c.getName().equals(name)) {
- return c;
- }
- }
- return null;
- }
-
- List getComplexTypes() {
- return Collections.unmodifiableList(complexTypes);
- }
-
- private List asComplexTypes() {
- List csdlComplexType = new ArrayList();
-
- for (ComplexType c : complexTypes) {
- csdlComplexType.add(c);
- }
- return Collections.unmodifiableList(csdlComplexType);
- }
-
- EnumType getEnumType(String name) {
- for (EnumType e : enumerations) {
- if (e.getName().equals(name)) {
- return e;
- }
- }
- return null;
- }
-
- List getEnumTypes() {
- return Collections.unmodifiableList(enumerations);
- }
-
- private List asEnumTypes() {
- List csdlEnumType = new ArrayList();
-
- for (EnumType e : enumerations) {
- csdlEnumType.add(e);
- }
- return Collections.unmodifiableList(csdlEnumType);
- }
-
String getNamespace() {
return namespace;
}
- TypeDefinition getTypeDefinition(String name) {
-
- for (TypeDefinition e : typeDefinitions) {
- if (e.getName().equals(name)) {
- return e;
- }
- }
- return null;
+ List getTerms() {
+ return Collections.unmodifiableList(terms);
}
- List getTypeDefinitions() {
- return Collections.unmodifiableList(typeDefinitions);
+ void setAlias(String alias) {
+ this.alias = alias;
}
- private List asTypeDefinitions() {
- List csdlTypeDefinion = new ArrayList();
+ @JsonSetter
+ void setComplexTypes(ComplexType[] newComplexTypes) {
+ complexTypes.addAll(Arrays.asList(newComplexTypes));
+ }
- for (TypeDefinition t : typeDefinitions) {
- csdlTypeDefinion.add(t);
- }
- return Collections.unmodifiableList(csdlTypeDefinion);
+ @JsonSetter
+ void setEnumerations(EnumType enumeration) {
+ this.enumerations.add(enumeration);
}
- void setAlias(String alias) {
- this.alias = alias;
+ @JsonSetter
+ void setFunctions(Function[] newFunctions) {
+ functions.addAll(Arrays.asList(newFunctions));
}
void setNamespace(String namespace) {
this.namespace = namespace;
}
- /*
- * <element name="Action" type="{http://docs.oasis-open.org/odata/ns/edm}TAction"/>
- * <element name="Function" type="{http://docs.oasis-open.org/odata/ns/edm}TFunction"/>
- * <element name="Annotations" type="{http://docs.oasis-open.org/odata/ns/edm}TAnnotations"/>
- * <element name="EntityContainer" type="{http://docs.oasis-open.org/odata/ns/edm}TEntityContainer"/>
- * <element ref="{http://docs.oasis-open.org/odata/ns/edm}Annotation"/>
- */
- Term getTerm(String name) {
- for (Term t : terms) {
- if (t.getName().equals(name)) {
- return t;
- }
- }
- return null;
+ @JsonSetter
+ void setTerms(Term[] newTerms) {
+ terms.addAll(Arrays.asList(newTerms));
}
- List getTerms() {
- return Collections.unmodifiableList(terms);
+ @JsonSetter
+ void setTypeDefinitions(TypeDefinition typeDefinition) {
+ this.typeDefinitions.add(typeDefinition);
}
- private List asCsdlTerms() {
- List csdlTerms = new ArrayList();
+ private List asActions() {
+ return Collections.unmodifiableList(actions);
+ }
- for (Term t : terms) {
- csdlTerms.add(t);
- }
- return Collections.unmodifiableList(csdlTerms);
+ private List asComplexTypes() {
+ return Collections.unmodifiableList(complexTypes);
}
- @JsonSetter
- void setComplexTypes(ComplexType[] newComplexTypes) {
- for (ComplexType t : newComplexTypes) {
- complexTypes.add(t);
- }
+ private List asCsdlTerms() {
+ return Collections.unmodifiableList(terms);
}
- @JsonSetter
- void setEnumerations(ArrayList enumerations) {
- this.enumerations = enumerations;
+ private List asEnumTypes() {
+ return Collections.unmodifiableList(enumerations);
}
- @JsonSetter
- void setTerms(Term[] newTerms) {
- for (Term t : newTerms) {
- terms.add(t);
- }
+ private List asFunctions() {
+ return Collections.unmodifiableList(functions);
}
- @JsonSetter
- void setTypeDefinitions(ArrayList typeDefinitions) {
- this.typeDefinitions = typeDefinitions;
+ private List asTypeDefinitions() {
+ return Collections.unmodifiableList(typeDefinitions);
}
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/SchemaReader.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/SchemaReader.java
index 0ef01b91c..5ef723e03 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/SchemaReader.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/SchemaReader.java
@@ -1,83 +1,37 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
import java.net.URI;
-import java.net.URL;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
-import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
-public class SchemaReader {
- final private JacksonXmlModule module;
- final private XmlMapper xmlMapper;
+public class SchemaReader extends AbstractVocabularyReader {
public SchemaReader() {
super();
- module = new JacksonXmlModule();
- module.setDefaultUseWrapper(false);
- xmlMapper = new XmlMapper(module);
-
- }
-
- public Map getSchemas(String path) throws JsonParseException,
- JsonMappingException, IOException {
- return convertEDMX(readFromResource(path));
- }
-
- public Map getSchemas(URI uri) throws JsonParseException,
- JsonMappingException, MalformedURLException, IOException {
- return convertEDMX(readFromURI(uri));
- }
-
- public Edmx readFromResource(final String path) throws JsonParseException, JsonMappingException, IOException {
-
- byte[] b = loadXML(path);
- return xmlMapper.readValue(new String(b), Edmx.class);
}
- public Edmx readFromURI(final URI uri) throws JsonParseException, JsonMappingException, MalformedURLException,
- IOException {
-
- return xmlMapper.readValue(uri.toURL(), Edmx.class);
-
+ public Map getSchemas(final String path) throws IOException, ODataJPAModelException {
+ return path == null || path.isEmpty() ? Collections.emptyMap() : convertEDMX(readFromResource(path));
}
- private byte[] loadXML(String path) {
-
- InputStream i = null;
- byte[] image = null;
- URL u = this.getClass().getClassLoader().getResource(path);
- try {
- i = u.openStream();
- image = new byte[i.available()];
- i.read(image);
- } catch (IOException e1) {
- e1.printStackTrace();
- } finally {
- try {
- i.close();
- return image;
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return null;
+ public Map getSchemas(final URI uri) throws IOException {
+ return uri == null ? Collections.emptyMap() : convertEDMX(readFromURI(uri));
}
- private Map convertEDMX(Edmx edmx) {
+ @SuppressWarnings("unchecked")
+ @Override
+ protected Map convertEDMX(Edmx edmx) {
if (edmx != null && edmx.getDataService() != null) {
Schema[] schemas = edmx.getDataService().getSchemas();
- Map edmSchemas = new HashMap(schemas.length);
+ Map edmSchemas = new HashMap<>(schemas.length);
for (Schema schema : schemas) {
String namespace = schema.getNamespace();
edmSchemas.put(namespace, schema.asCsdlSchema());
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Term.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Term.java
index 755e1a121..a8003aaa3 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Term.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/Term.java
@@ -1,178 +1,84 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import org.apache.olingo.commons.api.edm.geo.SRID;
import org.apache.olingo.commons.api.edm.provider.CsdlTerm;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
@JsonIgnoreProperties(ignoreUnknown = true)
class Term extends CsdlTerm {
- Term() {
- super();
- }
-
- @JacksonXmlProperty(localName = "Name", isAttribute = true)
- private String name;
-
- @JacksonXmlProperty(localName = "Type", isAttribute = true)
- private String type;
-
- @JacksonXmlProperty(localName = "BaseTerm", isAttribute = true)
- private String baseTerm;
-
- @JacksonXmlProperty(localName = "Nullable", isAttribute = true)
- private boolean nullable;
-
- @JacksonXmlProperty(localName = "DefaultValue", isAttribute = true)
- private String defaultValue;
-
@JacksonXmlProperty(localName = "AppliesTo", isAttribute = true)
- private String appliesTo;
-
- @JacksonXmlProperty(localName = "MaxLength", isAttribute = true)
- private int maxLength;
-
- @JacksonXmlProperty(localName = "Precision", isAttribute = true)
- private int precision;
-
- @JacksonXmlProperty(localName = "Scale", isAttribute = true)
- private int scale;
-
- @JacksonXmlProperty(localName = "SRID", isAttribute = true)
- private SRID srid;
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public String getType() {
- return type;
- }
-
- @Override
- public String getBaseTerm() {
- return baseTerm;
- }
-
- @Override
- public boolean isNullable() {
- return nullable;
- }
-
- @Override
- public String getDefaultValue() {
- return defaultValue;
- }
-
- @Override
- public List getAppliesTo() {
- List result = new ArrayList();
+ void setAppliesTo(final String appliesTo) {
+ final List result = new ArrayList<>();
if (appliesTo != null) {
String[] list = appliesTo.split(" ");
- for (String apply : list) {
- result.add(apply);
- }
+ result.addAll(Arrays.asList(list));
}
- return result;
- }
-
- @Override
- public Integer getMaxLength() {
- return maxLength;
- }
-
- @Override
- public Integer getPrecision() {
- return precision;
- }
-
- @Override
- public Integer getScale() {
- return scale;
- }
-
- @Override
- public SRID getSrid() {
- return srid;
- }
-
- @JsonSetter
- void setAppliesTo(String appliesTo) {
- this.appliesTo = appliesTo;
- }
-
- @Override
- public CsdlTerm setName(String name) {
- this.name = name;
- return this;
+ super.setAppliesTo(result);
}
@Override
- public CsdlTerm setType(String type) {
- this.type = type;
- return this;
+ @JacksonXmlProperty(localName = "Name", isAttribute = true)
+ public CsdlTerm setName(final String name) {
+ return super.setName(name);
}
@Override
- public CsdlTerm setBaseTerm(String baseTerm) {
- this.baseTerm = baseTerm;
- return this;
+ @JacksonXmlProperty(localName = "Type", isAttribute = true)
+ public CsdlTerm setType(final String type) {
+ return super.setType(type);
}
@Override
- public CsdlTerm setAppliesTo(List appliesTo) {
- return this;
+ @JacksonXmlProperty(localName = "BaseTerm", isAttribute = true)
+ public CsdlTerm setBaseTerm(final String baseTerm) {
+ return super.setBaseTerm(baseTerm);
}
@Override
- public CsdlTerm setDefaultValue(String defaultValue) {
- this.defaultValue = defaultValue;
+ public CsdlTerm setAppliesTo(final List appliesTo) {
return this;
}
@Override
- public CsdlTerm setNullable(boolean nullable) {
- this.nullable = nullable;
- return this;
+ @JacksonXmlProperty(localName = "DefaultValue", isAttribute = true)
+ public CsdlTerm setDefaultValue(final String defaultValue) {
+ return super.setDefaultValue(defaultValue);
}
@Override
- public CsdlTerm setMaxLength(Integer maxLength) {
- this.maxLength = maxLength;
- return this;
+ @JacksonXmlProperty(localName = "Nullable", isAttribute = true)
+ public CsdlTerm setNullable(final boolean nullable) {
+ return super.setNullable(nullable);
}
@Override
- public CsdlTerm setPrecision(Integer precision) {
- this.precision = precision;
- return this;
+ @JacksonXmlProperty(localName = "MaxLength", isAttribute = true)
+ public CsdlTerm setMaxLength(final Integer maxLength) {
+ return super.setMaxLength(maxLength);
}
@Override
- public CsdlTerm setScale(Integer scale) {
- this.scale = scale;
- return this;
+ @JacksonXmlProperty(localName = "Precision", isAttribute = true)
+ public CsdlTerm setPrecision(final Integer precision) {
+ return super.setPrecision(precision);
}
@Override
- public CsdlTerm setSrid(SRID srid) {
- this.srid = srid;
- return this;
+ @JacksonXmlProperty(localName = "Scale", isAttribute = true)
+ public CsdlTerm setScale(final Integer scale) {
+ return super.setScale(scale);
}
- @JsonSetter
- void setSrid(String srid) {
+ @JacksonXmlProperty(localName = "SRID", isAttribute = true)
+ void setSrid(final String srid) {
if (srid != null)
- this.srid = SRID.valueOf(srid);
- else
- this.srid = null;
+ super.setSrid(SRID.valueOf(srid));
}
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/TermReader.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/TermReader.java
index d44116026..329e8b051 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/TermReader.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/TermReader.java
@@ -1,83 +1,38 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
import java.net.URI;
-import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.apache.olingo.commons.api.edm.provider.CsdlTerm;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
-import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
-public class TermReader {
- final private JacksonXmlModule module;
- final private XmlMapper xmlMapper;
+public class TermReader extends AbstractVocabularyReader {
public TermReader() {
super();
- module = new JacksonXmlModule();
- module.setDefaultUseWrapper(false);
- xmlMapper = new XmlMapper(module);
-
}
- public Map> getTerms(String path) throws JsonParseException, JsonMappingException,
- IOException {
+ public Map> getTerms(String path) throws IOException, ODataJPAModelException {
return convertEDMX(readFromResource(path));
}
- public Map> getTerms(URI uri) throws JsonParseException, JsonMappingException,
- MalformedURLException, IOException {
+ public Map> getTerms(URI uri) throws IOException {
return convertEDMX(readFromURI(uri));
}
- public Edmx readFromResource(final String path) throws JsonParseException, JsonMappingException, IOException {
- byte[] b = loadXML(path);
- return xmlMapper.readValue(new String(b), Edmx.class);
- }
-
- public Edmx readFromURI(final URI uri) throws JsonParseException, JsonMappingException, MalformedURLException,
- IOException {
- return xmlMapper.readValue(uri.toURL(), Edmx.class);
-
- }
-
- private byte[] loadXML(String path) {
-
- InputStream i = null;
- byte[] image = null;
- URL u = this.getClass().getClassLoader().getResource(path);
- try {
- i = u.openStream();
- image = new byte[i.available()];
- i.read(image);
- } catch (IOException e1) {
- e1.printStackTrace();
- } finally {
- try {
- i.close();
- return image;
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return null;
- }
-
- private Map> convertEDMX(Edmx edmx) {
+ @SuppressWarnings("unchecked")
+ @Override
+ protected Map> convertEDMX(Edmx edmx) {
if (edmx != null && edmx.getDataService() != null) {
Schema[] schemas = edmx.getDataService().getSchemas();
- Map> edmSchemas = new HashMap>(schemas.length);
+ Map> edmSchemas = new HashMap<>(schemas.length);
for (Schema schema : schemas) {
String namespace = schema.getNamespace();
- Map terms = new HashMap();
+ Map terms = new HashMap<>();
for (CsdlTerm t : schema.getTerms()) {
terms.put(t.getName(), t);
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/TypeDefinition.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/TypeDefinition.java
index dad903016..a4003b7e0 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/TypeDefinition.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/annotation/TypeDefinition.java
@@ -1,128 +1,56 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.annotation;
-import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import java.util.Objects;
+
import org.apache.olingo.commons.api.edm.geo.SRID;
import org.apache.olingo.commons.api.edm.provider.CsdlTypeDefinition;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
@JsonIgnoreProperties(ignoreUnknown = true)
class TypeDefinition extends CsdlTypeDefinition {
- TypeDefinition() {
- super();
- }
-
- @JacksonXmlProperty(localName = "Name", isAttribute = true)
- private String name;
- @JacksonXmlProperty(localName = "UnderlyingType", isAttribute = true)
- private String underlyingType;
- @JacksonXmlProperty(localName = "MaxLength", isAttribute = true)
- private Integer maxLength;
- @JacksonXmlProperty(localName = "Precision", isAttribute = true)
- private Integer precision;
- @JacksonXmlProperty(localName = "Scale", isAttribute = true)
- private Integer scale;
- @JacksonXmlProperty(localName = "SRID", isAttribute = true)
- private String srid;
- @JacksonXmlProperty(localName = "Unicode", isAttribute = true)
- private Boolean isUnicode;
-
-//@JacksonXmlProperty(localName = "Annotation")
-//protected List annotations;
-
@Override
- public String getName() {
- return name;
- }
-
- @Override
- public String getUnderlyingType() {
- return underlyingType;
- }
-
- @Override
- public Integer getMaxLength() {
- return maxLength;
- }
-
- @Override
- public Integer getPrecision() {
- return new Integer(precision.intValue());
- }
-
- @Override
- public Integer getScale() {
- return scale;
- }
-
- @Override
- public boolean isUnicode() {
- return isUnicode;
- }
-
- @Override
- public SRID getSrid() {
- if (srid != null)
- return SRID.valueOf(srid);
- else
- return null;
- }
-
- @Override
- public TypeDefinition setName(String name) {
- this.name = name;
- return this;
- }
-
- @JsonSetter
- @Override
- public CsdlTypeDefinition setUnderlyingType(String underlyingType) {
- this.underlyingType = underlyingType;
- return this;
+ @JacksonXmlProperty(localName = "Name", isAttribute = true)
+ public CsdlTypeDefinition setName(final String name) {
+ return super.setName(name);
}
@Override
- public CsdlTypeDefinition setUnderlyingType(FullQualifiedName underlyingType) {
- this.underlyingType = underlyingType.getFullQualifiedNameAsString();
- return this;
+ @JacksonXmlProperty(localName = "UnderlyingType", isAttribute = true)
+ public CsdlTypeDefinition setUnderlyingType(final String underlyingType) {
+ return super.setUnderlyingType(underlyingType);
}
@Override
- public CsdlTypeDefinition setMaxLength(Integer maxLength) {
- this.maxLength = maxLength;
- return this;
+ @JacksonXmlProperty(localName = "MaxLength", isAttribute = true)
+ public CsdlTypeDefinition setMaxLength(final Integer maxLength) {
+ return super.setMaxLength(maxLength);
}
@Override
- public CsdlTypeDefinition setPrecision(Integer precision) {
- this.precision = precision;
- return this;
+ @JacksonXmlProperty(localName = "Precision", isAttribute = true)
+ public CsdlTypeDefinition setPrecision(final Integer precision) {
+ return super.setPrecision(precision);
}
@Override
- public CsdlTypeDefinition setScale(Integer scale) {
- this.scale = scale;
- return this;
+ @JacksonXmlProperty(localName = "Scale", isAttribute = true)
+ public CsdlTypeDefinition setScale(final Integer scale) {
+ return super.setScale(scale);
}
@Override
- public CsdlTypeDefinition setUnicode(boolean unicode) {
- this.isUnicode = unicode;
- return this;
+ @JacksonXmlProperty(localName = "Unicode", isAttribute = true)
+ public CsdlTypeDefinition setUnicode(final boolean unicode) {
+ return super.setUnicode(unicode);
}
- @Override
- public CsdlTypeDefinition setSrid(SRID srid) {
- this.srid = srid.toString();
- return this;
+ @JacksonXmlProperty(localName = "SRID", isAttribute = true)
+ void setSrid(final String srid) {
+ Objects.requireNonNull(srid);
+ super.setSrid(SRID.valueOf(srid));
}
-// @Override
-// public List getAnnotations() {
-// return annotations;
-// }
-
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAction.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAction.java
index de4ce1b4f..db7f8593e 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAction.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAction.java
@@ -2,8 +2,10 @@
import java.lang.reflect.Parameter;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
+
public interface JPAAction extends JPAOperation, JPAJavaOperation {
- JPAParameter getParameter(Parameter declairedParameter);
+ JPAParameter getParameter(Parameter declairedParameter) throws ODataJPAModelException;
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAssociationAttribute.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAssociationAttribute.java
index e13c6c90a..1cfee0c0b 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAssociationAttribute.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAssociationAttribute.java
@@ -2,13 +2,12 @@
import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
-//TODO remove extension
public interface JPAAssociationAttribute extends JPAAttribute {
public JPAStructuredType getTargetEntity() throws ODataJPAModelException;
- public boolean isCollection();
+ public JPAAssociationAttribute getPartner();
- JPAAssociationAttribute getPartner();
+ public JPAAssociationPath getPath() throws ODataJPAModelException;
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAssociationPath.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAssociationPath.java
index 9f69b9b80..c08d57f4b 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAssociationPath.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAssociationPath.java
@@ -6,21 +6,37 @@
public interface JPAAssociationPath {
- String PATH_SEPERATOR = "/";
-
String getAlias();
+ /**
+ * Only available if a Join Table was used
+ * @return
+ * @throws ODataJPAModelException
+ */
+ List getInverseLeftJoinColumnsList() throws ODataJPAModelException;
+
List getJoinColumnsList() throws ODataJPAModelException;
+ JPAJoinTable getJoinTable();
+
JPAAssociationAttribute getLeaf();
+ List getLeftColumnsList() throws ODataJPAModelException;
+
+ JPAAssociationAttribute getPartner();
+
List getPath();
- JPAStructuredType getTargetType();
+ List getRightColumnsList() throws ODataJPAModelException;
JPAStructuredType getSourceType();
- boolean isCollection();
+ JPAStructuredType getTargetType();
- JPAAssociationAttribute getPartner();
+ /**
+ * @return True if the target entity is linked via a join table
+ */
+ boolean hasJoinTable();
+
+ boolean isCollection();
}
\ No newline at end of file
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAttribute.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAttribute.java
index fb4719b1a..09ef4a933 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAttribute.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAAttribute.java
@@ -1,29 +1,75 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.api;
+import java.lang.reflect.Constructor;
+import java.util.List;
+import java.util.Set;
+
import javax.persistence.AttributeConverter;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.edm.provider.CsdlAbstractEdmItem;
+import com.sap.olingo.jpa.metadata.core.edm.annotation.EdmTransientPropertyCalculator;
import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
public interface JPAAttribute extends JPAElement {
- public AttributeConverter, ?> getConverter();
+ public AttributeConverter getConverter();
+
+ public EdmPrimitiveTypeKind getEdmType() throws ODataJPAModelException;
+
+ public CsdlAbstractEdmItem getProperty() throws ODataJPAModelException;
- public JPAStructuredType getStructuredType();
+ public JPAStructuredType getStructuredType() throws ODataJPAModelException;
+
+ /**
+ * Returns a list of names of the claims that shall be matched with this property
+ * @return
+ */
+ public Set getProtectionClaimNames();
+
+ /**
+ * Provides a List of path to the protected attributed
+ * @return
+ * @throws ODataJPAModelException
+ */
+ public List getProtectionPath(String claimName) throws ODataJPAModelException;
public Class> getType();
+ public boolean isAssociation();
+
+ /**
+ * True if a to n association is involved
+ * @return
+ */
+ public boolean isCollection();
+
public boolean isComplex();
- public boolean isKey();
+ public boolean isEnum();
- public boolean isAssociation();
+ public boolean isEtag();
+
+ public boolean isKey();
public boolean isSearchable();
- public EdmPrimitiveTypeKind getEdmType() throws ODataJPAModelException;
+ public boolean hasProtection();
- public CsdlAbstractEdmItem getProperty() throws ODataJPAModelException;
+ public boolean isTransient();
+
+ /**
+ *
+ * @param
+ * @return
+ * @throws ODataJPAModelException
+ */
+ public > Constructor getCalculatorConstructor()
+ throws ODataJPAModelException;
+
+ /**
+ * @return A list of path pointing to the properties that are required to calculate the value of this property
+ */
+ List getRequiredProperties();
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPACollectionAttribute.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPACollectionAttribute.java
new file mode 100644
index 000000000..65db012e5
--- /dev/null
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPACollectionAttribute.java
@@ -0,0 +1,27 @@
+package com.sap.olingo.jpa.metadata.core.edm.mapper.api;
+
+import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
+
+public interface JPACollectionAttribute extends JPAAttribute {
+
+ JPAAssociationPath asAssociation() throws ODataJPAModelException;
+
+ /**
+ * Returns for simple collections attributes the corresponding attribute of the target entity type. E.g. the following
+ * property definition:
+ *
+ * @ElementCollection(fetch = FetchType.LAZY)
+ * @CollectionTable(name = "\"Comment\"",
+ *     joinColumns = @@JoinColumn(name = "\"BusinessPartnerID\""))
+ * @Column(name = "\"Text\"")
+ * private List comment = new ArrayList<>();
+ *
+ * creates a simple collection attribute. For this collection attribute jpa processor requires that a corresponding
+ * entity exists. This entity has to have a property pointing to the same database column, which is returned.
+ *
+ * @return In case of simple collections attributes the corresponding attribute of the target entity type otherwise
+ * null.
+ * @throws ODataJPAModelException
+ */
+ JPAAttribute getTargetAttribute() throws ODataJPAModelException;
+}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPADescriptionAttribute.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPADescriptionAttribute.java
index f447b7175..dba90d0e3 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPADescriptionAttribute.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPADescriptionAttribute.java
@@ -1,15 +1,20 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.api;
-import java.util.HashMap;
+import java.util.Map;
public interface JPADescriptionAttribute extends JPAAttribute {
public boolean isLocationJoin();
+ /**
+ * @return Property of description entity that contains the text/description
+ */
public JPAAttribute getDescriptionAttribute();
public JPAPath getLocaleFieldName();
- public HashMap getFixedValueAssignment();
+ public Map getFixedValueAssignment();
+
+ public JPAAssociationAttribute asAssociationAttribute();
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAEdmNameBuilder.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAEdmNameBuilder.java
new file mode 100644
index 000000000..6ebaea42a
--- /dev/null
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAEdmNameBuilder.java
@@ -0,0 +1,103 @@
+/**
+ *
+ */
+package com.sap.olingo.jpa.metadata.core.edm.mapper.api;
+
+import javax.annotation.Nonnull;
+import javax.persistence.metamodel.Attribute;
+import javax.persistence.metamodel.EmbeddableType;
+import javax.persistence.metamodel.EntityType;
+
+import org.apache.olingo.commons.api.edm.provider.CsdlEntityType;
+
+/**
+ * A name builder creates, based on information from the JPA entity model names, the names of the corresponding element
+ * of the OData entity data model (EDM)
+ * @author Oliver Grande
+ * Created: 15.09.2019
+ *
+ */
+public interface JPAEdmNameBuilder {
+
+ /**
+ *
+ * @param jpaEnbeddedType
+ * @return
+ */
+ @Nonnull
+ String buildComplexTypeName(final EmbeddableType> jpaEnbeddedType);
+
+ /**
+ * Container names are
+ * Simple Identifier ,
+ * so can contain only letters, digits and underscores.
+ * @return non empty unique name of an Entity Set
+ */
+ @Nonnull
+ String buildContainerName();
+
+ default String buildEntitySetName(final CsdlEntityType entityType) {
+ return buildEntitySetName(entityType.getName());
+ }
+
+ /**
+ * Create a name of an
+ * Entity Set derived from the name of the corresponding entity type.
+ * @param entityTypeName
+ * @return non empty unique name of an Entity Set
+ */
+ @Nonnull
+ String buildEntitySetName(final String entityTypeName);
+
+ /**
+ * Creates the name of an Entity
+ * Type derived from JPA Entity Type.
+ * @param jpaEntityType
+ * @return non empty unique name of an Entity Type
+ */
+ @Nonnull
+ String buildEntityTypeName(final EntityType> jpaEntityType);
+
+ /**
+ * Converts the internal java class name of an enumeration into the external entity data model
+ * Enumeration Type name.
+ * @param javaEnum
+ * @return non empty unique name of an Enumeration
+ */
+ @Nonnull
+ String buildEnumerationTypeName(final Class extends Enum>> javaEnum);
+
+ /**
+ * Converts the name of an JPA association attribute into the name of an EDM navigation property
+ * @param jpaAttribute
+ * @return non empty unique name of a Navigation Property
+ */
+ @Nonnull
+ String buildNaviPropertyName(final Attribute, ?> jpaAttribute);
+
+ /**
+ * Convert the internal name of a java based operation into the external entity data model name.
+ * @param internalOperationName
+ * @return non empty unique name of an Operation (Function or Action)
+ */
+ @Nonnull
+ String buildOperationName(final String internalOperationName);
+
+ /**
+ * Converts the name of an JPA attribute into the name of an EDM property
+ * @param jpaAttributeName
+ * @return non empty unique name of a property
+ */
+ @Nonnull
+ String buildPropertyName(final String jpaAttributeName);
+
+ /**
+ * @return name space to a schema
+ */
+ @Nonnull
+ String getNamespace();
+}
\ No newline at end of file
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAElement.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAElement.java
index b25fb4bbd..e7126e900 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAElement.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAElement.java
@@ -3,9 +3,21 @@
import org.apache.olingo.commons.api.edm.FullQualifiedName;
public interface JPAElement {
+ /**
+ * Returns the full qualified name of an element
+ * @return
+ */
+ public FullQualifiedName getExternalFQN();
+
+ /**
+ * Returns the element name published by the API
+ * @return
+ */
public String getExternalName();
+ /**
+ * Returns the internally used (Java) name for an element
+ * @return
+ */
public String getInternalName();
-
- public FullQualifiedName getExternalFQN();
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAEntityType.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAEntityType.java
index c9caf98bd..e2ef7f60b 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAEntityType.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAEntityType.java
@@ -5,6 +5,20 @@
import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
public interface JPAEntityType extends JPAStructuredType {
+ /**
+ * Searches for a Collection Property defined by the name used in the OData metadata in all the collection properties
+ * that are available for this type via the OData service. That is:
+ *
+ * All not ignored collection properties of this type.
+ * All not ignored collection properties from super types.
+ * All not ignored collection properties from embedded types.
+ *
+ * @param externalName
+ * @return
+ * @throws ODataJPAModelException
+ */
+ public JPACollectionAttribute getCollectionAttribute(final String externalName) throws ODataJPAModelException;
+
/**
*
* @return Mime type of streaming content
@@ -14,9 +28,12 @@ public interface JPAEntityType extends JPAStructuredType {
public JPAPath getContentTypeAttributePath() throws ODataJPAModelException;
+ public JPAPath getEtagPath() throws ODataJPAModelException;
+
/**
* Returns a resolved list of all attributes that are marked as Id, so the attributes of an EmbeddedId are returned as
- * separate entries
+ * separate entries. For compound keys has the opposite order of the attributes in the entity or embedded id
+ * respectively.
* @return
* @throws ODataJPAModelException
*/
@@ -30,11 +47,17 @@ public interface JPAEntityType extends JPAStructuredType {
public List getKeyPath() throws ODataJPAModelException;
/**
- * Returns the class of the Key. This could by either a primitive tape, the IdClass or the Embeddable of an EmbeddedId
+ * Returns the class of the Key. This could by either a primitive type, the IdClass or the Embeddable of an EmbeddedId
* @return
*/
public Class> getKeyType();
+ /**
+ * True in case the entity type has a compound key, so an EmbeddedId or multiple id properties
+ * @return
+ */
+ public boolean hasCompoundKey();
+
/**
*
* @return
@@ -54,6 +77,5 @@ public interface JPAEntityType extends JPAStructuredType {
public boolean hasStream() throws ODataJPAModelException;
- public List searchChildPath(JPAPath selectItemPath);
-
+ public List searchChildPath(final JPAPath selectItemPath);
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAEnumerationAttribute.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAEnumerationAttribute.java
new file mode 100644
index 000000000..acac982eb
--- /dev/null
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAEnumerationAttribute.java
@@ -0,0 +1,27 @@
+package com.sap.olingo.jpa.metadata.core.edm.mapper.api;
+
+import java.util.List;
+
+import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
+
+public interface JPAEnumerationAttribute {
+ > T enumOf(final String value) throws ODataJPAModelException;
+
+ > E enumOf(final T value) throws ODataJPAModelException;
+
+ T valueOf(final String value) throws ODataJPAModelException;
+
+ T valueOf(final List value) throws ODataJPAModelException;
+
+ boolean isFlags() throws ODataJPAModelException;
+
+ /**
+ * Converts a list of string representations either into an array of enumerations, if a converter is given, or
+ * otherwise the first value into an enumeration
+ * @param value
+ * @return
+ * @throws ODataJPAModelException
+ */
+ Object convert(final List values) throws ODataJPAModelException;
+
+}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAFunction.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAFunction.java
index 38dfa204c..278be8dbc 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAFunction.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAFunction.java
@@ -27,4 +27,6 @@ public interface JPAFunction extends JPAOperation {
* @return The type of function
*/
public EdmFunctionType getFunctionType();
+
+ public boolean isBound() throws ODataJPAModelException;
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAJoinTable.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAJoinTable.java
new file mode 100644
index 000000000..265853d70
--- /dev/null
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAJoinTable.java
@@ -0,0 +1,30 @@
+package com.sap.olingo.jpa.metadata.core.edm.mapper.api;
+
+import java.util.List;
+
+import com.sap.olingo.jpa.metadata.api.JPAJoinColumn;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
+
+public interface JPAJoinTable {
+
+ public String getTableName();
+
+ public String getAlias(String dbFieldName);
+
+ public String getInverseAlias(String dbFieldName);
+
+ public JPAEntityType getEntityType();
+
+ public List getJoinColumns() throws ODataJPAModelException;
+
+ /**
+ * Returns the list of inverse join columns with exchanged left/right order.
+ * @return
+ * @throws ODataJPAModelException
+ */
+ public List getInversJoinColumns() throws ODataJPAModelException;
+
+ public List getRawJoinInformation();
+
+ public List getRawInversJoinInformation() throws ODataJPAModelException;
+}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAPath.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAPath.java
index 1c67debfa..74ef56686 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAPath.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAPath.java
@@ -2,18 +2,55 @@
import java.util.List;
+/**
+ * A path within an JPA entity to an attribute.
+ * @author Oliver Grande
+ *
+ */
public interface JPAPath extends Comparable {
- String PATH_SEPERATOR = "/";
+ final String PATH_SEPERATOR = "/";
+ /**
+ * External unique identifier for a path. Two path are seen as equal if they have the same alias
+ * @return
+ */
String getAlias();
+ /**
+ * @return the name of the data base table/view column of the leaf of a path
+ */
String getDBFieldName();
+ /**
+ * @return the last element of a path
+ */
JPAAttribute getLeaf();
+ /**
+ * @return all elements of a path
+ */
List getPath();
+ /**
+ * @return true if the leaf of the path shall be ignored
+ */
boolean ignore();
+ /**
+ * Returns true in case the leaf of the path is part of one of the provided groups or none of the path elements is
+ * annotated with EdmVisibleFor. The leaf is seen as a member of a group in case its EdmVisibleFor annotation contains
+ * the group or the groups is mentioned at any other element of the path.
+ * Note: Based on this inheritance of EdmVisibleFor a path is seen as inconsistent if multiple elements are
+ * annotated and the difference of the set of groups is not empty.
+ * @return
+ */
+ public boolean isPartOfGroups(final List groups);
+
+ /**
+ *
+ * @return True in case at least on of the elements of the path is a transient property
+ */
+ public boolean isTransient();
+
}
\ No newline at end of file
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAProtectionInfo.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAProtectionInfo.java
new file mode 100644
index 000000000..dc500ec6c
--- /dev/null
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAProtectionInfo.java
@@ -0,0 +1,32 @@
+package com.sap.olingo.jpa.metadata.core.edm.mapper.api;
+
+/**
+ * Provides information about a protected attribute
+ * @author Oliver Grande
+ *
+ */
+public interface JPAProtectionInfo {
+ /**
+ * The protected attribute
+ * @return
+ */
+ public JPAAttribute getAttribute();
+
+ /**
+ * Path within the entity type to the attribute
+ * @return
+ */
+ public JPAPath getPath();
+
+ /**
+ * Claim names that shall be used to protect this attribute
+ * @return
+ */
+ public String getClaimName();
+
+ /**
+ * Returns the maintained wildcard setting.
+ * @return
+ */
+ public boolean supportsWildcards();
+}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAServiceDocument.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAServiceDocument.java
index d9c461427..7730e12e2 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAServiceDocument.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAServiceDocument.java
@@ -4,6 +4,7 @@
import org.apache.olingo.commons.api.edm.EdmAction;
import org.apache.olingo.commons.api.edm.EdmComplexType;
+import org.apache.olingo.commons.api.edm.EdmEnumType;
import org.apache.olingo.commons.api.edm.EdmFunction;
import org.apache.olingo.commons.api.edm.EdmType;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
@@ -29,22 +30,29 @@ public interface JPAServiceDocument extends CustomETagSupport {
* @return
* @throws ODataJPAModelException
*/
- JPAEntityType getEntity(EdmType edmType) throws ODataJPAModelException;
+ JPAEntityType getEntity(final EdmType edmType) throws ODataJPAModelException;
- JPAEntityType getEntity(FullQualifiedName typeName);
+ JPAEntityType getEntity(final FullQualifiedName typeName);
- JPAEntityType getEntity(String edmEntitySetName) throws ODataJPAModelException;
+ JPAEntityType getEntity(final String edmEntitySetName) throws ODataJPAModelException;
- JPAFunction getFunction(EdmFunction function);
+ JPAEntityType getEntity(Class> entityClass) throws ODataJPAModelException;
- JPAAction getAction(EdmAction action);
+ JPAFunction getFunction(final EdmFunction function);
- JPAEntitySet getEntitySet(JPAEntityType entityType) throws ODataJPAModelException;
+ JPAAction getAction(final EdmAction action);
+
+ JPAEntitySet getEntitySet(final JPAEntityType entityType) throws ODataJPAModelException;
List getReferences();
- CsdlTerm getTerm(FullQualifiedName termName);
+ CsdlTerm getTerm(final FullQualifiedName termName);
+
+ JPAStructuredType getComplexType(final EdmComplexType edmComplexType);
+
+ JPAEnumerationAttribute getEnumType(final EdmEnumType type);
- JPAStructuredType getComplexType(EdmComplexType edmComplexType);
+ JPAEnumerationAttribute getEnumType(final String fqnAsString);
+ JPAEdmNameBuilder getNameBuilder();
}
\ No newline at end of file
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAStructuredType.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAStructuredType.java
index 213d0e266..56263c702 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAStructuredType.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/api/JPAStructuredType.java
@@ -1,6 +1,11 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.api;
import java.util.List;
+import java.util.Optional;
+
+import javax.annotation.Nonnull;
+
+import org.apache.olingo.server.api.uri.UriResourceProperty;
import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
@@ -11,35 +16,110 @@
*
*/
public interface JPAStructuredType extends JPAElement {
+ public JPAAssociationAttribute getAssociation(@Nonnull final String internalName) throws ODataJPAModelException;
+
+ /**
+ * Searches for an AssociationPath defined by the name used in the OData metadata in all the navigation properties
+ * that are available for this type via the OData service. That is:
+ *
+ * All not ignored navigation properties of this type.
+ * All not ignored navigation properties from super types.
+ * All not ignored navigation properties from embedded types.
+ *
+ * @param externalName
+ * @return
+ * @throws ODataJPAModelException
+ */
+ public JPAAssociationPath getAssociationPath(@Nonnull final String externalName) throws ODataJPAModelException;
+
/**
* Searches in the navigation properties that are available for this type via the OData service. That is:
*
* All not ignored navigation properties of this type.
- * All not ignored navigation properties from supertypes are included
- * All not ignored navigation properties from embedded types are included.
+ * All not ignored navigation properties from super types.
+ * All not ignored navigation properties from embedded types.
*
* @return null if no navigation property found.
* @throws ODataJPAModelException
*/
public List getAssociationPathList() throws ODataJPAModelException;
- public JPAAssociationAttribute getAssociation(String internalName) throws ODataJPAModelException;
+ public Optional getAttribute(@Nonnull final String internalName) throws ODataJPAModelException;
- public JPAAssociationPath getAssociationPath(String externalName) throws ODataJPAModelException;
+ public Optional getAttribute(@Nonnull final UriResourceProperty uriResourceItem)
+ throws ODataJPAModelException;
- public JPAAssociationPath getDeclaredAssociation(String externalName) throws ODataJPAModelException;
+ @Nonnull
+ public List getAttributes() throws ODataJPAModelException;
- public JPAAttribute getAttribute(String internalName) throws ODataJPAModelException;
+ /**
+ * List of the path to all collection properties of this type. That is:
+ *
+ * All not ignored collection properties of this type.
+ * All not ignored collection properties from super types.
+ * All not ignored collection properties from embedded types.
+ *
+ * @return
+ * @throws ODataJPAModelException
+ */
+ @Nonnull
+ public List getCollectionAttributesPath() throws ODataJPAModelException;
- public List getAttributes() throws ODataJPAModelException;
+ /**
+ * List of all associations that are declared at this type. That is:
+ *
+ * All navigation properties of this type.
+ * All navigation properties from super types.
+ *
+ * @return
+ * @throws ODataJPAModelException
+ */
+ @Nonnull
+ public List getDeclaredAssociations() throws ODataJPAModelException;
+
+ /**
+ * List of all attributes that are declared at this type. That is:
+ *
+ * All properties of this type.
+ * All properties from super types.
+ *
+ * @return
+ * @throws ODataJPAModelException
+ */
+ @Nonnull
+ public List getDeclaredAttributes() throws ODataJPAModelException;
+
+ public Optional getDeclaredAttribute(@Nonnull final String internalName) throws ODataJPAModelException;
- public JPAPath getPath(String externalName) throws ODataJPAModelException;
+ /**
+ * List of all collection attributes that are declared at this type. That is:
+ *
+ * All collection properties of this type.
+ * All collection properties from super types.
+ *
+ * @return
+ * @throws ODataJPAModelException
+ */
+ public List getDeclaredCollectionAttributes() throws ODataJPAModelException;
+
+ /**
+ * List of all associations that are declared at this type. That is:
+ *
+ * All not ignored collection properties of this type.
+ * All not ignored collection properties from super types.
+ *
+ * @return
+ * @throws ODataJPAModelException
+ */
+ public JPAPath getPath(final String externalName) throws ODataJPAModelException;
+
+ public JPAPath getPath(final String externalName, final boolean respectIgnore) throws ODataJPAModelException;
/**
* List of all attributes that are available for this type via the OData service. That is:
*
* All not ignored properties of the type.
- * All not ignored properties from supertypes.
+ * All not ignored properties from super types.
* All not ignored properties from embedded types.
*
* @return List of all attributes that are available via the OData service.
@@ -47,18 +127,19 @@ public interface JPAStructuredType extends JPAElement {
*/
public List getPathList() throws ODataJPAModelException;
- public Class> getTypeClass();
-
/**
- * In case the type is within the given association path, the sub-path is returned.
- * E.g. structured type is AdministrativeInformation and associationPath = AdministrativeInformation/Created/User
- * Created/User is returned.
- * @param associationPath
+ * List of all protected Attributes including protection/claim information. That is:
+ *
+ * All not ignored protected properties of the type.
+ * All not ignored protected properties from super types.
+ * All not ignored protected properties from embedded types.
+ *
* @return
* @throws ODataJPAModelException
*/
- public JPAAssociationPath getDeclaredAssociation(JPAAssociationPath associationPath) throws ODataJPAModelException;
+ public List getProtections() throws ODataJPAModelException;
- public boolean isAbstract();
+ public Class> getTypeClass();
+ public boolean isAbstract();
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/exception/ODataJPAModelException.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/exception/ODataJPAModelException.java
index f01780143..ce55cbadd 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/exception/ODataJPAModelException.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/exception/ODataJPAModelException.java
@@ -10,31 +10,21 @@ public class ODataJPAModelException extends ODataJPAException {
*/
private static final long serialVersionUID = -7188499882306858747L;
- public static enum MessageKeys implements ODataJPAMessageKey {
- INVALID_ENTITY_TYPE,
- INVALID_COMPLEX_TYPE,
- INVALID_ASSOCIATION,
- INVALID_ENTITY_SET,
- INVALID_ENTITY_CONTAINER,
- INVALID_ASSOCIATION_SET,
- INVALID_FUNC_IMPORT,
+ public enum MessageKeys implements ODataJPAMessageKey {
+
INVALID_DESCIPTION_PROPERTY,
+ INVALID_COLLECTION_TYPE,
- BUILDER_NULL,
TYPE_NOT_SUPPORTED,
- FUNC_ENTITY_SET_EXP,
FUNC_RETURN_TYPE_EXP,
- FUNC_RETURN_TYPE_ENTITY_NOT_FOUND,
FUNC_RETURN_TYPE_UNKNOWN,
FUNC_RETURN_TYPE_INVALID,
- GENERAL,
- INNER_EXCEPTION,
- FUNC_PARAM_NAME_EXP,
+ FUNC_RETURN_NOT_SUPPORTED,
FUNC_PARAM_ANNOTATION_MISSING,
- FUNC_PARAM_OUT_WRONG_TYPE,
- FUNC_PARAM_OUT_MISSING,
- FUNC_PARAM_OUT_TO_MANY,
+
FUNC_PARAM_ONLY_PRIMITIVE,
+ FUNC_PARAM_BOUND_IGNORE,
+ FUNC_CONV_ERROR,
FUNC_CONSTRUCTOR_MISSING,
ACTION_RETURN_TYPE_INVALID,
ACTION_RETURN_TYPE_EXP,
@@ -43,13 +33,21 @@ public static enum MessageKeys implements ODataJPAMessageKey {
ACTION_PARAM_TYPE_INVALID,
ACTION_PARAM_BINGING_NOT_FOUND,
ACTION_UNBOUND_ENTITY_SET,
+ ENUMERATION_ANNOTATION_MISSING,
+ ENUMERATION_UNSUPPORTED_TYPE,
+ ENUMERATION_NO_NEGATIVE_VALUE,
- REF_ATTRIBUTE_NOT_FOUND,
TYPE_MAPPER_COULD_NOT_INSANTIATE,
- NOT_SUPPORTED_EMBEDDED_KEY,
NOT_SUPPORTED_ATTRIBUTE_TYPE,
NOT_SUPPORTED_NO_IMPLICIT_COLUMNS,
+ NOT_SUPPORTED_NO_IMPLICIT_COLUMNS_COMPEX,
NOT_SUPPORTED_EMBEDDED_STREAM,
+ NOT_SUPPORTED_PROTECTED_COLLECTION,
+ NOT_SUPPORTED_PROTECTED_NAVIGATION,
+ NOT_SUPPORTED_NAVIGATION_PART_OF_GROUP,
+ NOT_SUPPORTED_MANDATORY_PART_OF_GROUP,
+ NOT_SUPPORTED_KEY_PART_OF_GROUP,
+ NOT_SUPPORTED_MIXED_PART_OF_GROUP,
DESCRIPTION_LOCALE_FIELD_MISSING,
DESCRIPTION_ANNOTATION_MISSING,
@@ -57,7 +55,13 @@ public static enum MessageKeys implements ODataJPAMessageKey {
PROPERTY_DEFAULT_ERROR,
PROPERTY_MISSING_PRECISION,
+ PROPERTY_REQUIRED_UNKNOWN,
+ COMPLEX_PROPERTY_MISSING_PROTECTION_PATH,
+ COMPLEX_PROPERTY_WRONG_PROTECTION_PATH,
REFERENCED_PROPERTY_NOT_FOUND,
+ TRANSIENT_CALCULATOR_TOO_MANY_CONSTRUCTORS,
+ TRANSIENT_CALCULATOR_WRONG_PARAMETER,
+ TRANSIENT_KEY_NOT_SUPPORTED,
INHERITANCE_NOT_ALLOWED,
TO_MANY_STREAMS,
ANNOTATION_STREAM_INCOMPLETE,
@@ -66,7 +70,8 @@ public static enum MessageKeys implements ODataJPAMessageKey {
NAVI_PROPERTY_NOT_FOUND,
ON_LEFT_ATTRIBUTE_NULL,
ON_RIGHT_ATTRIBUTE_NULL,
- PATH_ELEMENT_NOT_FOUND;
+ PATH_ELEMENT_NOT_FOUND,
+ FILE_NOT_FOUND;
@Override
public String getKey() {
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/extention/IntermediateModelItemAccess.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/extention/IntermediateModelItemAccess.java
index 2f140c384..62d4019ee 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/extention/IntermediateModelItemAccess.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/extention/IntermediateModelItemAccess.java
@@ -2,8 +2,15 @@
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAElement;
+/**
+ * @author Oliver Grande
+ *
+ */
public interface IntermediateModelItemAccess extends JPAElement {
-
+ /**
+ * Element shall be ignored for metadata generation.
+ * @return
+ */
boolean ignore();
/**
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/extention/IntermediateNavigationPropertyAccess.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/extention/IntermediateNavigationPropertyAccess.java
index 0e23fb9a7..51a8b6fed 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/extention/IntermediateNavigationPropertyAccess.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/extention/IntermediateNavigationPropertyAccess.java
@@ -9,8 +9,9 @@ public interface IntermediateNavigationPropertyAccess extends IntermediateModelI
public void setOnDelete(CsdlOnDelete onDelete);
/**
- * Enables to add annotations to a property, e.g. because the type of annotation is not enabled via
- * {@link com.sap.olingo.jpa.metadata.core.edm.annotation.EdmAnnotation EdmAnnotation} or should be during runtime
+ * Enables to add annotations to a navigation property, e.g. because the type of annotation is not enabled via
+ * {@link com.sap.olingo.jpa.metadata.core.edm.annotation.EdmAnnotation EdmAnnotation} or should be changed during
+ * runtime
* @param annotations
*/
public void addAnnotations(final List annotations);
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/extention/IntermediatePropertyAccess.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/extention/IntermediatePropertyAccess.java
index 5725928ce..888815efb 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/extention/IntermediatePropertyAccess.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/extention/IntermediatePropertyAccess.java
@@ -4,13 +4,22 @@
import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
+/**
+ * Override generated metadata for a property.
+ * @author Oliver Grande
+ *
+ */
public interface IntermediatePropertyAccess extends IntermediateModelItemAccess {
public boolean isEtag();
/**
* Enables to add annotations to a property, e.g. because the type of annotation is not enabled via
- * {@link com.sap.olingo.jpa.metadata.core.edm.annotation.EdmAnnotation EdmAnnotation} or should be during runtime
+ * {@link com.sap.olingo.jpa.metadata.core.edm.annotation.EdmAnnotation EdmAnnotation} or should changed be during
+ * runtime
* @param annotations
*/
public void addAnnotations(final List annotations);
+
+ public boolean hasProtection();
+
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/DefaultEdmPostProcessor.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/DefaultEdmPostProcessor.java
index 654fd36ac..d090b25cf 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/DefaultEdmPostProcessor.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/DefaultEdmPostProcessor.java
@@ -1,22 +1,31 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.impl;
+import com.sap.olingo.jpa.metadata.api.JPAEdmMetadataPostProcessor;
import com.sap.olingo.jpa.metadata.core.edm.mapper.extention.IntermediateEntityTypeAccess;
import com.sap.olingo.jpa.metadata.core.edm.mapper.extention.IntermediateNavigationPropertyAccess;
import com.sap.olingo.jpa.metadata.core.edm.mapper.extention.IntermediatePropertyAccess;
import com.sap.olingo.jpa.metadata.core.edm.mapper.extention.IntermediateReferenceList;
-final class DefaultEdmPostProcessor extends com.sap.olingo.jpa.metadata.api.JPAEdmMetadataPostProcessor {
+final class DefaultEdmPostProcessor extends JPAEdmMetadataPostProcessor {
@Override
public void processNavigationProperty(final IntermediateNavigationPropertyAccess property,
- final String jpaManagedTypeClassName) {}
+ final String jpaManagedTypeClassName) {
+ // Default shall do nothing
+ }
@Override
- public void processProperty(final IntermediatePropertyAccess property, final String jpaManagedTypeClassName) {}
+ public void processProperty(final IntermediatePropertyAccess property, final String jpaManagedTypeClassName) {
+ // Default shall do nothing
+ }
@Override
- public void provideReferences(IntermediateReferenceList references) {}
+ public void provideReferences(IntermediateReferenceList references) {
+ // Default shall do nothing
+ }
@Override
- public void processEntityType(IntermediateEntityTypeAccess entity) {}
+ public void processEntityType(IntermediateEntityTypeAccess entity) {
+ // Default shall do nothing
+ }
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediatOperationResultParameter.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediatOperationResultParameter.java
index 18259345e..c39bcd01b 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediatOperationResultParameter.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediatOperationResultParameter.java
@@ -16,14 +16,8 @@ class IntermediatOperationResultParameter implements JPAOperationResultParameter
private final Class> type;
private final boolean isCollection;
- public IntermediatOperationResultParameter(JPAOperation jpaOperation, final ReturnType jpaReturnType) {
- this.jpaOperation = jpaOperation;
- this.jpaReturnType = jpaReturnType;
- this.type = jpaReturnType.type();
- this.isCollection = jpaReturnType.isCollection();
- }
-
- public IntermediatOperationResultParameter(JPAOperation jpaOperation, ReturnType jpaReturnType, Class> returnType,
+ public IntermediatOperationResultParameter(final JPAOperation jpaOperation, final ReturnType jpaReturnType,
+ final Class> returnType,
boolean isCollection) {
this.jpaOperation = jpaOperation;
this.jpaReturnType = jpaReturnType;
@@ -34,6 +28,14 @@ public IntermediatOperationResultParameter(JPAOperation jpaOperation, ReturnType
this.type = returnType;
}
+ public IntermediatOperationResultParameter(final JPAOperation jpaOperation, final ReturnType jpaReturnType,
+ final Class> returnType) {
+ this.jpaOperation = jpaOperation;
+ this.jpaReturnType = jpaReturnType;
+ this.isCollection = jpaReturnType.isCollection();
+ this.type = returnType;
+ }
+
@Override
public Class> getType() {
return type;
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateActionFactory.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateActionFactory.java
index cef3c5617..288e891dc 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateActionFactory.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateActionFactory.java
@@ -6,6 +6,7 @@
import org.reflections.Reflections;
import com.sap.olingo.jpa.metadata.core.edm.annotation.EdmAction;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAEdmNameBuilder;
import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
import com.sap.olingo.jpa.metadata.core.edm.mapper.extention.ODataAction;
@@ -18,10 +19,10 @@ IntermediateOperation createOperation(JPAEdmNameBuilder nameBuilder, Intermediat
}
@SuppressWarnings("unchecked")
- Map extends String, ? extends IntermediateJavaAction> create(final JPAEdmNameBuilder nameBuilder,
+ Map create(final JPAEdmNameBuilder nameBuilder,
final Reflections reflections, final IntermediateSchema schema) throws ODataJPAModelException {
- return (Map extends String, ? extends IntermediateJavaAction>) createOperationMap(nameBuilder, reflections,
+ return (Map) createOperationMap(nameBuilder, reflections,
schema, ODataAction.class, EdmAction.class);
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateCollectionProperty.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateCollectionProperty.java
new file mode 100644
index 000000000..82283dddd
--- /dev/null
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateCollectionProperty.java
@@ -0,0 +1,341 @@
+package com.sap.olingo.jpa.metadata.core.edm.mapper.impl;
+
+import static com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException.MessageKeys.NOT_SUPPORTED_NO_IMPLICIT_COLUMNS;
+import static com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException.MessageKeys.NOT_SUPPORTED_NO_IMPLICIT_COLUMNS_COMPEX;
+import static com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException.MessageKeys.NOT_SUPPORTED_PROTECTED_COLLECTION;
+import static javax.persistence.metamodel.Type.PersistenceType.EMBEDDABLE;
+
+import java.lang.reflect.AnnotatedElement;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CollectionTable;
+import javax.persistence.JoinColumn;
+import javax.persistence.metamodel.PluralAttribute;
+import javax.persistence.metamodel.Type;
+import javax.persistence.metamodel.Type.PersistenceType;
+
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+
+import com.sap.olingo.jpa.metadata.api.JPAJoinColumn;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAAssociationAttribute;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAAssociationPath;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAAttribute;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPACollectionAttribute;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAEdmNameBuilder;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAElement;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAEntityType;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAJoinTable;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAOnConditionItem;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAPath;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAStructuredType;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException.MessageKeys;
+
+/**
+ * Represents a collection property. That is a property that may occur more than once.
+ * For details about Complex Type metadata see:
+ * OData Version 4.0 Part 3 - 9 Complex Type
+ * @author Oliver Grande
+ *
+ */
+
+class IntermediateCollectionProperty extends IntermediateProperty implements JPACollectionAttribute,
+ JPAAssociationAttribute {
+ private final IntermediateStructuredType sourceType;
+ private JPAJoinTable joinTable; // lazy builded
+ private JPAAssociationPathImpl associationPath; // lazy builded
+ private final JPAPath path;
+
+ /**
+ * Copy with in new context
+ * @param jpaElement
+ * @param intermediateStructuredType
+ * @throws ODataJPAModelException
+ */
+ public IntermediateCollectionProperty(final IntermediateCollectionProperty original,
+ final IntermediateStructuredType parent, final IntermediateProperty pathRoot) throws ODataJPAModelException {
+
+ super(original.nameBuilder, original.jpaAttribute, original.schema);
+ this.sourceType = parent;
+
+ final List newPath = new ArrayList<>();
+ newPath.add(pathRoot);
+ if (original.path != null) {
+ newPath.addAll(original.path.getPath());
+ this.path = new JPAPathImpl(pathRoot.getExternalName() + JPAPath.PATH_SEPERATOR + original.path.getAlias(), "",
+ newPath);
+ } else {
+ newPath.add(this);
+ this.path = new JPAPathImpl(pathRoot.getExternalName() + JPAPath.PATH_SEPERATOR + original.getExternalName(), "",
+ newPath);
+ }
+ }
+
+ IntermediateCollectionProperty(final JPAEdmNameBuilder nameBuilder,
+ final PluralAttribute, ?, ?> jpaAttribute, final IntermediateSchema schema,
+ final IntermediateStructuredType parent) throws ODataJPAModelException {
+
+ super(nameBuilder, jpaAttribute, schema);
+ this.sourceType = parent;
+ this.path = null;
+ }
+
+ @Override
+ public JPAAssociationPath asAssociation() throws ODataJPAModelException {
+ if (this.associationPath == null) {
+ final IntermediateCollectionTable joinTable = (IntermediateCollectionTable) getJoinTable();
+ this.associationPath = new JPAAssociationPathImpl(this, sourceType,
+ path == null ? sourceType.getPath(getExternalName()) : path,
+ joinTable == null ? null : joinTable.getLeftJoinColumns());
+ }
+ return associationPath;
+
+ }
+
+ @Override
+ public JPAAssociationAttribute getPartner() {
+ return null;
+ }
+
+ @Override
+ public JPAAssociationPath getPath() throws ODataJPAModelException {
+ return asAssociation();
+ }
+
+ @Override
+ public JPAAttribute getTargetAttribute() throws ODataJPAModelException {
+ if (isComplex())
+ return null;
+ else {
+ for (JPAAttribute a : ((IntermediateStructuredType) joinTable.getEntityType()).getAttributes()) {
+ if (dbFieldName.equals(((IntermediateProperty) a).getDBFieldName()))
+ return a;
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public JPAStructuredType getTargetEntity() throws ODataJPAModelException {
+ return getJoinTable().getEntityType();
+ }
+
+ @Override
+ public boolean isAssociation() {
+ return false;
+ }
+
+ @Override
+ public boolean isCollection() {
+ return true;
+ }
+
+ @Override
+ public boolean isComplex() {
+ return getRowType().getPersistenceType() == EMBEDDABLE;
+ }
+
+ @Override
+ public boolean isEtag() {
+ return false;
+ }
+
+ @Override
+ public boolean isKey() {
+ return false;
+ }
+
+ @Override
+ public boolean isSearchable() {
+ return false;
+ }
+
+ @Override
+ protected synchronized void lazyBuildEdmItem() throws ODataJPAModelException {
+ super.lazyBuildEdmItem();
+ if (isComplex()
+ && schema.getComplexType(this.edmProperty.getTypeAsFQNObject().getName()) == null)
+ // Base type of collection '%1$s' of structured type '%2$s' not found
+ throw new ODataJPAModelException(MessageKeys.INVALID_COLLECTION_TYPE, getInternalName(), sourceType
+ .getInternalName());
+ edmProperty.setCollection(true);
+ }
+
+ @Override
+ void checkConsistancy() throws ODataJPAModelException {
+ // Collection Properties do not support EdmProtectedBy
+ if (hasProtection() ||
+ (isComplex() && !getStructuredType().getProtections().isEmpty())) {
+ throw new ODataJPAModelException(NOT_SUPPORTED_PROTECTED_COLLECTION, this.managedType.getJavaType()
+ .getCanonicalName(), this.internalName);
+ }
+ }
+
+ @Override
+ Class> determineEntityType() {
+ return getRowType().getJavaType();
+ }
+
+ @Override
+ void determineIsVersion() {
+ isVersion = false; // Version is always false
+ }
+
+ @Override
+ void determineStreamInfo() throws ODataJPAModelException {
+ // Stream properties not supported
+ }
+
+ @Override
+ void determineStructuredType() {
+ if (getRowType().getPersistenceType() == PersistenceType.EMBEDDABLE)
+ type = schema.getStructuredType((PluralAttribute, ?, ?>) jpaAttribute);
+ else
+ type = null;
+ }
+
+ @Override
+ FullQualifiedName determineType() throws ODataJPAModelException {
+ return determineTypeByPersistanceType(getRowType().getPersistenceType());
+ }
+
+ @Override
+ String getDeafultValue() throws ODataJPAModelException {
+ // No defaults for collection properties
+ return null;
+ }
+
+ JPAJoinTable getJoinTable() throws ODataJPAModelException {
+ if (joinTable == null) {
+ final javax.persistence.CollectionTable jpaJoinTable = ((AnnotatedElement) this.jpaAttribute.getJavaMember())
+ .getAnnotation(javax.persistence.CollectionTable.class);
+ joinTable = jpaJoinTable != null ? new IntermediateCollectionTable(jpaJoinTable, schema) : null;
+ }
+ return joinTable;
+ }
+
+ IntermediateStructuredType getSourceType() {
+ return sourceType;
+ }
+
+ @Override
+ boolean isStream() {
+ // OData Version 4.0. Part 3: Common Schema Definition Language (CSDL) Plus Errata 03:
+ // Edm.Stream, or a type definition whose underlying type is Edm.Stream, cannot be used in collections or for
+ // non-binding parameters to functions or actions.
+ return false;
+ }
+
+ private Type> getRowType() {
+ return ((PluralAttribute, ?, ?>) jpaAttribute).getElementType();
+ }
+
+ private class IntermediateCollectionTable implements JPAJoinTable {
+ private final CollectionTable jpaJoinTable;
+ private List joinColumns;
+ private final JPAEntityType jpaEntityType;
+
+ public IntermediateCollectionTable(final CollectionTable jpaJoinTable, final IntermediateSchema schema)
+ throws ODataJPAModelException {
+ super();
+ this.jpaJoinTable = jpaJoinTable;
+ this.jpaEntityType = schema.getEntityType(jpaJoinTable.catalog(), jpaJoinTable.schema(), jpaJoinTable.name());
+ this.joinColumns = buildJoinColumns(sourceType);
+ }
+
+ @Override
+ public String getAlias(String dbFieldName) {
+ for (IntermediateJoinColumn column : joinColumns) {
+ if (column.getName().equals(dbFieldName))
+ return column.getReferencedColumnName();
+ }
+ return null;
+ }
+
+ @Override
+ public JPAEntityType getEntityType() {
+ return jpaEntityType;
+ }
+
+ @Override
+ public String getInverseAlias(String dbFieldName) {
+ return null;
+ }
+
+ @Override
+ public List getInversJoinColumns() throws ODataJPAModelException {
+ final List result = new ArrayList<>();
+
+ for (IntermediateJoinColumn column : joinColumns) {
+ result.add(new JPAOnConditionItemImpl(
+ ((IntermediateEntityType) jpaEntityType).getPathByDBField(column.getReferencedColumnName()),
+ sourceType.getPathByDBField(column.getName())));
+ }
+ return result;
+ }
+
+ @Override
+ public List getJoinColumns() throws ODataJPAModelException {
+ assert jpaEntityType != null;
+ final List result = new ArrayList<>();
+ for (IntermediateJoinColumn column : joinColumns) {
+ result.add(new JPAOnConditionItemImpl(
+ sourceType.getPathByDBField(column.getName()),
+ ((IntermediateEntityType) jpaEntityType).getPathByDBField(column.getReferencedColumnName())));
+ }
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List getRawInversJoinInformation() throws ODataJPAModelException {
+ final List inversColumns = new ArrayList<>(joinColumns.size());
+ for (final IntermediateJoinColumn column : joinColumns) {
+ final IntermediateJoinColumn inversColumn = new IntermediateJoinColumn(column.getReferencedColumnName(), column
+ .getName());
+ inversColumns.add((T) inversColumn);
+ }
+ return inversColumns;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List getRawJoinInformation() {
+ return (List) joinColumns;
+ }
+
+ @Override
+ public String getTableName() {
+ return buildFQTableName(jpaJoinTable.schema(), jpaJoinTable.name());
+ }
+
+ List getLeftJoinColumns() throws ODataJPAModelException {
+ return buildJoinColumns(sourceType);
+ }
+
+ private List buildJoinColumns(final IntermediateStructuredType contextType)
+ throws ODataJPAModelException {
+
+ final List result = new ArrayList<>();
+ for (JoinColumn column : jpaJoinTable.joinColumns()) {
+ if (column.referencedColumnName() == null || column.referencedColumnName().isEmpty()) {
+ if (jpaJoinTable.joinColumns().length > 1)
+ throw new ODataJPAModelException(NOT_SUPPORTED_NO_IMPLICIT_COLUMNS, getInternalName());
+ else if (!(contextType instanceof IntermediateEntityType))
+ throw new ODataJPAModelException(NOT_SUPPORTED_NO_IMPLICIT_COLUMNS_COMPEX, contextType.getInternalName());
+ else {
+ result.add(new IntermediateJoinColumn(
+ ((IntermediateProperty) ((IntermediateEntityType) contextType).getKey().get(0))
+ .getDBFieldName(), column.name()));
+ }
+ } else {
+ result.add(new IntermediateJoinColumn(column.referencedColumnName(), column.name()));
+ }
+ }
+ return result;
+ }
+ }
+}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateComplexType.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateComplexType.java
index 7738c9bbf..65fc4a27f 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateComplexType.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateComplexType.java
@@ -8,6 +8,7 @@
import org.apache.olingo.commons.api.edm.provider.CsdlNavigationProperty;
import org.apache.olingo.commons.api.edm.provider.CsdlProperty;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAEdmNameBuilder;
import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
/**
@@ -27,10 +28,10 @@
*
*/
final class IntermediateComplexType extends IntermediateStructuredType {
- private CsdlComplexType edmComplexType;
+ // private CsdlComplexType edmComplexType;
IntermediateComplexType(final JPAEdmNameBuilder nameBuilder, final EmbeddableType> jpaEmbeddable,
- final IntermediateSchema schema) throws ODataJPAModelException {
+ final IntermediateSchema schema) {
super(nameBuilder, jpaEmbeddable, schema);
this.setExternalName(nameBuilder.buildComplexTypeName(jpaEmbeddable));
@@ -39,17 +40,18 @@ final class IntermediateComplexType extends IntermediateStructuredType {
@SuppressWarnings("unchecked")
@Override
- protected void lazyBuildEdmItem() throws ODataJPAModelException {
- if (edmComplexType == null) {
+ protected synchronized void lazyBuildEdmItem() throws ODataJPAModelException {
+ if (edmStructuralType == null) {
buildPropertyList();
buildNaviPropertyList();
- edmComplexType = new CsdlComplexType();
+ addTransientProperties();
+ edmStructuralType = new CsdlComplexType();
- edmComplexType.setName(this.getExternalName());
- edmComplexType.setProperties((List) extractEdmModelElements(declaredPropertiesList));
- edmComplexType.setNavigationProperties((List) extractEdmModelElements(
+ edmStructuralType.setName(this.getExternalName());
+ edmStructuralType.setProperties((List) extractEdmModelElements(declaredPropertiesList));
+ edmStructuralType.setNavigationProperties((List) extractEdmModelElements(
declaredNaviPropertiesList));
- edmComplexType.setBaseType(determineBaseType());
+ edmStructuralType.setBaseType(determineBaseType());
// TODO Abstract
// edmComplexType.setAbstract(isAbstract)
// TODO OpenType
@@ -63,8 +65,10 @@ protected void lazyBuildEdmItem() throws ODataJPAModelException {
@Override
CsdlComplexType getEdmItem() throws ODataJPAModelException {
- lazyBuildEdmItem();
- return edmComplexType;
+ if (edmStructuralType == null) {
+ lazyBuildEdmItem();
+ }
+ return (CsdlComplexType) edmStructuralType;
}
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateDataBaseFunction.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateDataBaseFunction.java
index 09723555e..ef66694eb 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateDataBaseFunction.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateDataBaseFunction.java
@@ -14,6 +14,7 @@
import com.sap.olingo.jpa.metadata.core.edm.annotation.EdmFunctionType;
import com.sap.olingo.jpa.metadata.core.edm.annotation.EdmParameter;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPADataBaseFunction;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAEdmNameBuilder;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAOperationResultParameter;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAParameter;
import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
@@ -22,8 +23,9 @@
class IntermediateDataBaseFunction extends IntermediateFunction implements JPADataBaseFunction {
private final Class> jpaDefiningPOJO;
- IntermediateDataBaseFunction(JPAEdmNameBuilder nameBuilder, EdmFunction jpaFunction, Class> definingPOJO,
- IntermediateSchema schema) throws ODataJPAModelException {
+ IntermediateDataBaseFunction(final JPAEdmNameBuilder nameBuilder, final EdmFunction jpaFunction,
+ final Class> definingPOJO, final IntermediateSchema schema) {
+
super(nameBuilder, jpaFunction, schema, IntNameBuilder.buildFunctionName(jpaFunction));
this.setExternalName(jpaFunction.name());
this.jpaDefiningPOJO = definingPOJO;
@@ -41,7 +43,7 @@ public EdmFunctionType getFunctionType() {
@Override
public List getParameter() {
- final List parameterList = new ArrayList();
+ final List parameterList = new ArrayList<>();
for (final EdmParameter jpaParameter : jpaFunction.parameter()) {
parameterList.add(new IntermediatFunctionParameter(jpaParameter));
}
@@ -51,7 +53,7 @@ public List getParameter() {
@Override
public JPAParameter getParameter(String internalName) {
for (JPAParameter parameter : getParameter()) {
- if (parameter.getInternalName() == internalName)
+ if (parameter.getInternalName().equals(internalName))
return parameter;
}
return null;
@@ -59,7 +61,9 @@ public JPAParameter getParameter(String internalName) {
@Override
public JPAOperationResultParameter getResultParameter() {
- return new IntermediatOperationResultParameter(this, jpaFunction.returnType());
+ return new IntermediatOperationResultParameter(this, jpaFunction.returnType(),
+ jpaFunction.returnType().type().equals(Object.class) ? schema.getEntityType(jpaDefiningPOJO).getTypeClass()
+ : jpaFunction.returnType().type());
}
@Override
@@ -69,14 +73,23 @@ public CsdlReturnType getReturnType() {
@Override
protected List determineEdmInputParameter() throws ODataJPAModelException {
-
- final List edmInputParameterList = new ArrayList();
- for (final EdmParameter jpaParameter : jpaFunction.parameter()) {
+ int noParameterToSkip = 0;
+ final List edmInputParameterList = new ArrayList<>();
+ if (jpaFunction.isBound()) {
+ noParameterToSkip = ((IntermediateEntityType) schema.getEntityType(this.jpaDefiningPOJO)).getKey().size();
+ final CsdlParameter edmInputParameter = new CsdlParameter();
+ final IntermediateStructuredType et = schema.getEntityType(jpaDefiningPOJO);
+ edmInputParameter.setName("Key");
+ edmInputParameter.setType(buildFQN(et.getEdmItem().getName()));
+ edmInputParameter.setNullable(false);
+ edmInputParameterList.add(edmInputParameter);
+ }
+ for (int i = noParameterToSkip; i < jpaFunction.parameter().length; i++) {
+ final EdmParameter jpaParameter = jpaFunction.parameter()[i];
final CsdlParameter edmInputParameter = new CsdlParameter();
edmInputParameter.setName(jpaParameter.name());
- edmInputParameter.setType(JPATypeConvertor.convertToEdmSimpleType(jpaParameter.type()).getFullQualifiedName());
-
+ edmInputParameter.setType(determineParameterType(null, jpaParameter));
edmInputParameter.setNullable(false);
edmInputParameter.setCollection(jpaParameter.isCollection());
if (jpaParameter.maxLength() >= 0)
@@ -100,25 +113,7 @@ protected List determineEdmInputParameter() throws ODataJPAModelE
protected CsdlReturnType determineEdmResultType(final ReturnType returnType) throws ODataJPAModelException {
final CsdlReturnType edmResultType = new CsdlReturnType();
- FullQualifiedName fqn;
- if (returnType.type() == Object.class) {
- final IntermediateStructuredType et = schema.getEntityType(jpaDefiningPOJO);
- fqn = nameBuilder.buildFQN(et.getEdmItem().getName());
- this.setIgnore(et.ignore()); // If the result type shall be ignored, ignore also a function that returns it
- } else {
- final IntermediateStructuredType st = schema.getStructuredType(returnType.type());
- if (st != null) {
- fqn = nameBuilder.buildFQN(st.getEdmItem().getName());
- this.setIgnore(st.ignore()); // If the result type shall be ignored, ignore also a function that returns it
- } else {
- EdmPrimitiveTypeKind pt = JPATypeConvertor.convertToEdmSimpleType(returnType.type());
- if (pt != null)
- fqn = pt.getFullQualifiedName();
- else
- throw new ODataJPAModelException(MessageKeys.FUNC_RETURN_TYPE_UNKNOWN);
- }
- }
- edmResultType.setType(fqn);
+ edmResultType.setType(determineReturnType(returnType));
edmResultType.setCollection(returnType.isCollection());
edmResultType.setNullable(returnType.isNullable());
if (returnType.maxLength() >= 0)
@@ -134,4 +129,47 @@ protected CsdlReturnType determineEdmResultType(final ReturnType returnType) thr
}
return edmResultType;
}
+
+ @Override
+ protected FullQualifiedName determineParameterType(final Class> type, final EdmParameter definedParameter)
+ throws ODataJPAModelException {
+
+ final EdmPrimitiveTypeKind edmType = JPATypeConvertor.convertToEdmSimpleType(definedParameter.type());
+ if (edmType != null)
+ return edmType.getFullQualifiedName();
+ else {
+ final IntermediateEnumerationType enumType = schema.getEnumerationType(definedParameter.type());
+ if (enumType != null) {
+ return enumType.getExternalFQN();
+ } else {
+ throw new ODataJPAModelException(ODataJPAModelException.MessageKeys.FUNC_CONV_ERROR);
+ }
+ }
+ }
+
+ private FullQualifiedName determineReturnType(final ReturnType returnType) throws ODataJPAModelException {
+
+ if (returnType.type() == Object.class) {
+ final IntermediateStructuredType et = schema.getEntityType(jpaDefiningPOJO);
+ this.setIgnore(et.ignore()); // If the result type shall be ignored, ignore also a function that returns it
+ return buildFQN(et.getEdmItem().getName());
+ } else {
+ final IntermediateStructuredType st = schema.getStructuredType(returnType.type());
+ if (st != null) {
+ this.setIgnore(st.ignore()); // If the result type shall be ignored, ignore also a function that returns it
+ return buildFQN(st.getEdmItem().getName());
+ } else {
+ final IntermediateEnumerationType enumType = schema.getEnumerationType(returnType.type());
+ if (enumType != null) {
+ return enumType.getExternalFQN();
+ } else {
+ EdmPrimitiveTypeKind pt = JPATypeConvertor.convertToEdmSimpleType(returnType.type());
+ if (pt != null)
+ return pt.getFullQualifiedName();
+ else
+ throw new ODataJPAModelException(MessageKeys.FUNC_RETURN_TYPE_UNKNOWN);
+ }
+ }
+ }
+ }
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateDescriptionProperty.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateDescriptionProperty.java
index 180613f61..6c2361c1f 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateDescriptionProperty.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateDescriptionProperty.java
@@ -5,37 +5,85 @@
import java.lang.reflect.Member;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
import javax.persistence.metamodel.Attribute;
import com.sap.olingo.jpa.metadata.core.edm.annotation.EdmDescriptionAssoziation;
import com.sap.olingo.jpa.metadata.core.edm.annotation.EdmDescriptionAssoziation.valueAssignment;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAAssociationAttribute;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAAssociationPath;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAAttribute;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPADescriptionAttribute;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAEdmNameBuilder;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAElement;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAJoinTable;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAOnConditionItem;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAPath;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAStructuredType;
import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException.MessageKeys;
-final class IntermediateDescriptionProperty extends IntermediateProperty implements JPADescriptionAttribute {
- private IntermediateProperty descriptionProperty;
- private String languageAttribute;
+final class IntermediateDescriptionProperty extends IntermediateSimpleProperty implements JPADescriptionAttribute,
+ JPAAssociationAttribute {
+ private IntermediateSimpleProperty descriptionProperty;
private String localeAttribute;
+ private final IntermediateStructuredType sourceType;
private JPAStructuredType targetEntity;
private HashMap fixedValues;
private JPAPath localFieldPath;
+ private Optional assoziationPath;
IntermediateDescriptionProperty(final JPAEdmNameBuilder nameBuilder, final Attribute, ?> jpaAttribute,
- final IntermediateSchema schema) throws ODataJPAModelException {
+ final IntermediateStructuredType parent, final IntermediateSchema schema) throws ODataJPAModelException {
super(nameBuilder, jpaAttribute, schema);
+ this.sourceType = parent;
+ this.assoziationPath = Optional.empty();
}
@Override
- protected void lazyBuildEdmItem() throws ODataJPAModelException {
+ public JPAAttribute getDescriptionAttribute() {
+ return descriptionProperty;
+ }
+
+ @Override
+ public Map getFixedValueAssignment() {
+ return fixedValues;
+ }
+
+ @Override
+ public JPAPath getLocaleFieldName() {
+ return localFieldPath;
+ }
+
+ /**
+ * @return Type of description attribute
+ */
+ @Override
+ public Class> getType() {
+ return descriptionProperty.getType();
+ }
+
+ @Override
+ public boolean isAssociation() {
+ return true;
+ }
+
+ @Override
+ public boolean isLocationJoin() {
+ return !localeAttribute.isEmpty();
+ }
+
+ @Override
+ protected synchronized void lazyBuildEdmItem() throws ODataJPAModelException {
Member jpaMember = jpaAttribute.getJavaMember();
+ String languageAttribute;
if (this.edmProperty == null) {
super.lazyBuildEdmItem();
@@ -51,19 +99,18 @@ protected void lazyBuildEdmItem() throws ODataJPAModelException {
targetEntity = schema.getEntityType((Class>) jpaTargetEntityType.getActualTypeArguments()[0]);
else
targetEntity = schema.getEntityType(jpaAttribute.getJavaType());
- } else
+ } else {
targetEntity = schema.getEntityType(jpaAttribute.getJavaType());
-
- descriptionProperty = (IntermediateProperty) targetEntity.getAttribute(assozation
- .descriptionAttribute());
- if (descriptionProperty == null)
- // The attribute %2$s has not been found at entity %1$s
- throw new ODataJPAModelException(MessageKeys.INVALID_DESCIPTION_PROPERTY, targetEntity.getInternalName(),
- assozation.descriptionAttribute());
+ }
+ descriptionProperty = (IntermediateSimpleProperty) targetEntity.getAttribute(assozation
+ .descriptionAttribute()).orElseThrow(() ->
+ // The attribute %2$s has not been found at entity %1$s
+ new ODataJPAModelException(MessageKeys.INVALID_DESCIPTION_PROPERTY, targetEntity.getInternalName(),
+ assozation.descriptionAttribute()));
languageAttribute = assozation.languageAttribute();
localeAttribute = assozation.localeAttribute();
- if (languageAttribute.isEmpty() && localeAttribute.isEmpty() ||
+ if (emptyString(languageAttribute) && emptyString(localeAttribute) ||
!languageAttribute.isEmpty() && !localeAttribute.isEmpty())
throw new ODataJPAModelException(ODataJPAModelException.MessageKeys.DESCRIPTION_LOCALE_FIELD_MISSING,
targetEntity.getInternalName(), this.internalName);
@@ -77,74 +124,196 @@ protected void lazyBuildEdmItem() throws ODataJPAModelException {
fixedValues = convertFixedValues(assozation.valueAssignments());
localFieldPath = convertAttributeToPath(!languageAttribute.isEmpty() ? languageAttribute : localeAttribute);
- } else
+ } else {
throw new ODataJPAModelException(ODataJPAModelException.MessageKeys.DESCRIPTION_ANNOTATION_MISSING,
- targetEntity.getInternalName(), this.internalName);
+ sourceType.getInternalName(), this.internalName);
+ }
}
}
}
- @Override
- public boolean isAssociation() {
- return true;
+ private JPAPath convertAttributeToPath(final String attribute) throws ODataJPAModelException {
+ final String[] pathItems = attribute.split(JPAPath.PATH_SEPERATOR);
+ if (pathItems.length > 1) {
+ final List targetPath = new ArrayList<>();
+ IntermediateSimpleProperty nextHop = (IntermediateSimpleProperty) targetEntity.getAttribute(pathItems[0])
+ .orElseThrow(() -> new ODataJPAModelException(MessageKeys.PATH_ELEMENT_NOT_FOUND, pathItems[0], attribute));
+ targetPath.add(nextHop);
+ for (int i = 1; i < pathItems.length; i++) {
+ if (nextHop.isComplex()) {
+ nextHop = (IntermediateSimpleProperty) nextHop.getStructuredType().getAttribute(pathItems[i])
+ .orElseThrow(() -> new ODataJPAModelException(MessageKeys.PATH_ELEMENT_NOT_FOUND, pathItems[0],
+ attribute));
+ targetPath.add(nextHop);
+ }
+ }
+ return new JPAPathImpl(nextHop.getExternalName(), nextHop.getDBFieldName(), targetPath);
+ } else {
+ final IntermediateSimpleProperty p = (IntermediateSimpleProperty) targetEntity.getAttribute(attribute)
+ .orElseThrow(() -> new ODataJPAModelException(MessageKeys.PATH_ELEMENT_NOT_FOUND, pathItems[0], attribute));
+ return new JPAPathImpl(p.getExternalName(), p.getDBFieldName(), p);
+ }
}
- @Override
- public boolean isLocationJoin() {
- if (!localeAttribute.isEmpty())
- return true;
- return false;
+ private HashMap convertFixedValues(final valueAssignment[] valueAssignments)
+ throws ODataJPAModelException {
+ final HashMap result = new HashMap<>();
+ for (final EdmDescriptionAssoziation.valueAssignment value : valueAssignments) {
+ result.put(convertAttributeToPath(value.attribute()), value.value());
+ }
+ return result;
}
@Override
- public JPAAttribute getDescriptionAttribute() {
- return descriptionProperty;
+ public JPAAssociationAttribute asAssociationAttribute() {
+ return this;
}
@Override
- public JPAPath getLocaleFieldName() {
- return localFieldPath;
+ public JPAStructuredType getTargetEntity() throws ODataJPAModelException {
+ return targetEntity;
}
@Override
- public Class> getType() {
- return descriptionProperty.getType();
+ public JPAAssociationAttribute getPartner() {
+ return null;
}
@Override
- public HashMap getFixedValueAssignment() {
- return fixedValues;
+ public JPAAssociationPath getPath() throws ODataJPAModelException {
+ return assoziationPath.orElseGet(() -> {
+ assoziationPath = Optional.of(new AssoziationPath());
+ return assoziationPath.get();
+ });
}
- private HashMap convertFixedValues(final valueAssignment[] valueAssignments)
- throws ODataJPAModelException {
- final HashMap result = new HashMap();
- for (final EdmDescriptionAssoziation.valueAssignment value : valueAssignments) {
- result.put(convertAttributeToPath(value.attribute()), value.value());
+ private class AssoziationPath implements JPAAssociationPath {
+ private List joinColumns = null;
+
+ @Override
+ public String getAlias() {
+ return null;
}
- return result;
- }
- private JPAPath convertAttributeToPath(final String attribute) throws ODataJPAModelException {
- final String[] pathItems = attribute.split(JPAPath.PATH_SEPERATOR);
- if (pathItems.length > 1) {
- final List targetPath = new ArrayList();
- IntermediateProperty nextHop = (IntermediateProperty) targetEntity.getAttribute(pathItems[0]);
- if (nextHop == null)
- throw new ODataJPAModelException(MessageKeys.PATH_ELEMENT_NOT_FOUND, pathItems[0], attribute);
- targetPath.add(nextHop);
- for (int i = 1; i < pathItems.length; i++) {
- if (nextHop.isComplex()) {
- nextHop = (IntermediateProperty) nextHop.getStructuredType().getAttribute(pathItems[i]);
- if (nextHop == null)
- throw new ODataJPAModelException(MessageKeys.PATH_ELEMENT_NOT_FOUND, pathItems[0], attribute);
- targetPath.add(nextHop);
+ @Override
+ public List getJoinColumnsList() throws ODataJPAModelException {
+ if (joinColumns == null)
+ joinColumns = buildJoinColumnsFromAnnotations(true, (AnnotatedElement) jpaAttribute.getJavaMember());
+ final List result = new ArrayList<>();
+ for (final IntermediateJoinColumn column : this.joinColumns) {
+ result.add(new JPAOnConditionItemImpl(
+ sourceType.getPathByDBField(column.getReferencedColumnName()),
+ ((IntermediateStructuredType) targetEntity).getPathByDBField(column.getName())));
+ }
+ return result;
+ }
+
+ @Override
+ public List getLeftColumnsList() throws ODataJPAModelException {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List getRightColumnsList() throws ODataJPAModelException {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public JPAAssociationAttribute getLeaf() {
+ return null;
+ }
+
+ @Override
+ public List getPath() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public JPAStructuredType getTargetType() {
+ return targetEntity;
+ }
+
+ @Override
+ public JPAStructuredType getSourceType() {
+ return sourceType;
+ }
+
+ @Override
+ public boolean isCollection() {
+ return false;
+ }
+
+ @Override
+ public JPAAssociationAttribute getPartner() {
+ return null;
+ }
+
+ @Override
+ public JPAJoinTable getJoinTable() {
+ return null;
+ }
+
+ @Override
+ public List getInverseLeftJoinColumnsList() throws ODataJPAModelException {
+ return Collections.emptyList();
+ }
+
+ private List buildJoinColumnsFromAnnotations(final boolean isSourceOne,
+ final AnnotatedElement annotatedElement) throws ODataJPAModelException {
+
+ int implicitColumns = 0;
+ final List result = new ArrayList<>();
+ final JoinColumn[] columns = annotatedElement.getAnnotation(JoinColumns.class) != null ? annotatedElement
+ .getAnnotation(JoinColumns.class).value() : null;
+
+ if (columns != null) {
+ for (final JoinColumn column : columns) {
+ final IntermediateJoinColumn intermediateColumn = new IntermediateJoinColumn(column);
+ final String refColumnName = intermediateColumn.getReferencedColumnName();
+ final String name = intermediateColumn.getName();
+ if (refColumnName == null || refColumnName.isEmpty() || name == null || name.isEmpty()) {
+ implicitColumns += 1;
+ if (implicitColumns > 1)
+ throw new ODataJPAModelException(ODataJPAModelException.MessageKeys.NOT_SUPPORTED_NO_IMPLICIT_COLUMNS,
+ getInternalName());
+ fillMissingName(isSourceOne, intermediateColumn);
+ }
+ result.add(intermediateColumn);
+ }
+ } else {
+ final JoinColumn column = annotatedElement.getAnnotation(JoinColumn.class);
+ if (column != null) {
+ final IntermediateJoinColumn intermediateColumn = new IntermediateJoinColumn(column);
+ fillMissingName(isSourceOne, intermediateColumn);
+ result.add(intermediateColumn);
}
}
- return new JPAPathImpl(nextHop.getExternalName(), nextHop.getDBFieldName(), targetPath);
- } else {
- final IntermediateProperty p = (IntermediateProperty) targetEntity.getAttribute(attribute);
- return new JPAPathImpl(p.getExternalName(), p.getDBFieldName(), p);
+ return result;
+ }
+
+ private void fillMissingName(final boolean isSourceOne, final IntermediateJoinColumn intermediateColumn)
+ throws ODataJPAModelException {
+
+ final String refColumnName = intermediateColumn.getReferencedColumnName();
+ final String name = intermediateColumn.getName();
+
+ if (isSourceOne && (emptyString(refColumnName)))
+ intermediateColumn.setReferencedColumnName(((IntermediateSimpleProperty) ((IntermediateEntityType) sourceType)
+ .getKey().get(0)).getDBFieldName());
+ else if (isSourceOne && (emptyString(name)))
+ intermediateColumn.setReferencedColumnName(((IntermediateSimpleProperty) ((IntermediateEntityType) targetEntity)
+ .getKey().get(0)).getDBFieldName());
+ else if (!isSourceOne && (emptyString(refColumnName)))
+ intermediateColumn.setReferencedColumnName(((IntermediateSimpleProperty) ((IntermediateEntityType) targetEntity)
+ .getKey().get(0)).getDBFieldName());
+ else if (!isSourceOne && (emptyString(name)))
+ intermediateColumn.setReferencedColumnName(((IntermediateSimpleProperty) ((IntermediateEntityType) sourceType)
+ .getKey().get(0)).getDBFieldName());
+ }
+
+ @Override
+ public boolean hasJoinTable() {
+ return false;
}
}
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateEmbeddedIdProperty.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateEmbeddedIdProperty.java
index 6baf7d587..f43712c48 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateEmbeddedIdProperty.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateEmbeddedIdProperty.java
@@ -1,22 +1,20 @@
package com.sap.olingo.jpa.metadata.core.edm.mapper.impl;
+import static com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException.MessageKeys.TRANSIENT_KEY_NOT_SUPPORTED;
+
+import java.lang.reflect.AnnotatedElement;
+
import javax.persistence.metamodel.Attribute;
+import com.sap.olingo.jpa.metadata.core.edm.annotation.EdmTransient;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAEdmNameBuilder;
import com.sap.olingo.jpa.metadata.core.edm.mapper.exception.ODataJPAModelException;
-final class IntermediateEmbeddedIdProperty extends IntermediateProperty {
- private final Attribute, ?> embeddable;
-
- IntermediateEmbeddedIdProperty(final JPAEdmNameBuilder nameBuilder, final Attribute, ?> jpaAttribute,
- final IntermediateSchema schema, final Attribute, ?> embeddable) throws ODataJPAModelException {
- super(nameBuilder, jpaAttribute, schema);
- this.embeddable = embeddable;
- }
+final class IntermediateEmbeddedIdProperty extends IntermediateSimpleProperty {
IntermediateEmbeddedIdProperty(final JPAEdmNameBuilder nameBuilder, final Attribute, ?> jpaAttribute,
final IntermediateSchema schema) throws ODataJPAModelException {
super(nameBuilder, jpaAttribute, schema);
- this.embeddable = null;
}
@Override
@@ -24,7 +22,13 @@ public boolean isKey() {
return true;
}
- Attribute, ?> getEmbeddable() {
- return embeddable;
+ @Override
+ void determineTransient() throws ODataJPAModelException {
+ final EdmTransient jpaTransient = ((AnnotatedElement) this.jpaAttribute.getJavaMember())
+ .getAnnotation(EdmTransient.class);
+ if (jpaTransient != null) {
+ throw new ODataJPAModelException(TRANSIENT_KEY_NOT_SUPPORTED,
+ jpaAttribute.getJavaMember().getDeclaringClass().getName());
+ }
}
}
diff --git a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateEntityContainer.java b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateEntityContainer.java
index d3696a732..4467584a8 100644
--- a/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateEntityContainer.java
+++ b/jpa/odata-jpa-metadata/src/main/java/com/sap/olingo/jpa/metadata/core/edm/mapper/impl/IntermediateEntityContainer.java
@@ -4,6 +4,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import org.apache.olingo.commons.api.edm.provider.CsdlAction;
import org.apache.olingo.commons.api.edm.provider.CsdlActionImport;
@@ -14,6 +15,7 @@
import org.apache.olingo.commons.api.edm.provider.CsdlFunctionImport;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAAction;
+import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAEdmNameBuilder;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAEntitySet;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAEntityType;
import com.sap.olingo.jpa.metadata.core.edm.mapper.api.JPAFunction;
@@ -29,17 +31,16 @@
*/
//TODO How to handle multiple schemas
final class IntermediateEntityContainer extends IntermediateModelElement implements IntermediateEntityContainerAccess {
- final private Map schemaList;
- final private Map entitySetListInternalKey;
+ private final Map schemaList;
+ private final Map entitySetListInternalKey;
private CsdlEntityContainer edmContainer;
- IntermediateEntityContainer(final JPAEdmNameBuilder nameBuilder, final Map schemaList)
- throws ODataJPAModelException {
+ IntermediateEntityContainer(final JPAEdmNameBuilder nameBuilder, final Map schemaList) {
super(nameBuilder, nameBuilder.buildContainerName());
this.schemaList = schemaList;
this.setExternalName(nameBuilder.buildContainerName());
- this.entitySetListInternalKey = new HashMap();
+ this.entitySetListInternalKey = new HashMap<>();
}
@Override
@@ -48,7 +49,7 @@ public void addAnnotations(List annotations) {
}
@Override
- protected void lazyBuildEdmItem() throws ODataJPAModelException {
+ protected synchronized void lazyBuildEdmItem() throws ODataJPAModelException {
if (edmContainer == null) {
postProcessor.processEntityContainer(this);
edmContainer = new CsdlEntityContainer();
@@ -63,12 +64,16 @@ protected void lazyBuildEdmItem() throws ODataJPAModelException {
@Override
CsdlEntityContainer getEdmItem() throws ODataJPAModelException {
- lazyBuildEdmItem();
+ if (edmContainer == null) {
+ lazyBuildEdmItem();
+ }
return edmContainer;
}
IntermediateEntitySet getEntitySet(final String edmEntitySetName) throws ODataJPAModelException {
- lazyBuildEdmItem();
+ if (edmContainer == null) {
+ lazyBuildEdmItem();
+ }
return (IntermediateEntitySet) findModelElementByEdmItem(edmEntitySetName,
entitySetListInternalKey);
}
@@ -80,11 +85,12 @@ IntermediateEntitySet getEntitySet(final String edmEntitySetName) throws ODataJP
* @throws ODataJPAModelException
*/
JPAEntitySet getEntitySet(final JPAEntityType entityType) throws ODataJPAModelException {
- lazyBuildEdmItem();
- for (final String internalName : entitySetListInternalKey.keySet()) {
- final IntermediateEntitySet modelElement = entitySetListInternalKey.get(internalName);
- if (modelElement.getEntityType().getExternalFQN().equals(entityType.getExternalFQN())) {
- return modelElement;
+ if (edmContainer == null) {
+ lazyBuildEdmItem();
+ }
+ for (final Entry entitySet : entitySetListInternalKey.entrySet()) {
+ if (entitySet.getValue().getEntityType().getExternalFQN().equals(entityType.getExternalFQN())) {
+ return entitySet.getValue();
}
}
return null;
@@ -99,10 +105,8 @@ JPAEntitySet getEntitySet(final JPAEntityType entityType) throws ODataJPAModelEx
*/
@SuppressWarnings("unchecked")
private List buildEntitySets() throws ODataJPAModelException {
- for (final String namespace : schemaList.keySet()) {
- // Build Entity Sets
- final IntermediateSchema schema = schemaList.get(namespace);
- for (final IntermediateEntityType et : schema.getEntityTypes()) {
+ for (final Entry