diff --git a/rapidoid-http-server/src/main/java/org/rapidoid/setup/PojoHandlersSetup.java b/rapidoid-http-server/src/main/java/org/rapidoid/setup/PojoHandlersSetup.java index 4abda6b0ef..ba2bc93fc2 100644 --- a/rapidoid-http-server/src/main/java/org/rapidoid/setup/PojoHandlersSetup.java +++ b/rapidoid-http-server/src/main/java/org/rapidoid/setup/PojoHandlersSetup.java @@ -3,6 +3,7 @@ import org.rapidoid.RapidoidThing; import org.rapidoid.annotation.*; import org.rapidoid.beany.Metadata; +import org.rapidoid.cache.Cached; import org.rapidoid.cls.Cls; import org.rapidoid.ioc.IoCContext; import org.rapidoid.log.Log; @@ -150,20 +151,15 @@ protected List getControllerUris(Class component) { private void registerOrDeregister(boolean register, Object bean, String ctxPath, Method method) { - Transaction transaction = method.getAnnotation(Transaction.class); - TransactionMode tx = transaction != null ? transaction.value() : null; - - Set rolesAllowed = Secure.getRolesAllowed(method); - String[] roles = U.arrayOf(String.class, rolesAllowed); - for (Annotation ann : method.getAnnotations()) { + if (ann instanceof Page) { Page page = (Page) ann; String path = pathOf(method, ctxPath, uriOf(ann)); if (register) { - OnRoute route = route(setup.page(path), tx).roles(roles); + OnRoute route = route(setup.page(path), method); if (U.notEmpty(page.view())) { route.view(page.view()); @@ -183,7 +179,7 @@ private void registerOrDeregister(boolean register, Object bean, String ctxPath, String path = pathOf(method, ctxPath, uriOf(ann)); if (register) { - route(setup.get(path), tx).roles(roles).json(method, bean); + route(setup.get(path), method).json(method, bean); } else { setup.deregister(Constants.GET, path); } @@ -192,7 +188,7 @@ private void registerOrDeregister(boolean register, Object bean, String ctxPath, String path = pathOf(method, ctxPath, uriOf(ann)); if (register) { - route(setup.post(path), tx).roles(roles).json(method, bean); + route(setup.post(path), method).json(method, bean); } else { setup.deregister(Constants.POST, path); } @@ -201,7 +197,7 @@ private void registerOrDeregister(boolean register, Object bean, String ctxPath, String path = pathOf(method, ctxPath, uriOf(ann)); if (register) { - route(setup.put(path), tx).roles(roles).json(method, bean); + route(setup.put(path), method).json(method, bean); } else { setup.deregister(Constants.PUT, path); } @@ -210,7 +206,7 @@ private void registerOrDeregister(boolean register, Object bean, String ctxPath, String path = pathOf(method, ctxPath, uriOf(ann)); if (register) { - route(setup.delete(path), tx).roles(roles).json(method, bean); + route(setup.delete(path), method).json(method, bean); } else { setup.deregister(Constants.DELETE, path); } @@ -219,7 +215,7 @@ private void registerOrDeregister(boolean register, Object bean, String ctxPath, String path = pathOf(method, ctxPath, uriOf(ann)); if (register) { - route(setup.patch(path), tx).roles(roles).json(method, bean); + route(setup.patch(path), method).json(method, bean); } else { setup.deregister(Constants.PATCH, path); } @@ -228,7 +224,7 @@ private void registerOrDeregister(boolean register, Object bean, String ctxPath, String path = pathOf(method, ctxPath, uriOf(ann)); if (register) { - route(setup.options(path), tx).roles(roles).json(method, bean); + route(setup.options(path), method).json(method, bean); } else { setup.deregister(Constants.OPTIONS, path); } @@ -237,7 +233,7 @@ private void registerOrDeregister(boolean register, Object bean, String ctxPath, String path = pathOf(method, ctxPath, uriOf(ann)); if (register) { - route(setup.head(path), tx).roles(roles).json(method, bean); + route(setup.head(path), method).json(method, bean); } else { setup.deregister(Constants.HEAD, path); } @@ -246,7 +242,7 @@ private void registerOrDeregister(boolean register, Object bean, String ctxPath, String path = pathOf(method, ctxPath, uriOf(ann)); if (register) { - route(setup.trace(path), tx).roles(roles).json(method, bean); + route(setup.trace(path), method).json(method, bean); } else { setup.deregister(Constants.TRACE, path); } @@ -254,11 +250,32 @@ private void registerOrDeregister(boolean register, Object bean, String ctxPath, } } - private OnRoute route(OnRoute route, TransactionMode tx) { + private OnRoute route(OnRoute route, Method method) { + + // TRANSACTION + + Transaction transaction = method.getAnnotation(Transaction.class); + TransactionMode tx = transaction != null ? transaction.value() : null; + if (tx != null) { route.tx(tx); } + // ROLES + + Set rolesAllowed = Secure.getRolesAllowed(method); + String[] roles = U.arrayOf(String.class, rolesAllowed); + + route.roles(roles); + + // CACHE + + Cached cached = method.getAnnotation(Cached.class); + + if (cached != null) { + route.cacheTTL(cached.ttl()); + } + return route; } diff --git a/rapidoid-integration-tests/src/test/java/org/rapidoid/http/HttpCachingTest.java b/rapidoid-integration-tests/src/test/java/org/rapidoid/http/HttpCachingTest.java index 77bc6d81f3..c7bb4177b5 100644 --- a/rapidoid-integration-tests/src/test/java/org/rapidoid/http/HttpCachingTest.java +++ b/rapidoid-integration-tests/src/test/java/org/rapidoid/http/HttpCachingTest.java @@ -22,7 +22,10 @@ import org.junit.Test; import org.rapidoid.annotation.Authors; +import org.rapidoid.annotation.GET; import org.rapidoid.annotation.Since; +import org.rapidoid.cache.Cached; +import org.rapidoid.setup.App; import org.rapidoid.setup.On; import org.rapidoid.u.U; @@ -55,4 +58,41 @@ public void testHttpCaching() { } } + @Test + public void testHttpCachingWithAnnotations() { + + App.beans(CachingCtrl.class); + + int next = 1; + for (int n = 1; n <= 3; n++) { + + for (int i = 0; i < 10; i++) { + Self.get("/x").expect("" + next++); + Self.get("/y").expect("" + n); + } + + U.sleep(2100); + } + } + + static class CachingCtrl { + + // without caching + AtomicInteger x = new AtomicInteger(); + + // with caching + AtomicInteger y = new AtomicInteger(); + + @GET + public Object x() { + return x.incrementAndGet(); + } + + @GET + @Cached(ttl = 2000) + public Object y() { + return y.incrementAndGet(); + } + } + }