[OLINGo-765] - JPA Core Edm Provider initial implementation
Csdl Schema Namespace = JPA Persistence Unit Name
Signed-off-by: Chandan V A <chandan.v.a@sap.com>
diff --git a/ext/odata-jpa/odata-jpa-core/pom.xml b/ext/odata-jpa/odata-jpa-core/pom.xml
index 2567339..5145d1e 100644
--- a/ext/odata-jpa/odata-jpa-core/pom.xml
+++ b/ext/odata-jpa/odata-jpa-core/pom.xml
@@ -36,5 +36,9 @@
<artifactId>odata-jpa-api</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.eclipse.persistence</groupId>
+ <artifactId>javax.persistence</artifactId>
+ </dependency>
</dependencies>
</project>
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAContextImpl.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAContextImpl.java
index a6308fa..d69521c 100644
--- a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAContextImpl.java
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAContextImpl.java
@@ -18,20 +18,44 @@
*/
package org.apache.olingo.jpa.core;
+import javax.persistence.EntityManagerFactory;
+
import org.apache.olingo.jpa.api.ODataJPAContext;
+import org.apache.olingo.jpa.api.extension.JPACsdlMetaModelExtension;
public class ODataJPAContextImpl implements ODataJPAContext {
+ private String pUnitName;
+ private EntityManagerFactory emf;
+ private JPACsdlMetaModelExtension extension = null;
+
@Override
public String getPersistenceUnitName() {
- // TODO Auto-generated method stub
- return null;
+ return pUnitName;
}
@Override
- public void setPersistenceUnitName() {
- // TODO Auto-generated method stub
-
+ public void setPersistenceUnitName(final String pUnitName) {
+ this.pUnitName = pUnitName;
}
+ @Override
+ public EntityManagerFactory getEntityManagerFactory() {
+ return emf;
+ }
+
+ @Override
+ public void setEntityManagerFactory(final EntityManagerFactory emf) {
+ this.emf = emf;
+ }
+
+ @Override
+ public JPACsdlMetaModelExtension getJPACsdlMetaModelExtension() {
+ return extension;
+ }
+
+ @Override
+ public void setJPACsdlMetaModelExtension(JPACsdlMetaModelExtension extension) {
+ this.extension = extension;
+ }
}
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAProcessorDefault.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAProcessorDefault.java
new file mode 100644
index 0000000..b0754c2
--- /dev/null
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAProcessorDefault.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.jpa.core;
+
+import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.jpa.api.ODataJPAProcessor;
+import org.apache.olingo.server.api.OData;
+import org.apache.olingo.server.api.ODataApplicationException;
+import org.apache.olingo.server.api.ODataRequest;
+import org.apache.olingo.server.api.ODataResponse;
+import org.apache.olingo.server.api.ServiceMetadata;
+import org.apache.olingo.server.api.serializer.SerializerException;
+import org.apache.olingo.server.api.uri.UriInfo;
+
+public class ODataJPAProcessorDefault implements ODataJPAProcessor {
+
+ @Override
+ public void readEntityCollection(ODataRequest arg0, ODataResponse arg1, UriInfo arg2, ContentType arg3)
+ throws ODataApplicationException, SerializerException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void init(OData arg0, ServiceMetadata arg1) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/edm/ODataJPAEdmProvider.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/edm/ODataJPAEdmProvider.java
index 44811db..ec2cac7 100644
--- a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/edm/ODataJPAEdmProvider.java
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/edm/ODataJPAEdmProvider.java
@@ -18,8 +18,34 @@
*/
package org.apache.olingo.jpa.core.edm;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.olingo.commons.api.ODataException;
+import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
import org.apache.olingo.jpa.api.ODataJPAAbstractEdmProvider;
+import org.apache.olingo.jpa.api.ODataJPAContext;
+import org.apache.olingo.jpa.api.model.JPACsdlBuilder;
+import org.apache.olingo.jpa.api.model.JPACsdlMetaModelAccessor;
+import org.apache.olingo.jpa.api.model.JPACsdlSchemaAccessor;
+import org.apache.olingo.jpa.core.model.JPACsdlMetaModel;
public class ODataJPAEdmProvider extends ODataJPAAbstractEdmProvider {
+ private List<CsdlSchema> csdlSchemas = new ArrayList<CsdlSchema>();
+
+ public ODataJPAEdmProvider(ODataJPAContext context) {
+ super(context);
+ }
+
+ @Override
+ public List<CsdlSchema> getSchemas() throws ODataException {
+ // Build CSDL Schema if not yet built
+ if (csdlSchemas.isEmpty()) {
+ JPACsdlBuilder jpaCsdlMetaModelBuilder = JPACsdlMetaModel.newJPACsdlMetaModelBuilder(this.getODataJPAContext());
+ JPACsdlMetaModelAccessor metaModelAccessor = jpaCsdlMetaModelBuilder.build();
+ csdlSchemas.add(((JPACsdlSchemaAccessor) metaModelAccessor).getCsdlSchema());
+ }
+ return csdlSchemas;
+ }
}
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/factory/ODataJPAFactoryImpl.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/factory/ODataJPAFactoryImpl.java
index 18299fb..b02512e 100644
--- a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/factory/ODataJPAFactoryImpl.java
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/factory/ODataJPAFactoryImpl.java
@@ -25,6 +25,7 @@
import org.apache.olingo.jpa.api.ODataJPAProcessor;
import org.apache.olingo.jpa.api.factory.ODataJPAFactory;
import org.apache.olingo.jpa.core.ODataJPAContextImpl;
+import org.apache.olingo.jpa.core.ODataJPAProcessorDefault;
import org.apache.olingo.jpa.core.edm.ODataJPAEdmProvider;
import org.apache.olingo.jpa.core.exception.ODataJPARuntimeException;
@@ -34,15 +35,17 @@
new HashMap<String, ODataJPAAbstractEdmProvider>();
@Override
- public ODataJPAAbstractEdmProvider getODataJPAEdmProvider(String pUnitName) throws ODataJPARuntimeException {
+ public ODataJPAAbstractEdmProvider getODataJPAEdmProvider(ODataJPAContext odataJPAContext)
+ throws ODataJPARuntimeException {
ODataJPAAbstractEdmProvider odataJPAEdmProvider = null;
- if (pUnitName == null) {
+ String pUnitName = odataJPAContext.getPersistenceUnitName();
+ if (odataJPAContext == null || pUnitName == null) {
throw new ODataJPARuntimeException("Unable to create Edm Provider", null,
ODataJPARuntimeException.MessageKeys.NULL_PUNIT, null);
} else {
odataJPAEdmProvider = edmProviderMap.get(pUnitName);
if (odataJPAEdmProvider == null) {
- odataJPAEdmProvider = new ODataJPAEdmProvider();
+ odataJPAEdmProvider = new ODataJPAEdmProvider(odataJPAContext);
edmProviderMap.put(pUnitName, odataJPAEdmProvider);
}
}
@@ -52,8 +55,7 @@
@Override
public ODataJPAProcessor getODataJPAProcessor(ODataJPAContext odataJPAContext) {
- // TODO Auto-generated method stub
- return null;
+ return new ODataJPAProcessorDefault();
}
@Override
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlMetaModel.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlMetaModel.java
new file mode 100644
index 0000000..67f5b4e
--- /dev/null
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlMetaModel.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.jpa.core.model;
+
+import javax.persistence.metamodel.Metamodel;
+
+import org.apache.olingo.jpa.api.ODataJPAContext;
+import org.apache.olingo.jpa.api.exception.ODataJPAException;
+import org.apache.olingo.jpa.api.extension.JPACsdlMetaModelExtension;
+import org.apache.olingo.jpa.api.model.JPACsdlBuilder;
+import org.apache.olingo.jpa.api.model.JPACsdlMetaModelAccessor;
+import org.apache.olingo.jpa.api.model.JPACsdlMetaModelContext;
+import org.apache.olingo.jpa.api.model.JPACsdlSchemaAccessor;
+
+/**
+ * A meta model that holds JPA Model element definition and its corresponding CSDL definition
+ */
+public class JPACsdlMetaModel implements JPACsdlMetaModelContext {
+ private String pUnitName = null;
+ private Metamodel jpaMetaModel = null;
+ private JPACsdlMetaModelExtension extension = null;
+
+ private JPACsdlMetaModel() {}
+
+ public static JPACsdlBuilder newJPACsdlMetaModelBuilder(ODataJPAContext odataJPAContext) {
+ return new JPACsdlMetaModel.JPACsdlMetaModelBuilder(odataJPAContext);
+ }
+
+ @Override
+ public String getPersistenceUnit() {
+ return pUnitName;
+ }
+
+ @Override
+ public Metamodel getJPAMetaModel() {
+ return jpaMetaModel;
+ }
+
+ @Override
+ public JPACsdlMetaModelExtension getJPACsdlMetaModelExtension() {
+ return extension;
+ }
+
+ protected void setPersistenceUnit(String pUnitName) {
+ this.pUnitName = pUnitName;
+ }
+
+ protected void setJPAMetaModel(Metamodel metaModel) {
+ this.jpaMetaModel = metaModel;
+ }
+
+ public void setJPACsdlMetaModelExtension(JPACsdlMetaModelExtension jpaCsdlMetaModelExtension) {
+ extension = jpaCsdlMetaModelExtension;
+ }
+
+ private static class JPACsdlMetaModelBuilder implements JPACsdlBuilder {
+
+ private ODataJPAContext odataJPAContext = null;
+
+ public JPACsdlMetaModelBuilder(ODataJPAContext odataJPAContext) {
+ this.odataJPAContext = odataJPAContext;
+ }
+
+ @Override
+ public JPACsdlMetaModelAccessor build() throws ODataJPAException {
+ JPACsdlMetaModel jpaCsdlMetaModel = new JPACsdlMetaModel();
+ jpaCsdlMetaModel.setJPAMetaModel(odataJPAContext.getEntityManagerFactory().getMetamodel());
+ jpaCsdlMetaModel.setPersistenceUnit(odataJPAContext.getPersistenceUnitName());
+ jpaCsdlMetaModel.setJPACsdlMetaModelExtension(odataJPAContext.getJPACsdlMetaModelExtension());
+
+ JPACsdlSchemaAccessor jpaCsdlSchemaAccessor = new JPACsdlSchema(jpaCsdlMetaModel);
+ return jpaCsdlSchemaAccessor.getJPACsdlBuilder().build();
+ }
+ }
+
+}
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlNameBuilder.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlNameBuilder.java
new file mode 100644
index 0000000..c9eaf50
--- /dev/null
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlNameBuilder.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.jpa.core.model;
+
+import org.apache.olingo.jpa.api.model.JPACsdlMetaModelContext;
+
+/**
+ * The class builds the Name for Csdl Elements derived from JPA Meta Model elements
+ */
+public class JPACsdlNameBuilder {
+ public static String buildSchemaNamespace(JPACsdlMetaModelContext context) {
+ return context.getPersistenceUnit();
+ }
+}
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlSchema.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlSchema.java
new file mode 100644
index 0000000..8d9c901
--- /dev/null
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlSchema.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.jpa.core.model;
+
+import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
+import org.apache.olingo.jpa.api.exception.ODataJPAException;
+import org.apache.olingo.jpa.api.model.JPACsdlBuilder;
+import org.apache.olingo.jpa.api.model.JPACsdlMetaModelAccessor;
+import org.apache.olingo.jpa.api.model.JPACsdlMetaModelContext;
+import org.apache.olingo.jpa.api.model.JPACsdlSchemaAccessor;
+
+public class JPACsdlSchema implements JPACsdlSchemaAccessor {
+ private CsdlSchema csdlSchema;
+ private JPACsdlBuilder builder = null;
+ private JPACsdlMetaModelContext context = null;
+
+ public JPACsdlSchema(JPACsdlMetaModelContext context) {
+ this.context = context;
+ }
+
+ @Override
+ public CsdlSchema getCsdlSchema() {
+ return this.csdlSchema;
+ }
+
+ @Override
+ public JPACsdlBuilder getJPACsdlBuilder() {
+ if (builder == null) {
+ builder = new JPACsdlSchemaBuilder();
+ }
+ return builder;
+ }
+
+ private class JPACsdlSchemaBuilder implements JPACsdlBuilder {
+
+ @Override
+ public JPACsdlMetaModelAccessor build() throws ODataJPAException {
+ csdlSchema = new CsdlSchema();
+ csdlSchema.setNamespace(JPACsdlNameBuilder.buildSchemaNamespace(context));
+ return JPACsdlSchema.this;
+ }
+
+ }
+}