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.Since;
import org.rapidoid.dispatch.PojoDispatchException;
import org.rapidoid.dispatch.PojoHandlerNotFoundException;
import org.rapidoid.http.Handler;
import org.rapidoid.http.HttpExchange;
import org.rapidoid.http.HttpExchangeInternals;
Expand All @@ -31,6 +33,7 @@
import org.rapidoid.log.Log;
import org.rapidoid.pages.Pages;
import org.rapidoid.rest.WebPojoDispatcher;
import org.rapidoid.rest.WebReq;
import org.rapidoid.util.CustomizableClassLoader;
import org.rapidoid.util.U;
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());

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) {
dispatcher = new WebPojoDispatcher(appCls.services);
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) {
return result;
}

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

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

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));

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

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.cls.Cls;
import org.rapidoid.config.Conf;
import org.rapidoid.dispatch.PojoDispatchException;
import org.rapidoid.dispatch.PojoHandlerNotFoundException;
import org.rapidoid.html.Cmd;
import org.rapidoid.http.HTTPServer;
import org.rapidoid.http.HttpExchange;
Expand All @@ -47,8 +45,6 @@
import org.rapidoid.pages.impl.BuiltInCmdHandler;
import org.rapidoid.pages.impl.ComplexView;
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.U;
import org.rapidoid.util.UTILS;
Expand All @@ -66,7 +62,7 @@ public static void registerPages(HTTPServer server) {
server.serve(new PageHandler());
}

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

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) {

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);
}
}
public static boolean isEmiting(HttpExchange x) {
return x.isPostReq();
}

String pageName = pageName(x);
if (pageName == null) {
return null;
public static Object dispatch(HttpExchange x, Object page) {
if (Pages.isEmiting(x)) {
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";

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

Object page = Cls.newInstance(pageClass);

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

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

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

0 comments on commit 3daf81e

Please sign in to comment.