Skip to content

Commit

Permalink
Annotation-based cache configuration of the HTTP routes.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Jan 18, 2017
1 parent adab262 commit 2f6c643
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 16 deletions.
Expand Up @@ -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;
Expand Down Expand Up @@ -150,20 +151,15 @@ protected List<String> 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<String> 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());
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -246,19 +242,40 @@ 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);
}
}
}
}

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<String> 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;
}

Expand Down
Expand Up @@ -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;

Expand Down Expand Up @@ -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();
}
}

}

0 comments on commit 2f6c643

Please sign in to comment.