I used acroFields.GetTranslatedFieldName() to get the next fieldnames from the pdf:
topmostSubform[0].Page1[0].CheckBox2A[0]
topmostSubform[0].Page1[0].CheckBox2A[1]
topmostSubform[0].Page2[0].CheckBox2A[0]
topmostSubform[0].Page2[0].CheckBox2A[1]
topmostSubform[0].Page3[0].CheckBox2A[0]
topmostSubform[0].Page3[0].CheckBox2A[1]
I use the next line of code to fill CheckBox2A[0] on the second page.
fields.SetField("topmostSubform[0].Page2[0].CheckBox2A[0]", "1")
Instead of CheckBox2A[0] on the second page, CheckBox2A[0] on the first page gets checked.
iTextSharp (and also iText for Java, tested here) does not correctly associate the reference derived from the XFA template structure
topmostSubform[0].Page2[0].CheckBox2A[0]
with the matching entry in the one XFA dataset:
<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/" >
<xfa:data >
<topmostSubform >
<!-- vvv the incorrect match by iText -->
<CheckBox2A >0</CheckBox2A >
<!-- ^^^ the incorrect match by iText -->
<CheckBox2A >0</CheckBox2A >
<CheckBox2B >0</CheckBox2B >
<CheckBox2B >0</CheckBox2B >
<Voorletters />
<Achternaam />
<CheckBox2C >0</CheckBox2C >
<CheckBox2C >0</CheckBox2C >
<DatumDag />
<DatumMaand />
<DatumJaar />
<TextField1 />
<HuisNrTekst5 />
<HuisNrNummer5 />
<Straat />
<PostcodeNr1c />
<PostcodeAlpha1c />
<Plaats />
<HuisNrTekst5 />
<HuisNrNummer5 />
<TextField1 />
<PostcodeNr1c />
<PostcodeAlpha1c />
<Plaats />
<TextField1 />
<CheckBox2D >0</CheckBox2D >
<CheckBox2D >0</CheckBox2D >
<IBANREKC_1 />
<IBANREKB_1 />
<IBANREKA_1 />
<IBAN_1 />
<BurgerserviceNr />
<Voorletters />
<Achternaam />
<CheckBox2E >0</CheckBox2E >
<CheckBox2E >0</CheckBox2E >
<HuisNrTekst5 />
<HuisNrNummer5 />
<Straat />
<PostcodeNr1c />
<PostcodeAlpha1c />
<Plaats />
<DatumDag />
<DatumMaand />
<DatumJaar />
<IBANREKC_2 />
<IBANREKB_2 />
<IBANREKA_2 />
<IBAN_2 />
<Telefoon />
<!-- vvv the correct match -->
<CheckBox2A >0</CheckBox2A >
<!-- ^^^ the correct match -->
<CheckBox2A >0</CheckBox2A >
<CheckBox2B >0</CheckBox2B >
<CheckBox2B >0</CheckBox2B >
<IBANREKC_1 />
<IBANREKB_1 />
<IBANREKA_1 />
<IBAN_1 />
<CheckBox2C >0</CheckBox2C >
<CheckBox2C >0</CheckBox2C >
<TextField1 />
<TextField1 />
<CheckBox2D >0</CheckBox2D >
<CheckBox2D >0</CheckBox2D >
<Telefoon />
<CheckBox2E >0</CheckBox2E >
<CheckBox2E >0</CheckBox2E >
<CheckBox2F >0</CheckBox2F >
<CheckBox2F >0</CheckBox2F >
<TextField1 />
<TextField1 />
<CheckBox2G >0</CheckBox2G >
<CheckBox2G >0</CheckBox2G >
<CheckBox3B >0</CheckBox3B >
<CheckBox3B >0</CheckBox3B >
<CheckBox3B >0</CheckBox3B >
<IBAN_1E_01 />
<IBAN_1D_01 />
<IBAN_1C_01 />
<IBAN_1A_01 />
<IBAN_1B_01 />
<IBANREKC_1 />
<IBANREKB_1 />
<IBANREKA_1 />
<IBAN_1 />
<IBAN_1E_02 />
<IBAN_1D_02 />
<IBAN_1C_02 />
<IBAN_1B_02 />
<IBAN_1A_02 />
<CheckBox3D >0</CheckBox3D >
<CheckBox3D >0</CheckBox3D >
<CheckBox3D >0</CheckBox3D >
<CheckBox3A >0</CheckBox3A >
<CheckBox3A >0</CheckBox3A >
<CheckBox3A >0</CheckBox3A >
<CheckBox2A >0</CheckBox2A >
<CheckBox2A >0</CheckBox2A >
<CheckBox3B >0</CheckBox3B >
<CheckBox3B >0</CheckBox3B >
<CheckBox3B >0</CheckBox3B >
<DatumDag />
<DatumMaand />
<DatumJaar />
<TextField1 />
<DatumDag />
<DatumMaand />
<DatumJaar />
<TextField1 />
<Telefoon />
</topmostSubform >
</xfa:data >
</xfa:datasets >
Thus, the wrong dataset element is changed. I'm afraid this has to be looked into by iText development, I have no fix at hand.
You might be in luck, though: The form in your document actually is a hybrid with both an AcroForm and an XFA representation. During your fields.SetField call iText attempts to set the value in both representations, and indeed, in the AcroForm representation it sets the correct one.
Thus, if the result PDF is not required to carry that XFA structure anymore, you can simply drop the XFA structure:
using (var pdfReader = new PdfReader(file))
using (FileStream output = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, output))
{
AcroFields fields = pdfStamper.AcroFields;
fields.SetField("topmostSubform[0].Page2[0].CheckBox2A[0]", "1");
fields.RemoveXfa();
}
Doing that you get the tick on page 2:
Related
I am trying to get 3 options condition, but I am going crazy:
In a specific field may appear a number, a text or be an empty field
Conditions:
if any text = warning message pops up: "This in an error "
if any number= [pagedown] action
if empty = warning message pops up: "pls change code "
May someone help me?
Thanks!
<HAScript name="new condition" description="" timeout="60000" pausetime="300" promptall="te" blockinput="false" author="gennaro" creationdate="Nov 19, 2022 8:07:14 PM" supressclearevents="false" usevars="true" ignorepauseforenhancedtn="true" delayifnotenhancedtn="0" ignorepausetimeforenhancedtn="true">
<vars>
<create name="$text$" type="string" value="" />
<create name="$num$" type="integer" value="0" />
<create name="$emptyfield$" type="field" />
</vars>
<screen name="Screen1" entryscreen="true" exitscreen="true" transient="false">
<description >
<oia status="NOTINHIBITED" optional="false" invertmatch="false" />
</description>
<actions>
<extract name="'Extract'" planetype="TEXT_PLANE" srow="6" scol="66" erow="6" ecol="70" unwrap="false" continuous="false" assigntovar="$text$" />
<extract name="'Extract'" planetype="TEXT_PLANE" srow="6" scol="66" erow="6" ecol="70" unwrap="false" continuous="false" assigntovar="$num$" />
<extract name="'Extract'" planetype="TEXT_PLANE" srow="6" scol="66" erow="6" ecol="70" unwrap="false" continuous="false" assigntovar="$emptyfield$" />
<if condition="$string$" >
<input value="" row="0" col="0" movecursor="true" xlatehostkeys="true" encrypted="false" />
<message title="$string$" value="" />
</if>
<if condition="$num$" >
<input value="'[pagedn]'" row="0" col="0" movecursor="true" xlatehostkeys="true" encrypted="false" />
</if>
<if condition="$emptyfield$" >
<message title="$emptyfield$" value="" />
</if>
</actions>
<nextscreens timeout="0" >
</nextscreens>
</screen>
</HAScript>
I was expecting
Conditions:
if any text = warning message pops up: "This in an error "
if any mumber= [pagedoen] action
if empty = warning message pops up: "pls change code "
When I call method using EasyMock and set the expectation for the method call, in which method return result is Map.In my test case the return result is not taken by spring webflow. Method is expecting the RequestContext of spring webflow that is org.springframework.webflow.execution.RequestContext . I am trying to pass the MockRequestContext in junit test case but its not working
Below is the error
org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing [AnnotatedAction#41e68d87 targetAction = [EvaluateAction#49ff7d8c expression = setErrorMessages.getErrorMessagesMap(flowRequestContext), resultExpression = flowScope.errorMessageMap], attributes = map[[empty]]] in state 'set_error_in_scope' of flow 'shclogin-flow' -- action execution attributes were 'map[[empty]]'
at org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:60)
at org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:101)
at org.springframework.webflow.engine.State.enter(State.java:194)
at org.springframework.webflow.engine.Transition.execute(Transition.java:228)
at org.springframework.webflow.engine.DecisionState.doEnter(DecisionState.java:51)
at org.springframework.webflow.engine.State.enter(State.java:194)
at org.springframework.webflow.engine.Transition.execute(Transition.java:228)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:395)
at org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214)
at org.springframework.webflow.engine.support.TransitionExecutingFlowExecutionExceptionHandler.handle(TransitionExecutingFlowExecutionExceptionHandler.java:111)
at org.springframework.webflow.engine.FlowExecutionExceptionHandlerSet.handleException(FlowExecutionExceptionHandlerSet.java:109)
at org.springframework.webflow.engine.Flow.handleException(Flow.java:600)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.tryFlowHandlers(FlowExecutionImpl.java:647)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.handleException(FlowExecutionImpl.java:603)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:263)
at org.springframework.webflow.test.execution.AbstractFlowExecutionTests.resumeFlow(AbstractFlowExecutionTests.java:136)
at com.shc.ecom.test.usr.TestloginlFlow.testAction(TestloginlFlow.java:193)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:131)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.springframework.expression.ExpressionInvocationTargetException: A problem occurred when trying to execute method 'getErrorMessagesMap' on object of type [com.shc.ecom.sso.cas.web.flow.SetErrorMessages$$EnhancerByCGLIB$$500571b9]
at org.springframework.expression.spel.ast.MethodReference.throwSimpleExceptionIfPossible(MethodReference.java:227)
at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:133)
at org.springframework.expression.spel.ast.MethodReference.access$000(MethodReference.java:49)
at org.springframework.expression.spel.ast.MethodReference$MethodValueRef.getValue(MethodReference.java:342)
at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:88)
at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:131)
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:299)
at org.springframework.binding.expression.spel.SpringELExpression.getValue(SpringELExpression.java:84)
at org.springframework.webflow.action.EvaluateAction.doExecute(EvaluateAction.java:75)
at org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188)
at org.springframework.webflow.execution.AnnotatedAction.execute(AnnotatedAction.java:145)
at org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51)
... 32 more
Caused by: java.lang.AssertionError:
Unexpected method call SetErrorMessages.getErrorMessagesMap([RequestControlContextImpl#c94fd30 externalContext = org.springframework.webflow.test.MockExternalContext#36328d33, currentEvent = [null], requestScope = map[[empty]], attributes = map[[empty]], messageContext = [DefaultMessageContext#2c4d1ac sourceMessages = map[[null] -> list[[empty]]]], flowExecution = [FlowExecutionImpl#7f0d96f2 flow = 'shclogin-flow', flowSessions = list[[FlowSessionImpl#545b995e flow = 'shclogin-flow', state = 'set_error_in_scope', scope = map[[empty]]]]]]):
SetErrorMessages.getErrorMessagesMap(flowRequestContext): expected: 1, actual: 0
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44)
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:85)
at org.easymock.internal.ClassProxyFactory$MockMethodInterceptor.intercept(ClassProxyFactory.java:94)
at com.shc.ecom.sso.cas.web.flow.SetErrorMessages$$EnhancerByCGLIB$$500571b9.getErrorMessagesMap(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:112)
at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:129)
... 42 more
Test Cases
public class TestloginlFlow extends AbstractXmlFlowExecutionTests {
UsrInitialFlowSetupAction usrInitialFlowSetupAction;
AuthenticationViaFormAction authenticationViaFormAction;
UsrIsSYWRUserCheckAction usrIsSYWRUserCheckAction;
SSOGatewayService ssoGatewayService;
CustomGenerateServiceTicketAction generateServiceTicketAction;
CentralAuthenticationService centralAuthenticateService;
CookieRetrievingCookieGenerator warnCookieGenerator;
USRAuthenticationViaFormAction usrAuthenticationViaFormAction;
List<ArgumentExtractor> argumentExtractor;
SetErrorMessages setErrorMessages;
MockRequestContext flowRequestContext;
#Override
protected void setUp() throws Exception {
usrInitialFlowSetupAction = EasyMock.createMock("usrInitialFlowSetupAction", UsrInitialFlowSetupAction.class); // usrAuthenticationViaFormAction
setErrorMessages = EasyMock.createMock("SetErrorMessages", SetErrorMessages.class);
usrAuthenticationViaFormAction = EasyMock.createMock("usrAuthenticationViaFormAction",
USRAuthenticationViaFormAction.class);
usrIsSYWRUserCheckAction = EasyMock.createMock("usrIsSYWRUserCheckAction", UsrIsSYWRUserCheckAction.class); // ssoGatewayService
ssoGatewayService = EasyMock.createMock("ssoGatewayService", SSOGatewayService.class);
generateServiceTicketAction = EasyMock.createMock("generateServiceTicketAction",
CustomGenerateServiceTicketAction.class);
centralAuthenticateService = EasyMock.createMock("centralAuthenticateService",
CentralAuthenticationService.class);
warnCookieGenerator = EasyMock.createMock("centralAuthenticateService", CookieRetrievingCookieGenerator.class);
argumentExtractor = EasyMock.createMock("argumentExtractors", List.class);
generateServiceTicketAction = EasyMock.createMock("generateServiceTicketAction",
CustomGenerateServiceTicketAction.class);
flowRequestContext = EasyMock.createMock("flowRequestContext", MockRequestContext.class);
}
#Override
protected FlowDefinitionResource getResource(FlowDefinitionResourceFactory resourceFactory) {
return resourceFactory.createFileResource("src/main/webapp/WEB-INF/usr/flows/shclogin-flow.xml");
}
#Override
protected void registerMockFlowBeans(ConfigurableBeanFactory builderContext) {
builderContext.registerSingleton("usrInitialFlowSetupAction", usrInitialFlowSetupAction);
builderContext.registerSingleton("argumentExtractors", argumentExtractor);
builderContext.registerSingleton("warnCookieGenerator", warnCookieGenerator);
builderContext.registerSingleton("centralAuthenticateService", centralAuthenticateService);
builderContext.registerSingleton("usrAuthenticationViaFormAction", usrAuthenticationViaFormAction);
builderContext.registerSingleton("usrIsSYWRUserCheckAction", usrIsSYWRUserCheckAction);
builderContext.registerSingleton("ssoGatewayService", ssoGatewayService);
builderContext.registerSingleton("generateServiceTicketAction", generateServiceTicketAction);
builderContext.registerSingleton("ticketGrantingTicketCookieGenerator", warnCookieGenerator);
builderContext.registerSingleton("setErrorMessages", setErrorMessages);
builderContext.registerSingleton("flowRequestContext", flowRequestContext);
}
public void testAction1() throws Exception {
// setCurrentState("initialFlowSetup");
MockExternalContext ctx = new MockExternalContext();
MutableAttributeMap input = new LocalAttributeMap();
input.put("loginId", "12");
input.put("logonPassword", "ankur");
input.put("sourceSiteId", "3");
input.put("fullpage", "");
input.put("partialuser", "true");
input.put("service", "");
input.put("redirectUrl", "");
input.put("sywLogin", "er4fju");
input.put("tncmodal", null);
input.put("modifyservice", "no");
// input.put("reglogin", false);
// input.put("enrollresponse", 200);
input.put("shcCaptchaKey", null);
input.put("ticketGrantingTicketId", "1234");
Map<String, Object> parameters = new HashMap<>();
parameters.put("renew", "yes");
ParameterMap requestParameterMap = new LocalParameterMap(parameters);
ctx.setRequestParameterMap(requestParameterMap);
MockRequestContext context = new MockRequestContext();
Event event = new Event(this, "success");
EasyMock.expect(usrInitialFlowSetupAction.doExecute(flowRequestContext)).andReturn(event);
EasyMock.replay(usrInitialFlowSetupAction);
/*
* FlowExecution flowExecution = getFlowExecution(); FlowSession session
* = flowExecution.getActiveSession();
* session.getScope().put("ticketGrantingTicketId", "ee");
*/
// updateFlowExecution(flowExecution);
startFlow(input, ctx);
}
public void testAction() throws Exception {
setCurrentState("initialFlowSetup");
FlowExecutionContext flowExecution = getFlowExecution();
MockRequestContext context = new MockRequestContext();
MockExternalContext ctx = new MockExternalContext();
//context.setExternalContext(ctx);
//context.setFlowExecutionContext(flowExecution);
//context.setActiveSession(flowExecution.getActiveSession());
Map<String, Object> model = new HashMap<String, Object>();
model.put("originalUrl", 123);
model.put("parameters", "xyz");
// context.getFlowScope().put("errorMessageMap", model);
ctx.setEventId("error");
EasyMock.expect(setErrorMessages.getErrorMessagesMap(flowRequestContext)).andReturn(model);
EasyMock.replay(setErrorMessages);
resumeFlow(ctx);
assertResponseWrittenEquals("/loginfailure", ctx);
assertFlowExecutionEnded();
}
}
xml flow
version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.4.xsd"
start-state="initialFlowSetup" >
<input name="loginId" value="requestScope.loginId" />
<input name="logonPassword" value="requestScope.logonPassword" />
<input name="sourceSiteId" value="requestScope.sourceSiteId" />
<input name="fullpage" value="requestScope.fullpage" />
<input name="partialuser" value="requestScope.partialuser" />
<input name="sourceSiteId" value="flowScope.sourceSite" />
<input name="service" value="requestScope.service" />
<input name="redirectUrl" value="requestScope.redirectUrl" />
<input name="sywLogin" value="requestScope.sywLogin" />
<input name="tncmodal" value="requestScope.tncmodal" />
<input name="modifyservice" value="requestScope.modifyservice" />
<input name="reglogin" value="flowScope.reglogin" />
<input name="enrollresponse" value="flowScope.enrollresponse" />
<input name="shcCaptchaKey" value="requestScope.shcKey" />
<input name="shcCaptchaResponse" value="requestScope.shcResponse" />
<input name="sywmax" value="flowScope.sywmax" />
<input name="auth" value="flowScope.auth" />
<input name="maxactivationflow" value="flowScope.maxactivationflow" />
<action-state id="initialFlowSetup">
<evaluate expression="usrInitialFlowSetupAction" />
<transition on="success" to="ticketGrantingTicketExistsCheck" />
<transition on="error" to="pickup_error_redirect" />
</action-state>
<decision-state id="ticketGrantingTicketExistsCheck">
<if test="flowScope.ticketGrantingTicketId != null" then="hasServiceCheck"
else="gatewayRequestCheck" />
</decision-state>
<decision-state id="gatewayRequestCheck">
<if
test="externalContext.requestParameterMap['gateway'] != '' && externalContext.requestParameterMap['gateway'] != null && flowScope.service != null"
then="redirect" else="submit" />
</decision-state>
<decision-state id="hasServiceCheck">
<if test="flowScope.service != null" then="renewRequestCheck"
else="viewGenericLoginSuccess" />
</decision-state>
<decision-state id="renewRequestCheck">
<if
test="externalContext.requestParameterMap['renew'] != '' && externalContext.requestParameterMap['renew'] != null"
then="submit" else="generateServiceTicket" />
</decision-state>
<!-- The "warn" action makes the determination of whether to redirect directly
to the requested service or display the "confirmation" page to go back to
the server. -->
<decision-state id="warn">
<if test="flowScope.warnCookieValue" then="showWarningView"
else="redirect" />
</decision-state>
<!-- <action-state id="startAuthenticate"> <action bean="x509Check" /> <transition
on="success" to="sendTicketGrantingTicket" /> <transition on="error" to="viewLoginForm"
/> </action-state> -->
<view-state id="viewLoginForm" view="casLoginView">
<on-render>
<evaluate expression="authenticationViaFormAction.setupForm()" />
<evaluate expression="authenticationViaFormAction.referenceData()"/>
</on-render>
<transition on="submit" to="bindAndValidate" />
</view-state>
<action-state id="bindAndValidate">
<evaluate expression="usrAuthenticationViaFormAction" />
<transition on="success" to="submit" />
<transition on="error" to="redirect" />
</action-state>
<action-state id="submit">
<evaluate expression = "usrAuthenticationViaFormAction.setCredentialsToFlowScope()" />
<evaluate expression="usrAuthenticationViaFormAction.submit(flowRequestContext, flowScope.credentials, messageContext)" />
<transition on="success" to="sendTicketGrantingTicket" />
<transition on="authenticationFailure" to="pickup_error_redirect" />
<transition on="error" to="pickup_error_redirect">
<set name="errorCode" value="flowScope.errorCode" /> <!-- scope="conversation" />-->
</transition>
</action-state>
<action-state id="sendTicketGrantingTicket">
<evaluate expression="sendTicketGrantingTicketAction" />
<transition on="success" to="serviceCheck" />
</action-state>
<decision-state id="serviceCheck">
<if test="flowScope.service != null" then="checkEnrollResponse"
else="viewGenericLoginSuccess" />
</decision-state>
<decision-state id="checkEnrollResponse">
<if test="flowScope.enrollresponse != null" then="generateServiceTicket"
else="checksywrrequired" />
</decision-state>
<!-- select the success modal based on the flow caller -->
<decision-state id="checksywrrequired">
<if test="requestScope.sywLogin == 'true'" then="sywrRequired"
else="generateServiceTicket" />
</decision-state>
<action-state id="sywrRequired">
<evaluate expression="usrIsSYWRUserCheckAction" />
<transition on="success" to="isAffinityCheckRequired" />
<transition on="error" to="generateServiceTicketNoSywr" />
</action-state>
<decision-state id="isAffinityCheckRequired">
<if test="requestScope.sourceSiteId==6" then="craftsmanAffinityCheck"
else="generateServiceTicket" />
</decision-state>
<action-state id="craftsmanAffinityCheck">
<evaluate expression="ssoGatewayService.searchUserByMemberNumberInTelluride(flowScope.sywrNumber,
requestParameters.sourceSiteId)" result="returnEmailResponse"/>
<transition on="success" to="checkForCcAffinityModal" />
</action-state>
<!--
<bean-action bean="ssoGatewayService" method="searchUserByMemberNumberInTelluride">
<method-arguments>
<argument expression="flowScope.sywrNumber" />
<argument expression="${requestParameters.sourceSiteId}" />
</method-arguments>
<method-result name="returnEmailResponse" scope="flow" />
</bean-action>
-->
<decision-state id="checkForCcAffinityModal">
<if test="flowScope.returnEmailResponse.ccAffinity==true" then="generateServiceTicket"
else="generateServiceTicketNoCcaffinity" />
</decision-state>
<action-state id="generateServiceTicketNoSywr">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to="sendtickettomodalforloginnosywr" />
<transition on="error" to="setErrorCode" />
<transition on="gateway" to="redirect" />
</action-state>
<action-state id="generateServiceTicketNoCcaffinity">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to="sendtickettomodalforloginnoccaffinity" />
<transition on="error" to="setErrorCode" />
<transition on="gateway" to="redirect" />
</action-state>
<action-state id="generateServiceTicket">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to="pickupticketmodal" />
<transition on="error" to="setErrorCode" />
<transition on="gateway" to="redirect" />
</action-state>
<action-state id="setErrorCode">
<evaluate expression="setErrorCodeBean.submit()" />
<transition on="success" to="pickup_error_redirect" />
</action-state>
<!-- the "viewGenericLogin" is the end state for when a user attempts to
login without coming directly from a service. They have only initialized
their single-sign on session. -->
<end-state id="viewGenericLoginSuccess" view="casLoginGenericSuccessView" />
<!-- The "showWarningView" end state is the end state for when the user
has requested privacy settings (to be "warned") to be turned on. It delegates
to a view defines in default_views.properties that display the "Please click
here to go to the service." message. -->
<end-state id="showWarningView" view="casLoginConfirmView" />
<!-- The "redirect" end state allows CAS to properly end the workflow while
still redirecting the user back to the service required. -->
<end-state id="redirect" view="externalRedirect:#{requestScope.response.url}" />
<end-state id="viewServiceErrorView" view="viewServiceErrorView" />
<end-state id="viewServiceSsoErrorView" view="viewServiceSsoErrorView" />
<!-- select the success modal based on the flow caller -->
<decision-state id="pickupticketmodal">
<if test="flowScope.enrollresponse != null" then="sendtickettomodal_reg"
else="sendTicket" />
</decision-state>
<!-- send the service ticket back to the modal, no view required in this
subflow -->
<end-state id="sendtickettomodal_reg">
<output name = "serviceTicketId" value = "requestScope.serviceTicketId"/>
</end-state>
<!-- <output-mapper>
<mapping source="${requestScope.serviceTicketId}" target="serviceTicketId" />
</output-mapper> -->
<decision-state id="sendTicket">
<if test="flowScope.auth != null && flowScope.auth != ''"
then="sendtickettomodalforloginnosywr" else="sendtickettomodalforlogin" />
</decision-state>
<end-state id="sendtickettomodalforlogin" view="/displayserviceticketandcookie">
<output name = "modifyservice" value = "requestScope.modifyservice"/>
<output name = "sywmax" value = "requestScope.sywmax"/>
<output name = "irp" value = "requestScope.irp"/>
<output name = "auth" value = "requestScope.auth"/>
</end-state>
<!--
<output-mapper>
<mapping source="${requestScope.modifyservice}" target="modifyservice"/>
<mapping source="${requestScope.sywmax}" target="sywmax"/>
<mapping source="${requestScope.irp}" target="irp"/>
<mapping source="${requestScope.auth}" target="auth"/>
</output-mapper>
-->
<!-- for login, directly sending the st to the modal -->
<end-state id="sendtickettomodalforloginnosywr" view="displayserviceticketandcookienosywr" >
<output name = "modifyservice" value = "requestScope.modifyservice"/>
<output name = "irp" value = "requestScope.irp"/>
</end-state>
<!--
<output-mapper>
<mapping source="${requestScope.modifyservice}" target="modifyservice" />
<mapping source="${requestScope.irp}" target="irp" />
</output-mapper>
-->
<end-state id="sendtickettomodalforloginnoccaffinity" view="displayserviceticketandcookienoccaffinity">
<output name = "modifyservice" value = "requestScope.modifyservice"/>
<output name = "irp" value = "requestScope.irp"/>
</end-state>
<!--
<output-mapper>
<mapping source="${requestScope.modifyservice}" target="modifyservice" />
<mapping source="${requestScope.irp}" target="irp" />
</output-mapper>
-->
<!-- for login, directly sending the st to the modal -->
<end-state id="showTnCModal" view="/showTnCModalToUsers">
</end-state>
<!-- select the error redirect based on the flow caller -->
<decision-state id="pickup_error_redirect">
<if test="flowScope.enrollresponse != null" then="pickup_error_redirect_reg"
else="set_error_in_scope" />
</decision-state>
<action-state id="set_error_in_scope">
<evaluate expression="setErrorMessages.getErrorMessagesMap(flowRequestContext)" result="flowScope.errorMessageMap"
result-type="java.util.HashMap"></evaluate>
<transition on="success" to="pickup_error_redirect_login"> </transition>
</action-state>
<!-- redirect when error to create sso session, no view required in this subflow -->
<end-state id="pickup_error_redirect_reg" />
<end-state id="pickup_error_redirect_login" view="/loginfailure" >
<on-entry>
<set name="flowScope.parameters" value="flowScope.errorMessageMap.parameters"></set>
</on-entry>
</end-state>
<!-- current not properly defined the global error condition -->
<global-transitions>
<transition to="pickup_error_redirect"
on-exception="org.springframework.webflow.execution.repository.NoSuchFlowExecutionException" />
<transition to="pickup_error_redirect"
on-exception="org.jasig.cas.services.UnauthorizedSsoServiceException" />
<transition to="pickup_error_redirect"
on-exception="org.jasig.cas.services.UnauthorizedServiceException" />
<transition to="pickup_error_redirect"
on-exception="org.springframework.webflow.execution.FlowExecutionException" />
</global-transitions>
</flow>
You are still having the same issues, which are issues with mocking and expecting the exact same object as a parameter.
Why do you care so much about the flowRequestContext object?
EasyMock.expect(setErrorMessages.getErrorMessagesMap(flowRequestContext)).andReturn(model);
just use:
EasyMock.expect(setErrorMessages.getErrorMessagesMap((RequestContext)EasyMock.anyObject())).andReturn(model);
which will work with any instance of RequestContext that can be within your flow
I have tried to resume the flow with directly from particular state i.e setCurrentState("initialFlowSetup"). In which the flow is transition to other state with the given eventid error but after certain transition there is one action involved setErrorMessages.getErrorMessagesMap(flowRequestContext)" result="flowScope.errorMessageMap" in state set_error_in_scope which is returning the Map.
When I call the method using EasyMock and set the expectation the return result as map in my test case the return result is not taken by webflow. Below is the error.
I am not able to understand the concept , when to set expectation and set the result to webflow so the return result will be identified by flow.
Error
org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing [AnnotatedAction#7c974942 targetAction = [EvaluateAction#1eea9d2d expression = setErrorMessages.getErrorMessagesMap(flowRequestContext), resultExpression = flowScope.errorMessageMap], attributes = map[[empty]]] in state 'set_error_in_scope' of flow 'shclogin-flow' -- action execution attributes were 'map[[empty]]'
at org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:60)
at org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:101)
at org.springframework.webflow.engine.State.enter(State.java:194)
at org.springframework.webflow.engine.Transition.execute(Transition.java:228)
at org.springframework.webflow.engine.DecisionState.doEnter(DecisionState.java:51)
at org.springframework.webflow.engine.State.enter(State.java:194)
at org.springframework.webflow.engine.Transition.execute(Transition.java:228)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:395)
at org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214)
at org.springframework.webflow.engine.support.TransitionExecutingFlowExecutionExceptionHandler.handle(TransitionExecutingFlowExecutionExceptionHandler.java:111)
at org.springframework.webflow.engine.FlowExecutionExceptionHandlerSet.handleException(FlowExecutionExceptionHandlerSet.java:109)
at org.springframework.webflow.engine.Flow.handleException(Flow.java:600)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.tryFlowHandlers(FlowExecutionImpl.java:647)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.handleException(FlowExecutionImpl.java:603)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:263)
at org.springframework.webflow.test.execution.AbstractFlowExecutionTests.resumeFlow(AbstractFlowExecutionTests.java:136)
at com.shc.ecom.test.usr.TestloginlFlow.testAction(TestloginlFlow.java:149)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:131)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.springframework.expression.ExpressionInvocationTargetException: A problem occurred when trying to execute method 'getErrorMessagesMap' on object of type [com.shc.ecom.sso.cas.web.flow.SetErrorMessages$$EnhancerByCGLIB$$ae43a022]
at org.springframework.expression.spel.ast.MethodReference.throwSimpleExceptionIfPossible(MethodReference.java:227)
at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:133)
at org.springframework.expression.spel.ast.MethodReference.access$000(MethodReference.java:49)
at org.springframework.expression.spel.ast.MethodReference$MethodValueRef.getValue(MethodReference.java:342)
at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:88)
at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:131)
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:299)
at org.springframework.binding.expression.spel.SpringELExpression.getValue(SpringELExpression.java:84)
at org.springframework.webflow.action.EvaluateAction.doExecute(EvaluateAction.java:75)
at org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188)
at org.springframework.webflow.execution.AnnotatedAction.execute(AnnotatedAction.java:145)
at org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51)
... 34 more
Caused by: java.lang.AssertionError:
Unexpected method call SetErrorMessages.getErrorMessagesMap([RequestControlContextImpl#48bfb884 externalContext = org.springframework.webflow.test.MockExternalContext#11653e3b, currentEvent = [null], requestScope = map[[empty]], attributes = map[[empty]], messageContext = [DefaultMessageContext#715fb77 sourceMessages = map[[null] -> list[[empty]]]], flowExecution = [FlowExecutionImpl#1b9c1b51 flow = 'shclogin-flow', flowSessions = list[[FlowSessionImpl#2e52fb3e flow = 'shclogin-flow', state = 'set_error_in_scope', scope = map['errorMessageMap' -> map['originalUrl' -> 123]]]]]]):
SetErrorMessages.getErrorMessagesMap(requestContext): expected: 1, actual: 0
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44)
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:85)
at org.easymock.internal.ClassProxyFactory$MockMethodInterceptor.intercept(ClassProxyFactory.java:94)
at com.shc.ecom.sso.cas.web.flow.SetErrorMessages$$EnhancerByCGLIB$$ae43a022.getErrorMessagesMap(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:112)
at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:129)
... 44 more
Xml
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.4.xsd"
start-state="initialFlowSetup" >
<input name="loginId" value="requestScope.loginId" />
<input name="logonPassword" value="requestScope.logonPassword" />
<input name="sourceSiteId" value="requestScope.sourceSiteId" />
<input name="fullpage" value="requestScope.fullpage" />
<input name="partialuser" value="requestScope.partialuser" />
<input name="sourceSiteId" value="flowScope.sourceSite" />
<input name="service" value="requestScope.service" />
<input name="redirectUrl" value="requestScope.redirectUrl" />
<input name="sywLogin" value="requestScope.sywLogin" />
<input name="tncmodal" value="requestScope.tncmodal" />
<input name="modifyservice" value="requestScope.modifyservice" />
<input name="reglogin" value="flowScope.reglogin" />
<input name="enrollresponse" value="flowScope.enrollresponse" />
<input name="shcCaptchaKey" value="requestScope.shcKey" />
<input name="shcCaptchaResponse" value="requestScope.shcResponse" />
<input name="sywmax" value="flowScope.sywmax" />
<input name="auth" value="flowScope.auth" />
<input name="maxactivationflow" value="flowScope.maxactivationflow" />
<action-state id="initialFlowSetup">
<evaluate expression="usrInitialFlowSetupAction" />
<transition on="success" to="ticketGrantingTicketExistsCheck" />
<transition on="error" to="pickup_error_redirect" />
</action-state>
<decision-state id="ticketGrantingTicketExistsCheck">
<if test="flowScope.ticketGrantingTicketId != null" then="hasServiceCheck"
else="gatewayRequestCheck" />
</decision-state>
<decision-state id="gatewayRequestCheck">
<if
test="externalContext.requestParameterMap['gateway'] != '' && externalContext.requestParameterMap['gateway'] != null && flowScope.service != null"
then="redirect" else="submit" />
</decision-state>
<decision-state id="hasServiceCheck">
<if test="flowScope.service != null" then="renewRequestCheck"
else="viewGenericLoginSuccess" />
</decision-state>
<decision-state id="renewRequestCheck">
<if
test="externalContext.requestParameterMap['renew'] != '' && externalContext.requestParameterMap['renew'] != null"
then="submit" else="generateServiceTicket" />
</decision-state>
<!-- The "warn" action makes the determination of whether to redirect directly
to the requested service or display the "confirmation" page to go back to
the server. -->
<decision-state id="warn">
<if test="flowScope.warnCookieValue" then="showWarningView"
else="redirect" />
</decision-state>
<!-- <action-state id="startAuthenticate"> <action bean="x509Check" /> <transition
on="success" to="sendTicketGrantingTicket" /> <transition on="error" to="viewLoginForm"
/> </action-state> -->
<view-state id="viewLoginForm" view="casLoginView">
<on-render>
<evaluate expression="authenticationViaFormAction.setupForm()" />
<evaluate expression="authenticationViaFormAction.referenceData()"/>
</on-render>
<transition on="submit" to="bindAndValidate" />
</view-state>
<action-state id="bindAndValidate">
<evaluate expression="usrAuthenticationViaFormAction" />
<transition on="success" to="submit" />
<transition on="error" to="redirect" />
</action-state>
<action-state id="submit">
<evaluate expression = "usrAuthenticationViaFormAction.setCredentialsToFlowScope()" />
<evaluate expression="usrAuthenticationViaFormAction.submit(flowRequestContext, flowScope.credentials, messageContext)" />
<transition on="success" to="sendTicketGrantingTicket" />
<transition on="authenticationFailure" to="pickup_error_redirect" />
<transition on="error" to="pickup_error_redirect">
<set name="errorCode" value="flowScope.errorCode" /> <!-- scope="conversation" />-->
</transition>
</action-state>
<action-state id="sendTicketGrantingTicket">
<evaluate expression="sendTicketGrantingTicketAction" />
<transition on="success" to="serviceCheck" />
</action-state>
<decision-state id="serviceCheck">
<if test="flowScope.service != null" then="checkEnrollResponse"
else="viewGenericLoginSuccess" />
</decision-state>
<decision-state id="checkEnrollResponse">
<if test="flowScope.enrollresponse != null" then="generateServiceTicket"
else="checksywrrequired" />
</decision-state>
<!-- select the success modal based on the flow caller -->
<decision-state id="checksywrrequired">
<if test="requestScope.sywLogin == 'true'" then="sywrRequired"
else="generateServiceTicket" />
</decision-state>
<action-state id="sywrRequired">
<evaluate expression="usrIsSYWRUserCheckAction" />
<transition on="success" to="isAffinityCheckRequired" />
<transition on="error" to="generateServiceTicketNoSywr" />
</action-state>
<decision-state id="isAffinityCheckRequired">
<if test="requestScope.sourceSiteId==6" then="craftsmanAffinityCheck"
else="generateServiceTicket" />
</decision-state>
<action-state id="craftsmanAffinityCheck">
<evaluate expression="ssoGatewayService.searchUserByMemberNumberInTelluride(flowScope.sywrNumber,
requestParameters.sourceSiteId)" result="returnEmailResponse"/>
<transition on="success" to="checkForCcAffinityModal" />
</action-state>
<!--
<bean-action bean="ssoGatewayService" method="searchUserByMemberNumberInTelluride">
<method-arguments>
<argument expression="flowScope.sywrNumber" />
<argument expression="${requestParameters.sourceSiteId}" />
</method-arguments>
<method-result name="returnEmailResponse" scope="flow" />
</bean-action>
-->
<decision-state id="checkForCcAffinityModal">
<if test="flowScope.returnEmailResponse.ccAffinity==true" then="generateServiceTicket"
else="generateServiceTicketNoCcaffinity" />
</decision-state>
<action-state id="generateServiceTicketNoSywr">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to="sendtickettomodalforloginnosywr" />
<transition on="error" to="setErrorCode" />
<transition on="gateway" to="redirect" />
</action-state>
<action-state id="generateServiceTicketNoCcaffinity">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to="sendtickettomodalforloginnoccaffinity" />
<transition on="error" to="setErrorCode" />
<transition on="gateway" to="redirect" />
</action-state>
<action-state id="generateServiceTicket">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to="pickupticketmodal" />
<transition on="error" to="setErrorCode" />
<transition on="gateway" to="redirect" />
</action-state>
<action-state id="setErrorCode">
<evaluate expression="setErrorCodeBean.submit()" />
<transition on="success" to="pickup_error_redirect" />
</action-state>
<!-- the "viewGenericLogin" is the end state for when a user attempts to
login without coming directly from a service. They have only initialized
their single-sign on session. -->
<end-state id="viewGenericLoginSuccess" view="casLoginGenericSuccessView" />
<!-- The "showWarningView" end state is the end state for when the user
has requested privacy settings (to be "warned") to be turned on. It delegates
to a view defines in default_views.properties that display the "Please click
here to go to the service." message. -->
<end-state id="showWarningView" view="casLoginConfirmView" />
<!-- The "redirect" end state allows CAS to properly end the workflow while
still redirecting the user back to the service required. -->
<end-state id="redirect" view="externalRedirect:#{requestScope.response.url}" />
<end-state id="viewServiceErrorView" view="viewServiceErrorView" />
<end-state id="viewServiceSsoErrorView" view="viewServiceSsoErrorView" />
<!-- select the success modal based on the flow caller -->
<decision-state id="pickupticketmodal">
<if test="flowScope.enrollresponse != null" then="sendtickettomodal_reg"
else="sendTicket" />
</decision-state>
<!-- send the service ticket back to the modal, no view required in this
subflow -->
<end-state id="sendtickettomodal_reg">
<output name = "serviceTicketId" value = "requestScope.serviceTicketId"/>
</end-state>
<!-- <output-mapper>
<mapping source="${requestScope.serviceTicketId}" target="serviceTicketId" />
</output-mapper> -->
<decision-state id="sendTicket">
<if test="flowScope.auth != null && flowScope.auth != ''"
then="sendtickettomodalforloginnosywr" else="sendtickettomodalforlogin" />
</decision-state>
<end-state id="sendtickettomodalforlogin" view="/displayserviceticketandcookie">
<output name = "modifyservice" value = "requestScope.modifyservice"/>
<output name = "sywmax" value = "requestScope.sywmax"/>
<output name = "irp" value = "requestScope.irp"/>
<output name = "auth" value = "requestScope.auth"/>
</end-state>
<!--
<output-mapper>
<mapping source="${requestScope.modifyservice}" target="modifyservice"/>
<mapping source="${requestScope.sywmax}" target="sywmax"/>
<mapping source="${requestScope.irp}" target="irp"/>
<mapping source="${requestScope.auth}" target="auth"/>
</output-mapper>
-->
<!-- for login, directly sending the st to the modal -->
<end-state id="sendtickettomodalforloginnosywr" view="displayserviceticketandcookienosywr" >
<output name = "modifyservice" value = "requestScope.modifyservice"/>
<output name = "irp" value = "requestScope.irp"/>
</end-state>
<!--
<output-mapper>
<mapping source="${requestScope.modifyservice}" target="modifyservice" />
<mapping source="${requestScope.irp}" target="irp" />
</output-mapper>
-->
<end-state id="sendtickettomodalforloginnoccaffinity" view="displayserviceticketandcookienoccaffinity">
<output name = "modifyservice" value = "requestScope.modifyservice"/>
<output name = "irp" value = "requestScope.irp"/>
</end-state>
<!--
<output-mapper>
<mapping source="${requestScope.modifyservice}" target="modifyservice" />
<mapping source="${requestScope.irp}" target="irp" />
</output-mapper>
-->
<!-- for login, directly sending the st to the modal -->
<end-state id="showTnCModal" view="/showTnCModalToUsers">
</end-state>
<!-- select the error redirect based on the flow caller -->
<decision-state id="pickup_error_redirect">
<if test="flowScope.enrollresponse != null" then="pickup_error_redirect_reg"
else="set_error_in_scope" />
</decision-state>
<action-state id="set_error_in_scope">
<evaluate expression="setErrorMessages.getErrorMessagesMap(flowRequestContext)" result="flowScope.errorMessageMap"
result-type="java.util.HashMap"></evaluate>
<transition on="success" to="pickup_error_redirect_login"> </transition>
</action-state>
<!-- redirect when error to create sso session, no view required in this subflow -->
<end-state id="pickup_error_redirect_reg" />
<end-state id="pickup_error_redirect_login" view="/loginfailure" >
<on-entry>
<set name="flowScope.parameters" value="flowScope.errorMessageMap.parameters"></set>
</on-entry>
</end-state>
<!-- current not properly defined the global error condition -->
<global-transitions>
<transition to="pickup_error_redirect"
on-exception="org.springframework.webflow.execution.repository.NoSuchFlowExecutionException" />
<transition to="pickup_error_redirect"
on-exception="org.jasig.cas.services.UnauthorizedSsoServiceException" />
<transition to="pickup_error_redirect"
on-exception="org.jasig.cas.services.UnauthorizedServiceException" />
<transition to="pickup_error_redirect"
on-exception="org.springframework.webflow.execution.FlowExecutionException" />
</global-transitions>
</flow>
Test Case
public class TestloginlFlow extends AbstractXmlFlowExecutionTests {
UsrInitialFlowSetupAction usrInitialFlowSetupAction;
AuthenticationViaFormAction authenticationViaFormAction;
UsrIsSYWRUserCheckAction usrIsSYWRUserCheckAction;
SSOGatewayService ssoGatewayService;
CustomGenerateServiceTicketAction generateServiceTicketAction;
CentralAuthenticationService centralAuthenticateService;
CookieRetrievingCookieGenerator warnCookieGenerator;
USRAuthenticationViaFormAction usrAuthenticationViaFormAction;
List<ArgumentExtractor> argumentExtractor;
SetErrorMessages setErrorMessages;
RequestControlContext requestContext;
#Override
protected void setUp() throws Exception {
usrInitialFlowSetupAction = EasyMock.createMock("usrInitialFlowSetupAction", UsrInitialFlowSetupAction.class); // usrAuthenticationViaFormAction
setErrorMessages = EasyMock.createMock("SetErrorMessages", SetErrorMessages.class);
usrAuthenticationViaFormAction = EasyMock.createMock("usrAuthenticationViaFormAction",
USRAuthenticationViaFormAction.class);
usrIsSYWRUserCheckAction = EasyMock.createMock("usrIsSYWRUserCheckAction", UsrIsSYWRUserCheckAction.class); // ssoGatewayService
ssoGatewayService = EasyMock.createMock("ssoGatewayService", SSOGatewayService.class);
generateServiceTicketAction = EasyMock.createMock("generateServiceTicketAction",
CustomGenerateServiceTicketAction.class);
centralAuthenticateService = EasyMock.createMock("centralAuthenticateService",
CentralAuthenticationService.class);
warnCookieGenerator = EasyMock.createMock("centralAuthenticateService", CookieRetrievingCookieGenerator.class);
argumentExtractor = EasyMock.createMock("argumentExtractors", List.class);
generateServiceTicketAction = EasyMock.createMock("generateServiceTicketAction",
CustomGenerateServiceTicketAction.class);
requestContext=EasyMock.createMock("requestContext",RequestControlContext.class);
}
#Override
protected FlowDefinitionResource getResource(FlowDefinitionResourceFactory resourceFactory) {
return resourceFactory.createFileResource("src/main/webapp/WEB-INF/usr/flows/shclogin-flow.xml");
}
#Override
protected void registerMockFlowBeans(ConfigurableBeanFactory builderContext) {
builderContext.registerSingleton("argumentExtractors", argumentExtractor);
builderContext.registerSingleton("warnCookieGenerator", warnCookieGenerator);
builderContext.registerSingleton("centralAuthenticateService", centralAuthenticateService);
builderContext.registerSingleton("usrAuthenticationViaFormAction", usrAuthenticationViaFormAction);
builderContext.registerSingleton("usrIsSYWRUserCheckAction", usrIsSYWRUserCheckAction);
builderContext.registerSingleton("ssoGatewayService", ssoGatewayService);
builderContext.registerSingleton("generateServiceTicketAction", generateServiceTicketAction);
builderContext.registerSingleton("ticketGrantingTicketCookieGenerator", warnCookieGenerator);
builderContext.registerSingleton("setErrorMessages", setErrorMessages);
builderContext.registerSingleton("request", requestContext);
}
#Override
protected void configureFlowBuilderContext(MockFlowBuilderContext builderContext) {
usrAuthenticationViaFormAction.setCentralAuthenticationService(centralAuthenticateService);
usrAuthenticationViaFormAction.setWarnCookieGenerator(warnCookieGenerator);
builderContext.registerBean("warnCookieGenerator", warnCookieGenerator);
builderContext.registerBean("centralAuthenticateService", centralAuthenticateService);
builderContext.registerBean("usrAuthenticationViaFormAction", usrAuthenticationViaFormAction);
builderContext.registerBean("usrIsSYWRUserCheckAction", usrIsSYWRUserCheckAction);
builderContext.registerBean("ssoGatewayService", ssoGatewayService);
builderContext.registerBean("generateServiceTicketAction", generateServiceTicketAction);
builderContext.registerBean("setErrorMessages", setErrorMessages);
builderContext.registerBean("request", requestContext);
}
public void testAction() throws Exception {
setCurrentState("initialFlowSetup");
MockExternalContext ctx = new MockExternalContext();
MutableAttributeMap input = new LocalAttributeMap();
MockRequestControlContext context = new MockRequestControlContext();
FlowExecution flowExecution = getFlowExecution();
FlowSession session = flowExecution.getActiveSession();
Map<String, Object> model = new HashMap<String, Object>();
model.put("originalUrl", 123);
session.getScope().put("errorMessageMap", model);
updateFlowExecution(flowExecution);
ctx.setEventId("error");
EasyMock.expect(setErrorMessages.getErrorMessagesMap(requestContext)).andReturn(model);
EasyMock.replay(setErrorMessages);
resumeFlow(ctx);
assertResponseWrittenEquals("/loginfailure", ctx);
assertFlowExecutionEnded();
}
public void testAction1() throws Exception {
// setCurrentState("initialFlowSetup");
MockExternalContext ctx = new MockExternalContext();
MutableAttributeMap input = new LocalAttributeMap();
input.put("loginId", "12");
input.put("logonPassword", "ankur");
input.put("sourceSiteId", "3");
input.put("fullpage", "");
input.put("partialuser", "true");
input.put("service", "");
input.put("redirectUrl", "");
input.put("sywLogin", "er4fju");
input.put("tncmodal", null);
input.put("modifyservice", "no");
// input.put("reglogin", false);
// input.put("enrollresponse", 200);
input.put("shcCaptchaKey", null);
input.put("ticketGrantingTicketId", "1234");
Map<String, Object> parameters = new HashMap<>();
parameters.put("renew", "yes");
ParameterMap requestParameterMap = new LocalParameterMap(parameters);
ctx.setRequestParameterMap(requestParameterMap);
MockRequestContext context = new MockRequestContext();
Event event = new Event(this, "success");
EasyMock.expect(usrInitialFlowSetupAction.doExecute(flowRequestContext)).andReturn(event);
EasyMock.replay(usrInitialFlowSetupAction);
//Mockito.mock(usrInitialFlowSetupAction.doExecute(flowRequestContext), event)
/*
* FlowExecution flowExecution = getFlowExecution(); FlowSession session
* = flowExecution.getActiveSession();
* session.getScope().put("ticketGrantingTicketId", "ee");
*/
// updateFlowExecution(flowExecution);
startFlow(input, ctx);
}
}
I recently started working on JSF in ICEFaces FrameWork(Server # Glassfish).
I have one question.
In my first JSF page i have radio buttons, If i to select and click on next page, I have to publish those selected values in my second page. If i click on back button , i have to show the selected values in my first page.
How can i achieve this? Please suggest
My First Page(suites.xhtml).
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ace="http://www.icefaces.org/icefaces/components">
<ui:composition template="/WEB-INF/templates/template.xhtml">
<ui:param name="title" value="Eclipse Template Test Page" />
<ui:param name="companyName" value="Autoexetc" />
<ui:define name="menuItems">
<ace:menuItem value="Dashboard" url="/dashboard.jsf" icon="ui-icon ui-icon-home"
styleClass="menuBarItem" />
<ace:menuItem value="Suites" url="/suites.jsf" styleClass="menuBarItem" />
<ace:menuItem value="Status" url="/status.jsf" styleClass="menuBarItem" />
<ace:menuItem value="Report" url="#" styleClass="menuBarItem" />
<ace:menuItem value="Terminal" url="#" styleClass="menuBarItem" />
</ui:define>
<ui:define name="tabItems">
Your in Suites Page <h:commandButton value="Back To DashBoard" action="dashboard" />
<br></br>
1. Hard-coded with "f:selectItem" :
<h:selectOneRadio value="#{user.favColor1}">
<f:selectItem itemValue="Red" itemLabel="Color1 - Red" />
<f:selectItem itemValue="Green" itemLabel="Color1 - Green" />
<f:selectItem itemValue="Blue" itemLabel="Color1 - Blue" />
</h:selectOneRadio>
<br />
2. Generated by Map :
<h:selectOneRadio value="#{user.favColor2}">
<f:selectItems value="#{user.favColor2Value}" />
</h:selectOneRadio>
<br />
3. Generated by Object array and iterate with var :
<h:selectOneRadio value="#{user.favColor3}">
<f:selectItems value="#{user.favColor3Value}" var="c"
itemLabel="#{c.colorLabel}" itemValue="#{c.colorValue}" />
</h:selectOneRadio>
<br />
<h:commandButton value="Submit" action="status" />
<h:commandButton value="Reset" type="reset" />
</ui:define>
</ui:composition>
</html>
And My Result Page (status.Xhtml), which gives my selected values.
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ace="http://www.icefaces.org/icefaces/components">
<ui:composition template="/WEB-INF/templates/template.xhtml">
<ui:param name="title" value="Eclipse Template Test Page" />
<ui:param name="companyName" value="Autoexetc" />
<ui:define name="menuItems">
<ace:menuItem value="Dashboard" url="/dashboard.jsf" icon="ui-icon ui-icon-home"
styleClass="menuBarItem" />
<ace:menuItem value="Suites" url="/suites.jsf" styleClass="menuBarItem" />
<ace:menuItem value="Status" url="/status.jsf" styleClass="menuBarItem" />
<ace:menuItem value="Report" url="#" styleClass="menuBarItem" />
<ace:menuItem value="Terminal" url="#" styleClass="menuBarItem" />
</ui:define>
<ui:define name="tabItems">
Your in status Page <h:commandButton value="Back To suites" action="suites" />
<br/>
<ol>
<li>user.favColor1 : #{user.favColor1}</li>
<li>user.favColor2 : #{user.favColor2}</li>
<li>user.favColor3 : #{user.favColor3}</li>
</ol>
</ui:define>
When i click on back button from my result page, first page will display with selected values, if i re-select any values and submit it, cant able to navigate to my result page.
I have created a custom type in orchard cms, that has a two column lay out
It has 2 header text fileds and 2 content HTML flavour fileds
Heres the migration :
public class MigrationTwoColumnPageType : DataMigrationImpl
{
public int Create()
{
// Define the project type
ContentDefinitionManager.AlterTypeDefinition("TwoColumnPage", cfg => cfg
.WithSetting("Stereotype", "Content")
.CommomPart()
.AutoroutePart()
.WithPart("TitlePart")
.WithPart("MenuPart")
.WithPart("TagsPart")
.WithPart("PublishLaterPart")
.WithPart("TwoColumnPage")
.Creatable()
.Draftable());
return 1;
}
public int UpdateFrom1()
{
// Define project part - having a part with the same name will create fields in the project type
ContentDefinitionManager.AlterPartDefinition("TwoColumnPage", builder => builder
.TextField("Column1Title", Flavour.Large)
.TextField("Column1Text", Flavour.Html)
.TextField("Column2Title", Flavour.Large)
.TextField("Column2Text", Flavour.Html)
.Attachable());
return 2;
}
}
NOTE: TextField is a custom extension method to make things less verbose
When I try and use the media picker to up load an image into one of these content fields I get a folder not found error, - I have traced this back to the media path on the Request querystring not being set
// media directory to save uploaded files into
var mediaPath = Request["uploadpath"];
in ../../Orchard.MediaPicker/Views/admin/Tab_Url.cshtml
Is there some way to set this using filed settings ?
Seems to work fine for any pages I create, but custom types .... how do I set this value ?
UPDATE
Heres the xml meta data for a page...
<!--Exported from Orchard-->
<Orchard>
<Recipe>
<Name>Generated by Orchard.ImportExport</Name>
<Author>admin</Author>
</Recipe>
<Metadata>
<Types>
<Page ContentTypeSettings.Creatable="True" ContentTypeSettings.Draftable="True" TypeIndexing.Included="true" DisplayName="Page">
<NavigationPart />
<CommonPart DateEditorSettings.ShowDateEditor="true" />
<PublishLaterPart />
<TitlePart />
<AutoroutePart AutorouteSettings.AllowCustomPattern="true" AutorouteSettings.AutomaticAdjustmentOnEdit="false" AutorouteSettings.PatternDefinitions="[{Name:'Title', Pattern: '{Content.Slug}', Description: 'my-page'}]" AutorouteSettings.DefaultPatternIndex="0" />
<BodyPart />
<TagsPart />
<LocalizationPart />
</Page>
</Types>
<Parts>
<NavigationPart ContentPartSettings.Attachable="True" />
<CommonPart ContentPartSettings.Attachable="True" />
<PublishLaterPart ContentPartSettings.Attachable="True" />
<TitlePart ContentPartSettings.Attachable="True" />
<AutoroutePart ContentPartSettings.Attachable="True" />
<BodyPart ContentPartSettings.Attachable="True" BodyPartSettings.FlavorDefault="html" />
<TagsPart ContentPartSettings.Attachable="True" />
<LocalizationPart />
</Parts>
</Metadata>
</Orchard>
Here's the XML meta for my custom type, using TestFiledSetting instead of BodyPartSetting
<!--Exported from Orchard-->
<Orchard>
<Recipe>
<Name>Generated by Orchard.ImportExport</Name>
<Author>admin</Author>
</Recipe>
<Metadata>
<Types>
<TwoColumnPage Stereotype="Content" OwnerEditorSettings.ShowOwnerEditor="false" ContentTypeSettings.Creatable="True" ContentTypeSettings.Draftable="True" DisplayName="Two Column Page">
<CommonPart />
<AutoroutePart AutorouteSettings.PatternDefinitions="[{Name:'/Title', Pattern: '/{Content.Slug}', Description: 'my-page'}]" />
<TitlePart />
<MenuPart />
<TagsPart />
<PublishLaterPart />
<TwoColumnPage />
</TwoColumnPage>
</Types>
<Parts>
<CommonPart ContentPartSettings.Attachable="True" />
<AutoroutePart ContentPartSettings.Attachable="True" />
<TitlePart ContentPartSettings.Attachable="True" />
<MenuPart ContentPartSettings.Attachable="True" />
<TagsPart ContentPartSettings.Attachable="True" />
<PublishLaterPart ContentPartSettings.Attachable="True" />
<TwoColumnPage ContentPartSettings.Attachable="True">
<Column1Title.TextField TextFieldSettings.Required="True" TextFieldSettings.Flavor="Large" TextFieldSettings.Hint="" />
<Column1Text.TextField TextFieldSettings.Required="True" TextFieldSettings.Flavor="Html" TextFieldSettings.Hint="" />
<Column2Title.TextField TextFieldSettings.Required="True" TextFieldSettings.Flavor="Large" TextFieldSettings.Hint="" />
<Column2Text.TextField TextFieldSettings.Required="True" TextFieldSettings.Flavor="Html" TextFieldSettings.Hint="" />
</TwoColumnPage>
</Parts>
</Metadata>
</Orchard>
No mention of data-mediapicker-uploadpath in either. I'm still lost!