/**
* The MIT License
*
* Copyright (c) 2010-2011 Sonatype, Inc. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.hudsonci.utils.marshal.xref;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import org.hudsonci.utils.marshal.XStreamMarshaller;
import org.hudsonci.utils.test.TestUtil;
import org.junit.Test;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
* Tests for {@link XReferenceStoreConverter}.
*/
public class XReferenceStoreConverterTest
{
private final TestUtil util = new TestUtil(this);
@Test
public void testChewDocument() throws Exception {
XStream xs = new XStream();
xs.autodetectAnnotations(true);
XStreamMarshaller marshaller = new XStreamMarshaller(xs);
XReferenceStore store = new FileXReferenceStore(marshaller, util.resolveFile("target/test-xref"));
XReferenceStoreConverter converter = new XReferenceStoreConverter(store, xs.getMapper(), xs.getReflectionProvider());
xs.registerConverter(converter);
Document<Record> doc1 = new Document<Record>();
Record rec1 = new Record("1");
Entity ent1 = new Entity("1");
rec1.set(ent1);
assertNotNull(rec1.entity.holder);
assertTrue(rec1.entity.holder instanceof XReference.InstanceHolder);
XReference.InstanceHolder holder1 = (XReference.InstanceHolder)rec1.entity.holder;
assertNotNull(holder1.instance);
doc1.records.add(rec1);
StringWriter buff = new StringWriter();
marshaller.marshal(doc1, buff);
System.out.println("XML:\n" + buff);
Document<Record> doc2 = (Document<Record>) marshaller.unmarshal(new StringReader(buff.toString()));
assertNotNull(doc2);
assertNotNull(doc2.records);
assertEquals(1, doc2.records.size());
Record rec2 = doc2.records.get(0);
assertNotNull(rec2.entity);
System.out.println("ENT REF: " + rec2.entity);
assertNotNull(rec2.entity.holder);
assertTrue(rec2.entity.holder instanceof XReferenceStoreConverter.UnmarshalHolder);
XReferenceStoreConverter.UnmarshalHolder holder2 = (XReferenceStoreConverter.UnmarshalHolder)rec2.entity.holder;
assertNull(holder2.instance);
Entity ent2 = rec2.get();
System.out.println("ENT: " + ent2);
assertNotNull(ent2);
assertNotNull(holder2.instance);
buff = new StringWriter();
marshaller.marshal(doc2, buff);
System.out.println("XML\n" + buff);
}
@XStreamAlias("document")
private static class Document<T>
{
public final List<T> records = new ArrayList<T>();
}
@XStreamAlias("record")
private static class Record
{
private final String name;
private XReference entity;
private Record(String name) {
this.name = name;
}
public void set(Entity value) {
entity = new EntityReference(value);
}
public Entity get() {
if (entity != null) {
return (Entity) entity.get();
}
return null;
}
@XStreamAlias("entity-xref")
private class EntityReference
extends XReference
{
private EntityReference(final Entity value) {
super(value);
}
@Override
public String getPath() {
return "test-" + name + ".xml";
}
}
}
@XStreamAlias("entity")
private static class Entity
{
public final String name;
private Entity(String name) {
this.name = name;
}
@Override
public String toString() {
return "Entity{" +
"name='" + name + '\'' +
'}';
}
}
}