package org.simpleframework.xml.convert; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import org.simpleframework.xml.ElementList; import org.simpleframework.xml.Root; import org.simpleframework.xml.ValidationTestCase; import org.simpleframework.xml.convert.ExampleConverters.Cat; import org.simpleframework.xml.convert.ExampleConverters.CatConverter; import org.simpleframework.xml.convert.ExampleConverters.Dog; import org.simpleframework.xml.convert.ExampleConverters.DogConverter; import org.simpleframework.xml.convert.ExampleConverters.Pet; import org.simpleframework.xml.core.Persister; import org.simpleframework.xml.strategy.CycleStrategy; public class RegistryCycleStrategyTest extends ValidationTestCase { @Root public static class PetBucket { @ElementList(inline=true) private List<Pet> list = new ArrayList<Pet>(); public void addPet(Pet pet){ list.add(pet); } public List<Pet> getPets(){ return list; } } public void testCycle() throws Exception { Registry registry = new Registry(); CycleStrategy inner = new CycleStrategy(); RegistryStrategy strategy = new RegistryStrategy(registry, inner); Persister persister = new Persister(strategy); PetBucket bucket = new PetBucket(); StringWriter writer = new StringWriter(); registry.bind(Cat.class, CatConverter.class); registry.bind(Dog.class, DogConverter.class); Pet kitty = new Cat("Kitty", 10); Pet lassie = new Dog("Lassie", 7); Pet ben = new Dog("Ben", 8); bucket.addPet(kitty); bucket.addPet(lassie); bucket.addPet(ben); bucket.addPet(lassie); bucket.addPet(kitty); persister.write(bucket, writer); persister.write(bucket, System.out); String text = writer.toString(); PetBucket copy = persister.read(PetBucket.class, text); assertEquals(copy.getPets().get(0), bucket.getPets().get(0)); assertEquals(copy.getPets().get(1), bucket.getPets().get(1)); assertEquals(copy.getPets().get(2), bucket.getPets().get(2)); assertEquals(copy.getPets().get(3), bucket.getPets().get(3)); assertEquals(copy.getPets().get(4), bucket.getPets().get(4)); assertTrue(copy.getPets().get(0) == copy.getPets().get(4)); // cycle assertTrue(copy.getPets().get(1) == copy.getPets().get(3)); // cycle assertElementExists(text, "/petBucket"); assertElementExists(text, "/petBucket/pet"); assertElementHasAttribute(text, "/petBucket", "id", "0"); assertElementHasAttribute(text, "/petBucket/pet[1]", "id", "1"); assertElementHasAttribute(text, "/petBucket/pet[2]", "id", "2"); assertElementHasAttribute(text, "/petBucket/pet[3]", "id", "3"); assertElementHasAttribute(text, "/petBucket/pet[4]", "reference", "2"); assertElementHasAttribute(text, "/petBucket/pet[5]", "reference", "1"); assertElementHasValue(text, "/petBucket/pet[1]/name", "Kitty"); assertElementHasValue(text, "/petBucket/pet[1]/age", "10"); assertElementHasAttribute(text, "/petBucket/pet[1]", "class", Cat.class.getName()); assertElementHasAttribute(text, "/petBucket/pet[2]", "class", Dog.class.getName()); } }