package xml.c1342; import java.io.StringReader; import java.io.StringWriter; import junit.framework.TestCase; import net.sf.cglib.proxy.Factory; import org.castor.xml.XMLProperties; import org.exolab.castor.mapping.Mapping; import org.exolab.castor.xml.Marshaller; import org.exolab.castor.xml.Unmarshaller; import org.exolab.castor.xml.XMLContext; public final class Test1342 extends TestCase { private static final String MAPPING_FILE = "mapping.xml"; public Test1342() { super(); } /** * Test unmarshalling of simple bean without proxy. * * @throws Exception For any exception thrown. */ public void testUnmarshalSimpleBean() throws Exception { Mapping mapping = new Mapping(); mapping.loadMapping(getClass().getResource(MAPPING_FILE).toExternalForm()); Unmarshaller unmarshaller = new Unmarshaller(Bean.class); unmarshaller.setMapping(mapping); String input = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<bean attribute=\"999\">" + "<element>element of 999</element>" + "</bean>"; Bean bean = (Bean) unmarshaller.unmarshal(new StringReader(input)); assertNotNull(bean); assertEquals(999, bean.getAttribute().intValue()); assertEquals("element of 999", bean.getElement()); assertNull(bean.getReference()); } /** * Test unmarshalling of bean refering to another one without proxy. * * @throws Exception For any exception thrown. */ public void testUnmarshalReferingBean() throws Exception { Mapping mapping = new Mapping(); mapping.loadMapping(getClass().getResource(MAPPING_FILE).toExternalForm()); Unmarshaller unmarshaller = new Unmarshaller(Bean.class); unmarshaller.setMapping(mapping); String input = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<bean attribute=\"100\">" + "<element>element of 100</element>" + "<reference attribute=\"999\">" + "<element>element of 999</element>" + "</reference>" + "</bean>"; Bean referer = (Bean) unmarshaller.unmarshal(new StringReader(input)); assertNotNull(referer); assertEquals(100, referer.getAttribute().intValue()); assertEquals("element of 100", referer.getElement()); assertNotNull(referer.getReference()); Bean refered = referer.getReference(); assertNotNull(refered); assertEquals(999, refered.getAttribute().intValue()); assertEquals("element of 999", refered.getElement()); assertNull(refered.getReference()); } /** * Test marshalling of simple bean without proxy. * * @throws Exception For any exception thrown. */ public void testMarshalSimpleBean() throws Exception { Mapping mapping = new Mapping(); mapping.loadMapping(getClass().getResource(MAPPING_FILE).toExternalForm()); StringWriter out = new StringWriter(); Marshaller marshaller = new Marshaller(out); marshaller.setMapping(mapping); Bean bean = new Bean(new Integer(999), "element of 999", null); marshaller.marshal(bean); String output = out.toString(); String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<bean attribute=\"999\">" + "<element>element of 999</element>" + "</bean>"; assertEquals(expected, output); } /** * Test marshalling of bean refering to another one without proxy. * * @throws Exception For any exception thrown. */ public void testMarshalReferingBean() throws Exception { Mapping mapping = new Mapping(); mapping.loadMapping(getClass().getResource(MAPPING_FILE).toExternalForm()); StringWriter out = new StringWriter(); Marshaller marshaller = new Marshaller(out); marshaller.setMapping(mapping); Bean refered = new Bean(new Integer(999), "element of 999", null); Bean referer = new Bean(new Integer(100), "element of 100", refered); marshaller.marshal(referer); String output = out.toString(); String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<bean attribute=\"100\">" + "<element>element of 100</element>" + "<reference attribute=\"999\">" + "<element>element of 999</element>" + "</reference>" + "</bean>"; assertEquals(expected, output); } /** * Test marshalling of simple bean with proxy. * * @throws Exception For any exception thrown. */ public void testMarshalSimpleBeanProxy() throws Exception { XMLContext xmlContext = new XMLContext(); xmlContext.setProperty(XMLProperties.PROXY_INTERFACES, "net.sf.cglib.proxy.Factory"); Mapping mapping = xmlContext.createMapping(); mapping.loadMapping(getClass().getResource(MAPPING_FILE).toExternalForm()); StringWriter out = new StringWriter(); Marshaller marshaller = xmlContext.createMarshaller(); marshaller.setWriter(out); marshaller.setMapping(mapping); // Joachim 2007-09-04 before XMLContext was introduced it looked like: // Configuration config = LocalConfiguration.getInstance(); // config.getProperties().setProperty( // XMLConfiguration.PROXY_INTERFACES, "net.sf.cglib.proxy.Factory"); // // Mapping mapping = new Mapping(); // mapping.loadMapping(getClass().getResource(MAPPING_FILE).toExternalForm()); // // StringWriter out = new StringWriter(); // Marshaller marshaller = new Marshaller(out); // marshaller.setMapping(mapping); Bean bean = new Bean(new Integer(999), "element of 999", null); Bean proxy = (Bean) Proxy.newInstance(bean); assertNotNull(proxy); assertEquals(Bean.class, proxy.getClass().getSuperclass()); assertEquals(1, proxy.getClass().getInterfaces().length); assertEquals(Factory.class, proxy.getClass().getInterfaces()[0]); assertEquals(999, proxy.getAttribute().intValue()); assertEquals("element of 999", proxy.getElement()); assertNull(proxy.getReference()); marshaller.marshal(proxy); String output = out.toString(); String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<bean attribute=\"999\">" + "<element>element of 999</element>" + "</bean>"; assertEquals(expected, output); } /** * Test marshalling of bean refering to another one with proxy. * * @throws Exception For any exception thrown. */ public void testMarshalReferingBeanProxy() throws Exception { XMLContext xmlContext = new XMLContext(); xmlContext.setProperty(XMLProperties.PROXY_INTERFACES, "net.sf.cglib.proxy.Factory"); Mapping mapping = xmlContext.createMapping(); mapping.loadMapping(getClass().getResource(MAPPING_FILE).toExternalForm()); StringWriter out = new StringWriter(); Marshaller marshaller = xmlContext.createMarshaller(); marshaller.setWriter(out); marshaller.setMapping(mapping); // Joachim 2007-09-04 before XMLContext was introduced it looked like: // Configuration config = LocalConfiguration.getInstance(); // config.getProperties().setProperty( // XMLConfiguration.PROXY_INTERFACES, "net.sf.cglib.proxy.Factory"); // // Mapping mapping = new Mapping(); // mapping.loadMapping(getClass().getResource(MAPPING_FILE).toExternalForm()); // // StringWriter out = new StringWriter(); // Marshaller marshaller = new Marshaller(out); // marshaller.setMapping(mapping); Bean refered = new Bean(new Integer(999), "element of 999", null); Bean referedProxy = (Bean) Proxy.newInstance(refered); assertNotNull(referedProxy); assertEquals(Bean.class, referedProxy.getClass().getSuperclass()); assertEquals(1, referedProxy.getClass().getInterfaces().length); assertEquals(Factory.class, referedProxy.getClass().getInterfaces()[0]); assertEquals(999, referedProxy.getAttribute().intValue()); assertEquals("element of 999", referedProxy.getElement()); assertNull(referedProxy.getReference()); Bean referer = new Bean(new Integer(100), "element of 100", referedProxy); Bean refererProxy = (Bean) Proxy.newInstance(referer); assertNotNull(refererProxy); assertEquals(Bean.class, refererProxy.getClass().getSuperclass()); assertEquals(1, refererProxy.getClass().getInterfaces().length); assertEquals(Factory.class, refererProxy.getClass().getInterfaces()[0]); assertEquals(100, refererProxy.getAttribute().intValue()); assertEquals("element of 100", refererProxy.getElement()); assertNotNull(refererProxy.getReference()); marshaller.marshal(refererProxy); String output = out.toString(); String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<bean attribute=\"100\">" + "<element>element of 100</element>" + "<reference attribute=\"999\">" + "<element>element of 999</element>" + "</reference>" + "</bean>"; assertEquals(expected, output); } }