public Model createCopy() { TransitionModel copy = new TransitionModel(); copy.setOn(on); copy.setOnException(onException); copy.setTo(to); copy.setBind(bind); copy.setValidate(validate); copy.setValidationHints(validationHints); copy.setHistory(history); copy.setAttributes(copyList(attributes)); copy.setSecured((SecuredModel) copy(secured)); copy.setActions(copyList(actions)); return copy; }
public void merge(Model model) { TransitionModel transition = (TransitionModel) model; setOnException(merge(getOnException(), transition.getOnException())); setTo(merge(getTo(), transition.getTo())); setBind(merge(getBind(), transition.getBind())); setValidate(merge(getValidate(), transition.getValidate())); setValidationHints(merge(getValidationHints(), transition.getValidationHints())); setHistory(merge(getHistory(), transition.getHistory())); setAttributes(merge(getAttributes(), transition.getAttributes())); setSecured((SecuredModel) merge(getSecured(), transition.getSecured())); setActions(merge(getActions(), transition.getActions(), false)); }
private FlowExecutionExceptionHandler[] parseTransitionExecutingExceptionHandlers( List<TransitionModel> transitionModels) { if (transitionModels != null && !transitionModels.isEmpty()) { List<FlowExecutionExceptionHandler> exceptionHandlers = new ArrayList<>( transitionModels.size()); for (TransitionModel model : transitionModels) { if (StringUtils.hasText(model.getOnException())) { if (model.getSecured() != null) { throw new FlowBuilderException("Exception based transitions cannot be secured"); } exceptionHandlers.add(parseTransitionExecutingExceptionHandler(model)); } } return exceptionHandlers.toArray(new FlowExecutionExceptionHandler[exceptionHandlers.size()]); } else { return new FlowExecutionExceptionHandler[0]; } }
private Transition parseTransition(TransitionModel transition) { TransitionCriteria matchingCriteria = (TransitionCriteria) fromStringTo(TransitionCriteria.class).execute( transition.getOn()); TargetStateResolver stateResolver = (TargetStateResolver) fromStringTo(TargetStateResolver.class).execute( transition.getTo()); TransitionCriteria executionCriteria = TransitionCriteriaChain.criteriaChainFor(parseActions(transition .getActions())); MutableAttributeMap<Object> attributes = parseMetaAttributes(transition.getAttributes()); if (StringUtils.hasText(transition.getBind())) { attributes.put("bind", fromStringTo(Boolean.class).execute(transition.getBind())); } if (StringUtils.hasText(transition.getValidate())) { attributes.put("validate", fromStringTo(Boolean.class).execute(transition.getValidate())); } if (StringUtils.hasText(transition.getValidationHints())) { attributes.put("validationHints", getLocalContext().getExpressionParser().parseExpression(transition.getValidationHints(), new FluentParserContext().evaluate(RequestContext.class))); } if (StringUtils.hasText(transition.getHistory())) { attributes.put("history", fromStringTo(History.class).execute(transition.getHistory().toUpperCase())); } parseAndPutSecured(transition.getSecured(), attributes); return getLocalContext().getFlowArtifactFactory().createTransition(stateResolver, matchingCriteria, executionCriteria, attributes); }
public void testMerge() { TransitionModel child = new TransitionModel(); child.setOn("child"); TransitionModel parent = new TransitionModel(); parent.setOn("child"); parent.setTo("end"); child.merge(parent); assertEquals("end", child.getTo()); }
private static void createDuoAuthenticationWebflowAction(final List<AbstractStateModel> states) { val actModel = new ActionStateModel(CasWebflowConstants.STATE_ID_REAL_SUBMIT); val actions = new LinkedList<AbstractActionModel>(); actions.add(new EvaluateModel(ACTION_DUO_AUTHENTICATION_WEBFLOW)); actModel.setActions(actions); val trans = new LinkedList<TransitionModel>(); var transModel = new TransitionModel(); transModel.setOn(CasWebflowConstants.TRANSITION_ID_SUCCESS); transModel.setTo(CasWebflowConstants.TRANSITION_ID_SUCCESS); trans.add(transModel); transModel = new TransitionModel(); transModel.setOn(CasWebflowConstants.TRANSITION_ID_ERROR); transModel.setTo(CasWebflowConstants.STATE_ID_INIT_LOGIN_FORM); trans.add(transModel); transModel = new TransitionModel(); transModel.setOn(CasWebflowConstants.TRANSITION_ID_DENY); transModel.setTo(CasWebflowConstants.TRANSITION_ID_DENY); trans.add(transModel); transModel = new TransitionModel(); transModel.setOn(CasWebflowConstants.TRANSITION_ID_UNAVAILABLE); transModel.setTo(CasWebflowConstants.TRANSITION_ID_UNAVAILABLE); trans.add(transModel); actModel.setTransitions(trans); states.add(actModel); }
private static void createDuoLoginViewState(final List<AbstractStateModel> states) { val viewState = new ViewStateModel(STATE_ID_VIEW_LOGIN_FORM_DUO); viewState.setView("casDuoLoginView"); viewState.setModel(CasWebflowConstants.VAR_ID_CREDENTIAL); val bm = new BinderModel(); val bindings = new LinkedList<BindingModel>(); val bme = new BindingModel("signedDuoResponse", null, null); bindings.add(bme); bm.setBindings(bindings); viewState.setBinder(bm); val actions = new LinkedList<AbstractActionModel>(); actions.add(new EvaluateModel(ACTION_PREPARE_DUO_WEB_LOGIN_FORM_ACTION)); viewState.setOnEntryActions(actions); val trans = new LinkedList<TransitionModel>(); val transModel = new TransitionModel(); transModel.setOn(CasWebflowConstants.TRANSITION_ID_SUBMIT); transModel.setTo(CasWebflowConstants.STATE_ID_REAL_SUBMIT); transModel.setBind(Boolean.TRUE.toString()); transModel.setValidate(Boolean.FALSE.toString()); trans.add(transModel); viewState.setTransitions(trans); states.add(viewState); }
private FlowExecutionExceptionHandler parseTransitionExecutingExceptionHandler(TransitionModel transition) { TransitionExecutingFlowExecutionExceptionHandler handler = new TransitionExecutingFlowExecutionExceptionHandler(); Class<Throwable> exceptionClass = toClass(transition.getOnException(), Throwable.class); TargetStateResolver targetStateResolver = (TargetStateResolver) fromStringTo(TargetStateResolver.class) .execute(transition.getTo()); handler.add(exceptionClass, targetStateResolver); handler.getActionList().addAll(parseActions(transition.getActions())); return handler; }
public void testFlowSecuredTransition() { model.setStates(asList(new EndStateModel("end"))); TransitionModel transition = new TransitionModel(); transition.setTo("end"); transition.setSecured(new SecuredModel("ROLE_USER")); model.setGlobalTransitions(asList(transition)); Flow flow = getFlow(model); SecurityRule rule = (SecurityRule) flow.getGlobalTransitionSet().toArray()[0].getAttributes().get( SecurityRule.SECURITY_ATTRIBUTE_NAME); assertNotNull(rule); assertEquals(SecurityRule.COMPARISON_ANY, rule.getComparisonType()); assertEquals(1, rule.getAttributes().size()); assertTrue(rule.getAttributes().contains("ROLE_USER")); }
public void testNotMergeable() { TransitionModel child = new TransitionModel(); child.setOn("child"); TransitionModel parent = new TransitionModel(); parent.setOn("parent"); assertFalse(child.isMergeableWith(parent)); }
public void testNotMergeableOnException() { TransitionModel child = new TransitionModel(); child.setOnException("child"); TransitionModel parent = new TransitionModel(); parent.setOnException("parent"); assertFalse(child.isMergeableWith(parent)); }
public void testNotMergeableWithNull() { TransitionModel child = new TransitionModel(); assertFalse(child.isMergeableWith(null)); }
public void testFlowSecuredTransition() { ClassPathResource resource = new ClassPathResource("flow-secured-transition.xml", getClass()); FlowModelBuilder builder = new XmlFlowModelBuilder(resource, registry); builder.init(); builder.build(); FlowModel flow = builder.getFlowModel(); SecuredModel secured = flow.getGlobalTransitions().get(0).getSecured(); assertNotNull(secured); assertEquals("ROLE_USER", secured.getAttributes()); }
private Transition parseTransition(TransitionModel transition) { TransitionCriteria matchingCriteria = (TransitionCriteria) fromStringTo(TransitionCriteria.class).execute( transition.getOn()); TargetStateResolver stateResolver = (TargetStateResolver) fromStringTo(TargetStateResolver.class).execute( transition.getTo()); TransitionCriteria executionCriteria = TransitionCriteriaChain.criteriaChainFor(parseActions(transition .getActions())); MutableAttributeMap attributes = parseMetaAttributes(transition.getAttributes()); if (StringUtils.hasText(transition.getBind())) { attributes.put("bind", fromStringTo(Boolean.class).execute(transition.getBind())); } if (StringUtils.hasText(transition.getValidate())) { attributes.put("validate", fromStringTo(Boolean.class).execute(transition.getValidate())); } if (StringUtils.hasText(transition.getHistory())) { attributes.put("history", fromStringTo(History.class).execute(transition.getHistory())); } parseAndPutSecured(transition.getSecured(), attributes); return getLocalContext().getFlowArtifactFactory().createTransition(stateResolver, matchingCriteria, executionCriteria, attributes); }
public void testMergeGlobalTransitions() { FlowModel child = new FlowModel(); TransitionModel transition1 = new TransitionModel(); transition1.setOn("end"); TransitionModel transition2 = new TransitionModel(); transition2.setOn("start"); child.setGlobalTransitions(asList(transition1, transition2)); FlowModel parent = new FlowModel(); transition1 = new TransitionModel(); transition1.setOn("search"); transition2 = new TransitionModel(); transition2.setOn("end"); transition2.setTo("theend"); parent.setGlobalTransitions(asList(transition1, transition2)); child.merge(parent); assertEquals(3, child.getGlobalTransitions().size()); assertEquals("theend", child.getGlobalTransitions().get(0).getTo()); }
private static void createDuoDetermineRequestAction(final List<AbstractStateModel> states) { val actModel = new ActionStateModel(STATE_ID_DETERMINE_DUO_REQUEST); val actions = new LinkedList<AbstractActionModel>(); actions.add(new EvaluateModel(ACTION_CHECK_WEB_AUTHENTICATION_REQUEST)); actModel.setActions(actions); val trans = new LinkedList<TransitionModel>(); var transModel = new TransitionModel(); transModel.setOn(CasWebflowConstants.TRANSITION_ID_YES); transModel.setTo(STATE_ID_VIEW_LOGIN_FORM_DUO); trans.add(transModel); transModel = new TransitionModel(); transModel.setOn(CasWebflowConstants.TRANSITION_ID_NO); transModel.setTo(STATE_ID_DUO_NON_WEB_AUTHENTICATION); trans.add(transModel); actModel.setTransitions(trans); states.add(actModel); }
private FlowExecutionExceptionHandler parseTransitionExecutingExceptionHandler(TransitionModel transition) { TransitionExecutingFlowExecutionExceptionHandler handler = new TransitionExecutingFlowExecutionExceptionHandler(); Class<Throwable> exceptionClass = toClass(transition.getOnException(), Throwable.class); TargetStateResolver targetStateResolver = (TargetStateResolver) fromStringTo(TargetStateResolver.class) .execute(transition.getTo()); handler.add(exceptionClass, targetStateResolver); handler.getActionList().addAll(parseActions(transition.getActions())); return handler; }
public void testMergeable() { TransitionModel child = new TransitionModel(); child.setOn("event"); TransitionModel parent = new TransitionModel(); parent.setOn("event"); assertTrue(child.isMergeableWith(parent)); }
public void testMergeableOnException() { TransitionModel child = new TransitionModel(); child.setOnException("expception"); TransitionModel parent = new TransitionModel(); parent.setOnException("exception"); assertTrue(child.isMergeableWith(child)); }
private FlowExecutionExceptionHandler[] parseTransitionExecutingExceptionHandlers( List<TransitionModel> transitionModels) { if (transitionModels != null && !transitionModels.isEmpty()) { List<FlowExecutionExceptionHandler> exceptionHandlers = new ArrayList<>( transitionModels.size()); for (TransitionModel model : transitionModels) { if (StringUtils.hasText(model.getOnException())) { if (model.getSecured() != null) { throw new FlowBuilderException("Exception based transitions cannot be secured"); } exceptionHandlers.add(parseTransitionExecutingExceptionHandler(model)); } } return exceptionHandlers.toArray(new FlowExecutionExceptionHandler[exceptionHandlers.size()]); } else { return new FlowExecutionExceptionHandler[0]; } }