blob: 08dd1d84b980110fc6f20dff9f49cc2877dfb1c5 [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.felix.schematizer.impl;
import java.util.Map;
import org.apache.felix.schematizer.Node;
import org.apache.felix.schematizer.Schema;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.osgi.util.converter.TypeReference;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class SchematizerServiceTest {
private SchematizerImpl schematizer;
@Before
public void setUp() {
schematizer = new SchematizerImpl();
}
@After
public void tearDown() {
schematizer = null;
}
@Test
public void testSchematizeDTO() {
Schema s = schematizer
.schematize("MyDTO", new TypeReference<MyDTO>(){})
.get("MyDTO");
assertNotNull(s);
Node root = s.rootNode();
assertNodeEquals("", "/", false, MyDTO.class, false, root);
assertEquals(4, root.children().size());
Node pingNode = root.children().get("/ping");
assertNodeEquals("ping", "/ping", false, String.class, true, pingNode);
Node pongNode = root.children().get("/pong");
assertNodeEquals("pong", "/pong", false, Long.class, true, pongNode);
Node countNode = root.children().get("/count");
assertNodeEquals("count", "/count", false, MyDTO.Count.class, true, countNode);
Node embeddedNode = root.children().get("/embedded");
assertEquals(3, embeddedNode.children().size());
assertNodeEquals("embedded", "/embedded", false, MyEmbeddedDTO.class, true, embeddedNode);
Node marcoNode = embeddedNode.children().get("/marco");
assertNodeEquals("marco", "/embedded/marco", false, String.class, true, marcoNode);
Node poloNode = embeddedNode.children().get("/polo");
assertNodeEquals("polo", "/embedded/polo", false, Long.class, true, poloNode);
Node alphaNode = embeddedNode.children().get("/alpha");
assertNodeEquals("alpha", "/embedded/alpha", false, MyEmbeddedDTO.Alpha.class, true, alphaNode);
Node sRoot = s.nodeAtPath("/");
assertNodeEquals("", "/", false, MyDTO.class, false, sRoot);
Node sPingNode = s.nodeAtPath("/ping");
assertNodeEquals("ping", "/ping", false, String.class, true, sPingNode);
Node sPongNode = s.nodeAtPath("/pong");
assertNodeEquals("pong", "/pong", false, Long.class, true, sPongNode);
Node sCountNode = s.nodeAtPath("/count");
assertNodeEquals("count", "/count", false, MyDTO.Count.class, true, sCountNode);
Node sEmbeddedNode = s.nodeAtPath("/embedded");
assertNodeEquals("embedded", "/embedded", false, MyEmbeddedDTO.class, true, sEmbeddedNode);
Node sMarcoNode = s.nodeAtPath("/embedded/marco");
assertNodeEquals("marco", "/embedded/marco", false, String.class, true, sMarcoNode);
Node sPoloNode = s.nodeAtPath("/embedded/polo");
assertNodeEquals("polo", "/embedded/polo", false, Long.class, true, sPoloNode);
Node sAlphaNode = s.nodeAtPath("/embedded/alpha");
assertNodeEquals("alpha", "/embedded/alpha", false, MyEmbeddedDTO.Alpha.class, true, sAlphaNode);
}
@Test
public void testSchematizeDTOWithColletion() {
Schema s = schematizer
.type("MyDTO", "/embedded", new TypeReference<MyEmbeddedDTO2<String>>(){})
.type("MyDTO", "/embedded/value", String.class)
.schematize("MyDTO", new TypeReference<MyDTO3<MyEmbeddedDTO2<String>>>(){})
.get("MyDTO");
assertNotNull(s);
Node root = s.rootNode();
assertNodeEquals("", "/", false, new TypeReference<MyDTO3<MyEmbeddedDTO2<String>>>(){}.getType(), false, root);
assertEquals(4, root.children().size());
Node pingNode = root.children().get("/ping");
assertNodeEquals("ping", "/ping", false, String.class, true, pingNode);
Node pongNode = root.children().get("/pong");
assertNodeEquals("pong", "/pong", false, Long.class, true, pongNode);
Node countNode = root.children().get("/count");
assertNodeEquals("count", "/count", false, MyDTO3.Count.class, true, countNode);
Node embeddedNode = root.children().get("/embedded");
assertEquals(1, embeddedNode.children().size());
assertNodeEquals("embedded", "/embedded", true, new TypeReference<MyEmbeddedDTO2<String>>(){}.getType(), true, embeddedNode);
Node valueNode = embeddedNode.children().get("/value");
assertNodeEquals("value", "/embedded/value", false, String.class, true, valueNode);
Node sRoot = s.nodeAtPath("/");
assertNodeEquals("", "/", false, new TypeReference<MyDTO3<MyEmbeddedDTO2<String>>>(){}.getType(), false, sRoot);
Node sPingNode = s.nodeAtPath("/ping");
assertNodeEquals("ping", "/ping", false, String.class, true, sPingNode);
Node sPongNode = s.nodeAtPath("/pong");
assertNodeEquals("pong", "/pong", false, Long.class, true, sPongNode);
Node sCountNode = s.nodeAtPath("/count");
assertNodeEquals("count", "/count", false, MyDTO3.Count.class, true, sCountNode);
Node sEmbeddedNode = s.nodeAtPath("/embedded");
assertNodeEquals("embedded", "/embedded", true, new TypeReference<MyEmbeddedDTO2<String>>(){}.getType(), true, sEmbeddedNode);
Node sValueNode = s.nodeAtPath("/embedded/value");
assertNodeEquals("value", "/embedded/value", false, String.class, true, sValueNode);
}
@Test
public void testSchematizeDTOWithAnnotatedColletion() {
Schema s = schematizer
.schematize("MyDTO4", new TypeReference<MyDTO4>(){})
.get("MyDTO4");
assertNotNull(s);
Node root = s.rootNode();
assertNodeEquals("", "/", false, MyDTO4.class, false, root);
assertEquals(4, root.children().size());
Node pingNode = root.children().get("/ping");
assertNodeEquals("ping", "/ping", false, String.class, true, pingNode);
Node pongNode = root.children().get("/pong");
assertNodeEquals("pong", "/pong", false, Long.class, true, pongNode);
Node countNode = root.children().get("/count");
assertNodeEquals("count", "/count", false, MyDTO4.Count.class, true, countNode);
Node embeddedNode = root.children().get("/embedded");
assertEquals(3, embeddedNode.children().size());
assertNodeEquals("embedded", "/embedded", true, MyEmbeddedDTO.class, true, embeddedNode);
Node marcoNode = embeddedNode.children().get("/marco");
assertNodeEquals("marco", "/embedded/marco", false, String.class, true, marcoNode);
Node poloNode = embeddedNode.children().get("/polo");
assertNodeEquals("polo", "/embedded/polo", false, Long.class, true, poloNode);
Node alphaNode = embeddedNode.children().get("/alpha");
assertNodeEquals("alpha", "/embedded/alpha", false, MyEmbeddedDTO.Alpha.class, true, alphaNode);
Node sRoot = s.nodeAtPath("/");
assertNodeEquals("", "/", false, MyDTO4.class, false, sRoot);
Node sPingNode = s.nodeAtPath("/ping");
assertNodeEquals("ping", "/ping", false, String.class, true, sPingNode);
Node sPongNode = s.nodeAtPath("/pong");
assertNodeEquals("pong", "/pong", false, Long.class, true, sPongNode);
Node sCountNode = s.nodeAtPath("/count");
assertNodeEquals("count", "/count", false, MyDTO4.Count.class, true, sCountNode);
Node sEmbeddedNode = s.nodeAtPath("/embedded");
assertNodeEquals("embedded", "/embedded", true, MyEmbeddedDTO.class, true, sEmbeddedNode);
Node sMarcoNode = s.nodeAtPath("/embedded/marco");
assertNodeEquals("marco", "/embedded/marco", false, String.class, true, sMarcoNode);
Node sPoloNode = s.nodeAtPath("/embedded/polo");
assertNodeEquals("polo", "/embedded/polo", false, Long.class, true, sPoloNode);
Node sAlphaNode = s.nodeAtPath("/embedded/alpha");
assertNodeEquals("alpha", "/embedded/alpha", false, MyEmbeddedDTO.Alpha.class, true, sAlphaNode);
}
@Test
public void testSchematizeToMap() {
Schema s = schematizer
.schematize("MyDTO", new TypeReference<MyDTO>(){})
.get("MyDTO");
Map<String, Node.DTO> map = s.toMap();
testMapValues(map);
}
private void testMapValues(Map<String, Node.DTO> map) {
assertNotNull(map);
assertEquals(1, map.size());
Node.DTO root = map.get("/");
assertEquals(4, root.children.size());
assertNodeDTOEquals("", "/", false, MyDTO.class, root);
Node.DTO pingNode = root.children.get("ping");
assertNodeDTOEquals("ping", "/ping", false, String.class, pingNode);
Node.DTO pongNode = root.children.get("pong");
assertNodeDTOEquals("pong", "/pong", false, Long.class, pongNode);
Node.DTO countNode = root.children.get("count");
assertNodeDTOEquals("count", "/count", false, MyDTO.Count.class, countNode);
Node.DTO embeddedNode = root.children.get("embedded");
assertEquals(3, embeddedNode.children.size());
assertNodeDTOEquals("embedded", "/embedded", false, MyEmbeddedDTO.class, embeddedNode);
Node.DTO marcoNode = embeddedNode.children.get("marco");
assertNodeDTOEquals("marco", "/embedded/marco", false, String.class, marcoNode);
Node.DTO poloNode = embeddedNode.children.get("polo");
assertNodeDTOEquals("polo", "/embedded/polo", false, Long.class, poloNode);
Node.DTO alphaNode = embeddedNode.children.get("alpha");
assertNodeDTOEquals("alpha", "/embedded/alpha", false, MyEmbeddedDTO.Alpha.class, alphaNode);
}
@SuppressWarnings( "unused" )
@Test
@Ignore("Probably no longer necessary...")
public void testSchemaFromMap() {
Schema s1 = schematizer
.schematize("MyDTO", new TypeReference<MyDTO>(){})
.get("MyDTO");
Map<String, Node.DTO> map = s1.toMap();
// Schema s2 = schematizer.from("MyDTO", map);
// testSchema(s2);
}
@SuppressWarnings( "unused" )
private void testSchema(Schema s) {
// Assume that the map is serialized, then deserialized "as is".
assertNotNull(s);
Node root = s.rootNode();
assertEquals(4, root.children().size());
assertNodeEquals("", "/", false, MyDTO.class, false, root);
Node pingNode = root.children().get("/ping");
assertNodeEquals("ping", "/ping", false, String.class, true, pingNode);
Node pongNode = root.children().get("/pong");
assertNodeEquals("pong", "/pong", false, Long.class, true, pongNode);
Node countNode = root.children().get("/count");
assertNodeEquals("count", "/count", false, MyDTO.Count.class, true, countNode);
Node embeddedNode = root.children().get("/embedded");
assertEquals(3, embeddedNode.children().size());
assertNodeEquals("embedded", "/embedded", false, MyEmbeddedDTO.class, true, embeddedNode);
Node marcoNode = embeddedNode.children().get("/marco");
assertNodeEquals("marco", "/embedded/marco", false, String.class, true, marcoNode);
Node poloNode = embeddedNode.children().get("/polo");
assertNodeEquals("polo", "/embedded/polo", false, Long.class, true, poloNode);
Node alphaNode = embeddedNode.children().get("/alpha");
assertNodeEquals("alpha", "/embedded/alpha", false, MyEmbeddedDTO.Alpha.class, true, alphaNode);
Node sRoot = s.nodeAtPath("/");
assertNodeEquals("", "/", false, MyDTO.class, false, sRoot);
Node sPingNode = s.nodeAtPath("/ping");
assertNodeEquals("ping", "/ping", false, String.class, true, sPingNode);
Node sPongNode = s.nodeAtPath("/pong");
assertNodeEquals("pong", "/pong", false, Long.class, true, sPongNode);
Node sCountNode = s.nodeAtPath("/count");
assertNodeEquals("count", "/count", false, MyDTO.Count.class, true, sCountNode);
Node sEmbeddedNode = s.nodeAtPath("/embedded");
assertNodeEquals("embedded", "/embedded", false, MyEmbeddedDTO.class, true, sEmbeddedNode);
Node sMarcoNode = s.nodeAtPath("/embedded/marco");
assertNodeEquals("marco", "/embedded/marco", false, String.class, true, sMarcoNode);
Node sPoloNode = s.nodeAtPath("/embedded/polo");
assertNodeEquals("polo", "/embedded/polo", false, Long.class, true, sPoloNode);
Node sAlphaNode = s.nodeAtPath("/embedded/alpha");
assertNodeEquals("alpha", "/embedded/alpha", false, MyEmbeddedDTO.Alpha.class, true, sAlphaNode);
}
@Test
public void testVisitor() {
Schema s = schematizer
.schematize("MyDTO", new TypeReference<MyDTO>(){})
.get("MyDTO");
StringBuilder sb = new StringBuilder();
s.visit( n -> sb.append("::").append(n.name()));
assertEquals("::::count::embedded::alpha::marco::polo::ping::pong", sb.toString());
}
@Test
public void testGetParentNode() {
Schema s = schematizer
.schematize("MyDTO", new TypeReference<MyDTO>(){})
.get("MyDTO");
assertNotNull(s);
Node embeddedNode = s.nodeAtPath("/embedded/marco");
assertTrue(!"ERROR".equals(embeddedNode.name()));
Node parentNode = s.parentOf(embeddedNode);
assertTrue(!"ERROR".equals(parentNode.name()));
Node grandparentNode = s.parentOf(parentNode);
assertTrue(!"ERROR".equals(grandparentNode.name()));
assertEquals("/", grandparentNode.absolutePath());
}
@Test
public void testTypeRules() {
Schema s = schematizer
.type("MyDTO", "/embedded", new TypeReference<MyEmbeddedDTO2<String>>(){})
.type("MyDTO", "/embedded/value", String.class)
.schematize("MyDTO", new TypeReference<MyDTO3<MyEmbeddedDTO2<String>>>(){})
.get("MyDTO");
assertNotNull(s);
Node embeddedNode = s.nodeAtPath("/embedded/value");
assertTrue(!"ERROR".equals(embeddedNode.name()));
Node parentNode = s.parentOf(embeddedNode);
assertTrue(!"ERROR".equals(parentNode.name()));
Node grandparentNode = s.parentOf(parentNode);
assertTrue(!"ERROR".equals(grandparentNode.name()));
assertEquals("/", grandparentNode.absolutePath());
}
private void assertNodeEquals(String name, String path, boolean isCollection, Object type, boolean fieldNotNull, Node node) {
assertNotNull(node);
assertEquals(name, node.name());
assertEquals(path, node.absolutePath());
assertEquals(isCollection, node.isCollection());
assertEquals(type, node.type());
if (fieldNotNull)
assertNotNull(node.field());
else
assertTrue(node.field() == null);
}
private void assertNodeDTOEquals(String name, String path, boolean isCollection, Class<?> type, Node.DTO node) {
assertNotNull(node);
assertEquals(name, node.name);
assertEquals(path, node.path);
assertEquals(isCollection, node.isCollection);
assertEquals(type.getName(), node.type);
}
}