Skip to content

Commit

Permalink
Refactored app request dispatching.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Jul 9, 2015
1 parent 6292755 commit 3daf81e
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 42 deletions.
47 changes: 38 additions & 9 deletions rapidoid-app/src/main/java/org/rapidoid/app/AppHandler.java
Expand Up @@ -22,6 +22,8 @@


import org.rapidoid.annotation.Authors; import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since; import org.rapidoid.annotation.Since;
import org.rapidoid.dispatch.PojoDispatchException;
import org.rapidoid.dispatch.PojoHandlerNotFoundException;
import org.rapidoid.http.Handler; import org.rapidoid.http.Handler;
import org.rapidoid.http.HttpExchange; import org.rapidoid.http.HttpExchange;
import org.rapidoid.http.HttpExchangeInternals; import org.rapidoid.http.HttpExchangeInternals;
Expand All @@ -31,6 +33,7 @@
import org.rapidoid.log.Log; import org.rapidoid.log.Log;
import org.rapidoid.pages.Pages; import org.rapidoid.pages.Pages;
import org.rapidoid.rest.WebPojoDispatcher; import org.rapidoid.rest.WebPojoDispatcher;
import org.rapidoid.rest.WebReq;
import org.rapidoid.util.CustomizableClassLoader; import org.rapidoid.util.CustomizableClassLoader;
import org.rapidoid.util.U; import org.rapidoid.util.U;
import org.rapidoid.util.UTILS; import org.rapidoid.util.UTILS;
Expand Down Expand Up @@ -92,26 +95,52 @@ static Object processReq(HttpExchange x) {


final AppClasses appCls = Apps.getAppClasses(x, xi.getClassLoader()); final AppClasses appCls = Apps.getAppClasses(x, xi.getClassLoader());


WebPojoDispatcher dispatcher = (WebPojoDispatcher) appCls.ctx.get(DISPATCHER); Object result = dispatch(x, appCls);

if (result != null) {
return result;
} else {
throw x.notFound();
}
}

public static Object dispatch(HttpExchange x, AppClasses appCls) {

// static files
if (x.serveStaticFile()) {
return x;
}


WebPojoDispatcher dispatcher = (WebPojoDispatcher) appCls.ctx.get(DISPATCHER);
// TODO address race conditions (currently not a problem)
if (dispatcher == null) { if (dispatcher == null) {
dispatcher = new WebPojoDispatcher(appCls.services); dispatcher = new WebPojoDispatcher(appCls.services);
appCls.ctx.put(DISPATCHER, dispatcher); appCls.ctx.put(DISPATCHER, dispatcher);
} }


Object result = Pages.dispatch(x, dispatcher, appCls.pages); // REST services
if (dispatcher != null) {
try {
return dispatcher.dispatch(new WebReq(x));
} catch (PojoHandlerNotFoundException e) {
// / just ignore, will try to dispatch a page next...
} catch (PojoDispatchException e) {
return x.errorResponse(e);
}
}

// GUI pages

Object result = Pages.dispatchIfExists(x, appCls.pages);
if (result != null) { if (result != null) {
return result; return result;
} }


if (!U.isEmpty(appCls.screens) || appCls.main != null) { // App screens
Object view = new AppPageGeneric(x, appCls);


if (Pages.isEmiting(x)) { if (!U.isEmpty(appCls.screens) || appCls.main != null) {
return Pages.emit(x, view); Object genericPage = new AppPageGeneric(x, appCls);
} else { return Pages.dispatch(x, genericPage);
return Pages.serve(x, view);
}
} }


throw x.notFound(); throw x.notFound();
Expand Down
Expand Up @@ -38,7 +38,7 @@ public Object handle(HttpExchange x) throws Exception {


Map<String, Class<?>> pages = Cls.classMap(Scan.bySuffix("Page", null, null)); Map<String, Class<?>> pages = Cls.classMap(Scan.bySuffix("Page", null, null));


Object result = Pages.dispatch(x, null, pages); Object result = Pages.dispatch(x, pages);


return result != null ? result : x.notFound(); return result != null ? result : x.notFound();
} }
Expand Down
45 changes: 13 additions & 32 deletions rapidoid-pages/src/main/java/org/rapidoid/pages/Pages.java
Expand Up @@ -32,8 +32,6 @@
import org.rapidoid.beany.Beany; import org.rapidoid.beany.Beany;
import org.rapidoid.cls.Cls; import org.rapidoid.cls.Cls;
import org.rapidoid.config.Conf; import org.rapidoid.config.Conf;
import org.rapidoid.dispatch.PojoDispatchException;
import org.rapidoid.dispatch.PojoHandlerNotFoundException;
import org.rapidoid.html.Cmd; import org.rapidoid.html.Cmd;
import org.rapidoid.http.HTTPServer; import org.rapidoid.http.HTTPServer;
import org.rapidoid.http.HttpExchange; import org.rapidoid.http.HttpExchange;
Expand All @@ -47,8 +45,6 @@
import org.rapidoid.pages.impl.BuiltInCmdHandler; import org.rapidoid.pages.impl.BuiltInCmdHandler;
import org.rapidoid.pages.impl.ComplexView; import org.rapidoid.pages.impl.ComplexView;
import org.rapidoid.pages.impl.PageRenderer; import org.rapidoid.pages.impl.PageRenderer;
import org.rapidoid.rest.WebPojoDispatcher;
import org.rapidoid.rest.WebReq;
import org.rapidoid.util.Constants; import org.rapidoid.util.Constants;
import org.rapidoid.util.U; import org.rapidoid.util.U;
import org.rapidoid.util.UTILS; import org.rapidoid.util.UTILS;
Expand All @@ -66,7 +62,7 @@ public static void registerPages(HTTPServer server) {
server.serve(new PageHandler()); server.serve(new PageHandler());
} }


public static String pageName(HttpExchange x) { public static String getPageName(HttpExchange x) {
String path = x.path(); String path = x.path();


if (path.endsWith(".html")) { if (path.endsWith(".html")) {
Expand Down Expand Up @@ -153,27 +149,20 @@ public static Object render(HttpExchange x, Object page) {
} }
} }


public static Object dispatch(HttpExchange x, WebPojoDispatcher serviceDispatcher, Map<String, Class<?>> pages) { public static boolean isEmiting(HttpExchange x) {

return x.isPostReq();
if (x.serveStaticFile()) { }
return x;
}

if (serviceDispatcher != null) {
try {
return serviceDispatcher.dispatch(new WebReq(x));
} catch (PojoHandlerNotFoundException e) {
// / just ignore, will try to dispatch a page next...
} catch (PojoDispatchException e) {
return x.errorResponse(e);
}
}


String pageName = pageName(x); public static Object dispatch(HttpExchange x, Object page) {
if (pageName == null) { if (Pages.isEmiting(x)) {
return null; return Pages.emit(x, page);
} else {
return Pages.serve(x, page);
} }
}


public static Object dispatchIfExists(HttpExchange x, Map<String, Class<?>> pages) {
String pageName = Pages.getPageName(x);
String pageClassName = U.capitalized(pageName) + "Page"; String pageClassName = U.capitalized(pageName) + "Page";


Class<?> pageClass = pages.get(pageClassName); Class<?> pageClass = pages.get(pageClassName);
Expand All @@ -183,15 +172,7 @@ public static Object dispatch(HttpExchange x, WebPojoDispatcher serviceDispatche


Object page = Cls.newInstance(pageClass); Object page = Cls.newInstance(pageClass);


if (isEmiting(x)) { return dispatch(x, page);
return emit(x, page);
} else {
return serve(x, page);
}
}

public static boolean isEmiting(HttpExchange x) {
return x.isPostReq();
} }


public static Object serve(HttpExchange x, Object view) { public static Object serve(HttpExchange x, Object view) {
Expand Down

0 comments on commit 3daf81e

Please sign in to comment.