/** * Links an escalation to an {@link SectionOutput}. * * @param task * {@link SectionTask}. * @param exception * Type of escalation. * @param designer * {@link SectionDesigner}. * @param escalations * Registry of the {@link SectionOutput} by type of escalation. */ static <E extends Throwable> void linkEscalation(SectionTask task, Class<E> exception, SectionDesigner designer, Map<Class<?>, SectionOutput> escalations) { // Obtain the section output SectionOutput output = escalations.get(exception); if (output == null) { output = designer.addSectionOutput(exception.getName(), exception.getName(), true); escalations.put(exception, output); } // Link task escalation to output TaskFlow escalation = task.getTaskEscalation(exception.getName()); designer.link(escalation, output, FlowInstigationStrategyEnum.SEQUENTIAL); }
/** * Links the {@link TaskObject} to the {@link SectionObject}. * * @param task * {@link SectionTask}. * @param objectName * Name of the object. * @param objectType * Type of the object. * @param designer * {@link SectionDesigner}. * @param objects * Registry of the {@link SectionObject} by type of object. */ static void linkObject(SectionTask task, String objectName, Class<?> objectType, SectionDesigner designer, Map<Class<?>, SectionObject> objects) { // Obtain the section object SectionObject sectionObject = objects.get(objectType); if (sectionObject == null) { sectionObject = designer.addSectionObject(objectType.getName(), objectType.getName()); objects.put(objectType, sectionObject); } // Link task object to section object TaskObject taskObject = task.getTaskObject(objectName); designer.link(taskObject, sectionObject); }
@Override public void sourceSection(SectionDesigner designer, SectionSourceContext context) throws Exception { SectionFunctionNamespace namespace = designer.addSectionFunctionNamespace("secure", new HttpFlowSecurerManagedFunctionSource(this.annotation)); SectionFunction function = namespace.addSectionFunction("secure", HttpFlowSecurerManagedFunctionSource.FUNCTION_NAME); designer.link(designer.addSectionInput(INPUT_NAME, null), function); designer.link(function.getFunctionFlow(Flows.SECURE.name()), designer.addSectionOutput(SECURE_OUTPUT_NAME, null, false), false); designer.link(function.getFunctionFlow(Flows.INSECURE.name()), designer.addSectionOutput(INSECURE_OUTPUT_NAME, null, false), false); } }
designer.link(preSubscription.getTaskObject(CometRequestServicer.class .getName()), cometRequestServicer); designer.link(postSubscription.getTaskObject(CometRequestServicer.class .getName()), cometRequestServicer); designer.link(preSubscription, postSubscription); designer.link(designer.addSectionInput(SUBSCRIBE_INPUT_NAME, null), preSubscription); SectionTask publishTask = publishWork.addSectionTask("PUBLISH", PublishWorkSource.TASK_NAME); designer.link(publishTask .getTaskObject(Dependencies.SERVER_GWT_RPC_CONNECTION.name()), connection); designer.link( publishTask.getTaskObject(Dependencies.COMET_SERVICE.name()), cometService); designer.link(designer.addSectionInput(PUBLISH_INPUT_NAME, null), publishTask); designer.link(publishTask.getTaskFlow(outputFlowName), designer .addSectionOutput(PUBLISH_OUTPUT_PREFIX + outputFlowName, CometEvent.class.getName(),
/** * Adds handling for a {@link Servlet} resource. * * @param inputName * {@link SectionInput} name. * @param requestDispatcherPath * {@link RequestDispatcher} path. * @param servletBridge * {@link ServletBridge} {@link SectionObject}. * @param designer * {@link SectionDesigner}. */ private void addServletResource(String inputName, String requestDispatcherPath, SectionObject servletBridge, SectionDesigner designer) { // Create the task to indicate Servlet container resource SectionWork work = designer.addSectionWork(inputName, ServletContainerResourceWorkSource.class.getName()); work.addProperty( ServletContainerResourceWorkSource.PROPERTY_SERVLET_CONTAINER_RESOURCE, requestDispatcherPath); SectionTask task = work.addSectionTask(inputName, "RESOURCE"); TaskObject dependency = task .getTaskObject(DependencyKeys.SERVLET_BRIDGE.name()); designer.link(dependency, servletBridge); // Link input for task SectionInput input = designer.addSectionInput(inputName, null); designer.link(input, task); }
SectionFunction handler = namespace.addSectionFunction("handler", "handler"); handler.getFunctionObject(Dependencies.AUTHENTICATION_REQUIRED_EXCEPTION.name()).flagAsParameter(); designer.link(handler.getFunctionObject(Dependencies.SERVER_HTTP_CONNECTION.name()), serverHttpConnection); designer.link(handler.getFunctionObject(Dependencies.HTTP_SESSION.name()), httpSession); designer.link(handler.getFunctionObject(Dependencies.REQUEST_STATE.name()), requestState); for (String httpSecurityName : this.httpSecurityNames) { designer.link(flow, output, false); designer.link(sender.getFunctionObject( net.officefloor.web.security.impl.SendHttpChallengeFunction.Dependencies.HTTP_CHALLENGE_CONTEXT.name()), httpChallengeContext); designer.link(sender.getFunctionObject( net.officefloor.web.security.impl.SendHttpChallengeFunction.Dependencies.SERVER_HTTP_CONNECTION.name()), serverHttpConnection); designer.link(handler.getFunctionFlow("Send"), sender, false); designer.link(handle, handler);
@Override public SectionFlowSinkNode secureFlow(SectionDesigner designer, Class<?> argumentType, SectionFlowSinkNode secureFlowSink, SectionFlowSinkNode insecureFlowSink) { // Create the annotation HttpFlowSecurerAnnotation annotation = new HttpFlowSecurerAnnotation( this.httpSecurerBuilder.getHttpSecurityName(), this.httpSecurerBuilder.getAnyRoles(), this.httpSecurerBuilder.getRequiredRoles(), argumentType); // Configure the function String functionName = HttpSecurityArchitectEmployer.this.nextUniqueName(); SectionFunctionNamespace namespace = designer.addSectionFunctionNamespace(functionName, new HttpFlowSecurerManagedFunctionSource(annotation)); SectionFunction function = namespace.addSectionFunction(functionName, HttpFlowSecurerManagedFunctionSource.FUNCTION_NAME); // Configure the function designer.link(function.getFunctionFlow(Flows.SECURE.name()), secureFlowSink, false); designer.link(function.getFunctionFlow(Flows.INSECURE.name()), insecureFlowSink, false); // Return the decision flow sink return function; } }
HttpSecurityManagedFunctionSource.FUNCTION_CHALLENGE, HttpSecurityManagedFunctionSource.FUNCTION_CHALLENGE); designer.link(challengeFunction.getFunctionObject(HttpChallengeContext.class.getSimpleName()), httpChallengeContext); designer.link(challengeFunction.getFunctionObject(ServerHttpConnection.class.getSimpleName()), serverHttpConnection); designer.link(challengeFunction.getFunctionObject(HttpSession.class.getSimpleName()), httpSession); for (SectionObject dependency : dependencyObjects) { designer.link(challengeFunction.getFunctionObject(dependency.getSectionObjectName()), dependency); SectionOutput sectionOutput = designer.addSectionOutput(flowName, flowType.getArgumentType().getName(), false); designer.link(functionFlow, sectionOutput, false); moAuthFunction.getFunctionObject(FunctionAuthenticateContext.class.getSimpleName()).flagAsParameter(); for (SectionObject dependency : dependencyObjects) { designer.link(moAuthFunction.getFunctionObject(dependency.getSectionObjectName()), dependency); moLogoutFunction.getFunctionObject(FunctionLogoutContext.class.getSimpleName()).flagAsParameter(); for (SectionObject dependency : dependencyObjects) { designer.link(moLogoutFunction.getFunctionObject(dependency.getSectionObjectName()), dependency); .getFunctionObject(StartApplicationHttpAuthenticateFunction.Dependencies.CREDENTIALS.name()) .flagAsParameter(); designer.link( startAuthFunction.getFunctionObject( StartApplicationHttpAuthenticateFunction.Dependencies.AUTHENTICATION_CONTEXT.name()), HttpSecurityManagedFunctionSource.FUNCTION_COMPLETE_APPLICATION_AUTHENTICATE,
@Override public void sourceSection(SectionDesigner designer, SectionSourceContext context) throws Exception { final Map<Class<?>, SectionObject> objects = new HashMap<Class<?>, SectionObject>(); final Map<Class<?>, SectionOutput> escalations = new HashMap<Class<?>, SectionOutput>(); // Add file sender SectionWork sendFileWork = designer.addSectionWork("FILE", HttpFileSenderWorkSource.class.getName()); SourceHttpResourceFactory.copyProperties(context, sendFileWork); SectionTask sendFileTask = sendFileWork.addSectionTask( HttpFileSenderWorkSource.TASK_NAME, HttpFileSenderWorkSource.TASK_NAME); WebApplicationSectionSource.linkObject(sendFileTask, DependencyKeys.SERVER_HTTP_CONNECTION.name(), ServerHttpConnection.class, designer, objects); WebApplicationSectionSource.linkObject(sendFileTask, DependencyKeys.HTTP_APPLICATION_LOCATION.name(), HttpApplicationLocation.class, designer, objects); WebApplicationSectionSource.linkEscalation(sendFileTask, IOException.class, designer, escalations); WebApplicationSectionSource.linkEscalation(sendFileTask, InvalidHttpRequestUriException.class, designer, escalations); // Provide input to service SectionInput input = designer.addSectionInput(SERVICE_INPUT_NAME, null); designer.link(input, sendFileTask); // Provide output once file written SectionOutput output = designer.addSectionOutput(FILE_SENT_OUTPUT_NAME, null, false); designer.link(sendFileTask, output); }
designer.link(route.getFunctionFlow(HANDLE_REDIRECT_FLOW), handleRedirect, false); designer.link(handleHttpInput, route); SectionFunction intercept = interceptNamespace.addSectionFunction( InterceptManagedFunctionSource.FUNCTION_NAME, InterceptManagedFunctionSource.FUNCTION_NAME); designer.link(handleHttpInput, intercept); designer.link(intercept, interceptOutput); designer.link(routeInput, route); designer.link(handleRedirectFlow, output, false); designer.link(routeFlow, output, false); SectionFunction initialise = initialiseNamespace.addSectionFunction(outputName, INITIALISE_REQUEST_STATE_FUNCTION_NAME); designer.link(routeFlow, initialise, false); designer.link( initialise.getFunctionObject(InitialiseHttpRequestStateDependencies.HTTP_REQUEST_STATE.name()), requestState); designer.link(initialise, output); designer.link(route.getFunctionFlow(UNHANDLED_OUTPUT_NAME), unhandled, false); designer.link(handleRedirect.getFunctionFlow(UNHANDLED_OUTPUT_NAME), unhandled, false);
HttpSecurityWorkSource.TASK_CHALLENGE); challengeTask.getTaskObject("HTTP_AUTHENTICATION_REQUIRED_EXCEPTION").flagAsParameter(); designer.link(challengeTask.getTaskObject("SERVER_HTTP_CONNECTION"), serverHttpConnection); designer.link(challengeTask.getTaskObject("HTTP_SESSION"), httpSession); designer.link(challengeTask.getTaskObject("HTTP_REQUEST_STATE"), httpRequestState); for (SectionObject dependency : dependencyObjects) { designer.link(challengeTask.getTaskObject(dependency.getSectionObjectName()), dependency); designer.link(challengeTask.getTaskFlow("FAILURE"), failureOutput, FlowInstigationStrategyEnum.SEQUENTIAL); for (HttpSecurityFlowType<?> flowType : securityType.getFlowTypes()) { String flowName = flowType.getFlowName(); designer.link(taskFlow, sectionOutput, FlowInstigationStrategyEnum.SEQUENTIAL); moAuthTask.getTaskObject("TASK_AUTHENTICATE_CONTEXT").flagAsParameter(); for (SectionObject dependency : dependencyObjects) { designer.link(moAuthTask.getTaskObject(dependency.getSectionObjectName()), dependency); moLogoutTask.getTaskObject("TASK_LOGOUT_CONTEXT").flagAsParameter(); for (SectionObject dependency : dependencyObjects) { designer.link(moLogoutTask.getTaskObject(dependency.getSectionObjectName()), dependency); startAuthTask.getTaskObject(StartApplicationHttpAuthenticateTask.Dependencies.CREDENTIALS.name()) .flagAsParameter(); designer.link( startAuthTask .getTaskObject(StartApplicationHttpAuthenticateTask.Dependencies.HTTP_AUTHENTICATION.name()), httpAuthentication); designer.link(startAuthTask.getTaskFlow(StartApplicationHttpAuthenticateTask.Flows.FAILURE.name()),
HttpTemplateInitialWorkSource.PROPERTY_CONTENT_TYPE, HttpTemplateInitialWorkSource.PROPERTY_CHARSET); SectionTask initialTask = initialWork.addSectionTask("_INITIAL_TASK_", HttpTemplateInitialWorkSource.TASK_NAME); designer.link(initialTask.getTaskObject("SERVER_HTTP_CONNECTION"), connectionObject); designer.link(initialTask.getTaskObject("HTTP_APPLICATION_LOCATION"), locationObject); designer.link(initialTask.getTaskObject("REQUEST_STATE"), requestStateObject); designer.link(initialTask.getTaskObject("HTTP_SESSION"), sessionObject); designer.link(initialTask.getTaskEscalation(IOException.class.getName()), ioEscalation, FlowInstigationStrategyEnum.SEQUENTIAL); designer.link(sectionInput, initialTask); designer.link(templateTask.getTaskObject("SERVER_HTTP_CONNECTION"), connectionObject); designer.link(templateTask.getTaskObject("HTTP_APPLICATION_LOCATION"), locationObject); designer.link(templateTask.getTaskEscalation(IOException.class.getName()), ioEscalation, FlowInstigationStrategyEnum.SEQUENTIAL); designer.link(arrayIteratorTask.getTaskFlow(HttpTemplateArrayIteratorWorkSource.FLOW_NAME), templateTask, FlowInstigationStrategyEnum.PARALLEL); designer.link(renderFlow, beanTask.task, FlowInstigationStrategyEnum.SEQUENTIAL); designer.link(beanTask.task, templateTask); } else { designer.link(renderFlow, templateTask, FlowInstigationStrategyEnum.SEQUENTIAL); designer.link(previousTemplateTask, beanTask.task); designer.link(beanTask.task, templateTask); } else {
SectionFunction initialFunction = initialNamespace.addSectionFunction("_INITIAL_FUNCTION_", WebTemplateInitialManagedFunctionSource.FUNCTION_NAME); designer.link(initialFunction.getFunctionObject("SERVER_HTTP_CONNECTION"), connectionObject); designer.link(initialFunction.getFunctionEscalation(IOException.class.getName()), ioEscalation, false); designer.link(sectionInput, initialFunction); designer.link(templateRedirectFlow, redirectOutput, false); designer.link(templateRedirectFlow, redirectValuesFunction, false); designer.link(redirectValuesFunction, redirectOutput); designer.link(templateFunction.getFunctionObject("SERVER_HTTP_CONNECTION"), connectionObject); designer.link(templateFunction.getFunctionEscalation(IOException.class.getName()), ioEscalation, false); designer.link( arrayIteratorFunction.getFunctionFlow( WebTemplateArrayIteratorManagedFunctionSource.RENDER_ELEMENT_FLOW_NAME), designer.link(renderFlow, beanFunction.function, false); designer.link(beanFunction.function, templateFunction); } else { designer.link(renderFlow, templateFunction, false); designer.link( previousTemplateFunction.getFunctionFlow( WebTemplateArrayIteratorManagedFunctionSource.CONTINUE_TEMPLATE_FLOW_NAME),
ManagedObjectDependency contextToServerDependency = officeServletContextMo .getManagedObjectDependency("SERVLET_SERVER"); designer.link(contextToServerDependency, servletServerMo); designer.link(serviceInput, routeTask); designer.link(routeTask.getTaskFlow(FlowKeys.UNHANDLED.name()), unhandledOutput, FlowInstigationStrategyEnum.SEQUENTIAL); designer.link( routeTask.getTaskObject( net.officefloor.plugin.servlet.route.ServletRouteTask.DependencyKeys.HTTP_CONNECTION.name()), httpConnectionMo); designer.link(routeTask.getTaskObject( net.officefloor.plugin.servlet.route.ServletRouteTask.DependencyKeys.OFFICE_SERVLET_CONTEXT.name()), officeServletContextMo); designer.link(servletTask.getTaskObject(DependencyKeys.OFFICE_SERVLET_CONTEXT.name()), officeServletContextMo); designer.link(servletTask.getTaskObject(DependencyKeys.HTTP_CONNECTION.name()), httpConnectionMo); designer.link(servletTask.getTaskObject(DependencyKeys.REQUEST_ATTRIBUTES.name()), requestAttributesMo); designer.link(servletTask.getTaskObject(DependencyKeys.HTTP_SESSION.name()), httpSessionMo); designer.link(servletTask.getTaskObject(DependencyKeys.HTTP_SECURITY.name()), httpSecurityMo); designer.link(servletTask.getTaskEscalation(ServletException.class.getName()), servletExceptionOutput, FlowInstigationStrategyEnum.SEQUENTIAL); designer.link(servletTask.getTaskEscalation(IOException.class.getName()), ioExceptionOutput, FlowInstigationStrategyEnum.SEQUENTIAL);
designer.link(input, routeTask); SectionOutput unhandledRequestOutput = designer.addSectionOutput( UNHANDLED_REQUEST_OUTPUT_NAME, null, false); designer.link(unhandledServiceFlow, unhandledRequestOutput, FlowInstigationStrategyEnum.SEQUENTIAL); SectionInput sendResponseInput = designer.addSectionInput( SEND_RESPONSE_INPUT_NAME, null); designer.link(sendResponseInput, sendResponseTask);