/** * Creates new action request and initializes it. */ public ActionRequest( final MadvocController madvocController, final String actionPath, final String[] actionPathChunks, final ActionRuntime actionRuntime, final Object action, final HttpServletRequest servletRequest, final HttpServletResponse servletResponse) { this.madvocController = madvocController; this.actionPath = actionPath; this.actionPathChunks = actionPathChunks; this.actionRuntime = actionRuntime; this.servletRequest = servletRequest; this.servletResponse = servletResponse; this.action = action; this.targets = new Targets(this); this.executionIndex = 0; this.executionArray = createExecutionArray(); }
/** * Injects request attributes. */ protected void injectAttributes(final HttpServletRequest servletRequest, final Targets targets) { final Enumeration<String> attributeNames = servletRequest.getAttributeNames(); while (attributeNames.hasMoreElements()) { final String attrName = attributeNames.nextElement(); targets.forEachTargetAndIn(this, (target, in) -> { final String name = in.matchedName(attrName); if (name != null) { final Object attrValue = servletRequest.getAttribute(attrName); target.writeValue(name, attrValue, true); } }); } }
@Override public void outject(final ActionRequest actionRequest, final Targets targets) { final HttpServletResponse servletResponse = actionRequest.getHttpServletResponse(); targets.forEachTargetAndOut(this, (target, out) -> { final Cookie cookie = (Cookie) target.readValue(out); if (cookie != null) { servletResponse.addCookie(cookie); } }); } }
@Override public void inject(final Targets targets) { targets.forEachTarget(target -> { final Class targetType = target.resolveType(); final String baseName = baseNameOf(targetType); final ParamManager madvocPetiteParamManager = madpc.paramManager(); final String[] params = madvocPetiteParamManager.filterParametersForBeanName(baseName, true); for (final String param : params) { final Object value = madvocPetiteParamManager.get(param); final String propertyName = param.substring(baseName.length() + 1); target.writeValue(propertyName, value, false); } }); }
/** * 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)); } }
paramTarget = Target.ofValue(createActionMethodArgument(paramType, action), newScopeData); paramTarget = Target.ofMethodParam(methodParam, createActionMethodArgument(paramType, action)); paramTarget = Target.ofMethodParam(methodParam, type -> createActionMethodArgument(type, action));
public Targets(final ActionRequest actionRequest) { targets = makeTargets( Target.ofValue(actionRequest.getAction(), actionRequest.getActionRuntime().getScopeData()), actionRequest.getActionRuntime().getMethodParams()); }
@Override public void inject(final ServletContext servletContext, final Targets targets) { instancesInjector.inject(servletContext, targets); final Enumeration<String> attributeNames = servletContext.getAttributeNames(); while (attributeNames.hasMoreElements()) { final String attrName = attributeNames.nextElement(); targets.forEachTargetAndIn(this, (target, in) -> { final String name = in.matchedName(attrName); if (name != null) { final Object attrValue = servletContext.getAttribute(attrName); target.writeValue(name, attrValue, true); } }); } }
/** * Inject context into target. */ public void injectContext(final Object targetObject) { final Class targetType = targetObject.getClass(); final ScopeData scopeData = scopeDataInspector.inspectClassScopesWithCache(targetType); final Targets targets = new Targets(targetObject, scopeData); // inject no context scopeResolver.forEachScope(madvocScope -> madvocScope.inject(targets)); // inject special case scopeResolver.forScope(ParamsScope.class, scope -> scope.inject(targets)); // inject servlet context final ServletContext servletContext = madvocController.getApplicationContext(); if (servletContext != null) { scopeResolver.forEachScope(madvocScope -> madvocScope.inject(servletContext, targets)); } }
@Override public void outject(final ActionRequest actionRequest, final Targets targets) { final ServletContext context = actionRequest.getHttpServletRequest().getServletContext(); targets.forEachTargetAndOut(this, (target, out) -> { final Object value = target.readValue(out); context.setAttribute(out.name(), value); }); }
public void inject(final ServletContext servletContext, final Targets targets) { targets.forEachTargetAndIn(madvocScope, (target, in) -> { final Class inType = in.type(); Object value = null; if (inType == ServletContext.class) { value = servletContext; } if (value != null) { target.writeValue(in, value, true); } }); }
@Test void testInjection() { WebApp webapp = new WebApp(); webapp.start(); PetiteContainer madpc = webapp.madvocContainer().getPetiteContainer(); String baseName = StringUtil.uncapitalize(FooBean.class.getSimpleName()); madpc.defineParameter("foo", "1"); madpc.defineParameter(baseName + ".integer", "173"); madpc.defineParameter(baseName + ".string", "jodd"); madpc.defineParameter(baseName, "huh"); ParamsScope paramsScope = new ParamsScope(); BeanUtil.declared.setProperty(paramsScope, "madpc", madpc); FooBean fooBean = new FooBean(); paramsScope.inject(new Targets(fooBean, null)); assertEquals(173, fooBean.getInteger().intValue()); assertEquals("jodd", fooBean.getString()); } }
@Override public void outject(final ActionRequest actionRequest, final Targets targets) { final HttpServletRequest servletRequest = actionRequest.getHttpServletRequest(); final HttpSession session = servletRequest.getSession(); targets.forEachTargetAndOut(this, (target, out) -> { final Object value = target.readValue(out); session.setAttribute(out.name(), value); }); } }
@Override public void inject(final ActionRequest actionRequest, final Targets targets) { final HttpServletRequest servletRequest = actionRequest.getHttpServletRequest(); targets.forEachTargetAndIn(this, (target, in) -> { final Enumeration<String> headerNames = servletRequest.getHeaders(in.name()); if (headerNames != null) { final List<String> allValues = new ArrayList<>(); while (headerNames.hasMoreElements()) { allValues.add(headerNames.nextElement()); } final Object value; if (allValues.size() == 1) { value = allValues.get(0); } else { value = allValues; } target.writeValue(in, value, true); } }); }
@Override public void outject(final ActionRequest actionRequest, final Targets targets) { final HttpServletResponse servletResponse = actionRequest.getHttpServletResponse(); targets.forEachTargetAndOut(this, (target, out) -> { final String value = (String) target.readValue(out); if (value != null) { servletResponse.setHeader(out.name(), value); } }); } }
@Override public void inject(final ActionRequest actionRequest, final Targets targets) { final HttpServletRequest servletRequest = actionRequest.getHttpServletRequest(); final HttpSession session = servletRequest.getSession(); final Enumeration<String> attributeNames = session.getAttributeNames(); while (attributeNames.hasMoreElements()) { final String attrName = attributeNames.nextElement(); targets.forEachTargetAndIn(this, (target, in) -> { final String name = in.matchedName(attrName); if (name != null) { final Object attrValue = session.getAttribute(attrName); target.writeValue(name, attrValue, true); } }); } }
@Override public void outject(final ActionRequest actionRequest, final Targets targets) { final HttpServletRequest servletRequest = actionRequest.getHttpServletRequest(); targets.forEachTargetAndOut(this, (target, out) -> { final Object value = target.readValue(out); servletRequest.setAttribute(out.name(), value); }); }
@Override public void inject(final Targets targets) { targets.forEachTargetAndIn(this, (target, in) -> { final Object value = madpc.getBean(in.name()); if (value != null) { target.writeValue(in, value, false); } }); }
@Override public void inject(final ActionRequest actionRequest, final Targets targets) { final String body = actionRequest.readRequestBody(); if (StringUtil.isEmpty(body)) { return; } targets.forEachTargetAndIn(this, (target, in) -> target.writeValue(in, body, true)); }
targets.forEachTargetAndIn(this, (target, in) -> { final String name = in.matchedName(paramName); if (name != null) {