Index: src/test/java/org/jboss/resteasy/test/finegrain/CacheControlTest.java =================================================================== --- src/test/java/org/jboss/resteasy/test/finegrain/CacheControlTest.java (revision 1453) +++ src/test/java/org/jboss/resteasy/test/finegrain/CacheControlTest.java (working copy) @@ -1,5 +1,8 @@ package org.jboss.resteasy.test.finegrain; +import static org.junit.Assert.assertTrue; + +import org.jboss.resteasy.core.ExtendedCacheControl; import org.jboss.resteasy.plugins.delegates.CacheControlDelegate; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.junit.Assert; @@ -78,5 +81,31 @@ } } + + @Test + public void testEveryDirectiveAppearsInStringifiedVersion() // TCK requires this + { + CacheControl cc = new CacheControl(); + cc.setNoCache(true); + cc.setPrivate(true); + cc.setNoStore(true); + String value = cc.toString(); + assertTrue(value.contains("no-cache")); + assertTrue(value.contains("no-store")); + assertTrue(value.contains("private")); + } + + @Test + public void testExtendedCacheControl() + { + ExtendedCacheControl cc = new ExtendedCacheControl(); + cc.setNoCache(true); + cc.setPublic(true); + cc.setNoStore(true); + String value = cc.toString(); + assertTrue(value.contains("no-cache")); + assertTrue(value.contains("no-store")); + assertTrue(value.contains("public")); + } } Index: src/main/java/org/jboss/resteasy/plugins/interceptors/CacheControlInterceptor.java =================================================================== --- src/main/java/org/jboss/resteasy/plugins/interceptors/CacheControlInterceptor.java (revision 1453) +++ src/main/java/org/jboss/resteasy/plugins/interceptors/CacheControlInterceptor.java (working copy) @@ -37,8 +37,7 @@ } else if (noMethodCache != null) { - cacheControl = new CacheControl(); - cacheControl.setNoCache(true); + initCacheControl(noMethodCache); } else if (cache != null) { @@ -46,9 +45,8 @@ } else if (nocache != null) { - cacheControl = new CacheControl(); - cacheControl.setNoCache(true); - for (String field : nocache.fields()) cacheControl.getNoCacheFields().add(field); + initCacheControl(nocache); + } return cacheControl != null; @@ -74,6 +72,14 @@ cacheControl.setNoTransform((methodCached.noTransform())); cacheControl.setProxyRevalidate(methodCached.proxyRevalidate()); } + + protected void initCacheControl(NoCache value) + { + cacheControl = new CacheControl(); + cacheControl.setNoCache(true); + cacheControl.setNoTransform(false); + for (String field : value.fields()) cacheControl.getNoCacheFields().add(field); + } public void postProcess(ServerResponse response) { Index: src/main/java/org/jboss/resteasy/plugins/delegates/CacheControlDelegate.java =================================================================== --- src/main/java/org/jboss/resteasy/plugins/delegates/CacheControlDelegate.java (revision 1453) +++ src/main/java/org/jboss/resteasy/plugins/delegates/CacheControlDelegate.java (working copy) @@ -2,6 +2,9 @@ import javax.ws.rs.core.CacheControl; import javax.ws.rs.ext.RuntimeDelegate; + +import org.jboss.resteasy.core.ExtendedCacheControl; + import java.util.List; /** @@ -13,7 +16,7 @@ public CacheControl fromString(String value) throws IllegalArgumentException { if (value == null) throw new IllegalArgumentException("Cache-Control value is null"); - CacheControl result = new CacheControl(); + ExtendedCacheControl result = new ExtendedCacheControl(); String[] directives = value.split(","); for (String directive : directives) @@ -77,7 +80,7 @@ } else if ("public".equals(lowercase)) { - // do nothing + result.setPublic(true); } else { @@ -104,7 +107,6 @@ if (fields.size() < 1) { addDirective("no-cache", buffer); - return buffer.toString(); } else { @@ -114,7 +116,14 @@ } } } - if (!value.isPrivate()) buffer.append("public"); + if (value instanceof ExtendedCacheControl) + { + ExtendedCacheControl ecc = (ExtendedCacheControl) value; + if (ecc.isPublic()) + { + addDirective("public", buffer); + } + } if (value.isMustRevalidate()) addDirective("must-revalidate", buffer); if (value.isNoTransform()) addDirective("no-transform", buffer); if (value.isNoStore()) addDirective("no-store", buffer); Index: src/main/java/org/jboss/resteasy/core/ExtendedCacheControl.java =================================================================== --- src/main/java/org/jboss/resteasy/core/ExtendedCacheControl.java (revision 0) +++ src/main/java/org/jboss/resteasy/core/ExtendedCacheControl.java (revision 0) @@ -0,0 +1,45 @@ +package org.jboss.resteasy.core; + +import javax.ws.rs.core.CacheControl; + +/** + * Adds support for the public directive which is not supported by {@link CacheControl} for some reason. + * + * @author Jozef Hartinger + * + * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1 + */ +public class ExtendedCacheControl extends CacheControl { + + private boolean _public = false; + + public boolean isPublic() { + return _public; + } + + public void setPublic(boolean _public) { + this._public = _public; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + (_public ? 1231 : 1237); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + ExtendedCacheControl other = (ExtendedCacheControl) obj; + if (_public != other._public) + return false; + return true; + } +}