Index: src/main/java/org/jboss/resteasy/plugins/providers/atom/AtomFeedProvider.java =================================================================== Index: src/main/java/org/jboss/resteasy/plugins/providers/atom/AtomEntryProvider.java =================================================================== Index: src/test/java/org/jboss/resteasy/plugins/providers/atom/AtomProviderTest.java =================================================================== --- src/test/java/org/jboss/resteasy/plugins/providers/atom/AtomProviderTest.java (revision 0) +++ src/test/java/org/jboss/resteasy/plugins/providers/atom/AtomProviderTest.java (revision 0) @@ -0,0 +1,79 @@ +package org.jboss.resteasy.plugins.providers.atom; + + +import static org.junit.Assert.*; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.management.ClassLoadingMXBean; +import java.lang.management.ManagementFactory; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.ext.MessageBodyWriter; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jboss.resteasy.plugins.providers.jaxb.XmlJAXBContextFinder; +import org.jboss.resteasy.spi.ResteasyProviderFactory; +import org.junit.Before; +import org.junit.Test; + +public class AtomProviderTest { + + private AtomFeedProvider atomFeedProvider; + + private static Log log = LogFactory.getLog(AtomProviderTest.class); + + private AtomEntryProvider atomEntryProvider; + + @Before + public void setUp() throws Exception { + + ResteasyProviderFactory resteasyProviderFactory = new ResteasyProviderFactory(); + resteasyProviderFactory.addContextResolver(XmlJAXBContextFinder.class); + + atomFeedProvider = new AtomFeedProvider(); + atomFeedProvider.providers = resteasyProviderFactory; + + atomEntryProvider = new AtomEntryProvider(); + atomEntryProvider.providers = resteasyProviderFactory; + } + + @Test + public void testAtomFeedProviderWriteToReusesJAXBContext() throws WebApplicationException, IOException { + doPermGenTest(new Feed(), atomFeedProvider, "Atom Feed Provider"); + } + + @Test + public void testAtomEntryProviderWriteToReusesJAXBContext() throws IOException { + doPermGenTest(new Entry(), atomEntryProvider, "Atom Entry Provider"); + } + + private void doPermGenTest(T entity, MessageBodyWriter writer, String description) throws IOException { + ClassLoadingMXBean classLoadingStats = ManagementFactory.getClassLoadingMXBean(); + long loadedClasses = classLoadingStats.getTotalLoadedClassCount(); + log.info(String.format("Class count at start: %d", loadedClasses)); + int steadyStateCount = 0; + + for (int i = 0; i < 50; i++) { + + writer.writeTo(entity, entity.getClass(), entity.getClass(), null, + MediaType.APPLICATION_ATOM_XML_TYPE, null, new ByteArrayOutputStream()); + + if (loadedClasses == classLoadingStats.getTotalLoadedClassCount()) { + if (++steadyStateCount >= 10) { + return; + } + } else { + steadyStateCount = 0; + } + loadedClasses = classLoadingStats.getTotalLoadedClassCount(); + log.info(String.format("Class count at %d for iteration %d", loadedClasses, i)); + } + + fail(String.format("%s should not be loading new classes on each call to writeTo", + description)); + } + +}