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)); + } + +} Index: src/main/java/org/jboss/resteasy/plugins/providers/atom/AtomFeedProvider.java =================================================================== --- src/main/java/org/jboss/resteasy/plugins/providers/atom/AtomFeedProvider.java (revision 1368) +++ src/main/java/org/jboss/resteasy/plugins/providers/atom/AtomFeedProvider.java (working copy) @@ -91,7 +91,7 @@ { throw new JAXBMarshalException("Unable to find JAXBContext for media type: " + mediaType); } - HashSet set = new HashSet(); + HashSet> set = new HashSet>(); set.add(Feed.class); for (Entry entry : feed.getEntries()) { @@ -102,7 +102,7 @@ } try { - JAXBContext ctx = finder.createContext(annotations, set.toArray(new Class[set.size()])); + JAXBContext ctx = finder.findCacheContext(mediaType, annotations, set.toArray(new Class[set.size()])); Marshaller marshaller = ctx.createMarshaller(); NamespacePrefixMapper mapper = new NamespacePrefixMapper() { Index: src/main/java/org/jboss/resteasy/plugins/providers/atom/AtomEntryProvider.java =================================================================== --- src/main/java/org/jboss/resteasy/plugins/providers/atom/AtomEntryProvider.java (revision 1368) +++ src/main/java/org/jboss/resteasy/plugins/providers/atom/AtomEntryProvider.java (working copy) @@ -88,7 +88,7 @@ { throw new JAXBMarshalException("Unable to find JAXBContext for media type: " + mediaType); } - HashSet set = new HashSet(); + HashSet> set = new HashSet>(); set.add(Entry.class); if (entry.getContent() != null && entry.getContent().getJAXBObject() != null) { @@ -96,7 +96,7 @@ } try { - JAXBContext ctx = finder.createContext(annotations, set.toArray(new Class[set.size()])); + JAXBContext ctx = finder.findCacheContext(mediaType, annotations, set.toArray(new Class[set.size()])); Marshaller marshaller = ctx.createMarshaller(); NamespacePrefixMapper mapper = new NamespacePrefixMapper() {