You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2014/03/12 13:49:32 UTC

[2/5] [OLINGO-168] Enhance Edm for Service Document serialization

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/CircleStreamBuffer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/CircleStreamBuffer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/CircleStreamBuffer.java
new file mode 100644
index 0000000..6784f87
--- /dev/null
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/CircleStreamBuffer.java
@@ -0,0 +1,327 @@
+/*
+ * 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.server.core;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.util.Queue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * Circular stream buffer to write/read into/from one single buffer.
+ * With support of {@link InputStream} and {@link OutputStream} access to buffered data.
+ * 
+ * 
+ */
+public class CircleStreamBuffer {
+
+  private static final int NEW_BUFFER_RESIZE_FACTOR = 2;
+  private static final int READ_EOF = -1;
+  private static final int DEFAULT_CAPACITY = 8192;
+  private static final int MAX_CAPACITY = DEFAULT_CAPACITY * 32;
+
+  private int currentAllocateCapacity = DEFAULT_CAPACITY;
+
+  private boolean writeMode = true;
+  private boolean writeClosed = false;
+  private boolean readClosed = false;
+
+  private Queue<ByteBuffer> bufferQueue = new LinkedBlockingQueue<ByteBuffer>();
+  private ByteBuffer currentWriteBuffer;
+
+  private InternalInputStream inStream;
+  private InternalOutputStream outStream;
+
+  /**
+   * Creates a {@link CircleStreamBuffer} with default buffer size.
+   */
+  public CircleStreamBuffer() {
+    this(DEFAULT_CAPACITY);
+  }
+
+  /**
+   * Create a {@link CircleStreamBuffer} with given buffer size in bytes.
+   * 
+   * @param bufferSize
+   */
+  public CircleStreamBuffer(final int bufferSize) {
+    currentAllocateCapacity = bufferSize;
+    createNewWriteBuffer();
+    inStream = new InternalInputStream(this);
+    outStream = new InternalOutputStream(this);
+  }
+
+  /**
+   * Get {@link InputStream} for data read access.
+   * 
+   * @return the stream
+   */
+  public InputStream getInputStream() {
+    return inStream;
+  }
+
+  /**
+   * Get {@link OutputStream} for write data.
+   * 
+   * @return the stream
+   */
+  public OutputStream getOutputStream() {
+    return outStream;
+  }
+
+  // #############################################
+  // #
+  // # Common parts
+  // #
+  // #############################################
+
+  /**
+   * Closes the write (input) part of the {@link CircleStreamBuffer}.
+   * After this call the buffer can only be read out.
+   */
+  public void closeWrite() {
+    writeClosed = true;
+  }
+
+  /**
+   * Closes the read (output) part of the {@link CircleStreamBuffer}.
+   * After this call it is possible to write into the buffer (but can never be read out).
+   */
+  public void closeRead() {
+    readClosed = true;
+    // clear references to byte buffers
+    ByteBuffer buffer = bufferQueue.poll();
+    while (buffer != null) {
+      buffer.clear();
+      buffer = bufferQueue.poll();
+    }
+  }
+
+  /**
+   * Closes write and read part (and hence the complete buffer).
+   */
+  public void close() {
+    closeWrite();
+    closeRead();
+  }
+
+  private int remaining() throws IOException {
+    if (writeMode) {
+      return currentWriteBuffer.remaining();
+    } else {
+      ByteBuffer toRead = getReadBuffer();
+      if (toRead == null) {
+        return 0;
+      }
+      return toRead.remaining();
+    }
+  }
+
+  // #############################################
+  // #
+  // # Reading parts
+  // #
+  // #############################################
+
+  private ByteBuffer getReadBuffer() throws IOException {
+    if (readClosed) {
+      throw new IOException("Tried to read from closed stream.");
+    }
+
+    boolean next = false;
+    ByteBuffer tmp = null;
+    if (writeMode) {
+      writeMode = false;
+      next = true;
+    } else {
+      tmp = bufferQueue.peek();
+      if (tmp != null && !tmp.hasRemaining()) {
+        tmp = bufferQueue.poll();
+        next = true;
+      }
+    }
+
+    if (next) {
+      tmp = bufferQueue.peek();
+      if (tmp != null) {
+        tmp.flip();
+      }
+      tmp = getReadBuffer();
+    }
+
+    return tmp;
+  }
+
+  private int read(final byte[] b, final int off, final int len) throws IOException {
+    ByteBuffer readBuffer = getReadBuffer();
+    if (readBuffer == null) {
+      return READ_EOF;
+    }
+
+    int toReadLength = readBuffer.remaining();
+    if (len < toReadLength) {
+      toReadLength = len;
+    }
+    readBuffer.get(b, off, toReadLength);
+    return toReadLength;
+  }
+
+  private int read() throws IOException {
+    ByteBuffer readBuffer = getReadBuffer();
+    if (readBuffer == null) {
+      return READ_EOF;
+    }
+
+    return readBuffer.get();
+  }
+
+  // #############################################
+  // #
+  // # Writing parts
+  // #
+  // #############################################
+
+  private void write(final byte[] data, final int off, final int len) throws IOException {
+    ByteBuffer writeBuffer = getWriteBuffer(len);
+    writeBuffer.put(data, off, len);
+  }
+
+  private ByteBuffer getWriteBuffer(final int size) throws IOException {
+    if (writeClosed) {
+      throw new IOException("Tried to write into closed stream.");
+    }
+
+    if (writeMode) {
+      if (remaining() < size) {
+        createNewWriteBuffer(size);
+      }
+    } else {
+      writeMode = true;
+      createNewWriteBuffer();
+    }
+
+    return currentWriteBuffer;
+  }
+
+  private void write(final int b) throws IOException {
+    ByteBuffer writeBuffer = getWriteBuffer(1);
+    writeBuffer.put((byte) b);
+  }
+
+  private void createNewWriteBuffer() {
+    createNewWriteBuffer(currentAllocateCapacity);
+  }
+
+  /**
+   * Creates a new buffer (per {@link #allocateBuffer(int)}) with the requested capacity as minimum capacity, add the
+   * new allocated
+   * buffer to the {@link #bufferQueue} and set it as {@link #currentWriteBuffer}.
+   * 
+   * @param requestedCapacity minimum capacity for new allocated buffer
+   */
+  private void createNewWriteBuffer(final int requestedCapacity) {
+    ByteBuffer b = allocateBuffer(requestedCapacity);
+    bufferQueue.add(b);
+    currentWriteBuffer = b;
+  }
+
+  /**
+   * 
+   * @param requestedCapacity
+   * @return the buffer
+   */
+  private ByteBuffer allocateBuffer(final int requestedCapacity) {
+    int allocateCapacity = requestedCapacity;
+    if (allocateCapacity < currentAllocateCapacity) {
+      allocateCapacity = currentAllocateCapacity * NEW_BUFFER_RESIZE_FACTOR;
+    }
+    if (allocateCapacity > MAX_CAPACITY) {
+      allocateCapacity = MAX_CAPACITY;
+    }
+    // update current
+    currentAllocateCapacity = allocateCapacity;
+    return ByteBuffer.allocate(allocateCapacity);
+  }
+
+  // #############################################
+  // #
+  // # Inner classes (streams)
+  // #
+  // #############################################
+
+  /**
+   * 
+   */
+  private static class InternalInputStream extends InputStream {
+
+    private final CircleStreamBuffer inBuffer;
+
+    public InternalInputStream(final CircleStreamBuffer csBuffer) {
+      inBuffer = csBuffer;
+    }
+
+    @Override
+    public int available() throws IOException {
+      return inBuffer.remaining();
+    }
+
+    @Override
+    public int read() throws IOException {
+      return inBuffer.read();
+    }
+
+    @Override
+    public int read(final byte[] b, final int off, final int len) throws IOException {
+      return inBuffer.read(b, off, len);
+    }
+
+    @Override
+    public void close() throws IOException {
+      inBuffer.closeRead();
+    }
+  }
+
+  /**
+   * 
+   */
+  private static class InternalOutputStream extends OutputStream {
+    private final CircleStreamBuffer outBuffer;
+
+    public InternalOutputStream(final CircleStreamBuffer csBuffer) {
+      outBuffer = csBuffer;
+    }
+
+    @Override
+    public void write(final int b) throws IOException {
+      outBuffer.write(b);
+    }
+
+    @Override
+    public void write(final byte[] b, final int off, final int len) throws IOException {
+      outBuffer.write(b, off, len);
+    }
+
+    @Override
+    public void close() throws IOException {
+      outBuffer.closeWrite();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataJsonSerializer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataJsonSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataJsonSerializer.java
new file mode 100644
index 0000000..57a0d84
--- /dev/null
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataJsonSerializer.java
@@ -0,0 +1,147 @@
+/*
+ * 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.server.core;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+
+import org.apache.olingo.commons.api.ODataRuntimeException;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.commons.api.edm.EdmFunctionImport;
+import org.apache.olingo.commons.api.edm.EdmSingleton;
+import org.apache.olingo.server.api.ODataSerializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
+
+public class ODataJsonSerializer implements ODataSerializer {
+
+  private static final Logger log = LoggerFactory.getLogger(ODataJsonSerializer.class);
+
+  private static final String DEFAULT_CHARSET = "UTF-8";
+
+  public static final String ODATA_CONTEXT = "@odata.context";
+  public static final String METADATA = "$metadata";
+  public static final String VALUE = "value";
+  public static final String NAME = "name";
+  public static final String URL = "url";
+  public static final String KIND = "kind";
+
+  public static final String FUNCTION_IMPORT = "FunctionImport";
+  public static final String SINGLETON = "Singleton";
+  public static final String SERVICE_DOCUMENT = "ServiceDocument";
+
+  @Override
+  public InputStream metadata(Edm edm) {
+    throw new ODataRuntimeException("Metadata in JSON format not supported!");
+  }
+
+  @Override
+  public InputStream serviceDocument(Edm edm, String serviceRoot) {
+    CircleStreamBuffer buffer;
+    BufferedWriter writer;
+    JsonFactory factory;
+    JsonGenerator gen = null;
+
+    try {
+      buffer = new CircleStreamBuffer();
+      writer = new BufferedWriter(new OutputStreamWriter(buffer.getOutputStream(), DEFAULT_CHARSET));
+      factory = new JsonFactory();
+      gen = factory.createGenerator(writer);
+
+      gen.setPrettyPrinter(new DefaultPrettyPrinter());
+
+      gen.writeStartObject();
+
+      Object metadataUri = serviceRoot + "/" + METADATA;
+      gen.writeObjectField(ODATA_CONTEXT, metadataUri);
+      gen.writeArrayFieldStart(VALUE);
+
+      writeEntitySets(gen, edm);
+      writeFunctionImports(gen, edm);
+      writeSingletons(gen, edm);
+
+      gen.close();
+
+//      writer.flush();
+//      buffer.closeWrite();
+
+      return buffer.getInputStream();
+
+    } catch (Exception e) {
+      log.error(e.getMessage(), e);
+      throw new ODataRuntimeException(e);
+    } finally {
+      if (gen != null) {
+        try {
+          gen.close();
+        } catch (IOException e) {
+          throw new ODataRuntimeException(e);
+        }
+      }
+    }
+  }
+
+  private void writeEntitySets(JsonGenerator gen, Edm edm) throws JsonGenerationException, IOException {
+    EdmEntityContainer container = edm.getEntityContainer(null);
+
+    for (EdmEntitySet edmEntitySet : container.getEntitySets()) {
+      if (edmEntitySet.isIncludeInServiceDocument()) {
+        gen.writeStartObject();
+        gen.writeObjectField(NAME, edmEntitySet.getName());
+        gen.writeObjectField(URL, edmEntitySet.getName());
+        gen.writeEndObject();
+      }
+    }
+  }
+
+  private void writeFunctionImports(JsonGenerator gen, Edm edm) throws JsonGenerationException, IOException {
+    EdmEntityContainer container = edm.getEntityContainer(null);
+
+    for (EdmFunctionImport edmFunctionImport : container.getFunctionImports()) {
+      if (edmFunctionImport.isIncludeInServiceDocument()) {
+        gen.writeStartObject();
+        gen.writeObjectField(NAME, edmFunctionImport.getName());
+        gen.writeObjectField(URL, edmFunctionImport.getName());
+        gen.writeObjectField(KIND, FUNCTION_IMPORT);
+        gen.writeEndObject();
+      }
+    }
+  }
+
+  private void writeSingletons(JsonGenerator gen, Edm edm) throws JsonGenerationException, IOException {
+    EdmEntityContainer container = edm.getEntityContainer(null);
+
+    for (EdmSingleton edmSingleton : container.getSingletons()) {
+      gen.writeStartObject();
+      gen.writeObjectField(NAME, edmSingleton.getName());
+      gen.writeObjectField(URL, edmSingleton.getName());
+      gen.writeObjectField(KIND, SINGLETON);
+      gen.writeEndObject();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataSerializerImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataSerializerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataSerializerImpl.java
new file mode 100644
index 0000000..3950e0c
--- /dev/null
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataSerializerImpl.java
@@ -0,0 +1,38 @@
+/*
+ * 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.server.core;
+
+import java.io.InputStream;
+
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.server.api.ODataSerializer;
+
+public class ODataSerializerImpl implements ODataSerializer {
+
+  @Override
+  public InputStream metadata(Edm edm) {
+       return null;
+  }
+
+  @Override
+  public InputStream serviceDocument(Edm edm, String serviceRoot) {
+    return null;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataServerImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataServerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataServerImpl.java
new file mode 100644
index 0000000..a634b2e
--- /dev/null
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataServerImpl.java
@@ -0,0 +1,45 @@
+/*
+ * 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.server.core;
+
+import org.apache.olingo.commons.api.ODataRuntimeException;
+import org.apache.olingo.server.api.ODataFormat;
+import org.apache.olingo.server.api.ODataSerializer;
+import org.apache.olingo.server.api.ODataServer;
+
+public class ODataServerImpl extends ODataServer {
+
+  @Override
+  public ODataSerializer getSerializer(ODataFormat format) {
+    ODataSerializer serializer;
+    switch (format) {
+    case JSON:
+      serializer = new ODataJsonSerializer();
+      break;
+    case XML:
+      serializer = new ODataSerializerImpl();
+      break;
+    default:
+      throw new ODataRuntimeException("Unsupported format: " + format);
+    }
+
+    return serializer;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImpl.java
index d423525..991d348 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImpl.java
@@ -28,10 +28,9 @@ public class EdmActionImportImpl extends EdmOperationImportImpl implements EdmAc
 
   private final ActionImport actionImport;
 
-  public EdmActionImportImpl(final Edm edm, final EdmEntityContainer container, final String name,
-          final ActionImport actionImport) {
+  public EdmActionImportImpl(final Edm edm, final EdmEntityContainer container, final ActionImport actionImport) {
 
-    super(edm, container, name, actionImport);
+    super(edm, container, actionImport);
     this.actionImport = actionImport;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImpl.java
index baa0591..4199e08 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImpl.java
@@ -1,23 +1,25 @@
-/* 
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * 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
- *
+ * 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
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
 package org.apache.olingo.server.core.edm.provider;
 
+import java.util.List;
+
 import org.apache.olingo.commons.api.ODataException;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmActionImport;
@@ -25,9 +27,11 @@ import org.apache.olingo.commons.api.edm.EdmEntitySet;
 import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.EdmFunctionImport;
 import org.apache.olingo.commons.api.edm.EdmSingleton;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.core.edm.AbstractEdmEntityContainer;
 import org.apache.olingo.server.api.edm.provider.ActionImport;
 import org.apache.olingo.server.api.edm.provider.EdmProvider;
+import org.apache.olingo.server.api.edm.provider.EntityContainer;
 import org.apache.olingo.server.api.edm.provider.EntityContainerInfo;
 import org.apache.olingo.server.api.edm.provider.EntitySet;
 import org.apache.olingo.server.api.edm.provider.FunctionImport;
@@ -36,14 +40,22 @@ import org.apache.olingo.server.api.edm.provider.Singleton;
 public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
 
   private final EdmProvider provider;
+  private EntityContainer container;
 
   public EdmEntityContainerImpl(final Edm edm, final EdmProvider provider,
-          final EntityContainerInfo entityContainerInfo) {
+      final EntityContainerInfo entityContainerInfo) {
 
     super(edm, entityContainerInfo.getContainerName());
     this.provider = provider;
   }
 
+  public EdmEntityContainerImpl(Edm edm, EdmProvider provider, FullQualifiedName containerFQN,
+      EntityContainer entityContainer) {
+    super(edm, containerFQN);
+    this.provider = provider;
+    this.container = entityContainer;
+  }
+
   @Override
   protected EdmSingleton createSingleton(final String singletonName) {
     EdmSingleton singleton = null;
@@ -83,7 +95,7 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
     try {
       final ActionImport providerImport = provider.getActionImport(entityContainerName, actionImportName);
       if (providerImport != null) {
-        actionImport = new EdmActionImportImpl(edm, this, actionImportName, providerImport);
+        actionImport = new EdmActionImportImpl(edm, this, providerImport);
       }
     } catch (ODataException e) {
       throw new EdmException(e);
@@ -99,7 +111,7 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
     try {
       final FunctionImport providerImport = provider.getFunctionImport(entityContainerName, functionImportName);
       if (providerImport != null) {
-        functionImport = new EdmFunctionImportImpl(edm, this, functionImportName, providerImport);
+        functionImport = new EdmFunctionImportImpl(edm, this, providerImport);
       }
     } catch (ODataException e) {
       throw new EdmException(e);
@@ -108,4 +120,77 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
     return functionImport;
   }
 
+  @Override
+  protected void loadAllEntitySets() {
+    loadContainer();
+    List<EntitySet> providerEntitySets = container.getEntitySets();
+    if (providerEntitySets != null) {
+      for (EntitySet entitySet : providerEntitySets) {
+        if (!entitySets.containsKey(entitySet.getName())) {
+          EdmEntitySetImpl impl = new EdmEntitySetImpl(edm, this, entitySet);
+          entitySets.put(impl.getName(), impl);
+        }
+      }
+    }
+  }
+
+  @Override
+  protected void loadAllFunctionImports() {
+    loadContainer();
+    List<FunctionImport> providerFuctionImports = container.getFunctionImports();
+    if (providerFuctionImports != null) {
+      for (FunctionImport functionImport : providerFuctionImports) {
+        String functionName = functionImport.getName();
+        if (!functionImports.containsKey(functionName)) {
+          EdmFunctionImportImpl impl = new EdmFunctionImportImpl(edm, this, functionImport);
+          functionImports.put(functionName, impl);
+        }
+      }
+    }
+
+  }
+
+  @Override
+  protected void loadAllSingletons() {
+    loadContainer();
+    List<Singleton> providerSingletons = container.getSingletons();
+    if (providerSingletons != null) {
+      for (Singleton singleton : providerSingletons) {
+        if (!singletons.containsKey(singleton.getName())) {
+          EdmSingletonImpl impl = new EdmSingletonImpl(edm, this, singleton);
+          singletons.put(singleton.getName(), impl);
+        }
+      }
+    }
+
+  }
+
+  @Override
+  protected void loadAllActionImports() {
+    loadContainer();
+    List<ActionImport> providerActionImports = container.getActionImports();
+    if (providerActionImports != null) {
+      for (ActionImport actionImport : providerActionImports) {
+        if (!actionImports.containsKey(actionImport.getName())) {
+          EdmActionImportImpl impl = new EdmActionImportImpl(edm, this, actionImport);
+          actionImports.put(actionImport.getName(), impl);
+        }
+      }
+    }
+
+  }
+
+  private void loadContainer() {
+    if (container == null) {
+      try {
+        container = provider.getEntityContainer();
+        if (container == null) {
+          // TODO: Should we throw an exception here?
+          container = new EntityContainer().setName(this.getName());
+        }
+      } catch (ODataException e) {
+        throw new EdmException(e);
+      }
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntitySetImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntitySetImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntitySetImpl.java
index d5de2c5..492095b 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntitySetImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntitySetImpl.java
@@ -25,8 +25,15 @@ import org.apache.olingo.server.api.edm.provider.EntitySet;
 
 public class EdmEntitySetImpl extends EdmBindingTargetImpl implements EdmEntitySet {
 
+  private EntitySet entitySet;
+
   public EdmEntitySetImpl(final Edm edm, final EdmEntityContainer container, final EntitySet entitySet) {
     super(edm, container, entitySet);
+    this.entitySet = entitySet;
   }
 
+  @Override
+  public boolean isIncludeInServiceDocument() {
+    return entitySet.isIncludeInServiceDocument();
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImpl.java
index 8437384..8bb8c2d 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImpl.java
@@ -24,7 +24,6 @@ import java.util.Map;
 
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmEntityType;
-import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.EdmKeyPropertyRef;
 import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
 import org.apache.olingo.commons.api.edm.EdmProperty;
@@ -38,8 +37,6 @@ public class EdmEntityTypeImpl extends AbstractEdmEntityType {
 
   private final EdmStructuredTypeHelper helper;
 
-  private final EntityType entityType;
-
   public static EdmEntityTypeImpl getInstance(final Edm edm, final FullQualifiedName name,
           final EntityType entityType) {
 
@@ -50,9 +47,6 @@ public class EdmEntityTypeImpl extends AbstractEdmEntityType {
       instance.entityBaseType = null;
       
       final List<PropertyRef> key = entityType.getKey();
-      if (key == null && !entityType.isAbstract()) {
-        throw new EdmException("Non-Abstract entity types must define a key.");
-      }
       if (key != null) {
         final List<EdmKeyPropertyRef> edmKey = new ArrayList<EdmKeyPropertyRef>();
         for (PropertyRef ref : key) {
@@ -71,7 +65,6 @@ public class EdmEntityTypeImpl extends AbstractEdmEntityType {
     super(edm, name, entityType.getBaseType(), entityType.hasStream());
 
     this.helper = new EdmStructuredTypeHelperImpl(edm, entityType);
-    this.entityType = entityType;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEnumTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEnumTypeImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEnumTypeImpl.java
index cb263c7..faceb0e 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEnumTypeImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEnumTypeImpl.java
@@ -20,6 +20,7 @@ package org.apache.olingo.server.core.edm.provider;
 
 import java.util.List;
 
+import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmEnumType;
 import org.apache.olingo.commons.api.edm.EdmMember;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
@@ -34,7 +35,7 @@ public class EdmEnumTypeImpl extends AbstractEdmEnumType implements EdmEnumType
 
   private final EnumType enumType;
 
-  public EdmEnumTypeImpl(final EdmProviderImpl edm, final FullQualifiedName enumName, final EnumType enumType) {
+  public EdmEnumTypeImpl(final Edm edm, final FullQualifiedName enumName, final EnumType enumType) {
     super(edm, enumName, enumType.isFlags());
 
     if (enumType.getUnderlyingType() == null) {

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImpl.java
index e91b105..e9a06c5 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImpl.java
@@ -1,18 +1,18 @@
-/* 
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * 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
- *
+ * 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
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
@@ -24,16 +24,16 @@ import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmFunction;
 import org.apache.olingo.commons.api.edm.EdmFunctionImport;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.server.api.edm.provider.FunctionImport;
 
 public class EdmFunctionImportImpl extends EdmOperationImportImpl implements EdmFunctionImport {
 
   private final FunctionImport functionImport;
 
-  public EdmFunctionImportImpl(final Edm edm, final EdmEntityContainer container, final String name,
-          final FunctionImport functionImport) {
+  public EdmFunctionImportImpl(final Edm edm, final EdmEntityContainer container, final FunctionImport functionImport) {
 
-    super(edm, container, name, functionImport);
+    super(edm, container, functionImport);
     this.functionImport = functionImport;
   }
 
@@ -42,4 +42,13 @@ public class EdmFunctionImportImpl extends EdmOperationImportImpl implements Edm
     return edm.getFunction(functionImport.getFunction(), null, null, parameterNames);
   }
 
+  @Override
+  public boolean isIncludeInServiceDocument() {
+    return functionImport.isIncludeInServiceDocument();
+  }
+
+  @Override
+  public FullQualifiedName getFunctionFqn() {
+    return functionImport.getFunction();
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmOperationImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmOperationImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmOperationImpl.java
index 9d6546c..e1d0f4c 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmOperationImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmOperationImpl.java
@@ -1,18 +1,18 @@
-/* 
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * 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
- *
+ * 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
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
@@ -59,9 +59,27 @@ public abstract class EdmOperationImpl extends AbstractEdmOperation {
   }
 
   protected EdmOperationImpl(final Edm edm, final FullQualifiedName name, final Operation operation,
-          final EdmTypeKind kind) {
+      final EdmTypeKind kind) {
 
     super(edm, name, kind);
     this.operation = operation;
   }
+
+  @Override
+  public FullQualifiedName getBindingParameterTypeFqn() {
+    if (isBound()) {
+      Parameter bindingParameter = operation.getParameters().get(0);
+      return bindingParameter.getType();
+    }
+    return null;
+  }
+
+  @Override
+  public Boolean isBindingParameterTypeCollection() {
+    if (isBound()) {
+      Parameter bindingParameter = operation.getParameters().get(0);
+      return bindingParameter.isCollection();
+    }
+    return null;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmOperationImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmOperationImportImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmOperationImportImpl.java
index a6371df..f2badd7 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmOperationImportImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmOperationImportImpl.java
@@ -1,18 +1,18 @@
-/* 
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * 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
- *
+ * 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
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
@@ -25,9 +25,8 @@ import org.apache.olingo.server.api.edm.provider.OperationImport;
 
 public abstract class EdmOperationImportImpl extends AbstractEdmOperationImport {
 
-  public EdmOperationImportImpl(final Edm edm, final EdmEntityContainer container, final String name,
-          final OperationImport operationImport) {
-
-    super(edm, container, name, operationImport.getEntitySet());
+  public EdmOperationImportImpl(final Edm edm, final EdmEntityContainer container, 
+      final OperationImport operationImport) {
+    super(edm, container, operationImport.getName(), operationImport.getEntitySet());
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmProviderImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmProviderImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmProviderImpl.java
index 1d240ad..e4cf9b2 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmProviderImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmProviderImpl.java
@@ -1,18 +1,18 @@
-/* 
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * 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
- *
+ * 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
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
@@ -32,6 +32,7 @@ import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.edm.EdmEnumType;
 import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.EdmFunction;
+import org.apache.olingo.commons.api.edm.EdmSchema;
 import org.apache.olingo.commons.api.edm.EdmServiceMetadata;
 import org.apache.olingo.commons.api.edm.EdmTypeDefinition;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
@@ -45,6 +46,7 @@ import org.apache.olingo.server.api.edm.provider.EntityType;
 import org.apache.olingo.server.api.edm.provider.EnumType;
 import org.apache.olingo.server.api.edm.provider.Function;
 import org.apache.olingo.server.api.edm.provider.Parameter;
+import org.apache.olingo.server.api.edm.provider.Schema;
 import org.apache.olingo.server.api.edm.provider.TypeDefinition;
 
 public class EdmProviderImpl extends AbstractEdmImpl {
@@ -127,8 +129,8 @@ public class EdmProviderImpl extends AbstractEdmImpl {
 
   @Override
   public EdmAction createBoundAction(final FullQualifiedName actionName,
-          final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection) {
-    
+      final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection) {
+
     try {
       List<Action> actions = actionsMap.get(actionName);
       if (actions == null) {
@@ -145,8 +147,8 @@ public class EdmProviderImpl extends AbstractEdmImpl {
           final List<Parameter> parameters = action.getParameters();
           final Parameter parameter = parameters.get(0);
           if (bindingParameterTypeName.equals(parameter.getType())
-                  && isBindingParameterCollection.booleanValue() == parameter.isCollection()) {
-            
+              && isBindingParameterCollection.booleanValue() == parameter.isCollection()) {
+
             return EdmActionImpl.getInstance(this, actionName, action);
           }
 
@@ -160,9 +162,9 @@ public class EdmProviderImpl extends AbstractEdmImpl {
 
   @Override
   public EdmFunction createBoundFunction(final FullQualifiedName functionName,
-          final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection,
-          final List<String> parameterNames) {
-    
+      final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection,
+      final List<String> parameterNames) {
+
     try {
       List<Function> functions = functionsMap.get(functionName);
       if (functions == null) {
@@ -173,7 +175,8 @@ public class EdmProviderImpl extends AbstractEdmImpl {
           functionsMap.put(functionName, functions);
         }
       }
-      final List<String> parameterNamesCopy = parameterNames == null? Collections.<String>emptyList(): parameterNames;
+      final List<String> parameterNamesCopy =
+          parameterNames == null ? Collections.<String> emptyList() : parameterNames;
       for (Function function : functions) {
         if (function.isBound()) {
           List<Parameter> providerParameters = function.getParameters();
@@ -182,8 +185,8 @@ public class EdmProviderImpl extends AbstractEdmImpl {
           }
           final Parameter bindingParameter = providerParameters.get(0);
           if (bindingParameterTypeName.equals(bindingParameter.getType())
-                  && isBindingParameterCollection.booleanValue() == bindingParameter.isCollection()) {
-            
+              && isBindingParameterCollection.booleanValue() == bindingParameter.isCollection()) {
+
             if (parameterNamesCopy.size() == providerParameters.size() - 1) {
               final List<String> providerParameterNames = new ArrayList<String>();
               for (int i = 1; i < providerParameters.size(); i++) {
@@ -259,7 +262,8 @@ public class EdmProviderImpl extends AbstractEdmImpl {
           return null;
         }
       }
-      final List<String> parameterNamesCopy = parameterNames == null? Collections.<String>emptyList(): parameterNames;
+      final List<String> parameterNamesCopy =
+          parameterNames == null ? Collections.<String> emptyList() : parameterNames;
       for (Function function : functions) {
         if (!function.isBound()) {
           List<Parameter> providerParameters = function.getParameters();
@@ -284,4 +288,16 @@ public class EdmProviderImpl extends AbstractEdmImpl {
     }
   }
 
+  @Override
+  protected List<EdmSchema> createSchemas() {
+    try {
+      List<EdmSchema> schemas = new ArrayList<EdmSchema>();
+      for (Schema schema : provider.getSchemas()) {
+        schemas.add(new EdmSchemaImpl(this, provider, schema));
+      }
+      return schemas;
+    } catch (ODataException e) {
+      throw new EdmException(e);
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImpl.java
new file mode 100644
index 0000000..af98a41
--- /dev/null
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImpl.java
@@ -0,0 +1,139 @@
+/*
+ * 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.server.core.edm.provider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAction;
+import org.apache.olingo.commons.api.edm.EdmComplexType;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEntityType;
+import org.apache.olingo.commons.api.edm.EdmEnumType;
+import org.apache.olingo.commons.api.edm.EdmFunction;
+import org.apache.olingo.commons.api.edm.EdmTypeDefinition;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.core.edm.AbstractEdmSchemaImpl;
+import org.apache.olingo.server.api.edm.provider.Action;
+import org.apache.olingo.server.api.edm.provider.ComplexType;
+import org.apache.olingo.server.api.edm.provider.EdmProvider;
+import org.apache.olingo.server.api.edm.provider.EntityType;
+import org.apache.olingo.server.api.edm.provider.EnumType;
+import org.apache.olingo.server.api.edm.provider.Function;
+import org.apache.olingo.server.api.edm.provider.Schema;
+import org.apache.olingo.server.api.edm.provider.TypeDefinition;
+
+public class EdmSchemaImpl extends AbstractEdmSchemaImpl {
+
+  private final Schema schema;
+  private final Edm edm;
+  private final EdmProvider provider;
+
+  public EdmSchemaImpl(Edm edm, EdmProvider provider, Schema schema) {
+    super(schema.getNamespace(), schema.getAlias());
+    this.edm = edm;
+    this.provider = provider;
+    this.schema = schema;
+  }
+
+  @Override
+  protected EdmEntityContainer createEntityContainer() {
+    if (schema.getEntityContainer() != null) {
+      FullQualifiedName containerFQN =
+          new FullQualifiedName(namespace, schema.getEntityContainer().getName());
+      return new EdmEntityContainerImpl(edm, provider, containerFQN, schema.getEntityContainer());
+    }
+    return null;
+  }
+
+  @Override
+  protected List<EdmTypeDefinition> createTypeDefinitions() {
+    List<EdmTypeDefinition> typeDefinitions = new ArrayList<EdmTypeDefinition>();
+    List<TypeDefinition> providerTypeDefinitions = schema.getTypeDefinitions();
+    if (providerTypeDefinitions != null) {
+      for (TypeDefinition def : providerTypeDefinitions) {
+        typeDefinitions.add(new EdmTypeDefinitionImpl(edm, new FullQualifiedName("namespace", def.getName()), def));
+      }
+    }
+    return typeDefinitions;
+  }
+
+  @Override
+  protected List<EdmEnumType> createEnumTypes() {
+    List<EdmEnumType> enumTypes = new ArrayList<EdmEnumType>();
+    List<EnumType> providerEnumTypes = schema.getEnumTypes();
+    if (providerEnumTypes != null) {
+      for (EnumType enumType : providerEnumTypes) {
+        enumTypes.add(new EdmEnumTypeImpl(edm, new FullQualifiedName(namespace, enumType.getName()), enumType));
+      }
+    }
+    return enumTypes;
+  }
+
+  @Override
+  protected List<EdmEntityType> createEntityTypes() {
+    List<EdmEntityType> entityTypes = new ArrayList<EdmEntityType>();
+    List<EntityType> providerEntityTypes = schema.getEntityTypes();
+    if (providerEntityTypes != null) {
+      for (EntityType entityType : providerEntityTypes) {
+        entityTypes.add(EdmEntityTypeImpl.getInstance(edm, new FullQualifiedName(namespace, entityType.getName()),
+            entityType));
+      }
+    }
+    return entityTypes;
+  }
+
+  @Override
+  protected List<EdmComplexType> createComplexTypes() {
+    List<EdmComplexType> complexTypes = new ArrayList<EdmComplexType>();
+    List<ComplexType> providerComplexTypes = schema.getComplexTypes();
+    if (providerComplexTypes != null) {
+      for (ComplexType complexType : providerComplexTypes) {
+        complexTypes.add(EdmComplexTypeImpl.getInstance(edm, new FullQualifiedName(namespace, complexType.getName()),
+            complexType));
+      }
+    }
+    return complexTypes;
+  }
+
+  @Override
+  protected List<EdmAction> createActions() {
+    List<EdmAction> actions = new ArrayList<EdmAction>();
+    List<Action> providerActions = schema.getActions();
+    if (providerActions != null) {
+      for (Action action : providerActions) {
+        actions.add(EdmActionImpl.getInstance(edm, new FullQualifiedName(namespace, action.getName()), action));
+      }
+    }
+    return actions;
+  }
+
+  @Override
+  protected List<EdmFunction> createFunctions() {
+    List<EdmFunction> functions = new ArrayList<EdmFunction>();
+    List<Function> providerFunctions = schema.getFunctions();
+    if (providerFunctions != null) {
+      for (Function function : providerFunctions) {
+        functions.add(EdmFunctionImpl.getInstance(edm, new FullQualifiedName(namespace, function.getName()), function));
+      }
+    }
+    return functions;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmTypeDefinitionImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmTypeDefinitionImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmTypeDefinitionImpl.java
index 0eec8c5..1c6fb0b 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmTypeDefinitionImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmTypeDefinitionImpl.java
@@ -1,18 +1,18 @@
-/* 
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * 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
- *
+ * 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
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
@@ -34,21 +34,22 @@ public class EdmTypeDefinitionImpl extends AbstractEdmTypeDefinition implements
   private EdmPrimitiveType edmPrimitiveTypeInstance;
 
   public EdmTypeDefinitionImpl(final Edm edm, final FullQualifiedName typeDefinitionName,
-          final TypeDefinition typeDefinition) {
+      final TypeDefinition typeDefinition) {
 
     super(edm, typeDefinitionName);
     this.typeDefinition = typeDefinition;
-    // TODO: Should we check for edmNamespace in the underlying type name?
-    try {
-      edmPrimitiveTypeInstance = EdmPrimitiveTypeKind.valueOf(
-              typeDefinition.getUnderlyingType().getName()).getEdmPrimitiveTypeInstance();
-    } catch (IllegalArgumentException e) {
-      throw new EdmException("Invalid underlying type: " + typeDefinitionName, e);
-    }
   }
 
   @Override
   public EdmPrimitiveType getUnderlyingType() {
+    if (edmPrimitiveTypeInstance == null) {
+      try {
+        edmPrimitiveTypeInstance = EdmPrimitiveTypeKind.valueOf(
+            typeDefinition.getUnderlyingType().getName()).getEdmPrimitiveTypeInstance();
+      } catch (IllegalArgumentException e) {
+        throw new EdmException("Invalid underlying type: " + typeDefinition.getUnderlyingType(), e);
+      }
+    }
     return edmPrimitiveTypeInstance;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/test/java/org/apache/olingo/server/core/ServiceDocumentTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/ServiceDocumentTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/ServiceDocumentTest.java
new file mode 100644
index 0000000..8d08820
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/ServiceDocumentTest.java
@@ -0,0 +1,133 @@
+/*
+ * 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.server.core;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.commons.api.edm.EdmFunctionImport;
+import org.apache.olingo.commons.api.edm.EdmSingleton;
+import org.apache.olingo.server.api.ODataFormat;
+import org.apache.olingo.server.api.ODataSerializer;
+import org.apache.olingo.server.api.ODataServer;
+import org.apache.olingo.server.core.testutil.StringUtils;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ServiceDocumentTest {
+
+  private Edm edm;
+
+  @Before
+  public void before() {
+
+    EdmEntitySet edmEntitySet1 = mock(EdmEntitySet.class);
+    when(edmEntitySet1.getName()).thenReturn("entitySetName1");
+    when(edmEntitySet1.isIncludeInServiceDocument()).thenReturn(true);
+
+    EdmEntitySet edmEntitySet2 = mock(EdmEntitySet.class);
+    when(edmEntitySet2.getName()).thenReturn("entitySetName2");
+    when(edmEntitySet2.isIncludeInServiceDocument()).thenReturn(true);
+
+    EdmEntitySet edmEntitySet3 = mock(EdmEntitySet.class);
+    when(edmEntitySet3.getName()).thenReturn("entitySetName3");
+    when(edmEntitySet3.isIncludeInServiceDocument()).thenReturn(false);
+
+    List<EdmEntitySet> entitySets = new ArrayList<EdmEntitySet>();
+    entitySets.add(edmEntitySet1);
+    entitySets.add(edmEntitySet2);
+    entitySets.add(edmEntitySet3);
+
+    EdmFunctionImport functionImport1 = mock(EdmFunctionImport.class);
+    when(functionImport1.getName()).thenReturn("functionImport1");
+    when(functionImport1.isIncludeInServiceDocument()).thenReturn(true);
+
+    EdmFunctionImport functionImport2 = mock(EdmFunctionImport.class);
+    when(functionImport2.getName()).thenReturn("functionImport2");
+    when(functionImport2.isIncludeInServiceDocument()).thenReturn(true);
+
+    EdmFunctionImport functionImport3 = mock(EdmFunctionImport.class);
+    when(functionImport3.getName()).thenReturn("functionImport3");
+    when(functionImport3.isIncludeInServiceDocument()).thenReturn(false);
+
+    List<EdmFunctionImport> functionImports = new ArrayList<EdmFunctionImport>();
+    functionImports.add(functionImport1);
+    functionImports.add(functionImport2);
+    functionImports.add(functionImport3);
+
+    EdmSingleton singleton1 = mock(EdmSingleton.class);
+    when(singleton1.getName()).thenReturn("singleton1");
+
+    EdmSingleton singleton2 = mock(EdmSingleton.class);
+    when(singleton2.getName()).thenReturn("singleton2");
+
+    EdmSingleton singleton3 = mock(EdmSingleton.class);
+    when(singleton3.getName()).thenReturn("singleton3");
+
+    List<EdmSingleton> singletons = new ArrayList<EdmSingleton>();
+    singletons.add(singleton1);
+    singletons.add(singleton2);
+    singletons.add(singleton3);
+
+    EdmEntityContainer edmEntityContainer = mock(EdmEntityContainer.class);
+    when(edmEntityContainer.getEntitySets()).thenReturn(entitySets);
+    when(edmEntityContainer.getFunctionImports()).thenReturn(functionImports);
+    when(edmEntityContainer.getSingletons()).thenReturn(singletons);
+
+    edm = mock(Edm.class);
+    when(edm.getEntityContainer(null)).thenReturn(edmEntityContainer);
+  }
+
+  @Test
+  public void writeServiceDocumentJson() throws Exception {
+    String serviceRoot = "http://localhost:8080/odata.svc";
+
+    ODataServer server = ODataServer.newInstance();
+    assertNotNull(server);
+
+    ODataSerializer serializer = server.getSerializer(ODataFormat.JSON);
+    assertNotNull(serializer);
+
+    InputStream result = serializer.serviceDocument(edm, serviceRoot);
+    assertNotNull(result);
+    String jsonString = StringUtils.inputStreamToString(result, true);
+
+    assertTrue(jsonString.contains("entitySetName1"));
+    assertTrue(jsonString.contains("entitySetName2"));
+    assertFalse(jsonString.contains("entitySetName3"));
+
+    assertTrue(jsonString.contains("functionImport1"));
+    assertTrue(jsonString.contains("functionImport2"));
+    assertFalse(jsonString.contains("functionImport3"));
+
+    assertTrue(jsonString.contains("singleton1"));
+    assertTrue(jsonString.contains("singleton2"));
+    assertTrue(jsonString.contains("singleton3"));
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java
index dfd9871..97be017 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java
@@ -1,18 +1,18 @@
-/* 
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * 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
- *
+ * 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
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
@@ -52,8 +52,8 @@ public class EdmActionImportImplTest {
     FullQualifiedName actionFqn = new FullQualifiedName("namespace", "actionName");
     FullQualifiedName entityContainerFqn = new FullQualifiedName("namespace", "containerName");
     Target target = new Target().setEntityContainer(entityContainerFqn).setTargetName("entitySetName");
-    ActionImport providerActionImport
-            = new ActionImport().setName("actionImportName").setAction(actionFqn).setEntitySet(target);
+    ActionImport providerActionImport =
+        new ActionImport().setName("actionImportName").setAction(actionFqn).setEntitySet(target);
 
     EdmProviderImpl edm = mock(EdmProviderImpl.class);
     container = mock(EdmEntityContainer.class);
@@ -63,7 +63,7 @@ public class EdmActionImportImplTest {
 
     entitySet = mock(EdmEntitySet.class);
     when(container.getEntitySet("entitySetName")).thenReturn(entitySet);
-    actionImport = new EdmActionImportImpl(edm, container, "actionImportName", providerActionImport);
+    actionImport = new EdmActionImportImpl(edm, container, providerActionImport);
   }
 
   @Test
@@ -87,8 +87,8 @@ public class EdmActionImportImplTest {
   public void getReturnedEntitySetNonExistingContainer() {
     Target target = new Target();
     ActionImport providerActionImport = new ActionImport().setName("actionImportName").setEntitySet(target);
-    EdmActionImport actionImport
-            = new EdmActionImportImpl(mock(EdmProviderImpl.class), container, "actionImportName", providerActionImport);
+    EdmActionImport actionImport =
+        new EdmActionImportImpl(mock(EdmProviderImpl.class), container, providerActionImport);
     actionImport.getReturnedEntitySet();
   }
 
@@ -98,7 +98,7 @@ public class EdmActionImportImplTest {
     ActionImport providerActionImport = new ActionImport().setName("actionImportName").setEntitySet(target);
     EdmProviderImpl edm = mock(EdmProviderImpl.class);
     when(edm.getEntityContainer(null)).thenReturn(container);
-    EdmActionImport actionImport = new EdmActionImportImpl(edm, container, "actionImportName", providerActionImport);
+    EdmActionImport actionImport = new EdmActionImportImpl(edm, container, providerActionImport);
     actionImport.getReturnedEntitySet();
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImplTest.java
index 9372de5..d813a27 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImplTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImplTest.java
@@ -26,6 +26,9 @@ import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.olingo.commons.api.ODataException;
 import org.apache.olingo.commons.api.edm.EdmActionImport;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
@@ -36,6 +39,7 @@ import org.apache.olingo.commons.api.edm.EdmSingleton;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.server.api.edm.provider.ActionImport;
 import org.apache.olingo.server.api.edm.provider.EdmProvider;
+import org.apache.olingo.server.api.edm.provider.EntityContainer;
 import org.apache.olingo.server.api.edm.provider.EntityContainerInfo;
 import org.apache.olingo.server.api.edm.provider.EntitySet;
 import org.apache.olingo.server.api.edm.provider.FunctionImport;
@@ -57,6 +61,110 @@ public class EdmEntityContainerImplTest {
         new EntityContainerInfo().setContainerName(new FullQualifiedName("space", "name"));
     container = new EdmEntityContainerImpl(edm, provider, entityContainerInfo);
   }
+  
+  @Test
+  public void getAllEntitySetInitial(){
+    List<EdmEntitySet> entitySets = container.getEntitySets();
+    assertNotNull(entitySets);
+    assertEquals(2, entitySets.size());
+  }
+  
+  @Test
+  public void getAllEntitySetsAfterOneWasAlreadyLoaded(){
+    EdmEntitySet entitySet = container.getEntitySet("entitySetName");
+    List<EdmEntitySet> entitySets = container.getEntitySets();
+    assertNotNull(entitySets);
+    assertEquals(2, entitySets.size());
+    boolean contained = false;
+    for(EdmEntitySet es: entitySets){
+      //Already loaded entity set must be the same 
+      if(es.getName().equals("entitySetName")){
+        assertTrue(entitySet == es);
+        contained = true;
+      }
+    }
+    if(!contained){
+      fail("Should have found entity set in this list.");
+    }
+  }
+  
+  @Test
+  public void getAllSingletonsInitial(){
+    List<EdmSingleton> singletons = container.getSingletons();
+    assertNotNull(singletons);
+    assertEquals(2, singletons.size());
+  }
+  
+  @Test
+  public void getAllSingletonsAfterOneWasAlreadyLoaded(){
+    EdmSingleton singleton = container.getSingleton("singletonName");
+    List<EdmSingleton> singletons = container.getSingletons();
+    assertNotNull(singletons);
+    assertEquals(2, singletons.size());
+    boolean contained = false;
+    for(EdmSingleton s: singletons){
+      //Already loaded singleton must be the same 
+      if(s.getName().equals("singletonName")){
+        assertTrue(singleton == s);
+        contained = true;
+      }
+    }
+    if(!contained){
+      fail("Should have found singleton in this list.");
+    }
+  }
+  
+  @Test
+  public void getAllActionImportsInitial(){
+    List<EdmActionImport> actionImports = container.getActionImports();
+    assertNotNull(actionImports);
+    assertEquals(2, actionImports.size());
+  }
+  
+  @Test
+  public void getAllActionImportsAfterOneWasAlreadyLoaded(){
+    EdmActionImport actionImport = container.getActionImport("actionImportName");
+    List<EdmActionImport> actionImports = container.getActionImports();
+    assertNotNull(actionImports);
+    assertEquals(2, actionImports.size());
+    boolean contained = false;
+    for(EdmActionImport ai: actionImports){
+      //Already loaded action import must be the same 
+      if(ai.getName().equals("actionImportName")){
+        assertTrue(actionImport == ai);
+        contained = true;
+      }
+    }
+    if(!contained){
+      fail("Should have found action import in this list.");
+    }
+  }
+  
+  @Test
+  public void getAllFunctionImportsInitial(){
+    List<EdmFunctionImport> functionImports = container.getFunctionImports();
+    assertNotNull(functionImports);
+    assertEquals(2, functionImports.size());
+  }
+  
+  @Test
+  public void getAllFunctionImportsAfterOneWasAlreadyLoaded(){
+    EdmFunctionImport functionImport = container.getFunctionImport("functionImportName");
+    List<EdmFunctionImport> functionImports = container.getFunctionImports();
+    assertNotNull(functionImports);
+    assertEquals(2, functionImports.size());
+    boolean contained = false;
+    for(EdmFunctionImport fi: functionImports){
+      //Already loaded function import must be the same 
+      if(fi.getName().equals("functionImportName")){
+        assertTrue(functionImport == fi);
+        contained = true;
+      }
+    }
+    if(!contained){
+      fail("Should have found function import in this list.");
+    }
+  }
 
   @Test
   public void checkEdmExceptionConversion() throws Exception {
@@ -190,7 +298,7 @@ public class EdmEntityContainerImplTest {
     public ActionImport getActionImport(final FullQualifiedName entityContainer, final String actionImportName)
         throws ODataException {
       if (actionImportName != null) {
-        return new ActionImport().setName("singletonName");
+        return new ActionImport().setName("actionImportName");
       }
       return null;
     }
@@ -199,9 +307,35 @@ public class EdmEntityContainerImplTest {
     public FunctionImport getFunctionImport(final FullQualifiedName entityContainer, final String functionImportName)
         throws ODataException {
       if (functionImportName != null) {
-        return new FunctionImport().setName("singletonName");
+        return new FunctionImport().setName("functionImportName");
       }
       return null;
     }
+    
+    @Override
+    public EntityContainer getEntityContainer() throws ODataException {
+      EntityContainer container = new EntityContainer();
+      List<EntitySet> entitySets = new ArrayList<EntitySet>();
+      entitySets.add(new EntitySet().setName("entitySetName"));
+      entitySets.add(new EntitySet().setName("entitySetName2"));
+      container.setEntitySets(entitySets );
+      
+      List<Singleton> singletons = new ArrayList<Singleton>();
+      singletons.add(new Singleton().setName("singletonName"));
+      singletons.add(new Singleton().setName("singletonName2"));
+      container.setSingletons(singletons );
+      
+      List<ActionImport> actionImports = new ArrayList<ActionImport>();
+      actionImports.add(new ActionImport().setName("actionImportName"));
+      actionImports.add(new ActionImport().setName("actionImportName2"));
+      container.setActionImports(actionImports );
+      
+      List<FunctionImport> functionImports = new ArrayList<FunctionImport>();
+      functionImports.add(new FunctionImport().setName("functionImportName"));
+      functionImports.add(new FunctionImport().setName("functionImportName2"));
+      container.setFunctionImports(functionImports );
+      
+      return container;
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java
index dde8f3e..6bcc6bd 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java
@@ -244,13 +244,6 @@ public class EdmEntityTypeImplTest {
     assertTrue(property == typeWithBaseType.getProperty("nav2"));
   }
 
-  @Test(expected = EdmException.class)
-  public void noKeyOnTypeWithoutBaseTypeMustResultInException() {
-    EdmProviderImpl edm = mock(EdmProviderImpl.class);
-    EntityType entityType = new EntityType().setName("n");
-    EdmEntityTypeImpl.getInstance(edm, new FullQualifiedName("n", "n"), entityType);
-  }
-
   @Test
   public void abstractTypeDoesNotNeedKey() {
     EdmProviderImpl edm = mock(EdmProviderImpl.class);

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/44aadbd6/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImplTest.java
index d0cd1db..4f4b302 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImplTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImplTest.java
@@ -72,9 +72,9 @@ public class EdmFunctionImportImplTest {
     when(provider.getFunctionImport(containerName, functionImportName)).thenReturn(functionImportProvider);
 
     final EdmFunctionImport functionImport =
-        new EdmFunctionImportImpl(edm, entityContainer, "test", functionImportProvider);
+        new EdmFunctionImportImpl(edm, entityContainer, functionImportProvider);
     assertEquals(functionImportName, entityContainer.getFunctionImport(functionImportName).getName());
-    assertEquals("test", functionImport.getName());
+    assertEquals("functionImport", functionImport.getName());
     final EdmFunction function = functionImport.getFunction(Collections.<String> emptyList());
     assertEquals(functionName.getNamespace(), function.getNamespace());
     assertEquals(functionName.getName(), function.getName());