[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;
+    }
+
+  }
+}