[OLINGO-786] First minor adaption to MetadataSerializer
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/3ec5a161 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/3ec5a161 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/3ec5a161 Branch: refs/heads/master Commit: 3ec5a161ef02edf56a9ee6cc4f453f3583c108f4 Parents: a88800c Author: Michael Bolz <[email protected]> Authored: Wed Sep 30 15:28:00 2015 +0200 Committer: Michael Bolz <[email protected]> Committed: Wed Sep 30 15:28:00 2015 +0200 ---------------------------------------------------------------------- .../AbstractClientCsdlAnnotationExpression.java | 49 --------------- ...ctClientCsdlDynamicAnnotationExpression.java | 7 ++- .../ClientCsdlConstantAnnotationExpression.java | 29 +-------- .../apache/olingo/client/core/MetadataTest.java | 6 +- .../api/edm/provider/CsdlAnnotation.java | 3 +- .../api/edm/provider/CsdlBindingTarget.java | 4 ++ .../commons/api/edm/provider/CsdlEntitySet.java | 7 +++ .../AbstractCsdlAnnotationExpression.java | 49 +++++++++++++++ .../CsdlConstantAnnotationExpression.java | 58 ++++++++++++++++++ .../olingo/commons/core/edm/AbstractEdm.java | 2 +- .../core/edm/AbstractEdmAnnotatable.java | 8 ++- .../EdmConstantAnnotationExpressionImpl.java | 3 +- .../xml/MetadataDocumentXmlSerializer.java | 41 +++++++++++++ .../xml/MetadataDocumentXmlSerializerTest.java | 22 +++++++ .../tecsvc/provider/ContainerProvider.java | 28 ++++++--- .../server/tecsvc/provider/EdmTechProvider.java | 11 +++- .../server/tecsvc/provider/TermProvider.java | 64 ++++++++++++++++++++ .../serializer/xml/MetadataDocumentTest.java | 24 ++++++-- 18 files changed, 312 insertions(+), 103 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractClientCsdlAnnotationExpression.java ---------------------------------------------------------------------- diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractClientCsdlAnnotationExpression.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractClientCsdlAnnotationExpression.java deleted file mode 100644 index d362dfd..0000000 --- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractClientCsdlAnnotationExpression.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.xml; - -import org.apache.olingo.commons.api.edm.provider.CsdlAbstractEdmItem; -import org.apache.olingo.commons.api.edm.provider.annotation.AnnotationExpression; -import org.apache.olingo.commons.api.edm.provider.annotation.ConstantAnnotationExpression; -import org.apache.olingo.commons.api.edm.provider.annotation.DynamicAnnotationExpression; - -abstract class AbstractClientCsdlAnnotationExpression extends CsdlAbstractEdmItem implements AnnotationExpression { - - private static final long serialVersionUID = -4238652997159205377L; - - @Override - public boolean isConstant() { - return this instanceof ConstantAnnotationExpression; - } - - @Override - public ConstantAnnotationExpression asConstant() { - return isConstant() ? (ConstantAnnotationExpression) this : null; - } - - @Override - public boolean isDynamic() { - return this instanceof DynamicAnnotationExpression; - } - - @Override - public DynamicAnnotationExpression asDynamic() { - return isDynamic() ? (DynamicAnnotationExpression) this : null; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractClientCsdlDynamicAnnotationExpression.java ---------------------------------------------------------------------- diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractClientCsdlDynamicAnnotationExpression.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractClientCsdlDynamicAnnotationExpression.java index 229ef87..4202471 100644 --- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractClientCsdlDynamicAnnotationExpression.java +++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractClientCsdlDynamicAnnotationExpression.java @@ -25,6 +25,7 @@ import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.DeserializationContext; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ClassUtils; +import org.apache.olingo.commons.api.edm.provider.annotation.AbstractCsdlAnnotationExpression; import org.apache.olingo.commons.api.edm.provider.annotation.AnnotationPath; import org.apache.olingo.commons.api.edm.provider.annotation.Apply; import org.apache.olingo.commons.api.edm.provider.annotation.Cast; @@ -50,7 +51,7 @@ import java.io.IOException; @JsonDeserialize(using = AbstractClientCsdlDynamicAnnotationExpression.DynamicAnnotationExpressionDeserializer.class) abstract class AbstractClientCsdlDynamicAnnotationExpression - extends AbstractClientCsdlAnnotationExpression implements DynamicAnnotationExpression { + extends AbstractCsdlAnnotationExpression implements DynamicAnnotationExpression { private static final long serialVersionUID = 1093411847477874348L; @@ -257,8 +258,8 @@ abstract class AbstractClientCsdlDynamicAnnotationExpression } } - private AbstractClientCsdlAnnotationExpression parseConstOrEnumExpression(final JsonParser jp) throws IOException { - AbstractClientCsdlAnnotationExpression result; + private AbstractCsdlAnnotationExpression parseConstOrEnumExpression(final JsonParser jp) throws IOException { + AbstractCsdlAnnotationExpression result; if (isAnnotationConstExprConstruct(jp)) { result = parseAnnotationConstExprConstruct(jp); } else { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ClientCsdlConstantAnnotationExpression.java ---------------------------------------------------------------------- diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ClientCsdlConstantAnnotationExpression.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ClientCsdlConstantAnnotationExpression.java index 26e067f..97ac1cc 100644 --- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ClientCsdlConstantAnnotationExpression.java +++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/ClientCsdlConstantAnnotationExpression.java @@ -18,35 +18,10 @@ */ package org.apache.olingo.client.core.edm.xml; -import org.apache.olingo.commons.api.edm.provider.annotation.ConstantAnnotationExpression; +import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantAnnotationExpression; class ClientCsdlConstantAnnotationExpression - extends AbstractClientCsdlAnnotationExpression implements ConstantAnnotationExpression { + extends CsdlConstantAnnotationExpression { private static final long serialVersionUID = 5618680702707972904L; - - private Type type; - - private String value; - - @Override - public Type getType() { - return type; - } - - @Override - public void setType(final Type type) { - this.type = type; - } - - @Override - public String getValue() { - return value; - } - - @Override - public void setValue(final String value) { - this.value = value; - } - } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java ---------------------------------------------------------------------- diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java index 2ee68d7..566c143 100644 --- a/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java +++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java @@ -173,7 +173,7 @@ public class MetadataTest extends AbstractTest { final EdmAnnotation annotation = annotationGroup.getAnnotations().get(0); assertNotNull(annotation); assertTrue(annotation.getExpression().isConstant()); - assertEquals("Edm.String", annotation.getExpression().asConstant().getValue().getType()); + assertEquals("String", annotation.getExpression().asConstant().getValue().getType()); assertEquals(10, schema.getAnnotationGroups().get(3).getAnnotations().size()); } @@ -331,10 +331,10 @@ public class MetadataTest extends AbstractTest { assertNotNull(group); final EdmAnnotation time1 = group.getAnnotations().get(0); - assertEquals("Edm.TimeOfDay", time1.getExpression().asConstant().getValue().getType()); + assertEquals("TimeOfDay", time1.getExpression().asConstant().getValue().getType()); final EdmAnnotation time2 = group.getAnnotations().get(1); - assertEquals("Edm.TimeOfDay", time2.getExpression().asConstant().getValue().getType()); + assertEquals("TimeOfDay", time2.getExpression().asConstant().getValue().getType()); } /** http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlAnnotation.java ---------------------------------------------------------------------- diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlAnnotation.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlAnnotation.java index 60354ca..caec733 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlAnnotation.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlAnnotation.java @@ -50,8 +50,9 @@ public class CsdlAnnotation extends CsdlAbstractEdmItem implements CsdlAnnotatab * Sets the annotated expression * @param annotationExpression annotated expression */ - public void setExpression(final AnnotationExpression annotationExpression) { + public CsdlAnnotation setExpression(final AnnotationExpression annotationExpression) { this.annotationExpression = annotationExpression; + return this; } /** http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlBindingTarget.java ---------------------------------------------------------------------- diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlBindingTarget.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlBindingTarget.java index 2c8a0d3..2c9a99f 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlBindingTarget.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlBindingTarget.java @@ -130,4 +130,8 @@ public abstract class CsdlBindingTarget extends CsdlAbstractEdmItem implements C return annotations; } + public CsdlBindingTarget setAnnotations(final List<CsdlAnnotation> annotations) { + this.annotations.addAll(annotations); + return this; + } } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlEntitySet.java ---------------------------------------------------------------------- diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlEntitySet.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlEntitySet.java index 3ba2c38..12b59ce 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlEntitySet.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/CsdlEntitySet.java @@ -46,6 +46,13 @@ public class CsdlEntitySet extends CsdlBindingTarget { } @Override + public CsdlEntitySet setAnnotations(final List<CsdlAnnotation> annotations) { + super.setAnnotations(annotations); + return this; + } + + + @Override public CsdlEntitySet setType(final String type) { this.type = new FullQualifiedName(type); return this; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/AbstractCsdlAnnotationExpression.java ---------------------------------------------------------------------- diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/AbstractCsdlAnnotationExpression.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/AbstractCsdlAnnotationExpression.java new file mode 100644 index 0000000..0c0f1d5 --- /dev/null +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/AbstractCsdlAnnotationExpression.java @@ -0,0 +1,49 @@ +/* + * 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.commons.api.edm.provider.annotation; + +import org.apache.olingo.commons.api.edm.provider.CsdlAbstractEdmItem; +import org.apache.olingo.commons.api.edm.provider.annotation.AnnotationExpression; +import org.apache.olingo.commons.api.edm.provider.annotation.ConstantAnnotationExpression; +import org.apache.olingo.commons.api.edm.provider.annotation.DynamicAnnotationExpression; + +public abstract class AbstractCsdlAnnotationExpression extends CsdlAbstractEdmItem implements AnnotationExpression { + + private static final long serialVersionUID = -4238652997159205377L; + + @Override + public boolean isConstant() { + return this instanceof ConstantAnnotationExpression; + } + + @Override + public ConstantAnnotationExpression asConstant() { + return isConstant() ? (ConstantAnnotationExpression) this : null; + } + + @Override + public boolean isDynamic() { + return this instanceof DynamicAnnotationExpression; + } + + @Override + public DynamicAnnotationExpression asDynamic() { + return isDynamic() ? (DynamicAnnotationExpression) this : null; + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlConstantAnnotationExpression.java ---------------------------------------------------------------------- diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlConstantAnnotationExpression.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlConstantAnnotationExpression.java new file mode 100644 index 0000000..1f70276 --- /dev/null +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlConstantAnnotationExpression.java @@ -0,0 +1,58 @@ +/* + * 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.commons.api.edm.provider.annotation; + +public class CsdlConstantAnnotationExpression + extends AbstractCsdlAnnotationExpression implements ConstantAnnotationExpression { + + private static final long serialVersionUID = 5618680702707972904L; + + private Type type; + + private String value; + + public CsdlConstantAnnotationExpression() { + } + + public CsdlConstantAnnotationExpression(Type type, String value) { + this.type = type; + this.value = value; + } + + @Override + public Type getType() { + return type; + } + + @Override + public void setType(final Type type) { + this.type = type; + } + + @Override + public String getValue() { + return value; + } + + @Override + public void setValue(final String value) { + this.value = value; + } + +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java index f2f3c18..642de52 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java @@ -301,7 +301,7 @@ public abstract class AbstractEdm implements Edm { TargetQualifierMapKey key = new TargetQualifierMapKey(fqn, qualifier); EdmAnnotations _annotations = annotationGroups.get(key); if (_annotations == null) { - _annotations = createAnnotationGroup(targetName); + _annotations = createAnnotationGroup(fqn); if (_annotations != null) { annotationGroups.put(key, _annotations); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmAnnotatable.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmAnnotatable.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmAnnotatable.java index 223ceb1..658ca0b 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmAnnotatable.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdmAnnotatable.java @@ -45,8 +45,7 @@ public abstract class AbstractEdmAnnotatable implements EdmAnnotatable { EdmAnnotation result = null; for (EdmAnnotation annotation : getAnnotations()) { if (term.getFullQualifiedName().equals(annotation.getTerm().getFullQualifiedName())) { - if (qualifier == annotation.getQualifier() - || (qualifier != null && qualifier.equals(annotation.getQualifier()))) { + if (qualifierEqual(qualifier, annotation.getQualifier())) { result = annotation; break; } @@ -55,6 +54,11 @@ public abstract class AbstractEdmAnnotatable implements EdmAnnotatable { return result; } + private boolean qualifierEqual(String qualifier, String annotationQualifier) { + return (qualifier == null && annotationQualifier == null) + || (qualifier != null && qualifier.equals(annotationQualifier)); + } + @Override public List<EdmAnnotation> getAnnotations() { if (annotations == null) { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantAnnotationExpressionImpl.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantAnnotationExpressionImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantAnnotationExpressionImpl.java index 0096fbb..f7aca3b 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantAnnotationExpressionImpl.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantAnnotationExpressionImpl.java @@ -100,8 +100,7 @@ public class EdmConstantAnnotationExpressionImpl implements EdmConstantAnnotatio final Object valueOfString = type.valueOfString(constExprConstruct.getValue(), null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null, type.getDefaultType()); - value = new Property(kind.getFullQualifiedName().getFullQualifiedNameAsString(), - null, ValueType.PRIMITIVE, valueOfString); + value = new Property(kind.getFullQualifiedName().getName(), null, ValueType.PRIMITIVE, valueOfString); } catch (EdmPrimitiveTypeException e) { throw new IllegalArgumentException(e); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java index 81d516b..623f324 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java @@ -26,8 +26,11 @@ import java.util.Map; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; +import org.apache.olingo.commons.api.data.Valuable; import org.apache.olingo.commons.api.edm.EdmAction; import org.apache.olingo.commons.api.edm.EdmActionImport; +import org.apache.olingo.commons.api.edm.EdmAnnotatable; +import org.apache.olingo.commons.api.edm.EdmAnnotation; import org.apache.olingo.commons.api.edm.EdmBindingTarget; import org.apache.olingo.commons.api.edm.EdmComplexType; import org.apache.olingo.commons.api.edm.EdmEntityContainer; @@ -50,6 +53,8 @@ import org.apache.olingo.commons.api.edm.EdmStructuredType; import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.EdmTypeDefinition; import org.apache.olingo.commons.api.edm.FullQualifiedName; +import org.apache.olingo.commons.api.edm.annotation.EdmAnnotationExpression; +import org.apache.olingo.commons.api.edm.annotation.EdmConstantAnnotationExpression; import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; import org.apache.olingo.server.api.ServiceMetadata; import org.apache.olingo.server.api.edmx.EdmxReference; @@ -102,6 +107,7 @@ public class MetadataDocumentXmlSerializer { private static final String XML_ALIAS = "Alias"; private static final String XML_NAMESPACE = "Namespace"; private static final String XML_TYPE_DEFINITION = "TypeDefinition"; + private static final String XML_ANNOTATION = "Annotation"; private static final String REFERENCE = "Reference"; private static final String INCLUDE = "Include"; private static final String INCLUDE_ANNOTATIONS = "IncludeAnnotations"; @@ -120,6 +126,8 @@ public class MetadataDocumentXmlSerializer { private static final String NS_EDM = "http://docs.oasis-open.org/odata/ns/edm"; private static final String XML_ENTITY_SET_PATH = "EntitySetPath"; private static final String XML_CONTAINS_TARGET = "ContainsTarget"; + private static final String XML_TERM_ATT = "Term"; + private static final String XML_QUALIFIER_ATT = "Qualifier"; private final ServiceMetadata serviceMetadata; private final Map<String, String> namespaceToAlias = new HashMap<String, String>(); @@ -324,6 +332,7 @@ public class MetadataDocumentXmlSerializer { } appendNavigationPropertyBindings(writer, entitySet); + appendAnnotations(writer, entitySet); writer.writeEndElement(); } } @@ -482,10 +491,37 @@ public class MetadataDocumentXmlSerializer { appendNavigationProperties(writer, entityType); + appendAnnotations(writer, entityType); + writer.writeEndElement(); } } + private void appendAnnotations(XMLStreamWriter writer, EdmAnnotatable annotatable) throws XMLStreamException { + List<EdmAnnotation> annotations = annotatable.getAnnotations(); + for (EdmAnnotation annotation : annotations) { + writer.writeStartElement(XML_ANNOTATION); + String term = getAliasedFullQualifiedName(annotation.getTerm().getFullQualifiedName(), false); + writer.writeAttribute(XML_TERM_ATT, term); + String qualifier = annotation.getQualifier(); + if(qualifier != null) { + writer.writeAttribute(XML_QUALIFIER_ATT, qualifier); + } + EdmAnnotationExpression expression = annotation.getExpression(); + if(expression != null) { + if(expression.isConstant()) { + EdmConstantAnnotationExpression constExpression = expression.asConstant(); + Valuable value = constExpression.getValue(); + writer.writeAttribute(value.getType(), constExpression.getValueAsString()); + } else { + // TODO: mibo_150930: Handle dynamic expressions + } + } + writer.writeEndElement(); + } + } + + private void appendNavigationProperties(final XMLStreamWriter writer, final EdmStructuredType type) throws XMLStreamException { List<String> navigationPropertyNames = new ArrayList<String>(type.getNavigationPropertyNames()); @@ -616,6 +652,10 @@ public class MetadataDocumentXmlSerializer { private String getAliasedFullQualifiedName(final EdmType type, final boolean isCollection) { FullQualifiedName fqn = type.getFullQualifiedName(); + return getAliasedFullQualifiedName(fqn, isCollection); + } + + private String getAliasedFullQualifiedName(final FullQualifiedName fqn, final boolean isCollection) { final String name; if (namespaceToAlias.get(fqn.getNamespace()) != null) { name = namespaceToAlias.get(fqn.getNamespace()) + "." + fqn.getName(); @@ -640,6 +680,7 @@ public class MetadataDocumentXmlSerializer { writer.writeStartElement(PREFIX_EDMX, INCLUDE, NS_EDMX); writer.writeAttribute(XML_NAMESPACE, include.getNamespace()); if (include.getAlias() != null) { + namespaceToAlias.put(include.getNamespace(), include.getAlias()); // Reference Aliases are ignored for now since they are not V2 compatible writer.writeAttribute(XML_ALIAS, include.getAlias()); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializerTest.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializerTest.java index 52fc773..ea39b17 100644 --- a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializerTest.java +++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializerTest.java @@ -113,6 +113,28 @@ public class MetadataDocumentXmlSerializerTest { IOUtils.toString(metadata)); } + + /** Writes simplest (empty) Schema. */ + @Test + public void writeMetadataWithSimpleSchema() throws Exception { + EdmSchema schema = mock(EdmSchema.class); + when(schema.getNamespace()).thenReturn("MyNamespace"); + Edm edm = mock(Edm.class); + when(edm.getSchemas()).thenReturn(Arrays.asList(schema)); + ServiceMetadata serviceMetadata = mock(ServiceMetadata.class); + when(serviceMetadata.getEdm()).thenReturn(edm); + + InputStream metadata = serializer.metadataDocument(serviceMetadata).getContent(); + assertNotNull(metadata); + assertEquals("<?xml version='1.0' encoding='UTF-8'?>" + + "<edmx:Edmx Version=\"4.0\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">" + + "<edmx:DataServices>" + + "<Schema xmlns=\"http://docs.oasis-open.org/odata/ns/edm\" Namespace=\"MyNamespace\"/>" + + "</edmx:DataServices>" + + "</edmx:Edmx>", + IOUtils.toString(metadata)); + } + @Test public void writeEdmxWithLocalTestEdm() throws Exception { List<EdmxReference> edmxReferences = new ArrayList<EdmxReference>(); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java ---------------------------------------------------------------------- diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java index ff53d09..a38d7f9 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java @@ -22,6 +22,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation; +import org.apache.olingo.commons.api.edm.provider.annotation.ConstantAnnotationExpression; +import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantAnnotationExpression; import org.apache.olingo.commons.api.ex.ODataException; import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.provider.CsdlActionImport; @@ -160,14 +163,23 @@ public class ContainerProvider { return new CsdlEntitySet() .setName("ESAllPrim") .setType(EntityTypeProvider.nameETAllPrim) - .setNavigationPropertyBindings(Arrays.asList( - new CsdlNavigationPropertyBinding() - .setPath("NavPropertyETTwoPrimOne") - .setTarget("ESTwoPrim"), - new CsdlNavigationPropertyBinding() - .setPath("NavPropertyETTwoPrimMany") - .setTarget("ESTwoPrim") - )); + .setNavigationPropertyBindings(Arrays + .asList(new CsdlNavigationPropertyBinding().setPath("NavPropertyETTwoPrimOne").setTarget("ESTwoPrim"), + new CsdlNavigationPropertyBinding().setPath("NavPropertyETTwoPrimMany").setTarget("ESTwoPrim"))) + .setAnnotations(Arrays.asList(new CsdlAnnotation().setTerm("Core.Description").setExpression( + new CsdlConstantAnnotationExpression(ConstantAnnotationExpression.Type.String, + "Contains entities with all primitive types")), + new CsdlAnnotation().setTerm("Core.LongDescription").setQualifier("EnabledForEntitySet").setExpression( + new CsdlConstantAnnotationExpression(ConstantAnnotationExpression.Type.String, + "System Query Options: $filter, $count, $orderby, $skip, $top, $expand, $select, $format; " + + "Operations: Create, Create with Deep Insert, Create with Bind Operation, Read")), + new CsdlAnnotation().setTerm("Core.LongDescription").setQualifier("EnabledForEntity").setExpression( + new CsdlConstantAnnotationExpression(ConstantAnnotationExpression.Type.String, + "System Query Options: $expand, $select, $format; Operations: " + + "Read, Update, Update with Bind Operation, Delete")), + new CsdlAnnotation().setTerm("Core.LongDescription").setQualifier("EnabledNavigationProperties") + .setExpression(new CsdlConstantAnnotationExpression(ConstantAnnotationExpression.Type.String, + "NavPropertyETTwoPrimOne, NavPropertyETTwoPrimMany")))); } else if (name.equals("ESCollAllPrim")) { return new CsdlEntitySet() http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EdmTechProvider.java ---------------------------------------------------------------------- diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EdmTechProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EdmTechProvider.java index da47222..1e964a9 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EdmTechProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EdmTechProvider.java @@ -18,6 +18,7 @@ */ package org.apache.olingo.server.tecsvc.provider; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -43,6 +44,7 @@ import org.apache.olingo.commons.api.ex.ODataException; public class EdmTechProvider extends CsdlAbstractEdmProvider { public static final String nameSpace = "olingo.odata.test1"; + public static final String CORE_VOCABULARY_NAMESPACE = "Org.OData.Core.V1"; private final SchemaProvider schemaProvider; private final EntityTypeProvider entityTypeProvider; @@ -52,6 +54,7 @@ public class EdmTechProvider extends CsdlAbstractEdmProvider { private final ActionProvider actionProvider; private final FunctionProvider functionProvider; private final TypeDefinitionProvider typeDefinitionProvider; + private final TermProvider termProvider; public EdmTechProvider() { containerProvider = new ContainerProvider(this); @@ -62,12 +65,14 @@ public class EdmTechProvider extends CsdlAbstractEdmProvider { functionProvider = new FunctionProvider(); typeDefinitionProvider = new TypeDefinitionProvider(); schemaProvider = new SchemaProvider(this); + termProvider = new TermProvider(); } @Override public List<CsdlAliasInfo> getAliasInfos() throws ODataException { - return Collections.singletonList( - new CsdlAliasInfo().setAlias("Namespace1_Alias").setNamespace(nameSpace)); + return Arrays.asList( + new CsdlAliasInfo().setAlias("Namespace1_Alias").setNamespace(nameSpace), + new CsdlAliasInfo().setAlias("Core").setNamespace(CORE_VOCABULARY_NAMESPACE)); } @Override @@ -102,7 +107,7 @@ public class EdmTechProvider extends CsdlAbstractEdmProvider { @Override public CsdlTerm getTerm(final FullQualifiedName termName) throws ODataException { - return null; + return termProvider.getTerm(termName); } @Override http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/TermProvider.java ---------------------------------------------------------------------- diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/TermProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/TermProvider.java new file mode 100644 index 0000000..8e2ae19 --- /dev/null +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/TermProvider.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.olingo.server.tecsvc.provider; + +import org.apache.olingo.commons.api.edm.FullQualifiedName; +import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation; +import org.apache.olingo.commons.api.edm.provider.CsdlTerm; +import org.apache.olingo.commons.api.edm.provider.annotation.ConstantAnnotationExpression; +import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantAnnotationExpression; + +import java.util.Arrays; + +/** + */ +public class TermProvider { + +// <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> + + private static FullQualifiedName TERM_DESCRIPTION = new FullQualifiedName("Org.OData.Core.V1", "Description"); + private static FullQualifiedName TERM_LONG_DESCRIPTION = + new FullQualifiedName("Org.OData.Core.V1", "LongDescription"); + + public CsdlTerm getTerm(FullQualifiedName termName) { + if(TERM_DESCRIPTION.equals(termName)) { + return new CsdlTerm().setName("Description").setType("Edm.String") + .setAnnotations(Arrays.asList(new CsdlAnnotation().setTerm("Core.Description").setExpression( + new CsdlConstantAnnotationExpression(ConstantAnnotationExpression.Type.String, + "A brief description of a model element")), + new CsdlAnnotation().setTerm("Core.IsLanguageDependent"))); + } else if(TERM_LONG_DESCRIPTION.equals(termName)) { + return new CsdlTerm().setName("LongDescription").setType("Edm.String") + .setAnnotations(Arrays.asList(new CsdlAnnotation().setTerm("Core.Description").setExpression( + new CsdlConstantAnnotationExpression(ConstantAnnotationExpression.Type.String, + "A lengthy description of a model element")), + new CsdlAnnotation().setTerm("Core.IsLanguageDependent"))); + } + + return null; + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3ec5a161/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java ---------------------------------------------------------------------- diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java index 6f59060..ec69f5f 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java @@ -49,10 +49,8 @@ public class MetadataDocumentTest { final String metadata = IOUtils.toString( odata.createSerializer(ContentType.APPLICATION_XML).metadataDocument(serviceMetadata).getContent()); assertNotNull(metadata); - assertThat(metadata, - containsString("<edmx:Reference Uri=\"" + CORE_VOCABULARY + "\">" - + "<edmx:Include Namespace=\"Org.OData.Core.V1\" Alias=\"Core\"/>" - + "</edmx:Reference>")); + assertThat(metadata, containsString("<edmx:Reference Uri=\"" + CORE_VOCABULARY + "\">" + + "<edmx:Include Namespace=\"Org.OData.Core.V1\" Alias=\"Core\"/>" + "</edmx:Reference>")); assertThat(metadata, containsString("<edmx:Edmx Version=\"4.0\" xmlns:edmx=\"http://docs.oasis-open.org/odata/ns/edmx\">")); @@ -76,6 +74,24 @@ public class MetadataDocumentTest { + "<Property Name=\"AdditionalPropertyString_5\" Type=\"Edm.String\"/>" + "</EntityType>")); +// assertThat(metadata, containsString("<EntitySet Name=\"ESAllPrim\" EntityType=\"Namespace1_Alias.ETAllPrim\">" +// + "<NavigationPropertyBinding Path=\"NavPropertyETTwoPrimOne\" Target=\"ESTwoPrim\"/>" +// + "<NavigationPropertyBinding Path=\"NavPropertyETTwoPrimMany\" Target=\"ESTwoPrim\"/>" +// + "</EntitySet>")); + + assertThat(metadata, containsString("<EntitySet Name=\"ESAllPrim\" EntityType=\"Namespace1_Alias.ETAllPrim\">" + + "<NavigationPropertyBinding Path=\"NavPropertyETTwoPrimOne\" Target=\"ESTwoPrim\"/>" + + "<NavigationPropertyBinding Path=\"NavPropertyETTwoPrimMany\" Target=\"ESTwoPrim\"/>" + + "<Annotation Term=\"Core.Description\" String=\"Contains entities with all primitive types\"/>" + + "<Annotation Term=\"Core.LongDescription\" Qualifier=\"EnabledForEntitySet\" String=\"System Query Options:" + + " $filter, $count, $orderby, $skip, $top, $expand, $select, $format; Operations: Create, Create with Deep " + + "Insert, Create with Bind Operation, Read\"/>" + + "<Annotation Term=\"Core.LongDescription\" Qualifier=\"EnabledForEntity\" String=\"System Query Options: " + + "$expand, $select, $format; Operations: Read, Update, Update with Bind Operation, Delete\"/>" + + "<Annotation Term=\"Core.LongDescription\" Qualifier=\"EnabledNavigationProperties\" " + + "String=\"NavPropertyETTwoPrimOne, NavPropertyETTwoPrimMany\"/>" + + "</EntitySet>")); + assertThat(metadata, containsString("<ComplexType Name=\"CTPrim\">" + "<Property Name=\"PropertyInt16\" Type=\"Edm.Int16\"/></ComplexType>"));
