blob: f62cfef95370ad2840286bfac02f524ea4e420d2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.server.core;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.FileReader;
import java.util.Arrays;
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.CsdlAnnotations;
import org.apache.olingo.commons.api.edm.provider.CsdlEdmProvider;
import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
import org.apache.olingo.commons.api.edm.provider.CsdlTerm;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlAnnotationPath;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlApply;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlCast;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlCollection;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression.ConstantExpressionType;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlIf;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlIsOf;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlLabeledElement;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlLabeledElementReference;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlNavigationPropertyPath;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlNull;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlPath;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlPropertyValue;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlRecord;
import org.apache.olingo.commons.api.edm.provider.annotation.CsdlUrlRef;
import org.apache.olingo.commons.api.ex.ODataException;
import org.junit.Before;
import org.junit.Test;
public class MetadataParserAnnotationsTest {
final String NS = "Org.OData.AnnoatationTest";
final FullQualifiedName NSF = new FullQualifiedName(NS);
CsdlEdmProvider provider = null;
@Before
public void setUp() throws Exception {
MetadataParser parser = new MetadataParser();
parser.parseAnnotations(true);
parser.useLocalCoreVocabularies(true);
provider = (CsdlEdmProvider) parser.buildEdmProvider(new FileReader("src/test/resources/annotations.xml"));
}
CsdlAnnotation annotation(String term) throws ODataException {
CsdlSchema schema = provider.getSchemas().get(0);
assertNotNull(schema.getAnnotations());
return schema.getAnnotation(term);
}
@Test
public void testConstantExpressionAttribute() throws ODataException {
CsdlAnnotation a = annotation("Core.Description");
assertNotNull(a);
assertTrue(a.getExpression() instanceof CsdlConstantExpression);
assertEquals("Core terms needed to write vocabularies", ((CsdlConstantExpression)a.getExpression()).getValue());
assertEquals(ConstantExpressionType.String, ((CsdlConstantExpression)a.getExpression()).getType());
a = annotation("org.example.display.LastUpdated");
assertNotNull(a);
assertTrue(a.getExpression() instanceof CsdlConstantExpression);
assertEquals("2000-01-01T16:00:00.000-09:00", ((CsdlConstantExpression)a.getExpression()).getValue());
assertEquals(ConstantExpressionType.DateTimeOffset, ((CsdlConstantExpression)a.getExpression()).getType());
}
@Test
public void testCollection() throws ODataException {
CsdlAnnotation a = annotation("UI.CollectionFacet");
assertNotNull(a);
assertTrue(a.getExpression() instanceof CsdlCollection);
CsdlCollection exprs = ((CsdlCollection)a.getExpression());
assertEquals(2, exprs.getItems().size());
assertTrue(exprs.getItems().get(0) instanceof CsdlAnnotationPath);
CsdlAnnotationPath path = (CsdlAnnotationPath) exprs.getItems().get(0);
assertEquals("Supplier/@Communication.Contact", path.getValue());
}
@Test
public void testApply() throws ODataException {
CsdlAnnotation a = annotation("org.example.display.DisplayNameApply");
assertNotNull(a);
assertTrue(a.getExpression() instanceof CsdlApply);
CsdlApply apply = ((CsdlApply)a.getExpression());
assertEquals("odata.concat", apply.getFunction());
assertEquals(7, apply.getParameters().size());
assertTrue(apply.getParameters().get(1) instanceof CsdlPath);
assertTrue(apply.getParameters().get(4) instanceof CsdlConstantExpression);
assertEquals("OData.Description", apply.getAnnotations().get(0).getTerm());
assertEquals("concat apply", apply.getAnnotations().get(0).getExpression().asConstant().getValue());
}
@Test
public void testCast() throws ODataException {
CsdlAnnotation a = annotation("org.example.display.Threshold");
assertNotNull(a);
assertTrue(a.getExpression() instanceof CsdlCast);
CsdlCast cast= (CsdlCast)a.getExpression();
assertEquals("Edm.Decimal", cast.getType());
assertTrue(cast.getValue() instanceof CsdlPath);
assertEquals("Average", ((CsdlPath)cast.getValue()).getValue());
}
@Test
public void testIf() throws ODataException {
CsdlAnnotation a = annotation("org.example.person.Gender");
assertNotNull(a);
assertTrue(a.getExpression() instanceof CsdlIf);
CsdlIf ifexpr = (CsdlIf)a.getExpression();
assertTrue(ifexpr.getGuard() instanceof CsdlPath);
assertTrue(ifexpr.getThen() instanceof CsdlConstantExpression);
assertTrue(ifexpr.getElse() instanceof CsdlConstantExpression);
assertEquals("IsFemale", ((CsdlPath)ifexpr.getGuard()).getValue());
assertEquals("Female", ((CsdlConstantExpression)ifexpr.getThen()).getValue());
assertEquals("Male", ((CsdlConstantExpression)ifexpr.getElse()).getValue());
}
@Test
public void testIsOf() throws ODataException {
CsdlAnnotation a = annotation("Self.IsPreferredCustomer");
assertNotNull(a);
assertTrue(a.getExpression() instanceof CsdlIsOf);
CsdlIsOf isOf = (CsdlIsOf)a.getExpression();
assertEquals("Self.PreferredCustomer", isOf.getType());
assertTrue(isOf.getValue() instanceof CsdlPath);
assertEquals("OData.Description", isOf.getAnnotations().get(0).getTerm());
assertEquals("preferred customer", isOf.getAnnotations().get(0).getExpression().asConstant().getValue());
}
@Test
public void testLableledElement() throws ODataException {
CsdlAnnotation a = annotation("org.example.display.DisplayNameLabel");
assertNotNull(a);
assertTrue(a.getExpression() instanceof CsdlLabeledElement);
CsdlLabeledElement expr = (CsdlLabeledElement)a.getExpression();
assertEquals("CustomerFirstName", expr.getName());
assertTrue(expr.getValue() instanceof CsdlPath);
}
@Test
public void testLableledReference() throws ODataException {
CsdlAnnotation a = annotation("org.example.display.DisplayNameLabelReference");
assertNotNull(a);
assertTrue(a.getExpression() instanceof CsdlLabeledElementReference);
CsdlLabeledElementReference expr = (CsdlLabeledElementReference)a.getExpression();
assertEquals("Model.CustomerFirstName", expr.getValue());
}
@Test
public void testNull() throws ODataException {
CsdlAnnotation a = annotation("org.example.display.DisplayNameNull");
assertNotNull(a);
assertTrue(a.getExpression() instanceof CsdlNull);
}
@Test
public void testRecord() throws ODataException {
CsdlAnnotation a = annotation("Capabilities.UpdateRestrictions");
assertNotNull(a);
assertTrue(a.getExpression() instanceof CsdlRecord);
CsdlRecord expr = (CsdlRecord)a.getExpression();
assertEquals(1, expr.getPropertyValues().size());
CsdlPropertyValue value = expr.getPropertyValues().get(0);
assertEquals("NonUpdatableNavigationProperties", value.getProperty());
assertTrue(value.getValue() instanceof CsdlCollection);
assertEquals("OData.Description", expr.getAnnotations().get(0).getTerm());
assertEquals("descripiton test", expr.getAnnotations().get(0).getExpression().asConstant().getValue());
CsdlCollection collection = (CsdlCollection)value.getValue();
assertEquals(2, collection.getItems().size());
assertEquals("Category", ((CsdlNavigationPropertyPath)collection.getItems().get(1)).getValue());
}
@Test
public void testUrlRef() throws ODataException {
CsdlAnnotation a = annotation("Vocab.Supplier");
assertNotNull(a);
assertTrue(a.getExpression() instanceof CsdlUrlRef);
CsdlUrlRef expr = (CsdlUrlRef)a.getExpression();
assertTrue(expr.getValue() instanceof CsdlApply);
assertEquals(2, ((CsdlApply)expr.getValue()).getParameters().size());
}
@Test
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());
}
@Test
public void testAnnotationGroup() throws ODataException {
CsdlAnnotations annotations = this.provider.getAnnotationsGroup(
new FullQualifiedName("Org.OData.AnnoatationTest.TagX"), null);
assertEquals(3, annotations.getAnnotations().size());
}
}