You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ra...@apache.org on 2018/03/20 08:24:57 UTC

olingo-odata4 git commit: [OLINGO-1249]OData Client API issue: Have a means to validate if a document isv4Metadata or isServiceDoc

Repository: olingo-odata4
Updated Branches:
  refs/heads/master 1a739d46b -> eea324d5a


[OLINGO-1249]OData Client API issue:  Have a means to validate if a document isv4Metadata or isServiceDoc


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

Branch: refs/heads/master
Commit: eea324d5a67ac346695937dd49e4a9c775cfb501
Parents: 1a739d4
Author: ramya vasanth <ra...@sap.com>
Authored: Tue Mar 20 13:54:47 2018 +0530
Committer: ramya vasanth <ra...@sap.com>
Committed: Tue Mar 20 13:54:47 2018 +0530

----------------------------------------------------------------------
 .../olingo/client/api/edm/xml/XMLMetadata.java  | 117 +++---
 .../serialization/ODataMetadataValidation.java  |  12 +
 .../client/core/edm/ClientCsdlXMLMetadata.java  | 166 ++++----
 .../metadatavalidator/CsdlTypeValidator.java    |  47 +++
 .../ClientODataDeserializerImpl.java            | 393 +++++++++++--------
 .../ODataMetadataValidationImpl.java            |  10 +
 .../client/core/MetadataValidationTest.java     | 170 ++++++++
 7 files changed, 624 insertions(+), 291 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/eea324d5/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/XMLMetadata.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/XMLMetadata.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/XMLMetadata.java
index 74191cf..26013e5 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/XMLMetadata.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/XMLMetadata.java
@@ -1,57 +1,60 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.client.api.edm.xml;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
-
-/**
- * Entry point for access information about EDM metadata.
- */
-public interface XMLMetadata {
-
-  /**
-   * Returns the Schema at the specified position in the EdM metadata document.
-   *
-   * @param index index of the Schema to return
-   * @return the Schema at the specified position in the EdM metadata document
-   */
-  CsdlSchema getSchema(final int index);
-
-  /**
-   * Returns the Schema with the specified key (namespace or alias) in the EdM metadata document.
-   *
-   * @param key namespace or alias
-   * @return the Schema with the specified key in the EdM metadata document
-   */
-  CsdlSchema getSchema(final String key);
-
-  /**
-   * Returns all Schema objects defined in the EdM metadata document.
-   *
-   * @return all Schema objects defined in the EdM metadata document
-   */
-  List<CsdlSchema> getSchemas();
-
-  Map<String, CsdlSchema> getSchemaByNsOrAlias();
-  
-  List<Reference> getReferences();
-}
+/*
+ * 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.client.api.edm.xml;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
+
+/**
+ * Entry point for access information about EDM metadata.
+ */
+public interface XMLMetadata {
+
+  /**
+   * Returns the Schema at the specified position in the EdM metadata document.
+   *
+   * @param index index of the Schema to return
+   * @return the Schema at the specified position in the EdM metadata document
+   */
+  CsdlSchema getSchema(final int index);
+
+  /**
+   * Returns the Schema with the specified key (namespace or alias) in the EdM metadata document.
+   *
+   * @param key namespace or alias
+   * @return the Schema with the specified key in the EdM metadata document
+   */
+  CsdlSchema getSchema(final String key);
+
+  /**
+   * Returns all Schema objects defined in the EdM metadata document.
+   *
+   * @return all Schema objects defined in the EdM metadata document
+   */
+  List<CsdlSchema> getSchemas();
+
+  Map<String, CsdlSchema> getSchemaByNsOrAlias();
+  
+  List<Reference> getReferences();
+  
+  List<List<String>> getSchemaNamespaces();
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/eea324d5/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataMetadataValidation.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataMetadataValidation.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataMetadataValidation.java
index f1bf5ef..86533f3 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataMetadataValidation.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataMetadataValidation.java
@@ -34,4 +34,16 @@ public interface ODataMetadataValidation {
    * @param xmlMetadata
    */
   void validateMetadata(XMLMetadata xmlMetadata);
+  
+  /**
+   * This method checks if if its a V4 metadata based on the XMLMetadata provided
+   * @param xmlMetadata
+   */
+  boolean isV4Metadata(XMLMetadata xmlMetadata)throws Exception;
+  
+  /**
+   * This method checks if if its a service document based on the XMLMetadata provided
+   * @param xmlMetadata
+   */
+  boolean isServiceDocument(XMLMetadata xmlMetadata);
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/eea324d5/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/ClientCsdlXMLMetadata.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/ClientCsdlXMLMetadata.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/ClientCsdlXMLMetadata.java
index ac4f3e1..1507778 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/ClientCsdlXMLMetadata.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/ClientCsdlXMLMetadata.java
@@ -1,76 +1,90 @@
-/*
- * 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.client.core.edm;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.olingo.client.api.edm.xml.Edmx;
-import org.apache.olingo.client.api.edm.xml.Reference;
-import org.apache.olingo.client.api.edm.xml.XMLMetadata;
-import org.apache.olingo.commons.api.edm.provider.CsdlAbstractEdmItem;
-import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
-
-/**
- * Entry point for access information about EDM metadata.
- */
-public class ClientCsdlXMLMetadata extends CsdlAbstractEdmItem implements Serializable, XMLMetadata {
-
-  private static final long serialVersionUID = 6025723060298454901L;
-  protected final Edmx edmx;
-
-  public ClientCsdlXMLMetadata(final Edmx edmx) {
-    this.edmx = edmx;
-  }
-
-  @Override
-  public List<CsdlSchema> getSchemas() {
-    return this.edmx.getDataServices().getSchemas();
-  }
-
-  @Override
-  public CsdlSchema getSchema(final int index) {
-    return getSchemas().get(index);
-  }
-
-  @Override
-  public CsdlSchema getSchema(final String key) {
-    return getSchemaByNsOrAlias().get(key);
-  }
-
-  @Override
-  public Map<String, CsdlSchema> getSchemaByNsOrAlias() {
-    final Map<String, CsdlSchema> schemaByNsOrAlias = new HashMap<String, CsdlSchema>();
-    for (CsdlSchema schema : getSchemas()) {
-      schemaByNsOrAlias.put(schema.getNamespace(), schema);
-      if (StringUtils.isNotBlank(schema.getAlias())) {
-        schemaByNsOrAlias.put(schema.getAlias(), schema);
-      }
-    }
-    return schemaByNsOrAlias;
-  }
-
-  @Override
-  public List<Reference> getReferences() {
-    return this.edmx.getReferences();
-  }
-}
+/*
+ * 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.client.core.edm;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.olingo.client.api.edm.xml.Edmx;
+import org.apache.olingo.client.api.edm.xml.Reference;
+import org.apache.olingo.client.api.edm.xml.XMLMetadata;
+import org.apache.olingo.commons.api.edm.provider.CsdlAbstractEdmItem;
+import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
+
+/**
+ * Entry point for access information about EDM metadata.
+ */
+public class ClientCsdlXMLMetadata extends CsdlAbstractEdmItem implements Serializable, XMLMetadata {
+
+  private static final long serialVersionUID = 6025723060298454901L;
+  protected final Edmx edmx;
+  private  List<List<String>> schemaNameSpaces = null;
+
+  public ClientCsdlXMLMetadata(final Edmx edmx) {
+    this.edmx = edmx;
+  }
+  public ClientCsdlXMLMetadata(final Edmx edmx,final List<List<String>> schemaNameSpaces) {
+	    this.edmx = edmx;
+	    this.schemaNameSpaces = schemaNameSpaces;
+  }
+  
+ 
+  
+  @Override
+  public List<List<String>> getSchemaNamespaces() {
+		return schemaNameSpaces;
+	}
+	
+
+
+  @Override
+  public List<CsdlSchema> getSchemas() {
+    return this.edmx.getDataServices().getSchemas();
+  }
+
+  @Override
+  public CsdlSchema getSchema(final int index) {
+    return getSchemas().get(index);
+  }
+
+  @Override
+  public CsdlSchema getSchema(final String key) {
+    return getSchemaByNsOrAlias().get(key);
+  }
+
+  @Override
+  public Map<String, CsdlSchema> getSchemaByNsOrAlias() {
+    final Map<String, CsdlSchema> schemaByNsOrAlias = new HashMap<String, CsdlSchema>();
+    for (CsdlSchema schema : getSchemas()) {
+      schemaByNsOrAlias.put(schema.getNamespace(), schema);
+      if (StringUtils.isNotBlank(schema.getAlias())) {
+        schemaByNsOrAlias.put(schema.getAlias(), schema);
+      }
+    }
+    return schemaByNsOrAlias;
+  }
+
+  @Override
+  public List<Reference> getReferences() {
+    return this.edmx.getReferences();
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/eea324d5/lib/client-core/src/main/java/org/apache/olingo/client/core/metadatavalidator/CsdlTypeValidator.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/metadatavalidator/CsdlTypeValidator.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/metadatavalidator/CsdlTypeValidator.java
index fbb28d0..4eef836 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/metadatavalidator/CsdlTypeValidator.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/metadatavalidator/CsdlTypeValidator.java
@@ -19,10 +19,13 @@
 package org.apache.olingo.client.core.metadatavalidator;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.Map.Entry;
 
+import org.apache.olingo.client.api.edm.xml.XMLMetadata;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.provider.CsdlAction;
 import org.apache.olingo.commons.api.edm.provider.CsdlActionImport;
@@ -34,6 +37,7 @@ import org.apache.olingo.commons.api.edm.provider.CsdlFunction;
 import org.apache.olingo.commons.api.edm.provider.CsdlFunctionImport;
 import org.apache.olingo.commons.api.edm.provider.CsdlNavigationProperty;
 import org.apache.olingo.commons.api.edm.provider.CsdlNavigationPropertyBinding;
+import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
 import org.apache.olingo.commons.api.edm.provider.CsdlStructuralType;
 
 public class CsdlTypeValidator {
@@ -49,7 +53,12 @@ public class CsdlTypeValidator {
       new HashMap<FullQualifiedName, CsdlAction>();
   private Map<FullQualifiedName, CsdlFunction> csdlFunctionsMap = 
       new HashMap<FullQualifiedName, CsdlFunction>();
+  private static final String V4_SCHEMA_XMLNS = 
+		  "http://docs.oasis-open.org/odata/ns/edm";
   
+  public CsdlTypeValidator(){
+	  
+  }
   /**
    * 
    * @param aliasNamespaceMap
@@ -492,4 +501,42 @@ public class CsdlTypeValidator {
     }
     return fqName;
   }
+  /**
+   * This checks if XmlMetadata is V4 OData version.
+   * @param xmlMetadata
+   * @return boolean
+   * @throws Exception
+   */
+  public boolean isV4MetaData(XMLMetadata xmlMetadata) throws Exception {
+	boolean isV4doc = true;
+	List<List<String>>schemaNameSpaces = xmlMetadata.getSchemaNamespaces();
+	if (schemaNameSpaces == null || schemaNameSpaces.isEmpty()) {
+		throw new Exception("Cannot determine if v4 metadata," 
+				+ "No schemanamespaces found in XMLMetadata");
+	}
+	for(List<String> nameSpaces:schemaNameSpaces){
+		if(!nameSpaces.contains(V4_SCHEMA_XMLNS)){
+			isV4doc = false;
+		}
+	}
+	return isV4doc;
+}
+  /**
+   * This checks if XMLMetadata is a service document.
+   * @param xmlMetadata
+   * @return boolean
+   */
+  public boolean isServiceDocument(XMLMetadata xmlMetadata){
+	boolean isServDoc = false;
+	List<CsdlSchema> schemas = xmlMetadata.getSchemas();
+	for (CsdlSchema schema : schemas) {
+		// for metadata to be a service document it should have an entity
+		// container
+		if (schema.getEntityContainer() != null) {
+			isServDoc = true;
+			break;
+		}
+	}
+	return isServDoc;  
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/eea324d5/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ClientODataDeserializerImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ClientODataDeserializerImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ClientODataDeserializerImpl.java
index fcb2ca0..9d02bab 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ClientODataDeserializerImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ClientODataDeserializerImpl.java
@@ -1,158 +1,235 @@
-/*
- * 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.client.core.serialization;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.stream.XMLStreamException;
-
-import org.apache.olingo.client.api.data.ResWrap;
-import org.apache.olingo.client.api.data.ServiceDocument;
-import org.apache.olingo.client.api.edm.xml.XMLMetadata;
-import org.apache.olingo.client.api.serialization.ClientODataDeserializer;
-import org.apache.olingo.client.api.serialization.ODataDeserializer;
-import org.apache.olingo.client.api.serialization.ODataDeserializerException;
-import org.apache.olingo.client.core.data.JSONServiceDocumentDeserializer;
-import org.apache.olingo.client.core.data.XMLServiceDocumentDeserializer;
-import org.apache.olingo.client.core.edm.ClientCsdlXMLMetadata;
-import org.apache.olingo.client.core.edm.xml.ClientCsdlEdmx;
-import org.apache.olingo.commons.api.data.Delta;
-import org.apache.olingo.commons.api.data.Entity;
-import org.apache.olingo.commons.api.data.EntityCollection;
-import org.apache.olingo.commons.api.data.Property;
-import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
-import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
-import org.apache.olingo.commons.api.ex.ODataError;
-import org.apache.olingo.commons.api.format.ContentType;
-
-import com.fasterxml.aalto.stax.InputFactoryImpl;
-import com.fasterxml.aalto.stax.OutputFactoryImpl;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.InjectableValues;
-import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
-import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
-import com.fasterxml.jackson.dataformat.xml.XmlFactory;
-import com.fasterxml.jackson.dataformat.xml.XmlMapper;
-
-public class ClientODataDeserializerImpl implements ClientODataDeserializer {
-
-  private final ODataDeserializer deserializer;
-  private final ContentType contentType;
-
-  public ClientODataDeserializerImpl(final boolean serverMode, final ContentType contentType) {
-    this.contentType = contentType;
-    if (contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
-        || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML)
-        || contentType.isCompatible(ContentType.APPLICATION_XML)) {
-      deserializer = new AtomDeserializer();
-    } else {
-      deserializer = new JsonDeserializer(serverMode);
-    }
-  }
-
-  @Override
-  public ResWrap<EntityCollection> toEntitySet(final InputStream input) throws ODataDeserializerException {
-    return deserializer.toEntitySet(input);
-  }
-
-  @Override
-  public ResWrap<Entity> toEntity(final InputStream input) throws ODataDeserializerException {
-    return deserializer.toEntity(input);
-  }
-
-  @Override
-  public ResWrap<Property> toProperty(final InputStream input) throws ODataDeserializerException {
-    return deserializer.toProperty(input);
-  }
-
-  @Override
-  public ODataError toError(final InputStream input) throws ODataDeserializerException {
-    return deserializer.toError(input);
-  }
-
-  protected XmlMapper getXmlMapper() {
-    final XmlMapper xmlMapper = new XmlMapper(
-        new XmlFactory(new InputFactoryImpl(), new OutputFactoryImpl()), new JacksonXmlModule());
-
-    xmlMapper.setInjectableValues(new InjectableValues.Std().addValue(Boolean.class, Boolean.FALSE));
-
-    xmlMapper.addHandler(new DeserializationProblemHandler() {
-      @Override
-      public boolean handleUnknownProperty(final DeserializationContext ctxt, final JsonParser jp,
-          final com.fasterxml.jackson.databind.JsonDeserializer<?> deserializer,
-          final Object beanOrClass, final String propertyName)
-          throws IOException, JsonProcessingException {
-
-        // skip any unknown property
-        ctxt.getParser().skipChildren();
-        return true;
-      }
-    });
-    return xmlMapper;
-  }
-
-  @Override
-  public XMLMetadata toMetadata(final InputStream input) {
-    try {
-      return new ClientCsdlXMLMetadata(getXmlMapper().readValue(input, ClientCsdlEdmx.class));
-    } catch (Exception e) {
-      throw new IllegalArgumentException("Could not parse as Edmx document", e);
-    }
-  }
-
-  @Override
-  public ResWrap<ServiceDocument> toServiceDocument(final InputStream input) throws ODataDeserializerException {
-    return contentType.isCompatible(ContentType.APPLICATION_XML) ?
-        new XMLServiceDocumentDeserializer(false).toServiceDocument(input) :
-        new JSONServiceDocumentDeserializer(false).toServiceDocument(input);
-  }
-
-  @Override
-  public ResWrap<Delta> toDelta(final InputStream input) throws ODataDeserializerException {
-    try {
-      return contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
-          || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML) ?
-          new AtomDeserializer().delta(input) :
-          new JsonDeltaDeserializer(false).toDelta(input);
-    } catch (final XMLStreamException e) {
-      throw new ODataDeserializerException(e);
-    } catch (final EdmPrimitiveTypeException e) {
-      throw new ODataDeserializerException(e);
-    }
-  }
-
-  @Override
-  public List<CsdlSchema> fetchTermDefinitionSchema(List<InputStream> input) {
-    List<CsdlSchema> schemas = new ArrayList<CsdlSchema>();
-    try {
-      for (InputStream stream : input) {
-        ClientCsdlEdmx edmx = getXmlMapper().readValue(stream, ClientCsdlEdmx.class);
-        schemas.addAll(edmx.getDataServices().getSchemas());
-      }
-      return schemas;
-    } catch (Exception e) {
-      throw new IllegalArgumentException("Could not parse Term definition", e);
-    }
-  }
-}
+/*
+ * 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.client.core.serialization;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.olingo.client.api.data.ResWrap;
+import org.apache.olingo.client.api.data.ServiceDocument;
+import org.apache.olingo.client.api.edm.xml.Edmx;
+import org.apache.olingo.client.api.edm.xml.XMLMetadata;
+import org.apache.olingo.client.api.serialization.ClientODataDeserializer;
+import org.apache.olingo.client.api.serialization.ODataDeserializer;
+import org.apache.olingo.client.api.serialization.ODataDeserializerException;
+import org.apache.olingo.client.core.data.JSONServiceDocumentDeserializer;
+import org.apache.olingo.client.core.data.XMLServiceDocumentDeserializer;
+import org.apache.olingo.client.core.edm.ClientCsdlXMLMetadata;
+import org.apache.olingo.client.core.edm.xml.ClientCsdlEdmx;
+import org.apache.olingo.commons.api.data.Delta;
+import org.apache.olingo.commons.api.data.Entity;
+import org.apache.olingo.commons.api.data.EntityCollection;
+import org.apache.olingo.commons.api.data.Property;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
+import org.apache.olingo.commons.api.ex.ODataError;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import com.fasterxml.aalto.stax.InputFactoryImpl;
+import com.fasterxml.aalto.stax.OutputFactoryImpl;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.InjectableValues;
+import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
+import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
+import com.fasterxml.jackson.dataformat.xml.XmlFactory;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+
+public class ClientODataDeserializerImpl implements ClientODataDeserializer {
+
+  private final ODataDeserializer deserializer;
+  private final ContentType contentType;
+  private static final String SCHEMA = "Schema";
+  private static final String XMLNS = "xmlns";
+
+  public ClientODataDeserializerImpl(final boolean serverMode, final ContentType contentType) {
+    this.contentType = contentType;
+    if (contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
+        || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML)
+        || contentType.isCompatible(ContentType.APPLICATION_XML)) {
+      deserializer = new AtomDeserializer();
+    } else {
+      deserializer = new JsonDeserializer(serverMode);
+    }
+  }
+
+  @Override
+  public ResWrap<EntityCollection> toEntitySet(final InputStream input) throws ODataDeserializerException {
+    return deserializer.toEntitySet(input);
+  }
+
+  @Override
+  public ResWrap<Entity> toEntity(final InputStream input) throws ODataDeserializerException {
+    return deserializer.toEntity(input);
+  }
+
+  @Override
+  public ResWrap<Property> toProperty(final InputStream input) throws ODataDeserializerException {
+    return deserializer.toProperty(input);
+  }
+
+  @Override
+  public ODataError toError(final InputStream input) throws ODataDeserializerException {
+    return deserializer.toError(input);
+  }
+
+  protected XmlMapper getXmlMapper() {
+    final XmlMapper xmlMapper = new XmlMapper(
+        new XmlFactory(new InputFactoryImpl(), new OutputFactoryImpl()), new JacksonXmlModule());
+
+    xmlMapper.setInjectableValues(new InjectableValues.Std().addValue(Boolean.class, Boolean.FALSE));
+
+    xmlMapper.addHandler(new DeserializationProblemHandler() {
+      @Override
+      public boolean handleUnknownProperty(final DeserializationContext ctxt, final JsonParser jp,
+          final com.fasterxml.jackson.databind.JsonDeserializer<?> deserializer,
+          final Object beanOrClass, final String propertyName)
+          throws IOException, JsonProcessingException {
+
+        // skip any unknown property
+        ctxt.getParser().skipChildren();
+        return true;
+      }
+    });
+    return xmlMapper;
+  }
+
+  @Override
+  public XMLMetadata toMetadata(final InputStream input) {
+    try {
+    	
+    	ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+    	org.apache.commons.io.IOUtils.copy(input, byteArrayOutputStream);
+    	// copy the content of input stream to reuse it
+    	byte[] inputContent = byteArrayOutputStream.toByteArray();
+    	
+    	InputStream inputStream1 = new ByteArrayInputStream(inputContent);
+    	Edmx edmx = getXmlMapper().readValue(inputStream1, ClientCsdlEdmx.class);
+    	
+    	InputStream inputStream2 = new ByteArrayInputStream(inputContent);
+    	List<List<String>> schemaNameSpaces = getAllSchemaNameSpace(inputStream2);
+ 
+      return new ClientCsdlXMLMetadata(edmx,schemaNameSpaces);
+    } catch (Exception e) {
+      throw new IllegalArgumentException("Could not parse as Edmx document", e);
+    }
+  }
+
+	private List<List<String>> getAllSchemaNameSpace(InputStream inputStream)
+			throws ParserConfigurationException, SAXException, IOException{
+		List<List<String>> schemaNameSpaces = new ArrayList <List<String>>();
+		
+		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+		dbFactory.setFeature(
+	                "http://xml.org/sax/features/namespaces", true);
+		dbFactory.setFeature(
+	                "http://apache.org/xml/features/validation/schema",
+	                false);
+		dbFactory.setFeature(
+	                "http://apache.org/xml/features/validation/schema-full-checking",
+	                true);
+		dbFactory.setFeature(
+	                "http://xml.org/sax/features/external-general-entities",
+	                false);
+		dbFactory.setFeature(
+	                "http://xml.org/sax/features/external-parameter-entities",
+	                false);
+		dbFactory.setFeature(
+	                "http://apache.org/xml/features/disallow-doctype-decl",
+	                true);
+		dbFactory.setFeature(
+	                "http://javax.xml.XMLConstants/feature/secure-processing",
+	                true);
+		
+		DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+		Document doc = dBuilder.parse(inputStream);
+		doc.getDocumentElement().normalize();
+		NodeList nList = doc.getElementsByTagName(SCHEMA);
+		
+		for (int temp = 0; temp < nList.getLength(); temp++) {
+			Node nNode = nList.item(temp);
+			List<String> nameSpaces = new ArrayList <String>();
+			if (nNode.getNodeType() == Node.ELEMENT_NODE) {
+				Element eElement = (Element) nNode;
+				NamedNodeMap attributes = eElement.getAttributes();
+				int len = attributes.getLength();
+				for(int i =0;i<len;i++){
+					// check for all atributes begining with name xmlns or xmlns:
+					String attrName = attributes.item(i).getNodeName();
+					if( XMLNS.equals(attrName) || attrName.startsWith(XMLNS+":")){
+						nameSpaces.add(attributes.item(i).getNodeValue());
+					}
+				}
+			}
+			schemaNameSpaces.add(nameSpaces);
+		}
+	return schemaNameSpaces;
+	}
+
+  @Override
+  public ResWrap<ServiceDocument> toServiceDocument(final InputStream input) throws ODataDeserializerException {
+    return contentType.isCompatible(ContentType.APPLICATION_XML) ?
+        new XMLServiceDocumentDeserializer(false).toServiceDocument(input) :
+        new JSONServiceDocumentDeserializer(false).toServiceDocument(input);
+  }
+
+  @Override
+  public ResWrap<Delta> toDelta(final InputStream input) throws ODataDeserializerException {
+    try {
+      return contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
+          || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML) ?
+          new AtomDeserializer().delta(input) :
+          new JsonDeltaDeserializer(false).toDelta(input);
+    } catch (final XMLStreamException e) {
+      throw new ODataDeserializerException(e);
+    } catch (final EdmPrimitiveTypeException e) {
+      throw new ODataDeserializerException(e);
+    }
+  }
+
+  @Override
+  public List<CsdlSchema> fetchTermDefinitionSchema(List<InputStream> input) {
+    List<CsdlSchema> schemas = new ArrayList<CsdlSchema>();
+    try {
+      for (InputStream stream : input) {
+        ClientCsdlEdmx edmx = getXmlMapper().readValue(stream, ClientCsdlEdmx.class);
+        schemas.addAll(edmx.getDataServices().getSchemas());
+      }
+      return schemas;
+    } catch (Exception e) {
+      throw new IllegalArgumentException("Could not parse Term definition", e);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/eea324d5/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataMetadataValidationImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataMetadataValidationImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataMetadataValidationImpl.java
index 325cf1f..acbb040 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataMetadataValidationImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataMetadataValidationImpl.java
@@ -114,4 +114,14 @@ public class ODataMetadataValidationImpl implements ODataMetadataValidation {
         csdlEntityTypesMap, csdlComplexTypesMap, csdlActionsMap, csdlFunctionsMap);
     csdlTypeValidator.validateMetadataXML();
   }
+  
+ @Override
+  public boolean isV4Metadata(XMLMetadata xmlMetadata) throws Exception{
+	return  new CsdlTypeValidator().isV4MetaData(xmlMetadata);
+  }
+ 
+  @Override
+  public boolean isServiceDocument(XMLMetadata xmlMetadata){
+	  return  new CsdlTypeValidator().isServiceDocument(xmlMetadata);
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/eea324d5/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataValidationTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataValidationTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataValidationTest.java
index cec818e..32f61bf 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataValidationTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataValidationTest.java
@@ -626,6 +626,61 @@ public class MetadataValidationTest extends AbstractTest {
               + "EntityType=\"Namespace2_Alias.ODataWebExperimentalETKeyNav\"/>"
               + "</EntityContainer></Schema></edmx:DataServices></edmx:Edmx>";
   
+  public static final String V4MetadataWithNoEntityContainer ="<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+			+"<edmx:Edmx Version=\"4.0\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">"
+			+	"<edmx:Reference Uri=\"../VOC_Core/$metadata\">"
+			+		"<edmx:Include Namespace=\"Org.OData.Core.V1\" Alias=\"Core\" />"
+			+	"</edmx:Reference>"
+			+	"<edmx:DataServices>"
+			+"<Schema Namespace=\"EPMSample2\" xmlns=\"http://docs.oasis-open.org/odata/ns/edm\"/>"
+			+	"</edmx:DataServices>"
+			+"</edmx:Edmx>";
+  
+  public static final String invalidV4MetadataWithNoSchema ="<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+			+"<edmx:Edmx Version=\"4.0\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">"
+			+	"<edmx:Reference Uri=\"../VOC_Core/$metadata\">"
+			+		"<edmx:Include Namespace=\"Org.OData.Core.V1\" Alias=\"Core\" />"
+			+	"</edmx:Reference>"
+			+	"<edmx:DataServices>"
+			+	"</edmx:DataServices>"
+			+"</edmx:Edmx>";
+  
+  public static final String validMetadataWithMultipleSchemaNamespaces ="<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+			+"<edmx:Edmx Version=\"4.0\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\"  >"
+			+	"<edmx:Reference Uri=\"../VOC_Core/$metadata\">"
+			+		"<edmx:Include Namespace=\"Org.OData.Core.V1\" Alias=\"Core\" />"
+			+	"</edmx:Reference>"
+			+	"<edmx:DataServices>"
+			+"<Schema Namespace=\"EPMSample41\" xmlns:abc=\"http://docs.oasis-open.org/odata/ns/edm\" "
+			+ "xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\"/>"
+			+"<Schema Namespace=\"EPMSample42\" xmlns:xyz=\"http://docs.oasis-open.org/odata/ns/edm\""
+			+ " xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\"/>"
+			+"<Schema Namespace=\"EPMSample43\" xmlns=\"http://docs.oasis-open.org/odata/ns/edm\" "
+			+ "xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\"/>"
+			+	"</edmx:DataServices>"
+			+"</edmx:Edmx>";
+ 
+  public static final String invalidV4MetadataWithV2Schemas ="<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+			+"<edmx:Edmx Version=\"4.0\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">"
+			+	"<edmx:Reference Uri=\"../VOC_Core/$metadata\">"
+			+		"<edmx:Include Namespace=\"Org.OData.Core.V1\" Alias=\"Core\" />"
+			+	"</edmx:Reference>"
+			+	"<edmx:DataServices>"
+			+"<Schema Namespace=\"EPMSample2\" xmlns=\"http://schemas.microsoft.com/ado/2008/09/edm\"/>"
+			+"<Schema Namespace=\"EPM2\" xmlns=\"http://schemas.microsoft.com/ado/2008/09/edm\"/>"
+			+	"</edmx:DataServices>"
+			+"</edmx:Edmx>";
+  public static final String invalidV4MetadataWithV2AndV4Schemas ="<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+			+"<edmx:Edmx Version=\"4.0\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">"
+			+	"<edmx:Reference Uri=\"../VOC_Core/$metadata\">"
+			+		"<edmx:Include Namespace=\"Org.OData.Core.V1\" Alias=\"Core\" />"
+			+	"</edmx:Reference>"
+			+	"<edmx:DataServices>"
+			+"<Schema Namespace=\"EPMSample4\" xmlns=\"http://docs.oasis-open.org/odata/ns/edm\"/>"
+			+"<Schema Namespace=\"EPM2\" xmlns=\"http://schemas.microsoft.com/ado/2008/09/edm\"/>"
+			+	"</edmx:DataServices>"
+			+"</edmx:Edmx>";
+  
   @Test
   public void testXMLMetadataWithOneSchema() {
     final XMLMetadata metadata = client.getDeserializer(ContentType.APPLICATION_XML).
@@ -645,6 +700,121 @@ public class MetadataValidationTest extends AbstractTest {
   }
   
   @Test
+  public void checkValidV4XMLMetadataWithTwoSchemas() {
+    final XMLMetadata metadata = client.getDeserializer(ContentType.APPLICATION_XML).
+        toMetadata(getClass().getResourceAsStream("northwind-metadata.xml"));
+    assertNotNull(metadata);
+    ODataMetadataValidation metadataValidator = client.metadataValidation();
+    try {
+		assertEquals(true,metadataValidator.isV4Metadata(metadata));
+	} catch (Exception e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	}
+  }
+  
+  @Test
+  public void checkInValidV4XMLMetadataWithTwoSchemas() {
+    
+    boolean checkException = false;
+    try {
+        InputStream stream = new ByteArrayInputStream(invalidV4MetadataWithV2AndV4Schemas.getBytes("UTF-8"));
+        final XMLMetadata metadata = client.getDeserializer(ContentType.APPLICATION_XML).
+            toMetadata(stream);
+        assertNotNull(metadata);
+        ODataMetadataValidation metadataValidator = client.metadataValidation();
+        assertEquals(false,metadataValidator.isV4Metadata(metadata));
+        
+      } catch (Exception e) {
+      	checkException = true;
+      	 
+      } 
+      assertEquals(false,checkException);
+  }
+  
+  @Test
+  public void checkInValidV4XMLMetadataWithNoSchemas() {
+	  boolean checkException = false;
+    try {
+      InputStream stream = new ByteArrayInputStream(invalidV4MetadataWithNoSchema.getBytes("UTF-8"));
+      final XMLMetadata metadata = client.getDeserializer(ContentType.APPLICATION_XML).
+          toMetadata(stream);
+      assertNotNull(metadata);
+      ODataMetadataValidation metadataValidator = client.metadataValidation();
+      metadataValidator.isV4Metadata(metadata);
+      
+    } catch (Exception e) {
+    	checkException = true;
+    	 assertEquals(e.getMessage(), "Cannot determine if v4 metadata," 
+ 				+ "No schemanamespaces found in XMLMetadata");
+    } 
+    assertEquals(true,checkException);
+  }
+  
+  
+  @Test
+  public void checkInValidV4XMLMetadataWithNoSchemasample() {
+	  boolean checkException = false;
+    try {
+      InputStream stream = new ByteArrayInputStream(validMetadataWithMultipleSchemaNamespaces.getBytes("UTF-8"));
+      final XMLMetadata metadata = client.getDeserializer(ContentType.APPLICATION_XML).
+          toMetadata(stream);
+      assertNotNull(metadata);
+      ODataMetadataValidation metadataValidator = client.metadataValidation();
+      assertEquals(true,metadataValidator.isV4Metadata(metadata));
+      
+    } catch (Exception e) {
+    	checkException = true;
+    	 
+    } 
+    assertEquals(false,checkException);
+  }
+  
+  @Test
+  public void checkInValidV4XMLMetadataWithV2Schemas() {
+	
+    try {
+      InputStream stream = new ByteArrayInputStream(invalidV4MetadataWithV2Schemas.getBytes("UTF-8"));
+      final XMLMetadata metadata = client.getDeserializer(ContentType.APPLICATION_XML).
+          toMetadata(stream);
+      assertNotNull(metadata);
+      ODataMetadataValidation metadataValidator = client.metadataValidation();
+      assertEquals(false,metadataValidator.isV4Metadata(metadata));
+      
+    } catch (Exception e) {
+    
+    	assertEquals(false, true);
+    } 
+  }
+  
+  
+  
+  @Test
+  public void testIfV4Service() {
+    final XMLMetadata metadata = client.getDeserializer(ContentType.APPLICATION_XML).
+        toMetadata(getClass().getResourceAsStream("northwind-metadata.xml"));
+    assertNotNull(metadata);
+    ODataMetadataValidation metadataValidator = client.metadataValidation();
+    assertEquals(true,metadataValidator.isServiceDocument(metadata));
+  }
+
+  @Test
+  public void testIfV4ServiceWithNoEntityContainer() {
+	  try{
+		  InputStream stream = new ByteArrayInputStream(V4MetadataWithNoEntityContainer.getBytes("UTF-8"));
+	      final XMLMetadata metadata = client.getDeserializer(ContentType.APPLICATION_XML).
+	          toMetadata(stream);
+	      assertNotNull(metadata);
+	    ODataMetadataValidation metadataValidator = client.metadataValidation();
+	    boolean isservice = metadataValidator.isServiceDocument(metadata);
+	    assertEquals(false,isservice);
+	  }catch (Exception e) {
+		    
+	    	assertEquals(false, true);
+	    } 
+
+  }
+  @Test
   public void testXMLMetadataWithTripInService() {
     final XMLMetadata metadata = client.getDeserializer(ContentType.APPLICATION_XML).
         toMetadata(getClass().getResourceAsStream("metadata_TripInService.xml"));