OLINGO-880: Enable MetadataParser to load core vocabularies based on a perference setting, these are loaded loaded from local classpath, instead of making a web call
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/187c229b Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/187c229b Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/187c229b Branch: refs/heads/OLINGO-832_StreamSerializerPoC Commit: 187c229b6022923a028e6fe5a29a430e06003ff7 Parents: 801899a Author: Ramesh Reddy <[email protected]> Authored: Fri Feb 12 09:16:00 2016 -0600 Committer: Ramesh Reddy <[email protected]> Committed: Fri Feb 12 09:16:00 2016 -0600 ---------------------------------------------------------------------- .../olingo/server/core/MetadataParser.java | 118 +++--- .../olingo/server/core/ReferenceResolver.java | 3 +- .../server/core/SchemaBasedEdmProvider.java | 39 +- .../resources/Org.OData.Capabilities.V1.xml | 388 +++++++++++++++++++ .../src/main/resources/Org.OData.Core.V1.xml | 187 +++++++++ .../main/resources/Org.OData.Measures.V1.xml | 110 ++++++ .../core/MetadataParserAnnotationsTest.java | 11 +- .../olingo/server/core/MetadataParserTest.java | 2 +- .../olingo/server/example/TripPinServlet.java | 2 + .../src/test/resources/annotations.xml | 2 +- 10 files changed, 807 insertions(+), 55 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/187c229b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/MetadataParser.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/MetadataParser.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/MetadataParser.java index b564792..03a6675 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/MetadataParser.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/MetadataParser.java @@ -19,6 +19,7 @@ package org.apache.olingo.server.core; import java.io.IOException; +import java.io.InputStream; import java.io.Reader; import java.net.MalformedURLException; import java.net.URI; @@ -95,38 +96,68 @@ import org.apache.olingo.server.api.edmx.EdmxReferenceIncludeAnnotation; */ public class MetadataParser { private boolean parseAnnotations = false; - private final String XML_LINK_NS = "http://www.w3.org/1999/xlink"; - private ReferenceResolver referenceResolver = new DefaultReferenceResolver(); + private static final String XML_LINK_NS = "http://www.w3.org/1999/xlink"; + private ReferenceResolver defaultReferenceResolver = new DefaultReferenceResolver(); + private boolean loadCoreVocabularies = false; - public void setParseAnnotations(boolean f) { - this.parseAnnotations = true; + public MetadataParser parseAnnotations(boolean parse) { + this.parseAnnotations = parse; + return this; } - public void setReferenceResolver(ReferenceResolver resolver) { - this.referenceResolver = resolver; + public MetadataParser referenceResolver(ReferenceResolver resolver) { + this.defaultReferenceResolver = resolver; + return this; + } + + public MetadataParser loadCoreVocabularies(boolean load) { + this.loadCoreVocabularies = load; + return this; } public ServiceMetadata buildServiceMetadata(Reader csdl) throws XMLStreamException { + SchemaBasedEdmProvider provider = buildEdmProvider(csdl, + this.defaultReferenceResolver, this.loadCoreVocabularies); + return new ServiceMetadataImpl(provider, provider.getReferences(), null); + } + + public SchemaBasedEdmProvider buildEdmProvider(Reader csdl) throws XMLStreamException { + return buildEdmProvider(csdl, this.defaultReferenceResolver, this.loadCoreVocabularies); + } + + protected SchemaBasedEdmProvider buildEdmProvider(Reader csdl, + ReferenceResolver referenceResolver, boolean loadCoreVocabularies) throws XMLStreamException { XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); XMLEventReader reader = xmlInputFactory.createXMLEventReader(csdl); - + return buildEdmProvider(reader, referenceResolver, loadCoreVocabularies); + } + + protected SchemaBasedEdmProvider buildEdmProvider(InputStream csdl, + ReferenceResolver referenceResolver, boolean loadCoreVocabularies) throws XMLStreamException { + XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); + XMLEventReader reader = xmlInputFactory.createXMLEventReader(csdl); + return buildEdmProvider(reader, referenceResolver, loadCoreVocabularies); + } + + protected SchemaBasedEdmProvider buildEdmProvider(XMLEventReader reader, + ReferenceResolver referenceResolver, boolean loadCoreVocabularies) throws XMLStreamException { SchemaBasedEdmProvider provider = new SchemaBasedEdmProvider(referenceResolver); - final ArrayList<EdmxReference> references = new ArrayList<EdmxReference>(); - new ElementReader<SchemaBasedEdmProvider>() { @Override void build(XMLEventReader reader, StartElement element, SchemaBasedEdmProvider provider, String name) throws XMLStreamException { - String version = attr(element, "Version"); String xmlBase = attrNS(element, XML_LINK_NS, "base"); - provider.setXMLBase(xmlBase); + provider.setXMLBase(xmlBase); + String version = attr(element, "Version"); if ("4.0".equals(version)) { - readDataServicesAndReference(reader, element, provider, references); + readDataServicesAndReference(reader, element, provider); } else { throw new XMLStreamException("Currently only V4 is supported."); } } }.read(reader, null, provider, "Edmx"); + + // make sure there is nothing left to read, due to parser error if(reader.hasNext()) { XMLEvent event = reader.peek(); throw new XMLStreamException( @@ -135,34 +166,33 @@ public class MetadataParser { event.asStartElement().getName().getLocalPart() : event.asEndElement().getName().getLocalPart())); } - provider.addReferences(references); - return new ServiceMetadataImpl(provider, references, null); - } - - SchemaBasedEdmProvider buildEdmProvider(Reader csdl) throws XMLStreamException { - XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); - XMLEventReader reader = xmlInputFactory.createXMLEventReader(csdl); - return buildEdmProvider(reader); - } + + // load the core vocabularies + if (loadCoreVocabularies) { + loadVocabularySchema(provider, "Org.OData.Core.V1", "Org.OData.Core.V1.xml"); + loadVocabularySchema(provider, "Org.OData.Capabilities.V1", "Org.OData.Capabilities.V1.xml"); + loadVocabularySchema(provider, "Org.OData.Measures.V1", "Org.OData.Measures.V1.xml"); + } + return provider; + } - SchemaBasedEdmProvider buildEdmProvider(XMLEventReader reader) throws XMLStreamException { - SchemaBasedEdmProvider provider = new SchemaBasedEdmProvider(this.referenceResolver); - new ElementReader<SchemaBasedEdmProvider>() { - @Override - void build(XMLEventReader reader, StartElement element, SchemaBasedEdmProvider provider, - String name) throws XMLStreamException { - String version = attr(element, "Version"); - if ("4.0".equals(version)) { - readDataServicesAndReference(reader, element, provider, new ArrayList<EdmxReference>()); - } + private void loadVocabularySchema(SchemaBasedEdmProvider provider, String namespace, + String resource) throws XMLStreamException { + CsdlSchema schema = provider.getSchema(namespace, false); + if (schema == null) { + InputStream is = this.getClass().getClassLoader().getResourceAsStream(resource); + if (is != null) { + SchemaBasedEdmProvider childProvider = buildEdmProvider(is, null, false); + provider.addSchema(childProvider.getSchema(namespace, false)); + } else { + throw new XMLStreamException("failed to load "+resource+" core vocabulary"); } - }.read(reader, null, provider, "Edmx"); - return provider; + } } private void readDataServicesAndReference(XMLEventReader reader, - StartElement element, SchemaBasedEdmProvider provider, - final ArrayList<EdmxReference> references) throws XMLStreamException { + StartElement element, SchemaBasedEdmProvider provider) throws XMLStreamException { + final ArrayList<EdmxReference> references = new ArrayList<EdmxReference>(); new ElementReader<SchemaBasedEdmProvider>() { @Override void build(XMLEventReader reader, StartElement element, SchemaBasedEdmProvider provider, @@ -174,6 +204,7 @@ public class MetadataParser { } } }.read(reader, element, provider, "DataServices", "Reference"); + provider.addReferences(references); } private void readReference(XMLEventReader reader, StartElement element, @@ -782,7 +813,7 @@ public class MetadataParser { return property; } - private String attr(StartElement element, String name) { + private static String attr(StartElement element, String name) { Attribute attr = element.getAttributeByName(new QName(name)); if (attr != null) { return attr.getValue(); @@ -790,7 +821,7 @@ public class MetadataParser { return null; } - private String attrNS(StartElement element, String ns, String name) { + private static String attrNS(StartElement element, String ns, String name) { Attribute attr = element.getAttributeByName(new QName(ns, name)); if (attr != null) { return attr.getValue(); @@ -1043,9 +1074,9 @@ public class MetadataParser { throws XMLStreamException; } - class DefaultReferenceResolver implements ReferenceResolver{ + private static class DefaultReferenceResolver implements ReferenceResolver { @Override - public SchemaBasedEdmProvider resolveReference(URI referenceUri, String xmlBase) { + public InputStream resolveReference(URI referenceUri, String xmlBase) { URL schemaURL = null; try { if (referenceUri.isAbsolute()) { @@ -1057,17 +1088,12 @@ public class MetadataParser { throw new EdmException("No xml:base set to read the references from the metadata"); } } - - XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); - XMLEventReader reader = xmlInputFactory.createXMLEventReader(schemaURL.openStream()); - return buildEdmProvider(reader); + return schemaURL.openStream(); } catch (MalformedURLException e) { throw new EdmException(e); - } catch (XMLStreamException e) { - throw new EdmException(e); } catch (IOException e) { throw new EdmException(e); } } - } + } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/187c229b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ReferenceResolver.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ReferenceResolver.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ReferenceResolver.java index f7d5101..2ac79bc 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ReferenceResolver.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ReferenceResolver.java @@ -18,6 +18,7 @@ */ package org.apache.olingo.server.core; +import java.io.InputStream; import java.net.URI; public interface ReferenceResolver { @@ -28,5 +29,5 @@ public interface ReferenceResolver { * @param xmlBase xml:base if provided by the metadata document; null otherwise * @return */ - SchemaBasedEdmProvider resolveReference(URI referenceUri, String xmlBase); + InputStream resolveReference(URI referenceUri, String xmlBase); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/187c229b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/SchemaBasedEdmProvider.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/SchemaBasedEdmProvider.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/SchemaBasedEdmProvider.java index a2f23f6..a778e2c 100644 --- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/SchemaBasedEdmProvider.java +++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/SchemaBasedEdmProvider.java @@ -18,11 +18,15 @@ */ package org.apache.olingo.server.core; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import javax.xml.stream.XMLStreamException; + +import org.apache.olingo.commons.api.edm.EdmException; 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; @@ -60,14 +64,25 @@ public class SchemaBasedEdmProvider implements CsdlEdmProvider { void addSchema(CsdlSchema schema) { this.edmSchemas.add(schema); } + + List<EdmxReference> getReferences(){ + return new ArrayList<EdmxReference>(references.values()); + } - private CsdlSchema getSchema(String ns) { + CsdlSchema getSchema(String ns) { + return getSchema(ns, true); + } + + CsdlSchema getSchema(String ns, boolean checkReferences) { for (CsdlSchema s : this.edmSchemas) { if (s.getNamespace().equals(ns)) { return s; } } - return getReferenceSchema(ns); + if (checkReferences) { + return getReferenceSchema(ns); + } + return null; } private CsdlSchema getReferenceSchema(String ns) { @@ -77,7 +92,23 @@ public class SchemaBasedEdmProvider implements CsdlEdmProvider { if (this.referenceSchemas.get(ns) == null) { EdmxReference reference = this.references.get(ns); if (reference != null) { - SchemaBasedEdmProvider provider = this.referenceResolver.resolveReference(reference.getUri(), xmlBase); + SchemaBasedEdmProvider provider = null; + if (this.referenceResolver == null) { + throw new EdmException("Failed to load Reference "+reference.getUri()); + } else { + InputStream is = this.referenceResolver.resolveReference(reference.getUri(), this.xmlBase); + if (is != null) { + try { + MetadataParser parser = new MetadataParser(); + provider = parser.buildEdmProvider(is, this.referenceResolver, false); + } catch (XMLStreamException e) { + throw new EdmException("Failed to load Reference "+reference.getUri()+" parsing failed"); + } + } else { + throw new EdmException("Failed to load Reference "+reference.getUri()+" loading failed"); + } + } + // copy references for (EdmxReferenceInclude include : reference.getIncludes()) { this.referenceSchemas.put(include.getNamespace(), provider); if (include.getAlias() != null) { @@ -381,5 +412,5 @@ public class SchemaBasedEdmProvider implements CsdlEdmProvider { this.xmlBase = base+"/"; } } - } + } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/187c229b/lib/server-core-ext/src/main/resources/Org.OData.Capabilities.V1.xml ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/resources/Org.OData.Capabilities.V1.xml b/lib/server-core-ext/src/main/resources/Org.OData.Capabilities.V1.xml new file mode 100644 index 0000000..991a0ae --- /dev/null +++ b/lib/server-core-ext/src/main/resources/Org.OData.Capabilities.V1.xml @@ -0,0 +1,388 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + 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. + +--> +<!-- + + OData Version 4.0 Plus Errata 02 + OASIS Standard incorporating Approved Errata 02 + 30 October 2014 + Copyright (c) OASIS Open 2014. All Rights Reserved. + Source: http://docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/vocabularies/ + +--> +<!-- + +Technical Committee: + OASIS Open Data Protocol (OData) TC + https://www.oasis-open.org/committees/odata + +Chairs: + - Barbara Hartel ([email protected]), SAP AG + - Ram Jeyaraman ([email protected]), Microsoft + +Editors: + - Ralf Handl ([email protected]), SAP AG + - Michael Pizzo ([email protected]), Microsoft + - Martin Zurmuehl ([email protected]), SAP AG + +Additional artifacts: + This CSDL document is one component of a Work Product which consists of: + - OData Version 4.0 Part 1: Protocol + - OData Version 4.0 Part 2: URL Conventions + - OData Version 4.0 Part 3: Common Schema Definition Language (CSDL) + - OData ABNF Construction Rules Version 4.0 + - OData ABNF Test Cases + - OData Core Vocabulary + - OData Capabilities Vocabulary (this document) + - OData Measures Vocabulary + - OData Metadata Service Entity Model + - OData EDMX XML Schema + - OData EDM XML Schema + +Related work: + This work product is related to the following two Work Products, each of + which define alternate formats for OData payloads + - OData Atom Format Version 4.0 + - OData JSON Format Version 4.0 + This specification replaces or supersedes: + - None + +Declared XML namespaces: + - http://docs.oasis-open.org/odata/ns/edmx + - http://docs.oasis-open.org/odata/ns/edm + +Abstract: + The Open Data Protocol (OData) enables the creation of REST-based data + services, which allow resources, identified using Uniform Resource + Identifiers (URLs) and defined in a data model, to be published and + edited by Web clients using simple HTTP messages. This document defines + the URL syntax for requests and the serialization format for primitive + literals in request and response payloads. + +Overview: + This document contains terms describing capabilities of an OData service. + +--> +<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0"> + <edmx:Reference Uri="http://docs.oasis-open.org/odata/odata/v4.0/os/vocabularies/Org.OData.Core.V1.xml"> + <edmx:Include Alias="Core" Namespace="Org.OData.Core.V1" /> + </edmx:Reference> + <edmx:DataServices> + <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Org.OData.Capabilities.V1" Alias="Capabilities"> + <Annotation Term="Core.Description"> + <String> + The Capabilities vocabulary aims to provide a way for service authors to describe + certain capabilities of an OData Service. + </String> + </Annotation> + <Annotation Term="Core.LongDescription"> + <String> + There are some capabilities which are strongly recommended for services to support even + though they are optional. Support for $top and $skip is a good example as + supporting these query options helps with performance of a service and are essential. Such + capabilities are assumed to be default capabilities of an OData service even in + the case that a capabilities annotation doesnât exist. Capabilities annotations are + mainly expected to be used to explicitly specify that a service doesnât support such + capabilities. Capabilities annotations can as well be used to declaratively + specify the support of such capabilities. + + On the other hand, there are some capabilities that a service may choose to support or + not support and in varying degrees. $filter and $orderby are such good examples. + This vocabulary aims to define terms to specify support or no support for such + capabilities. + + A service is assumed to support by default the following capabilities even though an + annotation doesnât exist: + - Countability ($count) + - Client pageability ($top, $skip) + - Expandability ($expand) + - Indexability by key + - Batch support ($batch) + - Navigability of navigation properties + + A service is expected to support the following capabilities. If not supported, the + service is expected to call out the restrictions using annotations: + - Filterability ($filter) + - Sortability ($orderby) + - Queryability of top level entity sets + - Query functions + + A client cannot assume that a service supports certain capabilities. A client can try, but + it needs to be prepared to handle an error in case the following capabilities are not + supported: + - Insertability + - Updatability + - Deletability + </String> + </Annotation> + + <!-- Conformance Level --> + + <Term Name="ConformanceLevel" Type="Capabilities.ConformanceLevelType" AppliesTo="EntityContainer" /> + <EnumType Name="ConformanceLevelType"> + <Member Name="Minimal" /> + <Member Name="Intermediate" /> + <Member Name="Advanced" /> + </EnumType> + + <!-- Request Capabilities --> + + <Term Name="SupportedFormats" Type="Collection(Edm.String)"> + <Annotation Term="Core.Description" String="Media types of supported formats, including format parameters" /> + <Annotation Term="Core.IsMediaType" /> + </Term> + + <Term Name="AcceptableEncodings" Type="Collection(Edm.String)" AppliesTo="EntityContainer"> + <Annotation Term="Core.Description" String="List of acceptable compression methods for ($batch) requests, e.g. gzip" /> + </Term> + + <!-- Supported Preferences --> + + <Term Name="AsynchronousRequestsSupported" Type="Core.Tag" DefaultValue="true" AppliesTo="EntityContainer"> + <Annotation Term="Core.Description" String="Service supports the asynchronous request preference" /> + </Term> + + <Term Name="BatchContinueOnErrorSupported" Type="Core.Tag" DefaultValue="true" AppliesTo="EntityContainer"> + <Annotation Term="Core.Description" String="Service supports the continue on error preference" /> + </Term> + + <Term Name="IsolationSupported" Type="Capabilities.IsolationLevel" AppliesTo="EntityContainer"> + <Annotation Term="Core.Description" String="Supported odata.isolation levels" /> + </Term> + <EnumType Name="IsolationLevel" IsFlags="true"> + <Member Name="Snapshot" Value="1" /> + </EnumType> + + <Term Name="CallbackSupported" Type="Capabilities.CallbackType" AppliesTo="EntityContainer EntitySet"> + <Annotation Term="Core.Description" String="Supports callbacks for the specified protocols" /> + </Term> + <Term Name="CrossJoinSupported" Type="Core.Tag" DefaultValue="true" AppliesTo="EntityContainer"> + <Annotation Term="Core.Description" String="Supports cross joins for the entity sets in this container" /> + </Term> + <ComplexType Name="CallbackType"> + <Property Name="CallbackProtocols" Type="Collection(Capabilities.CallbackProtocol)" /> + <Annotation Term="Core.Description" + String="A non-empty collection lists the full set of supported protocols. A empty collection means 'only HTTP is supported'" /> + </ComplexType> + <ComplexType Name="CallbackProtocol"> + <Property Name="Id" Type="Edm.String"> + <Annotation Term="Core.Description" String="Protcol Identifier" /> + </Property> + <Property Name="UrlTemplate" Type="Edm.String"> + <Annotation Term="Core.Description" + String="URL Template including parameters. Parameters are enclosed in curly braces {} as defined in RFC6570" /> + </Property> + <Property Name="DocumentationUrl" Type="Edm.String" Nullable="true"> + <Annotation Term="Core.Description" String="Human readable description of the meaning of the URL Template parameters" /> + <Annotation Term="Core.IsURL" /> + </Property> + </ComplexType> + + <Term Name="ChangeTracking" Type="Capabilities.ChangeTrackingType" AppliesTo="EntityContainer EntitySet"> + <Annotation Term="Core.Description" String="Change tracking capabilities of this service or entity set" /> + </Term> + <ComplexType Name="ChangeTrackingType"> + <Property Name="Supported" Type="Edm.Boolean" DefaultValue="true"> + <Annotation Term="Core.Description" String="This entity set supports the odata.track-changes preference" /> + </Property> + <Property Name="FilterableProperties" Type="Collection(Edm.PropertyPath)"> + <Annotation Term="Core.Description" String="Change tracking supports filters on these properties" /> + </Property> + <Property Name="ExpandableProperties" Type="Collection(Edm.NavigationPropertyPath)"> + <Annotation Term="Core.Description" String="Change tracking supports these properties expanded" /> + </Property> + </ComplexType> + + <!--Query Capabilities --> + + <Term Name="CountRestrictions" Type="Capabilities.CountRestrictionsType" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" String="Restrictions on /$count path suffix and $count=true system query option" /> + </Term> + <ComplexType Name="CountRestrictionsType"> + <Property Name="Countable" Type="Edm.Boolean" DefaultValue="true"> + <Annotation Term="Core.Description" String="Entities can be counted" /> + </Property> + <Property Name="NonCountableProperties" Type="Collection(Edm.PropertyPath)"> + <Annotation Term="Core.Description" String="These collection properties do not allow /$count segments" /> + </Property> + <Property Name="NonCountableNavigationProperties" Type="Collection(Edm.NavigationPropertyPath)"> + <Annotation Term="Core.Description" String="These navigation properties do not allow /$count segments" /> + </Property> + </ComplexType> + + <Term Name="NavigationRestrictions" Type="Capabilities.NavigationRestrictionsType" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" String="Restrictions on navigating properties according to OData URL conventions" /> + </Term> + <ComplexType Name="NavigationRestrictionsType"> + <Property Name="Navigability" Type="Capabilities.NavigationType"> + <Annotation Term="Core.Description" String="Supported Navigability" /> + </Property> + <Property Name="RestrictedProperties" Type="Collection(Capabilities.NavigationPropertyRestriction)" /> + </ComplexType> + <ComplexType Name="NavigationPropertyRestriction"> + <Property Name="NavigationProperty" Type="Edm.NavigationPropertyPath"> + <Annotation Term="Core.Description" String="Navigation properties can be navigated" /> + </Property> + <Property Name="Navigability" Type="Capabilities.NavigationType"> + <Annotation Term="Core.Description" String="Navigation properties can be navigated to this level" /> + </Property> + </ComplexType> + <EnumType Name="NavigationType"> + <Member Name="Recursive"> + <Annotation Term="Core.Description" String="Navigation properties can be recursively navigated" /> + </Member> + <Member Name="Single"> + <Annotation Term="Core.Description" String="Navigation properties can be navigated to a single level" /> + </Member> + <Member Name="None"> + <Annotation Term="Core.Description" String="Navigation properties are not navigable" /> + </Member> + </EnumType> + + <Term Name="IndexableByKey" Type="Core.Tag" DefaultValue="true" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" String="Supports key values according to OData URL conventions" /> + </Term> + + <Term Name="TopSupported" Type="Core.Tag" DefaultValue="true" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" String="Supports $top" /> + </Term> + <Term Name="SkipSupported" Type="Core.Tag" DefaultValue="true" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" String="Supports $skip" /> + </Term> + + <Term Name="BatchSupported" Type="Core.Tag" DefaultValue="true" AppliesTo="EntityContainer"> + <Annotation Term="Core.Description" String="Supports $batch requests" /> + </Term> + + <Term Name="FilterFunctions" Type="Collection(Edm.String)" AppliesTo="EntityContainer EntitySet"> + <Annotation Term="Core.Description" String="List of functions supported in $filter" /> + </Term> + + <Term Name="FilterRestrictions" Type="Capabilities.FilterRestrictionsType" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" String="Restrictions on $filter expressions" /> + </Term> + <ComplexType Name="FilterRestrictionsType"> + <Property Name="Filterable" Type="Edm.Boolean" DefaultValue="true"> + <Annotation Term="Core.Description" String="$filter is supported" /> + </Property> + <Property Name="RequiresFilter" Type="Edm.Boolean" Nullable="true"> + <Annotation Term="Core.Description" String="$filter is required" /> + </Property> + <Property Name="RequiredProperties" Type="Collection(Edm.PropertyPath)"> + <Annotation Term="Core.Description" + String="These properties must be specified in the $filter clause (properties of derived types are not allowed here)" /> + </Property> + <Property Name="NonFilterableProperties" Type="Collection(Edm.PropertyPath)"> + <Annotation Term="Core.Description" String="These properties cannot be used in $filter expressions" /> + </Property> + </ComplexType> + + <Term Name="SortRestrictions" Type="Capabilities.SortRestrictionsType" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" String="Restrictions on $orderby expressions" /> + </Term> + <ComplexType Name="SortRestrictionsType"> + <Property Name="Sortable" Type="Edm.Boolean" DefaultValue="true"> + <Annotation Term="Core.Description" String="$orderby is supported" /> + </Property> + <Property Name="AscendingOnlyProperties" Type="Collection(Edm.PropertyPath)"> + <Annotation Term="Core.Description" String="These properties can only be used for sorting in Ascending order" /> + </Property> + <Property Name="DescendingOnlyProperties" Type="Collection(Edm.PropertyPath)"> + <Annotation Term="Core.Description" String="These properties can only be used for sorting in Descending order" /> + </Property> + <Property Name="NonSortableProperties" Type="Collection(Edm.PropertyPath)"> + <Annotation Term="Core.Description" String="These properties cannot be used in $orderby expressions" /> + </Property> + </ComplexType> + + <Term Name="ExpandRestrictions" Type="Capabilities.ExpandRestrictionsType" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" String="Restrictions on $expand expressions" /> + </Term> + <ComplexType Name="ExpandRestrictionsType"> + <Property Name="Expandable" Type="Edm.Boolean" DefaultValue="true"> + <Annotation Term="Core.Description" String="$expand is supported" /> + </Property> + <Property Name="NonExpandableProperties" Type="Collection(Edm.NavigationPropertyPath)"> + <Annotation Term="Core.Description" String="These properties cannot be used in $expand expressions" /> + </Property> + </ComplexType> + + <Term Name="SearchRestrictions" Type="Capabilities.SearchRestrictionsType" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" String="Restrictions on $search expressions" /> + </Term> + <ComplexType Name="SearchRestrictionsType"> + <Property Name="Searchable" Type="Edm.Boolean" DefaultValue="true"> + <Annotation Term="Core.Description" String="$search is supported" /> + </Property> + <Property Name="UnsupportedExpressions" Type="Capabilities.SearchExpressions" DefaultValue="none"> + <Annotation Term="Core.Description" String="Expressions supported in $search" /> + </Property> + </ComplexType> + <EnumType Name="SearchExpressions" IsFlags="true"> + <Member Name="none" Value="0" /> + <Member Name="AND" Value="1" /> + <Member Name="OR" Value="2" /> + <Member Name="NOT" Value="4" /> + <Member Name="phrase" Value="8" /> + <Member Name="group" Value="16" /> + </EnumType> + + <!-- Data Modification Capabilities --> + + <Term Name="InsertRestrictions" Type="Capabilities.InsertRestrictionsType" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" String="Restrictions on insert operations" /> + </Term> + <ComplexType Name="InsertRestrictionsType"> + <Property Name="Insertable" Type="Edm.Boolean" DefaultValue="true"> + <Annotation Term="Core.Description" String="Entities can be inserted" /> + </Property> + <Property Name="NonInsertableNavigationProperties" Type="Collection(Edm.NavigationPropertyPath)"> + <Annotation Term="Core.Description" String="These navigation properties do not allow deep inserts" /> + </Property> + </ComplexType> + + <Term Name="UpdateRestrictions" Type="Capabilities.UpdateRestrictionsType" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" String="Restrictions on update operations" /> + </Term> + <ComplexType Name="UpdateRestrictionsType"> + <Property Name="Updatable" Type="Edm.Boolean" DefaultValue="true"> + <Annotation Term="Core.Description" String="Entities can be updated" /> + </Property> + <Property Name="NonUpdatableNavigationProperties" Type="Collection(Edm.NavigationPropertyPath)"> + <Annotation Term="Core.Description" String="These navigation properties do not allow rebinding" /> + </Property> + </ComplexType> + + <Term Name="DeleteRestrictions" Type="Capabilities.DeleteRestrictionsType" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" String="Restrictions on delete operations" /> + </Term> + <ComplexType Name="DeleteRestrictionsType"> + <Property Name="Deletable" Type="Edm.Boolean" DefaultValue="true"> + <Annotation Term="Core.Description" String="Entities can be deleted" /> + </Property> + <Property Name="NonDeletableNavigationProperties" Type="Collection(Edm.NavigationPropertyPath)"> + <Annotation Term="Core.Description" String="These navigation properties do not allow DeleteLink requests" /> + </Property> + </ComplexType> + + </Schema> + </edmx:DataServices> +</edmx:Edmx> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/187c229b/lib/server-core-ext/src/main/resources/Org.OData.Core.V1.xml ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/resources/Org.OData.Core.V1.xml b/lib/server-core-ext/src/main/resources/Org.OData.Core.V1.xml new file mode 100644 index 0000000..b9bb306 --- /dev/null +++ b/lib/server-core-ext/src/main/resources/Org.OData.Core.V1.xml @@ -0,0 +1,187 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + 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. + +--> +<!-- + + OData Version 4.0 Plus Errata 02 + OASIS Standard incorporating Approved Errata 02 + 30 October 2014 + Copyright (c) OASIS Open 2014. All Rights Reserved. + Source: http://docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/vocabularies/ + +--> +<!-- + +Technical Committee: + OASIS Open Data Protocol (OData) TC + https://www.oasis-open.org/committees/odata + +Chairs: + - Barbara Hartel ([email protected]), SAP AG + - Ram Jeyaraman ([email protected]), Microsoft + +Editors: + - Ralf Handl ([email protected]), SAP AG + - Michael Pizzo ([email protected]), Microsoft + - Martin Zurmuehl ([email protected]), SAP AG + +Additional artifacts: + This CSDL document is one component of a Work Product which consists of: + - OData Version 4.0 Part 1: Protocol + - OData Version 4.0 Part 2: URL Conventions + - OData Version 4.0 Part 3: Common Schema Definition Language (CSDL) + - OData ABNF Construction Rules Version 4.0 + - OData ABNF Test Cases + - OData Core Vocabulary (this document) + - OData Capabilities Vocabulary + - OData Measures Vocabulary + - OData Metadata Service Entity Model + - OData EDMX XML Schema + - OData EDM XML Schema + +Related work: + This work product is related to the following two Work Products, each of + which define alternate formats for OData payloads + - OData Atom Format Version 4.0 + - OData JSON Format Version 4.0 + This specification replaces or supersedes: + - None + +Declared XML namespaces: + - http://docs.oasis-open.org/odata/ns/edmx + - http://docs.oasis-open.org/odata/ns/edm + +Abstract: + The Open Data Protocol (OData) enables the creation of REST-based data + services, which allow resources, identified using Uniform Resource + Identifiers (URLs) and defined in a data model, to be published and + edited by Web clients using simple HTTP messages. This document defines + the URL syntax for requests and the serialization format for primitive + literals in request and response payloads. + +Overview: + This document contains Core terms needed to write vocabularies. + +--> +<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0"> + <edmx:DataServices> + <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Org.OData.Core.V1" Alias="Core"> + <Annotation Term="Core.Description"> + <String>Core terms needed to write vocabularies</String> + </Annotation> + + <!--Documentation --> + + <Term Name="Description" Type="Edm.String"> + <Annotation Term="Core.Description" String="A brief description of a model element" /> + <Annotation Term="Core.IsLanguageDependent" /> + </Term> + + <Term Name="LongDescription" Type="Edm.String"> + <Annotation Term="Core.Description" String="A lengthy description of a model element" /> + <Annotation Term="Core.IsLanguageDependent" /> + </Term> + + <!-- Localization --> + + <Term Name="IsLanguageDependent" Type="Core.Tag" DefaultValue="true" AppliesTo="Term Property"> + <Annotation Term="Core.Description" String="Properties and terms annotated with this term are language-dependent" /> + <Annotation Term="Core.RequiresType" String="Edm.String" /> + </Term> + + <!-- Term Restrictions --> + + <TypeDefinition Name="Tag" UnderlyingType="Edm.Boolean"> + <Annotation Term="Core.Description" String="This is the type to use for all tagging terms" /> + </TypeDefinition> + + <Term Name="RequiresType" Type="Edm.String" AppliesTo="Term"> + <Annotation Term="Core.Description" + String="Terms annotated with this term can only be applied to elements that have a type that is identical to or derived from the given type name" /> + </Term> + + <!--Resource Paths --> + + <Term Name="ResourcePath" Type="Edm.String" AppliesTo="EntitySet Singleton ActionImport FunctionImport"> + <Annotation Term="Core.Description" + String="Resource path for entity container child, can be relative to xml:base and the request URL" /> + <Annotation Term="Core.IsUrl" /> + </Term> + + <Term Name="DereferenceableIDs" Type="Core.Tag" DefaultValue="true" AppliesTo="EntityContainer"> + <Annotation Term="Core.Description" String="Entity-ids are URLs that locate the identified entity" /> + </Term> + + <Term Name="ConventionalIDs" Type="Core.Tag" DefaultValue="true" AppliesTo="EntityContainer"> + <Annotation Term="Core.Description" String="Entity-ids follow OData URL conventions" /> + </Term> + + <!-- Permissions --> + + <Term Name="Permissions" Type="Core.Permission" AppliesTo="Property"> + <Annotation Term="Core.Description" String="Permissions available for a property.The value of 2 is reserved for future use." /> + </Term> + <EnumType Name="Permission" IsFlags="true"> + <Member Name="None" Value="0" /> + <Member Name="Read" Value="1" /> + <Member Name="ReadWrite" Value="3" /> + </EnumType> + + <!-- Metadata Extensions --> + + <Term Name="Immutable" Type="Core.Tag" DefaultValue="true" AppliesTo="Property"> + <Annotation Term="Core.Description" + String="A value for this non-key property can be provided on insert and remains unchanged on update" /> + </Term> + + <Term Name="Computed" Type="Core.Tag" DefaultValue="true" AppliesTo="Property"> + <Annotation Term="Core.Description" String="A value for this property is generated on both insert and update" /> + </Term> + + <Term Name="IsURL" Type="Core.Tag" DefaultValue="true" AppliesTo="Property Term"> + <Annotation Term="Core.Description" String="Properties and terms annotated with this term MUST contain a valid URL" /> + <Annotation Term="Core.RequiresType" String="Edm.String" /> + </Term> + + <Term Name="AcceptableMediaTypes" Type="Collection(Edm.String)" AppliesTo="EntityType Property"> + <Annotation Term="Core.Description" + String="Lists the MIME types acceptable for the annotated entity type marked with HasStream="true" or the annotated stream property" /> + <Annotation Term="Core.IsMediaType" /> + </Term> + + <Term Name="MediaType" Type="Edm.String" AppliesTo="Property"> + <Annotation Term="Core.IsMediaType" /> + <Annotation Term="Core.RequiresType" String="Edm.Binary" /> + </Term> + + <Term Name="IsMediaType" Type="Core.Tag" DefaultValue="true" AppliesTo="Property Term"> + <Annotation Term="Core.Description" String="Properties and terms annotated with this term MUST contain a valid MIME type" /> + <Annotation Term="Core.RequiresType" String="Edm.String" /> + </Term> + + <Term Name="OptimisticConcurrency" Type="Collection(Edm.PropertyPath)" AppliesTo="EntitySet"> + <Annotation Term="Core.Description" + String="Data modification requires the use of Etags. A non-empty collection contains the set of properties that are used to compute the ETag" /> + </Term> + + </Schema> + </edmx:DataServices> +</edmx:Edmx> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/187c229b/lib/server-core-ext/src/main/resources/Org.OData.Measures.V1.xml ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/main/resources/Org.OData.Measures.V1.xml b/lib/server-core-ext/src/main/resources/Org.OData.Measures.V1.xml new file mode 100644 index 0000000..39f3e40 --- /dev/null +++ b/lib/server-core-ext/src/main/resources/Org.OData.Measures.V1.xml @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + 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. + +--> +<!-- + + OData Version 4.0 Plus Errata 02 + OASIS Standard incorporating Approved Errata 02 + 30 October 2014 + Copyright (c) OASIS Open 2014. All Rights Reserved. + Source: http://docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/vocabularies/ + +--> +<!-- + +Technical Committee: + OASIS Open Data Protocol (OData) TC + https://www.oasis-open.org/committees/odata + +Chairs: + - Barbara Hartel ([email protected]), SAP AG + - Ram Jeyaraman ([email protected]), Microsoft + +Editors: + - Ralf Handl ([email protected]), SAP AG + - Michael Pizzo ([email protected]), Microsoft + - Martin Zurmuehl ([email protected]), SAP AG + +Additional artifacts: + This CSDL document is one component of a Work Product which consists of: + - OData Version 4.0 Part 1: Protocol + - OData Version 4.0 Part 2: URL Conventions + - OData Version 4.0 Part 3: Common Schema Definition Language (CSDL) + - OData ABNF Construction Rules Version 4.0 + - OData ABNF Test Cases + - OData Core Vocabulary + - OData Capabilities Vocabulary + - OData Measures Vocabulary (this document) + - OData Metadata Service Entity Model + - OData EDMX XML Schema + - OData EDM XML Schema + +Related work: + This work product is related to the following two Work Products, each of + which define alternate formats for OData payloads + - OData Atom Format Version 4.0 + - OData JSON Format Version 4.0 + This specification replaces or supersedes: + - None + +Declared XML namespaces: + - http://docs.oasis-open.org/odata/ns/edmx + - http://docs.oasis-open.org/odata/ns/edm + +Abstract: + The Open Data Protocol (OData) enables the creation of REST-based data + services, which allow resources, identified using Uniform Resource + Identifiers (URLs) and defined in a data model, to be published and + edited by Web clients using simple HTTP messages. This document defines + the URL syntax for requests and the serialization format for primitive + literals in request and response payloads. + +Overview: + This document contains terms describing monetary amounts and measured quantities. + +--> +<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0"> + <edmx:Reference Uri="http://docs.oasis-open.org/odata/odata/v4.0/os/vocabularies/Org.OData.Core.V1.xml"> + <edmx:Include Alias="Core" Namespace="Org.OData.Core.V1" /> + </edmx:Reference> + <edmx:DataServices> + <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Org.OData.Measures.V1" Alias="Measures"> + <Annotation Term="Core.Description"> + <String>Terms describing monetary amounts and measured quantities</String> + </Annotation> + + <Term Name="ISOCurrency" Type="Edm.String" AppliesTo="Property"> + <Annotation Term="Core.Description" String="The currency for this monetary amount as an ISO 4217 currency code" /> + </Term> + + <Term Name="Scale" Type="Edm.Byte" AppliesTo="Property"> + <Annotation Term="Core.Description" + String="The number of significant decimal places in the scale part (less than or equal to the number declared in the Scale facet)" /> + <Annotation Term="Core.RequiresType" String="Edm.Decimal" /> + </Term> + + <Term Name="Unit" Type="Edm.String" AppliesTo="Property"> + <Annotation Term="Core.Description" String="The unit of measure for this measured quantity, e.g. cm for centimeters or % for percentages" /> + </Term> + + </Schema> + </edmx:DataServices> +</edmx:Edmx> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/187c229b/lib/server-core-ext/src/test/java/org/apache/olingo/server/core/MetadataParserAnnotationsTest.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/test/java/org/apache/olingo/server/core/MetadataParserAnnotationsTest.java b/lib/server-core-ext/src/test/java/org/apache/olingo/server/core/MetadataParserAnnotationsTest.java index 7912dc8..d71c54d 100644 --- a/lib/server-core-ext/src/test/java/org/apache/olingo/server/core/MetadataParserAnnotationsTest.java +++ b/lib/server-core-ext/src/test/java/org/apache/olingo/server/core/MetadataParserAnnotationsTest.java @@ -51,7 +51,7 @@ import org.junit.Before; import org.junit.Test; public class MetadataParserAnnotationsTest { - final String NS = "Org.OData.Core.V1"; + final String NS = "Org.OData.AnnoatationTest"; final FullQualifiedName NSF = new FullQualifiedName(NS); CsdlEdmProvider provider = null; @@ -59,7 +59,8 @@ public class MetadataParserAnnotationsTest { @Before public void setUp() throws Exception { MetadataParser parser = new MetadataParser(); - parser.setParseAnnotations(true); + parser.parseAnnotations(true); + parser.loadCoreVocabularies(true); provider = (CsdlEdmProvider) parser.buildEdmProvider(new FileReader("src/test/resources/annotations.xml")); } @@ -204,5 +205,11 @@ public class MetadataParserAnnotationsTest { public void testTermAppliesTo() throws ODataException { CsdlTerm term = this.provider.getTerm(new FullQualifiedName(NS, "IsURI")); assertEquals(Arrays.asList("Property", "PropertyPath"), term.getAppliesTo()); + } + + @Test + public void checkCoreVocabularies() throws ODataException { + CsdlTerm term = this.provider.getTerm(new FullQualifiedName("Org.OData.Core.V1", "Description")); + assertEquals("Edm.String", term.getType()); } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/187c229b/lib/server-core-ext/src/test/java/org/apache/olingo/server/core/MetadataParserTest.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/test/java/org/apache/olingo/server/core/MetadataParserTest.java b/lib/server-core-ext/src/test/java/org/apache/olingo/server/core/MetadataParserTest.java index 97f19b5..83160b4 100644 --- a/lib/server-core-ext/src/test/java/org/apache/olingo/server/core/MetadataParserTest.java +++ b/lib/server-core-ext/src/test/java/org/apache/olingo/server/core/MetadataParserTest.java @@ -54,7 +54,7 @@ public class MetadataParserTest { @Before public void setUp() throws Exception { MetadataParser parser = new MetadataParser(); - parser.setParseAnnotations(true); + parser.parseAnnotations(true); provider = (CsdlEdmProvider) parser.buildEdmProvider(new FileReader("src/test/resources/trippin.xml")); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/187c229b/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinServlet.java ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinServlet.java b/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinServlet.java index 036cd78..06e498c 100644 --- a/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinServlet.java +++ b/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinServlet.java @@ -50,6 +50,8 @@ public class TripPinServlet extends HttpServlet { ServiceMetadata metadata = null; try { + parser.parseAnnotations(true); + parser.loadCoreVocabularies(true); metadata = parser.buildServiceMetadata(new FileReader("src/test/resources/trippin.xml")); } catch (XMLStreamException e) { throw new IOException(e); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/187c229b/lib/server-core-ext/src/test/resources/annotations.xml ---------------------------------------------------------------------- diff --git a/lib/server-core-ext/src/test/resources/annotations.xml b/lib/server-core-ext/src/test/resources/annotations.xml index fce46a8..1c5281a 100644 --- a/lib/server-core-ext/src/test/resources/annotations.xml +++ b/lib/server-core-ext/src/test/resources/annotations.xml @@ -13,7 +13,7 @@ Version="4.0"> <edmx:DataServices> <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" - Namespace="Org.OData.Core.V1" Alias="Core"> + Namespace="Org.OData.AnnoatationTest" Alias="test"> <Annotation Term="Core.Description"> <String>Core terms needed to write vocabularies</String>
