actionRuntime -> actionRuntime.getActionPath() + ' ' + actionRuntime.getActionMethod())) .forEach(ar -> { final String actionMethod = ar.getActionMethod(); ProxettaUtil.resolveTargetClass(ar.getActionClass()), 2) + '#' + ar.getActionClassMethod().getName(); Chalk256.chalk().green(), ar.getActionPath(), Chalk256.chalk().blue(), signature, width - 7 - 1 actionRuntime -> actionRuntime.getActionPath() + ' ' + actionRuntime.getActionMethod())) .forEach(ar -> { final String actionPath = ar.getActionPath();
protected ActionRequest createActionRequest(String actionPath) { HttpServletRequest servletRequest = mock(HttpServletRequest.class); HttpServletResponse servletResponse = mock(HttpServletResponse.class); HttpSession httpSession = mock(HttpSession.class); ServletContext servletContext = mock(ServletContext.class); when(servletRequest.getSession()).thenReturn(httpSession); when(httpSession.getServletContext()).thenReturn(servletContext); MadvocController madvocController = new MadvocController(); Object action = new Object(); ActionRuntime actionRuntime = new ActionRuntime( null, Action.class, ClassUtil.findMethod(Action.class, "view"), null, null, new ActionDefinition(actionPath, "GET"), ServletDispatcherActionResult.class, null, false, false, null, null); return new ActionRequest(madvocController, actionRuntime.getActionPath(), MadvocUtil.splitPathToChunks(actionRuntime.getActionPath()), actionRuntime, action, servletRequest, servletResponse); }
/** * Invokes action method after starting all interceptors. * After method invocation, all interceptors will finish, in opposite order. */ protected Object invokeActionMethod() throws Exception { if (actionRuntime.isActionHandlerDefined()) { actionRuntime.getActionHandler().handle(this); return null; } final Object[] params = targets.extractParametersValues(); try { return actionRuntime.getActionClassMethod().invoke(action, params); } catch(InvocationTargetException itex) { throw wrapToException(unwrapThrowable(itex)); } }
/** * Registers manually created {@link ActionRuntime action runtime configurations}. * Optionally, if action path with the same name already exist, * exception will be thrown. */ public ActionRuntime registerActionRuntime(final ActionRuntime actionRuntime) { final String actionPath = actionRuntime.getActionPath(); final String method = actionRuntime.getActionMethod(); log.debug(() -> "Madvoc action: " + ifNotNull(method, m -> m + " ") + actionRuntime.getActionPath() + " => " + actionRuntime.createActionString()); final RouteChunk routeChunk = routes.registerPath(method, actionPath); if (routeChunk.value() != null) { // existing chunk if (detectDuplicatePathsEnabled) { throw new MadvocException("Duplicate action path for [" + actionRuntime + "] occupied by: [" + routeChunk.value() + "]"); } } else { actionsCount++; } routeChunk.bind(actionRuntime); // finally runtimes.put(actionRuntime.createActionString(), actionRuntime); // async check if (actionRuntime.isAsync()) { asyncMode = true; } return actionRuntime; }
assertEquals(ReAction.class, cfg.getActionClass()); assertEquals("/re/wild{id}cat", cfg.getActionPath()); RouteChunk chunk = cfg.getRouteChunk(); assertEquals(1, chunk.pathMacros().macrosCount()); assertEquals("id", chunk.pathMacros().names()[0]); assertEquals(ReAction.class, cfg.getActionClass()); assertEquals("/re/wild{id}dog", cfg.getActionPath()); assertEquals("POST", cfg.getActionMethod()); chunk = cfg.getRouteChunk(); assertEquals(1, chunk.pathMacros().macrosCount()); assertEquals("id", chunk.pathMacros().names()[0]);
@Test void testClasses() { WebApp webapp = new WebApp(); webapp.start(); ActionMethodParser actionMethodParser = webapp.madvocContainer().lookupComponent(ActionMethodParser.class); ActionRuntime cfg = parse(actionMethodParser, "fixtures.tst.Boo1Action#foo"); assertNotNull(cfg); assertEquals(Boo1Action.class, cfg.getActionClass()); assertEquals("/boo1.foo", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst.Boo2Action#foo"); assertNotNull(cfg); assertEquals(Boo2Action.class, cfg.getActionClass()); assertEquals("/bbb.foo", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst.Boo2Action#foo1"); assertEquals("/bbb.xxx", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst.Boo2Action#foo2"); assertEquals("/bbb.foo2.xxx", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst.Boo2Action#foo3"); assertEquals("/bbb", cfg.getActionPath()); }
assertEquals(BooAction.class, cfg.getActionClass()); assertEquals("/fixtures/tst/boo.foo", cfg.getActionPath()); assertEquals("/fixtures/tst/boo.xxx", cfg.getActionPath()); assertEquals("/fixtures/tst/boo.foo2.xxx", cfg.getActionPath()); assertEquals("/fixtures/tst/boo", cfg.getActionPath()); assertEquals("/xxx", cfg.getActionPath()); assertNull(cfg.getActionMethod()); assertEquals("/xxx", cfg.getActionPath()); assertEquals("DELETE", cfg.getActionMethod()); assertEquals("/xxx.html", cfg.getActionPath()); assertEquals("POST", cfg.getActionMethod()); assertEquals("/fixtures/tst/boo.qfoo62", cfg.getActionPath()); assertEquals("/foo7.html", cfg.getActionPath());
@Test void testManualAction_asComponent() { WebApp webApp = WebApp .createWebApp() .registerComponent(ManualRegistration.class) .start(); ActionsManager actionsManager = webApp.madvocContainer().requestComponent(ActionsManager.class); assertEquals(2, actionsManager.getActionsCount()); ActionRuntime actionRuntime = actionsManager.lookup("GET", MadvocUtil.splitPathToChunks("/hello")); assertNotNull(actionRuntime); assertEquals(BooAction.class, actionRuntime.getActionClass()); assertEquals("foo1", actionRuntime.getActionClassMethod().getName()); actionRuntime = actionsManager.lookup("GET", MadvocUtil.splitPathToChunks("/world")); assertNotNull(actionRuntime); assertEquals(BooAction.class, actionRuntime.getActionClass()); assertEquals("foo2", actionRuntime.getActionClassMethod().getName()); }
@Test void testMacrosDups() { WebApp webapp = new WebApp(); webapp.start(); ActionsManager actionsManager = webapp.madvocContainer().lookupComponent(ActionsManager.class); webapp.madvocContainer().lookupComponent(RootPackages.class).addRootPackageOf(this.getClass()); actionsManager.setPathMacroClass(RegExpPathMacros.class); actionsManager.registerAction(ReAction.class, "duplo2", null); actionsManager.registerAction(ReAction.class, "duplo1", null); ActionRuntime cfg = actionsManager.lookup("GET", MadvocUtil.splitPathToChunks("/re/duplo/123")); assertNotNull(cfg); assertEquals(ReAction.class, cfg.getActionClass()); assertEquals("/re/duplo/{id:^[0-9]+}", cfg.getActionPath()); RouteChunk chunk = cfg.getRouteChunk(); assertEquals(1, chunk.pathMacros().macrosCount()); assertEquals("id", chunk.pathMacros().names()[0]); cfg = actionsManager.lookup("GET", MadvocUtil.splitPathToChunks("/re/duplo/aaa")); assertNotNull(cfg); assertEquals(ReAction.class, cfg.getActionClass()); assertEquals("/re/duplo/{sid}", cfg.getActionPath()); chunk = cfg.getRouteChunk(); assertEquals(1, chunk.pathMacros().macrosCount()); assertEquals("sid", chunk.pathMacros().names()[0]); assertEquals(2, actionsManager.getActionsCount()); }
log.debug("Invoke action for '" + actionPath + "' using " + actionRuntime.createActionString()); if (actionRuntime.isActionHandlerDefined()) { action = actionRuntime.getActionHandler(); action = createAction(actionRuntime.getActionClass()); if (actionRuntime.isAsync()) { asyncActionExecutor.invoke(actionRequest); } else {
/** * Lookups value as an alias and, if not found, as a default alias. */ protected String lookupAlias(final String alias) { String value = actionsManager.lookupPathAlias(alias); if (value == null) { ActionRuntime cfg = actionsManager.lookup(alias); if (cfg != null) { value = cfg.getActionPath(); } } return value; }
@Test void testActionPathMacros2() { WebApp webapp = new WebApp(); webapp.start(); ActionsManager actionsManager = webapp.madvocContainer().lookupComponent(ActionsManager.class); actionsManager.registerAction(FooAction.class, "two", new ActionDefinition("/xxx-{two}")); actionsManager.registerAction(FooAction.class, "one", new ActionDefinition("/{one}")); ActionRuntime actionRuntime = actionsManager.routes.lookup(null, MadvocUtil.splitPathToChunks("/foo")); assertEquals("one", actionRuntime.getActionClassMethod().getName()); actionRuntime = actionsManager.routes.lookup(null, MadvocUtil.splitPathToChunks("/foo/boo")); assertNull(actionRuntime); actionRuntime = actionsManager.routes.lookup(null, MadvocUtil.splitPathToChunks("/xxx-foo")); assertEquals("two", actionRuntime.getActionClassMethod().getName()); // best match! }
return new ActionRuntime( actionHandler, actionClass, return new ActionRuntime( null, actionClass,
@Override public Object intercept(final ActionRequest actionRequest) throws Exception { final ActionRuntime actionRuntime = actionRequest.getActionRuntime(); if (actionRuntime.isAuthenticated()) { // action requires user to be authenticated T grantedAuthToken = authenticateUserViaHttpSession(actionRequest); if (grantedAuthToken == null) { grantedAuthToken = authenticateUserViaToken(actionRequest); } if (authenticateViaBasicAuth && grantedAuthToken == null) { grantedAuthToken = authenticateUserViaBasicAuth(actionRequest); } if (grantedAuthToken == null) { return JsonResult.of(return404instead401 ? HttpStatus.error404().notFound() : HttpStatus.error401().unauthorized("Not authorized")); } if (!authorized(actionRequest)) { return JsonResult.of(HttpStatus.error403().forbidden()); } } return actionRequest.invoke(); }
public void inject(final ActionRequest actionRequest, final Targets targets) { final ActionRuntime actionRuntime = actionRequest.getActionRuntime(); final RouteChunk routeChunk = actionRuntime.getRouteChunk(); if (!routeChunk.hasMacrosOnPath()) { // no action path macros at all, just exit return; } // inject final String[] actionPath = actionRequest.getActionPathChunks(); int ndx = actionPath.length - 1; RouteChunk chunk = routeChunk; while (chunk.parent() != null) { final PathMacros pathMacros = chunk.pathMacros(); if (pathMacros != null) { injectMacros(actionPath[ndx], pathMacros, targets); } ndx--; chunk = chunk.parent(); } }
assertEquals(ReAction.class, cfg.getActionClass()); assertEquals("/re/user/{id}/macro", cfg.getActionPath()); RouteChunk chunk = cfg.getRouteChunk(); assertNull(chunk.pathMacros()); chunk = chunk.parent(); assertEquals(ReAction.class, cfg.getActionClass()); assertEquals("/re/user/image/{id}/{fmt}/macro2", cfg.getActionPath()); chunk = cfg.getRouteChunk(); assertNull(chunk.pathMacros()); chunk = chunk.parent(); assertEquals(1, chunk.pathMacros().macrosCount()); assertEquals("id", chunk.pathMacros().names()[0]); chunk = cfg.getRouteChunk(); assertNull(chunk.pathMacros()); assertEquals(ReAction.class, cfg.getActionClass()); assertEquals("/re/users/{id}/macro3", cfg.getActionPath()); assertEquals("POST", cfg.getActionMethod()); chunk = cfg.getRouteChunk(); assertNull(chunk.pathMacros()); chunk = chunk.parent();
@Test void testPackage() { WebApp webapp = new WebApp(); webapp.start(); ActionMethodParser actionMethodParser = webapp.madvocContainer().lookupComponent(ActionMethodParser.class); RootPackages rootPackages = webapp.madvocContainer().lookupComponent(RootPackages.class); rootPackages.addRootPackageOf(this.getClass()); ActionRuntime cfg = parse(actionMethodParser, "fixtures.tst2.Boo4Action#foo"); assertNotNull(cfg); assertEquals(Boo4Action.class, cfg.getActionClass()); assertEquals("/ttt/www.foo", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst2.Boo4Action#foo1"); assertEquals("/ttt/www.xxx", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst2.Boo4Action#foo2"); assertEquals("/ttt/www.foo2.xxx", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst2.Boo4Action#foo3"); assertEquals("/ttt/www", cfg.getActionPath()); }
@Test void testMethod() { WebApp webapp = new WebApp(); webapp.start(); ActionMethodParser actionMethodParser = webapp.madvocContainer().lookupComponent(ActionMethodParser.class); ActionRuntime cfg = parse(actionMethodParser, "fixtures.tst.BooAction#foo"); assertNotNull(cfg); assertEquals(BooAction.class, cfg.getActionClass()); assertEquals("/boo.foo", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst.BooAction#foo1"); assertEquals("/boo.xxx", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst.BooAction#foo2"); assertEquals("/boo.foo2.xxx", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst.BooAction#foo3"); assertEquals("/boo", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst.BooAction#foo4"); assertEquals("/xxx", cfg.getActionPath()); assertNull(cfg.getActionMethod()); cfg = parse(actionMethodParser, "fixtures.tst.BooAction#foo41"); assertEquals("/xxx", cfg.getActionPath()); assertEquals("DELETE", cfg.getActionMethod()); cfg = parse(actionMethodParser, "fixtures.tst.BooAction#foo5"); assertEquals("/xxx.html", cfg.getActionPath()); assertEquals("POST", cfg.getActionMethod()); ActionsManager actionsManager = webapp.madvocContainer().lookupComponent(ActionsManager.class); assertEquals("/xxx.html", actionsManager.lookupPathAlias("dude")); }
assertEquals(BooAction.class, actionRuntime.getActionClass()); assertEquals("foo1", actionRuntime.getActionClassMethod().getName()); assertEquals(BooAction.class, actionRuntime.getActionClass()); assertEquals("foo2", actionRuntime.getActionClassMethod().getName());
@Test void testDefaultMethods() { WebApp webapp = new WebApp(); webapp.start(); ActionMethodParser actionMethodParser = webapp.madvocContainer().lookupComponent(ActionMethodParser.class); ActionRuntime cfg = parse(actionMethodParser, "fixtures.tst.BooAction#foo"); assertEquals("/boo.foo", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst.BooAction#view"); assertEquals("/boo", cfg.getActionPath()); cfg = parse(actionMethodParser, "fixtures.tst.BooAction#execute"); assertEquals("/boo", cfg.getActionPath()); }