You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by sk...@apache.org on 2014/03/07 09:59:03 UTC

git commit: [OLINGO-167] service document serialization (json)

Repository: incubator-olingo-odata4
Updated Branches:
  refs/heads/olingo167MetadataDocument bd8f4c592 -> 57f7faaff


[OLINGO-167] service document serialization (json)


Project: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/commit/57f7faaf
Tree: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/tree/57f7faaf
Diff: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/diff/57f7faaf

Branch: refs/heads/olingo167MetadataDocument
Commit: 57f7faaffc8fcd2d225e2c28f5941a53f1fede15
Parents: bd8f4c5
Author: Stephan Klevenz <st...@sap.com>
Authored: Thu Mar 6 17:37:25 2014 +0100
Committer: Stephan Klevenz <st...@sap.com>
Committed: Fri Mar 7 09:58:23 2014 +0100

----------------------------------------------------------------------
 .../olingo/odata4/commons/api/edm/Edm.java      |  1 +
 .../commons/api/edm/EdmEntityContainer.java     |  8 ++
 .../odata4/commons/api/edm/EdmEntitySet.java    |  2 +
 .../commons/api/edm/EdmFunctionImport.java      |  2 +
 .../api/edm/provider/EntityContainerInfo.java   | 13 +++
 odata4-lib/odata4-server-core/pom.xml           |  4 +
 .../edm/provider/EdmEntityContainerImpl.java    | 63 ++++++++++---
 .../core/edm/provider/EdmEntitySetImpl.java     | 11 ++-
 .../edm/provider/EdmFunctionImportImpl.java     |  5 +
 .../core/edm/provider/EdmProviderImpl.java      |  1 +
 .../core/edm/provider/EdmSingletonImpl.java     |  1 +
 .../serializer/json/ODataJsonSerializer.java    | 97 +++++++++++++++++--
 .../core/serializer/ServiceDocumentTest.java    | 99 ++++++++++++++++++--
 .../server/core/testutil/EdmTechProvider.java   |  6 +-
 pom.xml                                         |  6 ++
 15 files changed, 284 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/57f7faaf/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/Edm.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/Edm.java b/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/Edm.java
index 635b342..c4623c1 100644
--- a/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/Edm.java
+++ b/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/Edm.java
@@ -92,4 +92,5 @@ public interface Edm {
    * @return {@link EdmServiceMetadata}
    */
   EdmServiceMetadata getServiceMetadata();
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/57f7faaf/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmEntityContainer.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmEntityContainer.java b/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmEntityContainer.java
index dd8af30..9f86c25 100644
--- a/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmEntityContainer.java
+++ b/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmEntityContainer.java
@@ -18,6 +18,8 @@
  ******************************************************************************/
 package org.apache.olingo.odata4.commons.api.edm;
 
+import java.util.Collection;
+
 /**
  * A CSDL EntityContainer element
  * 
@@ -58,4 +60,10 @@ public interface EdmEntityContainer extends EdmNamed {
    */
   EdmFunctionImport getFunctionImport(String name);
 
+  Collection<EdmEntitySet> getEntitySets();
+
+  Collection<EdmFunctionImport> getFunctionImports();
+
+  Collection<EdmSingleton> getSingletons();
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/57f7faaf/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmEntitySet.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmEntitySet.java b/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmEntitySet.java
index 3eed41e..0474aca 100644
--- a/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmEntitySet.java
+++ b/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmEntitySet.java
@@ -25,4 +25,6 @@ package org.apache.olingo.odata4.commons.api.edm;
  */
 public interface EdmEntitySet extends EdmBindingTarget {
 
+  boolean isIncludeInServiceDocument();
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/57f7faaf/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmFunctionImport.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmFunctionImport.java b/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmFunctionImport.java
index fb561e1..a686be4 100644
--- a/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmFunctionImport.java
+++ b/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/odata4/commons/api/edm/EdmFunctionImport.java
@@ -27,4 +27,6 @@ public interface EdmFunctionImport extends EdmOperationImport {
 
   public EdmFunction getFunction(List<String> parameterNames);
 
+  public boolean includeInServiceDocument();
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/57f7faaf/odata4-lib/odata4-server-api/src/main/java/org/apache/olingo/odata4/server/api/edm/provider/EntityContainerInfo.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-server-api/src/main/java/org/apache/olingo/odata4/server/api/edm/provider/EntityContainerInfo.java b/odata4-lib/odata4-server-api/src/main/java/org/apache/olingo/odata4/server/api/edm/provider/EntityContainerInfo.java
index 3f83b8d..70372f3 100644
--- a/odata4-lib/odata4-server-api/src/main/java/org/apache/olingo/odata4/server/api/edm/provider/EntityContainerInfo.java
+++ b/odata4-lib/odata4-server-api/src/main/java/org/apache/olingo/odata4/server/api/edm/provider/EntityContainerInfo.java
@@ -18,11 +18,15 @@
  ******************************************************************************/
 package org.apache.olingo.odata4.server.api.edm.provider;
 
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.olingo.odata4.commons.api.edm.FullQualifiedName;
 
 public class EntityContainerInfo {
   private FullQualifiedName containerName;
   private FullQualifiedName extendsContainer;
+  private List<String> entitySetNames;
 
   public FullQualifiedName getContainerName() {
     return containerName;
@@ -42,4 +46,13 @@ public class EntityContainerInfo {
     return this;
   }
 
+  public EntityContainerInfo setEntitySetNames(List<String> names) {
+    entitySetNames = names;
+    return this;
+  }
+
+  public List<String> getEntitySetNames() {
+    return Collections.unmodifiableList(entitySetNames);
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/57f7faaf/odata4-lib/odata4-server-core/pom.xml
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-server-core/pom.xml b/odata4-lib/odata4-server-core/pom.xml
index 8343b1e..eb84685 100644
--- a/odata4-lib/odata4-server-core/pom.xml
+++ b/odata4-lib/odata4-server-core/pom.xml
@@ -52,6 +52,10 @@
       <artifactId>jackson-core</artifactId>
       <version>2.2.3</version>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
     <!-- <dependency> -->
     <!-- <groupId>com.fasterxml.jackson.core</groupId> -->
     <!-- <artifactId>jackson-databind</artifactId> -->

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/57f7faaf/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmEntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmEntityContainerImpl.java b/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmEntityContainerImpl.java
index 8908406..36b6060 100644
--- a/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmEntityContainerImpl.java
+++ b/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmEntityContainerImpl.java
@@ -18,7 +18,10 @@
  ******************************************************************************/
 package org.apache.olingo.odata4.server.core.edm.provider;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.olingo.odata4.commons.api.ODataException;
@@ -44,12 +47,14 @@ public class EdmEntityContainerImpl extends EdmNamedImpl implements EdmEntityCon
   private final Map<String, EdmEntitySet> entitySets = new HashMap<String, EdmEntitySet>();
   private final Map<String, EdmActionImport> actionImports = new HashMap<String, EdmActionImport>();
   private final Map<String, EdmFunctionImport> functionImports = new HashMap<String, EdmFunctionImport>();
+  private EntityContainerInfo entityContainerInfo;
 
   public EdmEntityContainerImpl(final EdmProviderImpl edm, final EdmProvider provider,
       final EntityContainerInfo entityContainerInfo) {
     super(edm, entityContainerInfo.getContainerName().getName());
     this.provider = provider;
     entityContainerName = entityContainerInfo.getContainerName();
+    this.entityContainerInfo = entityContainerInfo;
   }
 
   @Override
@@ -78,21 +83,14 @@ public class EdmEntityContainerImpl extends EdmNamedImpl implements EdmEntityCon
 
   @Override
   public EdmEntitySet getEntitySet(final String entitySetName) {
-    EdmEntitySet entitySet = entitySets.get(entitySetName);
-    if (entitySet == null) {
-      try {
-        EntitySet providerEntitySet = provider.getEntitySet(entityContainerName, entitySetName);
-        if (providerEntitySet != null) {
-          entitySet = new EdmEntitySetImpl(edm, this, providerEntitySet);
-          if (entitySet != null) {
-            entitySets.put(entitySetName, entitySet);
-          }
-        }
-      } catch (ODataException e) {
-        throw new EdmException(e);
-      }
+    try {
+      loadEntitySet(entitySetName);
+      EdmEntitySet entitySet = entitySets.get(entitySetName);
+
+      return entitySet;
+    } catch (ODataException e) {
+      throw new EdmException(e);
     }
-    return entitySet;
   }
 
   @Override
@@ -133,4 +131,41 @@ public class EdmEntityContainerImpl extends EdmNamedImpl implements EdmEntityCon
     return functionImport;
   }
 
+  private void loadEntitySet(String name) throws ODataException {
+    if (!entitySets.containsKey(name)) {
+      EntitySet providerEntitySet = provider.getEntitySet(entityContainerName, name);
+      if (providerEntitySet != null) {
+        EdmEntitySetImpl entitySet = new EdmEntitySetImpl(edm, this, providerEntitySet);
+        if (entitySet != null) {
+          entitySets.put(name, entitySet);
+        }
+      }
+    }
+  }
+
+  @Override
+  public Collection<EdmEntitySet> getEntitySets() {
+    try {
+      List<String> names = entityContainerInfo.getEntitySetNames();
+
+      for (String name : names) {
+        loadEntitySet(name);
+      }
+
+      return Collections.unmodifiableCollection(entitySets.values());
+    } catch (ODataException e) {
+      throw new EdmException(e);
+    }
+  }
+
+  @Override
+  public Collection<EdmFunctionImport> getFunctionImports() {
+    return null;
+  }
+
+  @Override
+  public Collection<EdmSingleton> getSingletons() {
+    return null;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/57f7faaf/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmEntitySetImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmEntitySetImpl.java b/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmEntitySetImpl.java
index 61868d4..53bd6f3 100644
--- a/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmEntitySetImpl.java
+++ b/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmEntitySetImpl.java
@@ -24,8 +24,17 @@ import org.apache.olingo.odata4.server.api.edm.provider.EntitySet;
 
 public class EdmEntitySetImpl extends EdmBindingTargetImpl implements EdmEntitySet {
 
+  private EntitySet entitySet;
+
   public EdmEntitySetImpl(final EdmProviderImpl edm, final EdmEntityContainer container, final EntitySet entitySet) {
-    super(edm, container, 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/57f7faaf/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmFunctionImportImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmFunctionImportImpl.java b/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmFunctionImportImpl.java
index 42e04b9..3577acc 100644
--- a/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmFunctionImportImpl.java
+++ b/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmFunctionImportImpl.java
@@ -40,4 +40,9 @@ public class EdmFunctionImportImpl extends EdmOperationImportImpl implements Edm
     return edm.getFunction(functionImport.getFunction(), null, null, parameterNames);
   }
 
+  @Override
+  public boolean includeInServiceDocument() {
+    return false;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/57f7faaf/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmProviderImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmProviderImpl.java b/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmProviderImpl.java
index a7594ad..700f019 100644
--- a/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmProviderImpl.java
+++ b/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmProviderImpl.java
@@ -291,4 +291,5 @@ public class EdmProviderImpl extends EdmImpl {
       throw new EdmException(e);
     }
   }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/57f7faaf/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmSingletonImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmSingletonImpl.java b/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmSingletonImpl.java
index f98a328..79ad0b4 100644
--- a/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmSingletonImpl.java
+++ b/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/edm/provider/EdmSingletonImpl.java
@@ -27,4 +27,5 @@ public class EdmSingletonImpl extends EdmBindingTargetImpl implements EdmSinglet
   public EdmSingletonImpl(final EdmProviderImpl edm, final EdmEntityContainer container, final Singleton singleton) {
     super(edm, container, singleton);
   }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/57f7faaf/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/serializer/json/ODataJsonSerializer.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/serializer/json/ODataJsonSerializer.java b/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/serializer/json/ODataJsonSerializer.java
index 130d345..4e15980 100644
--- a/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/serializer/json/ODataJsonSerializer.java
+++ b/odata4-lib/odata4-server-core/src/main/java/org/apache/olingo/odata4/server/core/serializer/json/ODataJsonSerializer.java
@@ -22,20 +22,41 @@ import java.io.BufferedWriter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStreamWriter;
+import java.util.List;
 
 import org.apache.olingo.odata4.commons.api.ODataRuntimeException;
 import org.apache.olingo.odata4.commons.api.edm.Edm;
+import org.apache.olingo.odata4.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.odata4.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.odata4.commons.api.edm.EdmFunctionImport;
+import org.apache.olingo.odata4.commons.api.edm.EdmSingleton;
 import org.apache.olingo.odata4.server.api.ODataSerializer;
 import org.apache.olingo.odata4.server.core.CircleStreamBuffer;
+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!");
@@ -43,20 +64,28 @@ public class ODataJsonSerializer implements ODataSerializer {
 
   @Override
   public InputStream serviceDocument(Edm edm, String serviceRoot) {
+    CircleStreamBuffer buffer;
+    BufferedWriter writer;
+    JsonFactory factory;
+    JsonGenerator gen = null;
 
     try {
-      CircleStreamBuffer buffer = new CircleStreamBuffer();
-      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(buffer.getOutputStream(), DEFAULT_CHARSET));
+      buffer = new CircleStreamBuffer();
+      writer = new BufferedWriter(new OutputStreamWriter(buffer.getOutputStream(), DEFAULT_CHARSET));
+      factory = new JsonFactory();
+      gen = factory.createGenerator(writer);
 
-      JsonFactory factory = new JsonFactory();
-      JsonGenerator gen = factory.createGenerator(writer);
-      
       gen.setPrettyPrinter(new DefaultPrettyPrinter());
 
       gen.writeStartObject();
-      gen.writeObjectField("bla1", new Integer(3));
-      gen.writeObjectField("bla2", new Integer(3));
-      gen.writeEndObject();
+
+      Object metadataUri = serviceRoot + "/" + METADATA;
+      gen.writeObjectField(ODATA_CONTEXT, metadataUri);
+      gen.writeArrayFieldStart(VALUE);
+
+      writeEntitySets(gen, edm);
+      writeFunctionImports(gen, edm);
+      writeSingletons(gen, edm);
 
       gen.close();
 
@@ -64,9 +93,57 @@ public class ODataJsonSerializer implements ODataSerializer {
 //      buffer.closeWrite();
 
       return buffer.getInputStream();
-      
-    } catch (IOException e) {
+
+    } 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.includeInServiceDocument()) {
+        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/57f7faaf/odata4-lib/odata4-server-core/src/test/java/org/apache/olingo/odata4/server/core/serializer/ServiceDocumentTest.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-server-core/src/test/java/org/apache/olingo/odata4/server/core/serializer/ServiceDocumentTest.java b/odata4-lib/odata4-server-core/src/test/java/org/apache/olingo/odata4/server/core/serializer/ServiceDocumentTest.java
index c0f9b5c..228a0b9 100644
--- a/odata4-lib/odata4-server-core/src/test/java/org/apache/olingo/odata4/server/core/serializer/ServiceDocumentTest.java
+++ b/odata4-lib/odata4-server-core/src/test/java/org/apache/olingo/odata4/server/core/serializer/ServiceDocumentTest.java
@@ -15,30 +15,98 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
- */ 
+ */
 package org.apache.olingo.odata4.server.core.serializer;
 
-import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
 
 import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 
 import org.apache.olingo.odata4.commons.api.edm.Edm;
+import org.apache.olingo.odata4.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.odata4.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.odata4.commons.api.edm.EdmFunctionImport;
+import org.apache.olingo.odata4.commons.api.edm.EdmSingleton;
+import org.apache.olingo.odata4.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.odata4.server.api.ODataFormat;
 import org.apache.olingo.odata4.server.api.ODataSerializer;
 import org.apache.olingo.odata4.server.api.ODataServer;
-import org.apache.olingo.odata4.server.core.edm.provider.EdmProviderImpl;
-import org.apache.olingo.odata4.server.core.testutil.EdmTechProvider;
 import org.apache.olingo.odata4.server.core.testutil.StringUtil;
+import org.junit.Before;
 import org.junit.Test;
 
 public class ServiceDocumentTest {
-  
-  private Edm edm = new EdmProviderImpl(new EdmTechProvider());
+
+  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);
+
+    Collection<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.includeInServiceDocument()).thenReturn(true);
+
+    EdmFunctionImport functionImport2 = mock(EdmFunctionImport.class);
+    when(functionImport2.getName()).thenReturn("functionImport2");
+    when(functionImport2.includeInServiceDocument()).thenReturn(true);
+
+    EdmFunctionImport functionImport3 = mock(EdmFunctionImport.class);
+    when(functionImport3.getName()).thenReturn("functionImport3");
+    when(functionImport3.includeInServiceDocument()).thenReturn(false);
+
+    Collection<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");
+
+    Collection<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);
 
@@ -47,7 +115,20 @@ public class ServiceDocumentTest {
 
     InputStream result = serializer.serviceDocument(edm, serviceRoot);
     assertNotNull(result);
-    
-    System.out.println(StringUtil.inputStreamToString(result, true));
+    String jsonString = StringUtil.inputStreamToString(result, true);
+
+    System.out.println(jsonString);
+
+    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/57f7faaf/odata4-lib/odata4-server-core/src/test/java/org/apache/olingo/odata4/server/core/testutil/EdmTechProvider.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-server-core/src/test/java/org/apache/olingo/odata4/server/core/testutil/EdmTechProvider.java b/odata4-lib/odata4-server-core/src/test/java/org/apache/olingo/odata4/server/core/testutil/EdmTechProvider.java
index 1be927d..d85a073 100644
--- a/odata4-lib/odata4-server-core/src/test/java/org/apache/olingo/odata4/server/core/testutil/EdmTechProvider.java
+++ b/odata4-lib/odata4-server-core/src/test/java/org/apache/olingo/odata4/server/core/testutil/EdmTechProvider.java
@@ -365,8 +365,12 @@ public class EdmTechProvider extends EdmProvider {
       .setName("CollPropertyTimeOfDay")
       .setType(nameTimeOfDay)
       .setCollection(true);
+  
+  ArrayList<String> entitySetNames = new ArrayList<String>();
+  
+  
   EntityContainerInfo entityContainerInfoTest1 =
-      new EntityContainerInfo().setContainerName(nameContainer);
+      new EntityContainerInfo().setContainerName(nameContainer).setEntitySetNames(entitySetNames);
   NavigationProperty navPropertyETKeyNavOne_ETKeyNav = new NavigationProperty()
       .setName("NavPropertyETKeyNavOne")
       .setType(nameETKeyNav);

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/57f7faaf/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 953fb30..2eb4f8b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -116,6 +116,12 @@
         <artifactId>slf4j-api</artifactId>
         <version>${sl4j.version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.slf4j</groupId>
+        <artifactId>slf4j-log4j12</artifactId>
+        <version>${sl4j.version}</version>
+        <scope>test</scope>
+      </dependency>
     </dependencies>
   </dependencyManagement>