/** * Copyright (C) 2010 Olafur Gauti Gudmundsson * <p/> * Licensed 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 * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * 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.mongodb.morphia; import org.bson.types.ObjectId; import org.junit.Before; import org.junit.Test; import org.mongodb.morphia.annotations.Entity; import org.mongodb.morphia.annotations.Id; import org.mongodb.morphia.mapping.validation.ConstraintViolationException; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; /** * @author Scott Hernandez */ public class TestInheritanceMappings extends TestBase { @Before @Override public void setUp() { super.setUp(); getMorphia().map(Car.class).map(AbstractVehicle.class).map(FlyingCar.class); } @Test(expected = ConstraintViolationException.class) public void testMapEntity() throws Exception { getMorphia().map(MapLike.class); MapLike m = new MapLike(); m.put("Name", "Scott"); getDs().save(m); assertNotNull(m.id); assertEquals(1, getDs().getCount(MapLike.class)); m = getDs().find(MapLike.class).get(); assertNotNull(m.id); assertTrue(m.containsKey("Name")); assertEquals("Scott", m.get("Name")); } @Test public void testParamEntity() throws Exception { getMorphia().map(ParameterizedEntity.class); ParameterizedEntity c = new ParameterizedEntity(); c.setId("foo"); c.b = "eh"; c.setK(12L); getDs().save(c); c = getDs().get(ParameterizedEntity.class, "foo"); assertNotNull(c.getId()); assertNotNull(c.b); assertNotNull(c.getK()); assertEquals("foo", c.getId()); assertEquals("eh", c.b); assertEquals(12, c.getK().longValue()); assertEquals(1, getDs().getCount(ParameterizedEntity.class)); } @Test public void testParamIdEntity() throws Exception { getMorphia().map(ParameterizedIdEntity.class); ParameterizedIdEntity c = new ParameterizedIdEntity(); c.setId("foo"); getDs().save(c); c = getDs().get(ParameterizedIdEntity.class, "foo"); assertNotNull(c.getId()); assertEquals("foo", c.getId()); assertEquals(1, getDs().getCount(ParameterizedIdEntity.class)); } @Test public void testParamIdEntity2() throws Exception { getMorphia().map(ParameterizedIdEntity2.class); ParameterizedIdEntity2 c = new ParameterizedIdEntity2(); c.setId("foo"); getDs().save(c); c = getDs().get(ParameterizedIdEntity2.class, "foo"); assertNotNull(c.getId()); assertEquals("foo", c.getId()); assertEquals(1, getDs().getCount(ParameterizedIdEntity2.class)); } @Test public void testSuperclassEntity() throws Exception { final Car c = new Car(); getDs().save(c); assertNotNull(c.getId()); assertEquals(1, getDs().getCount(Car.class)); assertEquals(1, getDs().getCount(AbstractVehicle.class)); } private enum VehicleClass { Bicycle, Moped, MiniCar, Car, Truck } private interface Vehicle { String getId(); VehicleClass getVehicleClass(); int getWheelCount(); } private interface MapPlusIterableStringString extends Iterable<Entry<String, String>>, Map<String, String> { } @Entity("vehicles") private abstract static class AbstractVehicle implements Vehicle { @Id private ObjectId id; @Override public String getId() { return id.toString(); } } private static class Car extends AbstractVehicle { @Override public VehicleClass getVehicleClass() { return VehicleClass.Car; } @Override public int getWheelCount() { return 4; } } private static class FlyingCar extends AbstractVehicle { @Override public VehicleClass getVehicleClass() { return VehicleClass.Car; } @Override public int getWheelCount() { return 0; } } public static class GenericIdPlus<T, K> { @Id private T id; private K k; public T getId() { return id; } public void setId(final T id) { this.id = id; } public K getK() { return k; } public void setK(final K k) { this.k = k; } } private static class ParameterizedEntity extends GenericIdPlus<String, Long> { private String b; } private static class GenericId<T> { @Id private T id; public T getId() { return id; } public void setId(final T id) { this.id = id; } } private static class GenericIdSub<V> extends GenericId<V> { } private static class ParameterizedIdEntity2 extends GenericIdSub<String> { } private static class ParameterizedIdEntity extends GenericId<String> { } @Entity(noClassnameStored = true) public static class MapLike implements MapPlusIterableStringString { private final HashMap<String, String> realMap = new HashMap<String, String>(); @Id private ObjectId id; @Override public Iterator<Entry<String, String>> iterator() { return realMap.entrySet().iterator(); } @Override public int size() { return realMap.size(); } @Override public boolean isEmpty() { return realMap.isEmpty(); } @Override public boolean containsKey(final Object key) { return realMap.containsKey(key); } @Override public boolean containsValue(final Object value) { return realMap.containsValue(value); } @Override public String get(final Object key) { return realMap.get(key); } @Override public String put(final String key, final String value) { return realMap.put(key, value); } @Override public String remove(final Object key) { return realMap.remove(key); } @Override public void putAll(final Map<? extends String, ? extends String> m) { realMap.putAll(m); } @Override public void clear() { realMap.clear(); } @Override public Set<String> keySet() { return realMap.keySet(); } @Override public Collection<String> values() { return realMap.values(); } @Override public Set<Entry<String, String>> entrySet() { return realMap.entrySet(); } } }