From 58d1ea3acc8e45601e299890f1ff60086f5d53d6 Mon Sep 17 00:00:00 2001
From: Ben Hale
Date: Thu, 11 Oct 2007 01:16:37 +0000
Subject: [PATCH] Merging of SWF-367 back into trunk. This has all of the SWF
2.0 goodies.
---
spring-binding/.classpath | 4 +-
.../convert/support/TextToExpression.java | 11 +-
.../binding/expression/EvaluationAttempt.java | 18 +-
.../binding/expression/Expression.java | 11 +-
.../binding/expression/ExpressionParser.java | 44 +-
.../expression/ExpressionVariable.java | 61 +
.../binding/expression/SetValueAttempt.java | 5 +-
.../el/DefaultELContextFactory.java | 54 -
.../expression/el/DefaultELResolver.java | 77 +-
.../expression/el/ELContextFactory.java | 12 +-
.../binding/expression/el/ELExpression.java | 86 +-
.../expression/el/ELExpressionParser.java | 149 +-
.../expression/el/MapAdaptableELResolver.java | 52 +
.../expression/ognl/OgnlExpression.java | 24 +-
.../expression/ognl/OgnlExpressionParser.java | 5 -
.../support/AbstractExpressionParser.java | 53 +-
.../support/BeanWrapperExpression.java | 75 -
.../support/BeanWrapperExpressionParser.java | 36 -
.../support/CollectionAddingExpression.java | 14 +-
.../support/CompositeStringExpression.java | 9 +-
.../expression/support/StaticExpression.java | 9 +-
.../binding/mapping/Mapping.java | 13 +-
.../binding/mapping/MappingBuilder.java | 12 +-
.../binding/mapping/RequiredMapping.java | 3 +-
.../message/DefaultMessageContextFactory.java | 88 +
.../binding/message/Message.java | 57 +
.../binding/message/MessageContext.java | 32 +
.../message/MessageContextFactory.java | 16 +
.../binding/message/MessageResolver.java | 24 +
.../binding/message/Messages.java | 225 +++
.../binding/message/Severity.java | 32 +
.../StateManageableMessageContext.java | 26 +
.../binding/method/MethodInvoker.java | 2 +-
.../binding/method/Parameter.java | 8 +-
.../el/ELExpressionParserTests.java | 200 +-
.../ognl/OgnlExpressionParserTests.java | 73 +-
.../{support => ognl}/TestBean.java | 2 +-
.../CollectionAddingExpressionTests.java | 67 -
.../support/SimpleExpressionTests.java | 101 -
.../expression/support/TestMethods.java | 10 -
.../method/TextToMethodSignatureTests.java | 4 +-
spring-faces/.classpath | 4 +-
.../.settings/org.eclipse.jdt.core.prefs | 8 +-
.../.settings/org.eclipse.jdt.ui.prefs | 5 +-
spring-faces/project.properties | 4 +-
.../faces/ui => META-INF}/ext/ext.js | 0
.../ext/resources/css/ext-all.css | 360 ++--
.../images/default/basic-dialog/btn-arrow.gif | Bin
.../default/basic-dialog/btn-sprite.gif | Bin
.../images/default/basic-dialog/close.gif | Bin
.../images/default/basic-dialog/collapse.gif | Bin
.../images/default/basic-dialog/e-handle.gif | Bin
.../images/default/basic-dialog/expand.gif | Bin
.../images/default/basic-dialog/hd-sprite.gif | Bin
.../images/default/basic-dialog/progress.gif | Bin
.../images/default/basic-dialog/progress2.gif | Bin
.../images/default/basic-dialog/s-handle.gif | Bin
.../images/default/basic-dialog/se-handle.gif | Bin
.../images/default/box/corners-blue.gif | Bin
.../resources/images/default/box/corners.gif | Bin
.../resources/images/default/box/l-blue.gif | Bin
.../ext/resources/images/default/box/l.gif | Bin
.../resources/images/default/box/r-blue.gif | Bin
.../ext/resources/images/default/box/r.gif | Bin
.../resources/images/default/box/tb-blue.gif | Bin
.../ext/resources/images/default/box/tb.gif | Bin
.../resources/images/default/dd/drop-add.gif | Bin
.../resources/images/default/dd/drop-no.gif | Bin
.../resources/images/default/dd/drop-yes.gif | Bin
.../images/default/editor/tb-sprite.gif | Bin
.../images/default/form/clear-trigger.gif | Bin
.../images/default/form/clear-trigger.psd | Bin
.../images/default/form/date-trigger.gif | Bin
.../images/default/form/date-trigger.psd | Bin
.../images/default/form/error-tip-corners.gif | Bin
.../images/default/form/exclamation.gif | Bin
.../images/default/form/search-trigger.gif | Bin
.../images/default/form/search-trigger.psd | Bin
.../resources/images/default/form/text-bg.gif | Bin
.../images/default/form/trigger-tpl.gif | Bin
.../resources/images/default/form/trigger.gif | Bin
.../resources/images/default/form/trigger.psd | Bin
.../resources/images/default/gradient-bg.gif | Bin
.../resources/images/default/grid/Thumbs.db | Bin
.../images/default/grid/arrow-left-white.gif | Bin
.../images/default/grid/arrow-right-white.gif | Bin
.../images/default/grid/col-move-bottom.gif | Bin
.../images/default/grid/col-move-top.gif | Bin
.../resources/images/default/grid/dirty.gif | Bin
.../resources/images/default/grid/done.gif | Bin
.../resources/images/default/grid/drop-no.gif | Bin
.../images/default/grid/drop-yes.gif | Bin
.../images/default/grid/footer-bg.gif | Bin
.../images/default/grid/grid-blue-hd.gif | Bin
.../images/default/grid/grid-blue-split.gif | Bin
.../images/default/grid/grid-hrow.gif | Bin
.../images/default/grid/grid-loading.gif | Bin
.../images/default/grid/grid-split.gif | Bin
.../images/default/grid/grid-vista-hd.gif | Bin
.../images/default/grid/grid3-hd-btn.gif | Bin
.../images/default/grid/grid3-hrow-over.gif | Bin
.../images/default/grid/grid3-hrow.gif | Bin
.../default/grid/grid3-special-col-bg.gif | Bin
.../default/grid/grid3-special-col-sel-bg.gif | Bin
.../resources/images/default/grid/hd-pop.gif | Bin
.../images/default/grid/hmenu-asc.gif | Bin
.../images/default/grid/hmenu-desc.gif | Bin
.../images/default/grid/hmenu-lock.gif | Bin
.../images/default/grid/hmenu-lock.png | Bin
.../images/default/grid/hmenu-unlock.gif | Bin
.../images/default/grid/hmenu-unlock.png | Bin
.../images/default/grid/invalid_line.gif | Bin
.../resources/images/default/grid/loading.gif | Bin
.../resources/images/default/grid/mso-hd.gif | Bin
.../resources/images/default/grid/nowait.gif | Bin
.../default/grid/page-first-disabled.gif | Bin
.../images/default/grid/page-first.gif | Bin
.../default/grid/page-last-disabled.gif | Bin
.../images/default/grid/page-last.gif | Bin
.../default/grid/page-next-disabled.gif | Bin
.../images/default/grid/page-next.gif | Bin
.../default/grid/page-prev-disabled.gif | Bin
.../images/default/grid/page-prev.gif | Bin
.../images/default/grid/pick-button.gif | Bin
.../resources/images/default/grid/refresh.gif | Bin
.../images/default/grid/row-check-sprite.gif | Bin
.../images/default/grid/row-expand-sprite.gif | Bin
.../images/default/grid/row-over.gif | Bin
.../resources/images/default/grid/row-sel.gif | Bin
.../images/default/grid/sort_asc.gif | Bin
.../images/default/grid/sort_desc.gif | Bin
.../resources/images/default/grid/wait.gif | Bin
.../images/default/layout/collapse.gif | Bin
.../images/default/layout/expand.gif | Bin
.../images/default/layout/gradient-bg.gif | Bin
.../images/default/layout/ns-collapse.gif | Bin
.../images/default/layout/ns-expand.gif | Bin
.../images/default/layout/panel-close.gif | Bin
.../images/default/layout/panel-title-bg.gif | Bin
.../default/layout/panel-title-light-bg.gif | Bin
.../resources/images/default/layout/stick.gif | Bin
.../resources/images/default/layout/stuck.gif | Bin
.../images/default/layout/tab-close-on.gif | Bin
.../images/default/layout/tab-close.gif | Bin
.../resources/images/default/menu/checked.gif | Bin
.../images/default/menu/group-checked.gif | Bin
.../images/default/menu/menu-parent.gif | Bin
.../resources/images/default/menu/menu.gif | Bin
.../images/default/menu/unchecked.gif | Bin
.../images/default/panel/tool-sprites.gif | Bin
.../ext/resources/images/default/qtip/bg.gif | Bin
.../resources/images/default/qtip/close.gif | Bin
.../images/default/qtip/tip-sprite.gif | Bin
.../ext/resources/images/default/s.gif | Bin
.../ext/resources/images/default/shadow-c.png | Bin
.../resources/images/default/shadow-lr.png | Bin
.../ext/resources/images/default/shadow.png | Bin
.../images/default/shared/calendar.gif | Bin
.../images/default/shared/glass-bg.gif | Bin
.../images/default/shared/left-btn.gif | Bin
.../images/default/shared/right-btn.gif | Bin
.../images/default/shared/warning.gif | Bin
.../images/default/sizer/e-handle-dark.gif | Bin
.../images/default/sizer/e-handle.gif | Bin
.../images/default/sizer/ne-handle-dark.gif | Bin
.../images/default/sizer/ne-handle.gif | Bin
.../images/default/sizer/nw-handle-dark.gif | Bin
.../images/default/sizer/nw-handle.gif | Bin
.../images/default/sizer/s-handle-dark.gif | Bin
.../images/default/sizer/s-handle.gif | Bin
.../images/default/sizer/se-handle-dark.gif | Bin
.../images/default/sizer/se-handle.gif | Bin
.../resources/images/default/sizer/square.gif | Bin
.../images/default/sizer/sw-handle-dark.gif | Bin
.../images/default/sizer/sw-handle.gif | Bin
.../default/tabs/tab-btm-inactive-left-bg.gif | Bin
.../tabs/tab-btm-inactive-right-bg.gif | Bin
.../images/default/tabs/tab-btm-left-bg.gif | Bin
.../images/default/tabs/tab-btm-right-bg.gif | Bin
.../images/default/tabs/tab-sprite.gif | Bin
.../default/toolbar/btn-arrow-light.gif | Bin
.../images/default/toolbar/btn-arrow.gif | Bin
.../images/default/toolbar/btn-over-bg.gif | Bin
.../images/default/toolbar/gray-bg.gif | Bin
.../images/default/toolbar/tb-bg.gif | Bin
.../images/default/toolbar/tb-btn-sprite.gif | Bin
.../images/default/tree/drop-add.gif | Bin
.../images/default/tree/drop-between.gif | Bin
.../resources/images/default/tree/drop-no.gif | Bin
.../images/default/tree/drop-over.gif | Bin
.../images/default/tree/drop-under.gif | Bin
.../images/default/tree/drop-yes.gif | Bin
.../default/tree/elbow-end-minus-nl.gif | Bin
.../images/default/tree/elbow-end-minus.gif | Bin
.../images/default/tree/elbow-end-plus-nl.gif | Bin
.../images/default/tree/elbow-end-plus.gif | Bin
.../images/default/tree/elbow-end.gif | Bin
.../images/default/tree/elbow-line.gif | Bin
.../images/default/tree/elbow-minus-nl.gif | Bin
.../images/default/tree/elbow-minus.gif | Bin
.../images/default/tree/elbow-plus-nl.gif | Bin
.../images/default/tree/elbow-plus.gif | Bin
.../resources/images/default/tree/elbow.gif | Bin
.../images/default/tree/folder-open.gif | Bin
.../resources/images/default/tree/folder.gif | Bin
.../resources/images/default/tree/leaf.gif | Bin
.../resources/images/default/tree/loading.gif | Bin
.../ext/resources/images/default/tree/s.gif | Bin
.../src/main/java/META-INF/faces-config.xml | 28 +-
.../spring-faces}/SpringFaces.js | 0
.../faces/el/Jsf11ELExpressionParser.java | 58 -
.../faces/el/Jsf11ELResolverAdapter.java | 135 --
.../faces/el/Jsf12ELExpressionParser.java | 34 -
.../faces/ui/ExtJsRenderer.java | 26 +-
.../faces/ui/ExtValidateAllRenderer.java | 6 +-
.../faces/ui/resource/FlowResourceHelper.java | 104 +
.../ResolveAndRenderResourceAction.java | 85 +
.../ui/resource/ResourcesFlowBuilder.java | 16 +
.../faces/webflow/FlowActionListener.java | 30 +
.../faces/webflow/FlowExecutionHolder.java | 154 --
.../webflow/FlowExecutionHolderUtils.java | 115 --
.../webflow/FlowExecutionKeyStateHolder.java | 176 --
.../webflow/FlowExecutionViewHandler.java | 62 +
.../faces/webflow/FlowFacesContext.java | 269 +++
.../webflow/FlowFacesContextFactory.java | 21 +
.../faces/webflow/FlowFacesUtils.java | 166 --
.../faces/webflow/FlowLifecycle.java | 69 +
.../faces/webflow/FlowLifecycleFactory.java | 31 +
.../faces/webflow/FlowNavigationHandler.java | 245 ---
...lowNavigationHandlerArgumentExtractor.java | 106 -
.../faces/webflow/FlowPhaseListener.java | 567 ------
.../faces/webflow/FlowRenderKitFactory.java | 34 +
.../faces/webflow/FlowRenderKitWrapper.java | 42 +
.../webflow/FlowResponseStateManager.java | 67 +
.../webflow/FlowSystemCleanupFilter.java | 79 -
.../faces/webflow/JsfExternalContext.java | 195 --
.../faces/webflow/JsfFlowUtils.java | 48 +
.../webflow/JsfRenderFinalResponseAction.java | 32 +
.../faces/webflow/JsfView.java | 77 +
.../faces/webflow/JsfViewFactory.java | 99 +
.../faces/webflow/ViewIdMapper.java | 41 -
...AbstractFlowExecutionPropertyResolver.java | 163 --
.../el/DelegatingFlowVariableResolver.java | 88 -
.../el/FlowExecutionPropertyResolver.java | 132 --
.../el/FlowExecutionVariableResolver.java | 71 -
.../webflow/el/FlowPropertyResolver.java | 92 -
.../webflow/el/FlowVariableResolver.java | 76 -
.../builder/xml/JsfViewFactoryCreator.java | 32 +
.../ui/resource/FlowResourceHelperTests.java | 92 +
.../faces/ui/resource/RequestInfoMatcher.java | 23 +
.../ResolveAndRenderResourceActionTests.java | 61 +
.../webflow/FlowActionListenerTests.java | 73 +
.../faces/webflow/FlowFacesContextTests.java | 158 ++
...vigationHandlerArgumentExtractorTests.java | 60 -
.../webflow/FlowPropertyResolverTests.java | 135 --
.../webflow/FlowSystemCleanupFilterTests.java | 102 -
.../webflow/FlowVariableResolverTests.java | 95 -
.../webflow/JSF11ManagedBeanAccessTests.java | 142 --
.../webflow/JSF12ManagedBeanAccessTests.java | 25 -
.../faces/webflow/JSFFlowExecutionTests.java | 302 +++
.../faces/webflow/JSFMockHelper.java | 83 +-
.../JsfRenderFinalResponseActionTests.java | 147 ++
.../faces/webflow/JsfViewFactoryTests.java | 254 +++
.../faces/webflow/JsfViewTests.java | 153 ++
.../faces/webflow/MockBaseFacesContext.java | 35 +
.../webflow/MockBaseFacesContextFactory.java | 25 +
.../faces/webflow/MockViewHandler.java | 31 +-
.../builder/xml/JsfXmlFlowBuilderTests.java | 37 +
.../webflow/engine/builder/xml/jsf-flow.xml | 13 +
spring-webflow-samples/birthdate/.classpath | 10 -
spring-webflow-samples/birthdate/.project | 36 -
.../.settings/org.eclipse.jdt.core.prefs | 270 ---
.../.settings/org.eclipse.jdt.ui.prefs | 58 -
...clipse.jst.common.project.facet.core.prefs | 4 -
.../org.eclipse.wst.common.component | 81 -
....eclipse.wst.common.project.facet.core.xml | 7 -
.../org.eclipse.wst.validation.prefs | 6 -
spring-webflow-samples/birthdate/.springBeans | 11 -
.../birthdate/.springWebflow | 15 -
spring-webflow-samples/birthdate/build.xml | 16 -
spring-webflow-samples/birthdate/ivy.xml | 23 -
.../birthdate/project.properties | 10 -
.../birthdate/src/etc/filter.properties | 33 -
.../src/etc/test-resources/log4j.properties | 15 -
.../webflow/samples/birthdate/BirthDate.java | 62 -
.../birthdate/BirthDateFormAction.java | 91 -
.../samples/birthdate/BirthDateValidator.java | 54 -
.../birthdate/MessageResources.properties | 11 -
.../webapp/WEB-INF/birthdate-alternate.xml | 43 -
.../src/main/webapp/WEB-INF/birthdate.xml | 53 -
.../webapp/WEB-INF/classes/log4j.properties | 9 -
.../main/webapp/WEB-INF/jsp/birthdateForm.jsp | 54 -
.../src/main/webapp/WEB-INF/jsp/cardForm.jsp | 57 -
.../src/main/webapp/WEB-INF/jsp/yourAge.jsp | 34 -
.../src/main/webapp/WEB-INF/struts-config.xml | 27 -
.../birthdate/src/main/webapp/WEB-INF/web.xml | 33 -
.../main/webapp/WEB-INF/webflow-config.xml | 23 -
.../src/main/webapp/images/spring-logo.jpg | Bin 31339 -> 0 bytes
.../src/main/webapp/images/submit.gif | Bin 1817 -> 0 bytes
.../src/main/webapp/images/webflow-logo.jpg | Bin 2383 -> 0 bytes
.../birthdate/src/main/webapp/index.jsp | 36 -
.../birthdate/src/main/webapp/style.css | 58 -
.../birthdate/src/test/java/log4j.properties | 9 -
.../birthdate/BirthdateValidatorTests.java | 37 -
spring-webflow-samples/booking-jsf/ivy.xml | 1 +
.../booking/flow/booking/BookingActions.java | 15 +-
.../WEB-INF/config/web-application-config.xml | 51 +-
.../src/main/webapp/WEB-INF/web.xml | 53 +-
.../src/main/webapp/flow/booking/booking.xml | 6 +-
.../src/main/webapp/flow/main/main.xml | 6 +-
.../booking-jsf/src/main/webapp/index.html | 2 +-
spring-webflow-samples/fileupload/.classpath | 9 -
spring-webflow-samples/fileupload/.project | 36 -
.../.settings/org.eclipse.jdt.core.prefs | 270 ---
.../.settings/org.eclipse.jdt.ui.prefs | 58 -
...clipse.jst.common.project.facet.core.prefs | 3 -
.../org.eclipse.wst.common.component | 57 -
....eclipse.wst.common.project.facet.core.xml | 7 -
.../org.eclipse.wst.validation.prefs | 6 -
.../fileupload/.springBeans | 8 -
.../fileupload/.springWebflow | 10 -
spring-webflow-samples/fileupload/build.xml | 16 -
spring-webflow-samples/fileupload/ivy.xml | 22 -
.../fileupload/project.properties | 10 -
.../fileupload/src/etc/filter.properties | 33 -
.../src/etc/test-resources/log4j.properties | 15 -
.../samples/fileupload/FileUploadAction.java | 35 -
.../webapp/WEB-INF/classes/log4j.properties | 9 -
.../webapp/WEB-INF/fileupload-servlet.xml | 46 -
.../src/main/webapp/WEB-INF/fileupload.xml | 21 -
.../src/main/webapp/WEB-INF/jsp/fileForm.jsp | 58 -
.../src/main/webapp/WEB-INF/web.xml | 22 -
.../src/main/webapp/images/spring-logo.jpg | Bin 31339 -> 0 bytes
.../src/main/webapp/images/webflow-logo.jpg | Bin 2383 -> 0 bytes
.../fileupload/src/main/webapp/index.jsp | 33 -
.../fileupload/src/main/webapp/style.css | 58 -
.../flowlauncher/.classpath | 9 -
spring-webflow-samples/flowlauncher/.project | 36 -
.../.settings/org.eclipse.jdt.core.prefs | 270 ---
.../.settings/org.eclipse.jdt.ui.prefs | 58 -
...clipse.jst.common.project.facet.core.prefs | 4 -
.../org.eclipse.wst.common.component | 51 -
....eclipse.wst.common.project.facet.core.xml | 7 -
.../org.eclipse.wst.validation.prefs | 6 -
.../flowlauncher/.springBeans | 8 -
.../flowlauncher/.springWebflow | 13 -
spring-webflow-samples/flowlauncher/build.xml | 15 -
spring-webflow-samples/flowlauncher/ivy.xml | 20 -
.../flowlauncher/project.properties | 10 -
.../flowlauncher/src/etc/filter.properties | 33 -
.../src/etc/test-resources/log4j.properties | 15 -
.../webapp/WEB-INF/classes/log4j.properties | 9 -
.../webapp/WEB-INF/flowlauncher-servlet.xml | 36 -
.../src/main/webapp/WEB-INF/jsp/aPage.jsp | 127 --
.../src/main/webapp/WEB-INF/jsp/bPage.jsp | 60 -
.../src/main/webapp/WEB-INF/sampleA.xml | 29 -
.../src/main/webapp/WEB-INF/sampleB.xml | 19 -
.../src/main/webapp/WEB-INF/web.xml | 22 -
.../src/main/webapp/images/spring-logo.jpg | Bin 31339 -> 0 bytes
.../src/main/webapp/images/webflow-logo.jpg | Bin 2383 -> 0 bytes
.../flowlauncher/src/main/webapp/index.html | 72 -
.../flowlauncher/src/main/webapp/style.css | 58 -
spring-webflow-samples/itemlist/.classpath | 9 -
spring-webflow-samples/itemlist/.project | 36 -
.../.settings/org.eclipse.jdt.core.prefs | 270 ---
.../.settings/org.eclipse.jdt.ui.prefs | 58 -
...clipse.jst.common.project.facet.core.prefs | 4 -
.../org.eclipse.wst.common.component | 51 -
....eclipse.wst.common.project.facet.core.xml | 7 -
.../org.eclipse.wst.validation.prefs | 6 -
spring-webflow-samples/itemlist/.springBeans | 8 -
.../itemlist/.springWebflow | 15 -
spring-webflow-samples/itemlist/build.xml | 16 -
spring-webflow-samples/itemlist/ivy.xml | 20 -
.../itemlist/project.properties | 10 -
.../itemlist/src/etc/filter.properties | 33 -
.../src/etc/test-resources/log4j.properties | 15 -
.../samples/itemlist/AddItemAction.java | 41 -
.../samples/itemlist/NewItemAction.java | 27 -
.../webapp/WEB-INF/classes/log4j.properties | 9 -
.../webapp/WEB-INF/itemlist-alternate.xml | 40 -
.../main/webapp/WEB-INF/itemlist-servlet.xml | 52 -
.../src/main/webapp/WEB-INF/itemlist.xml | 29 -
.../src/main/webapp/WEB-INF/jsp/item.jsp | 50 -
.../src/main/webapp/WEB-INF/jsp/itemlist.jsp | 51 -
.../itemlist/src/main/webapp/WEB-INF/web.xml | 22 -
.../src/main/webapp/images/spring-logo.jpg | Bin 31339 -> 0 bytes
.../src/main/webapp/images/webflow-logo.jpg | Bin 2383 -> 0 bytes
.../itemlist/src/main/webapp/index.jsp | 41 -
.../itemlist/src/main/webapp/style.css | 58 -
spring-webflow-samples/numberguess/.classpath | 10 -
spring-webflow-samples/numberguess/.project | 36 -
.../.settings/org.eclipse.jdt.core.prefs | 270 ---
.../.settings/org.eclipse.jdt.ui.prefs | 58 -
...clipse.jst.common.project.facet.core.prefs | 4 -
.../org.eclipse.wst.common.component | 51 -
....eclipse.wst.common.project.facet.core.xml | 7 -
.../org.eclipse.wst.validation.prefs | 6 -
...org.springframework.ide.eclipse.core.prefs | 5 -
.../numberguess/.springBeans | 25 -
.../numberguess/.springWebflow | 13 -
spring-webflow-samples/numberguess/build.xml | 15 -
spring-webflow-samples/numberguess/ivy.xml | 23 -
.../numberguess/project.properties | 10 -
.../numberguess/src/etc/filter.properties | 33 -
.../src/etc/test-resources/log4j.properties | 20 -
.../samples/numberguess/HigherLowerGame.java | 82 -
.../samples/numberguess/MastermindGame.java | 206 --
.../webapp/WEB-INF/classes/log4j.properties | 9 -
.../webapp/WEB-INF/dispatcher-servlet.xml | 36 -
.../src/main/webapp/WEB-INF/higherlower.xml | 26 -
.../WEB-INF/jsp/higherlower.enterGuess.jsp | 52 -
.../WEB-INF/jsp/higherlower.showAnswer.jsp | 48 -
.../WEB-INF/jsp/mastermind.enterGuess.jsp | 70 -
.../WEB-INF/jsp/mastermind.showAnswer.jsp | 48 -
.../src/main/webapp/WEB-INF/mastermind.xml | 25 -
.../src/main/webapp/WEB-INF/web.xml | 22 -
.../src/main/webapp/images/spring-logo.jpg | Bin 31339 -> 0 bytes
.../src/main/webapp/images/webflow-logo.jpg | Bin 2383 -> 0 bytes
.../numberguess/src/main/webapp/index.html | 40 -
.../numberguess/src/main/webapp/style.css | 58 -
.../numberguess/MastermindGameTests.java | 63 -
.../phonebook-portlet/.classpath | 20 -
.../phonebook-portlet/.project | 24 -
.../.settings/org.eclipse.jdt.core.prefs | 274 ---
.../.settings/org.eclipse.jdt.ui.prefs | 58 -
.../org.eclipse.wst.validation.prefs | 6 -
.../phonebook-portlet/.springBeans | 33 -
.../phonebook-portlet/.springWebflow | 17 -
.../phonebook-portlet/build.xml | 17 -
.../phonebook-portlet/ivy.xml | 23 -
.../phonebook-portlet/project.properties | 10 -
.../src/etc/filter.properties | 33 -
.../src/etc/test-resources/log4j.properties | 15 -
.../webflow/samples/phonebook/Person.java | 83 -
.../webflow/samples/phonebook/Phonebook.java | 27 -
.../samples/phonebook/SearchCriteria.java | 41 -
.../phonebook/SearchCriteriaValidator.java | 34 -
.../samples/phonebook/stub/StubPhonebook.java | 122 --
.../phonebook/stub/services-config.xml | 10 -
.../webflow/PersonDetailFlowBuilder.java | 62 -
.../PhonebookFlowRegistryFactoryBean.java | 60 -
.../webflow/SearchPersonFlowBuilder.java | 70 -
.../webflow/phonebook-webflow-config.xml | 17 -
.../webapp/WEB-INF/classes/log4j.properties | 20 -
.../main/webapp/WEB-INF/flows/detail-flow.xml | 37 -
.../WEB-INF/flows/search-flow-beans.xml | 14 -
.../main/webapp/WEB-INF/flows/search-flow.xml | 42 -
.../src/main/webapp/WEB-INF/jsp/details.jsp | 76 -
.../webapp/WEB-INF/jsp/searchCriteria.jsp | 81 -
.../main/webapp/WEB-INF/jsp/searchResults.jsp | 81 -
.../WEB-INF/phonebook-portlet-config.xml | 36 -
.../WEB-INF/phonebook-webflow-config.xml | 24 -
.../src/main/webapp/WEB-INF/portlet.xml | 46 -
.../src/main/webapp/WEB-INF/web.xml | 48 -
.../src/main/webapp/images/spring-logo.jpg | Bin 31339 -> 0 bytes
.../src/main/webapp/images/webflow-logo.jpg | Bin 2383 -> 0 bytes
.../src/main/webapp/style.css | 58 -
.../webflow/SearchFlowExecutionTests.java | 93 -
spring-webflow-samples/phonebook/.classpath | 10 -
spring-webflow-samples/phonebook/.project | 36 -
.../.settings/org.eclipse.jdt.core.prefs | 270 ---
.../.settings/org.eclipse.jdt.ui.prefs | 58 -
...clipse.jst.common.project.facet.core.prefs | 4 -
.../org.eclipse.wst.common.component | 51 -
....eclipse.wst.common.project.facet.core.xml | 7 -
.../org.eclipse.wst.validation.prefs | 6 -
...org.springframework.ide.eclipse.core.prefs | 5 -
spring-webflow-samples/phonebook/.springBeans | 41 -
.../phonebook/.springWebflow | 16 -
spring-webflow-samples/phonebook/build.xml | 17 -
spring-webflow-samples/phonebook/ivy.xml | 23 -
.../phonebook/project.properties | 10 -
.../webflow/samples/phonebook/Person.java | 83 -
.../webflow/samples/phonebook/Phonebook.java | 27 -
.../samples/phonebook/SearchCriteria.java | 41 -
.../phonebook/SearchCriteriaValidator.java | 34 -
.../samples/phonebook/stub/StubPhonebook.java | 122 --
.../phonebook/stub/services-config.xml | 10 -
.../webflow/PersonDetailFlowBuilder.java | 62 -
.../PhonebookFlowRegistryFactoryBean.java | 60 -
.../webflow/SearchPersonFlowBuilder.java | 70 -
.../webflow/phonebook-webflow-config.xml | 17 -
.../webapp/WEB-INF/classes/log4j.properties | 9 -
.../main/webapp/WEB-INF/flows/detail-flow.xml | 37 -
.../WEB-INF/flows/search-flow-beans.xml | 14 -
.../main/webapp/WEB-INF/flows/search-flow.xml | 42 -
.../src/main/webapp/WEB-INF/jsp/details.jsp | 73 -
.../webapp/WEB-INF/jsp/searchCriteria.jsp | 65 -
.../main/webapp/WEB-INF/jsp/searchResults.jsp | 73 -
.../WEB-INF/phonebook-servlet-config.xml | 24 -
.../WEB-INF/phonebook-webflow-config.xml | 19 -
.../phonebook/src/main/webapp/WEB-INF/web.xml | 43 -
.../src/main/webapp/images/spring-logo.jpg | Bin 31339 -> 0 bytes
.../src/main/webapp/images/webflow-logo.jpg | Bin 2383 -> 0 bytes
.../phonebook/src/main/webapp/index.jsp | 21 -
.../phonebook/src/main/webapp/style.css | 58 -
.../phonebook/src/test/java/log4j.properties | 9 -
.../webflow/SearchFlowExecutionTests.java | 93 -
spring-webflow-samples/readme.txt | 11 +-
.../sellitem-jsf/.classpath | 11 -
.../sellitem-jsf/.m7project | 16 -
spring-webflow-samples/sellitem-jsf/.project | 36 -
.../.settings/org.eclipse.jdt.core.prefs | 271 ---
.../.settings/org.eclipse.jdt.ui.prefs | 59 -
.../.settings/org.eclipse.jpt.core.prefs | 5 -
...clipse.jst.common.project.facet.core.prefs | 5 -
.../org.eclipse.wst.common.component | 10 -
....eclipse.wst.common.project.facet.core.xml | 7 -
.../org.eclipse.wst.validation.prefs | 7 -
.../sellitem-jsf/.springBeans | 21 -
.../sellitem-jsf/.springWebflow | 10 -
spring-webflow-samples/sellitem-jsf/build.xml | 15 -
spring-webflow-samples/sellitem-jsf/ivy.xml | 33 -
.../sellitem-jsf/project.properties | 10 -
.../sellitem-jsf/src/etc/filter.properties | 33 -
.../src/etc/test-resources/log4j.properties | 20 -
.../sellitem/InMemoryDatabaseCreator.java | 29 -
.../samples/sellitem/JdbcSaleProcessor.java | 29 -
.../webflow/samples/sellitem/Sale.java | 130 --
.../samples/sellitem/SaleProcessor.java | 24 -
.../samples/sellitem/SellItemAction.java | 33 -
.../samples/sellitem/services-config.xml | 34 -
.../webapp/WEB-INF/classes/log4j.properties | 9 -
.../webapp/WEB-INF/flows/sellitem-flow.xml | 38 -
.../src/main/webapp/WEB-INF/web.xml | 55 -
.../main/webapp/WEB-INF/webflow-config.xml | 19 -
.../src/main/webapp/categoryForm.jsp | 61 -
.../src/main/webapp/costOverview.jsp | 77 -
.../src/main/webapp/images/spring-logo.jpg | Bin 31339 -> 0 bytes
.../src/main/webapp/images/webflow-logo.jpg | Bin 2383 -> 0 bytes
.../sellitem-jsf/src/main/webapp/index.jsp | 9 -
.../sellitem-jsf/src/main/webapp/intro.jsp | 40 -
.../src/main/webapp/priceAndItemCountForm.jsp | 62 -
.../src/main/webapp/shippingDetailsForm.jsp | 60 -
.../sellitem-jsf/src/main/webapp/style.css | 58 -
.../src/test/java/log4j.properties | 9 -
.../SaleProcessorIntegrationTests.java | 44 -
spring-webflow-samples/sellitem/.classpath | 13 -
spring-webflow-samples/sellitem/.project | 36 -
.../.settings/org.eclipse.jdt.core.prefs | 271 ---
.../.settings/org.eclipse.jdt.ui.prefs | 59 -
...clipse.jst.common.project.facet.core.prefs | 5 -
.../org.eclipse.wst.common.component | 10 -
....eclipse.wst.common.project.facet.core.xml | 7 -
.../org.eclipse.wst.validation.prefs | 7 -
...org.springframework.ide.eclipse.core.prefs | 36 -
spring-webflow-samples/sellitem/.springBeans | 33 -
.../sellitem/.springWebflow | 16 -
spring-webflow-samples/sellitem/build.xml | 14 -
spring-webflow-samples/sellitem/ivy.xml | 34 -
.../sellitem/project.properties | 10 -
.../sellitem/src/etc/filter.properties | 33 -
.../src/etc/test-resources/log4j.properties | 20 -
.../sellitem/InMemoryDatabaseCreator.java | 29 -
.../samples/sellitem/JdbcSaleProcessor.java | 29 -
.../webflow/samples/sellitem/Sale.java | 142 --
.../samples/sellitem/SaleProcessor.java | 24 -
.../samples/sellitem/SaleValidator.java | 40 -
.../SellItemFlowExecutionListener.java | 43 -
.../SellItemPropertyEditorRegistrar.java | 30 -
.../samples/sellitem/services-config.xml | 29 -
.../webapp/WEB-INF/classes/log4j.properties | 9 -
.../conversation-scope/sellitem-beans.xml | 20 -
.../sellitem-conversation-scope-flow.xml | 53 -
.../shipping-conversation-scope-flow.xml | 19 -
.../webapp/WEB-INF/flows/sellitem-beans.xml | 18 -
.../webapp/WEB-INF/flows/sellitem-flow.xml | 58 -
.../webapp/WEB-INF/flows/shipping-flow.xml | 23 -
.../flows/simple/sellitem-simple-flow.xml | 55 -
.../main/webapp/WEB-INF/jsp/categoryForm.jsp | 70 -
.../main/webapp/WEB-INF/jsp/costOverview.jsp | 92 -
.../WEB-INF/jsp/priceAndItemCountForm.jsp | 48 -
.../WEB-INF/jsp/shippingDetailsForm.jsp | 73 -
.../WEB-INF/sellitem-servlet-config.xml | 22 -
.../WEB-INF/sellitem-webflow-config.xml | 27 -
.../sellitem/src/main/webapp/WEB-INF/web.xml | 40 -
.../src/main/webapp/images/spring-logo.jpg | Bin 31339 -> 0 bytes
.../src/main/webapp/images/webflow-logo.jpg | Bin 2383 -> 0 bytes
.../sellitem/src/main/webapp/index.jsp | 41 -
.../sellitem/src/main/webapp/style.css | 58 -
.../sellitem/src/test/java/log4j.properties | 9 -
.../SaleProcessorIntegrationTests.java | 44 -
.../sellitem/SellItemFlowExecutionTests.java | 94 -
.../shippingrate/.classpath | 9 -
spring-webflow-samples/shippingrate/.project | 36 -
.../.settings/org.eclipse.jdt.core.prefs | 270 ---
.../.settings/org.eclipse.jdt.ui.prefs | 58 -
...clipse.jst.common.project.facet.core.prefs | 4 -
.../org.eclipse.wst.common.component | 51 -
....eclipse.wst.common.project.facet.core.xml | 7 -
.../org.eclipse.wst.validation.prefs | 6 -
.../shippingrate/.springBeans | 26 -
spring-webflow-samples/shippingrate/build.xml | 14 -
spring-webflow-samples/shippingrate/ivy.xml | 20 -
.../shippingrate/project.properties | 10 -
.../shippingrate/src/etc/filter.properties | 33 -
.../src/etc/test-resources/log4j.properties | 20 -
.../samples/shippingrate/domain/Rate.java | 47 -
.../shippingrate/domain/RateCriteria.java | 91 -
.../domain/RateCriteriaValidator.java | 62 -
.../shippingrate/domain/RateService.java | 27 -
.../shippingrate/domain/StubRateService.java | 42 -
.../samples/shippingrate/domain/services.xml | 8 -
.../classes/MessageResources.properties | 1 -
.../webapp/WEB-INF/classes/log4j.properties | 9 -
.../webapp/WEB-INF/flows/getRate-flow.xml | 70 -
.../webapp/WEB-INF/jsp/selectCustomer.jsp | 41 -
.../WEB-INF/jsp/selectPackageDetails.jsp | 46 -
.../webapp/WEB-INF/jsp/selectReceiver.jsp | 43 -
.../main/webapp/WEB-INF/jsp/selectSender.jsp | 43 -
.../src/main/webapp/WEB-INF/jsp/showRate.jsp | 13 -
.../webapp/WEB-INF/shippingrate-servlet.xml | 43 -
.../src/main/webapp/WEB-INF/web.xml | 33 -
.../src/main/webapp/images/spring-logo.jpg | Bin 31339 -> 0 bytes
.../src/main/webapp/images/webflow-logo.jpg | Bin 2383 -> 0 bytes
.../shippingrate/src/main/webapp/index.jsp | 49 -
.../shippingrate/src/main/webapp/prototype.js | 1781 -----------------
.../shippingrate/src/main/webapp/style.css | 60 -
.../shippingrate/src/main/webapp/swf_ajax.js | 64 -
spring-webflow/.classpath | 66 +-
spring-webflow/ivy.xml | 1 +
spring-webflow/readme.txt | 2 +-
.../src/main/java/META-INF/spring.schemas | 1 -
.../webflow/action/AbstractAction.java | 3 +-
.../webflow/action/EvaluateAction.java | 13 +-
.../EventFactorySupport.java | 2 +-
.../action/ExternalRedirectAction.java | 23 +
.../action/FlowDefinitionRedirectAction.java | 70 +
.../webflow/action/FormAction.java | 63 +-
.../webflow/action/FormObjectAccessor.java | 33 +-
.../action/ResultObjectBasedEventFactory.java | 7 +-
.../webflow/action/SetAction.java | 21 +-
.../webflow/action/SuccessEventFactory.java | 1 -
.../EnableScopesBeanDefinitionParser.java | 38 -
...ecutionAttributesBeanDefinitionParser.java | 100 -
.../webflow/config/FlowBuilderInfo.java | 59 +
.../config/FlowDefinitionResource.java | 56 +
.../config/FlowDefinitionResourceFactory.java | 79 +
.../webflow/config/FlowElementAttribute.java | 65 +
...onListenerLoaderBeanDefinitionParser.java} | 13 +-
...lowExecutionListenerLoaderFactoryBean.java | 68 +
....java => FlowExecutionRepositoryType.java} | 20 +-
... => FlowExecutorBeanDefinitionParser.java} | 103 +-
.../config/FlowExecutorFactoryBean.java | 328 ++-
...s.java => FlowExecutorSystemDefaults.java} | 15 +-
.../webflow/config/FlowLocation.java | 49 +
.../FlowRegistryBeanDefinitionParser.java | 131 ++
.../config/FlowRegistryFactoryBean.java | 239 +++
.../config/RegistryBeanDefinitionParser.java | 113 --
.../config/WebFlowConfigNamespaceHandler.java | 41 +-
.../config/scope/AbstractWebFlowScope.java | 112 --
.../config/scope/ConversationScope.java | 33 -
.../webflow/config/scope/FlashScope.java | 33 -
.../webflow/config/scope/FlowScope.java | 33 -
.../webflow/config/scope/ScopeRegistrar.java | 44 -
.../webflow/config/scope/package.html | 6 -
.../config/spring-webflow-config-1.0.xsd | 345 ----
.../config/spring-webflow-config-2.0.xsd | 361 ++--
.../context/AbstractFlowRequestInfo.java | 74 +
.../webflow/context/ExternalContext.java | 133 +-
.../context/FlowDefinitionRequestInfo.java | 25 +
.../context/FlowExecutionRequestInfo.java | 51 +
.../webflow/context/RequestPath.java | 94 +
.../portlet/PortletExternalContext.java | 101 +-
.../servlet/ServletExternalContext.java | 340 +++-
.../DefaultExpressionParserFactory.java | 24 +-
.../WebFlowOgnlExpressionParser.java | 2 +-
.../el/RequestContextELResolver.java | 65 +
.../el/ScopeSearchingELResolver.java | 150 ++
.../el/WebFlowELExpressionParser.java | 73 +
.../ExternalizedFlowDefinitionRegistrar.java | 180 --
.../FlowDefinitionConstructionException.java | 18 +-
.../registry/FlowDefinitionLocator.java | 12 +-
.../registry/FlowDefinitionRegistrar.java | 47 -
.../registry/FlowDefinitionRegistry.java | 21 +-
.../registry/FlowDefinitionRegistryImpl.java | 165 +-
.../registry/FlowDefinitionRegistryMBean.java | 86 -
.../registry/FlowDefinitionResource.java | 162 --
.../definition/registry/FlowPathUtils.java | 55 -
.../NoSuchFlowDefinitionException.java | 17 +-
.../registry/StaticFlowDefinitionHolder.java | 97 +-
.../webflow/engine/ActionExecutor.java | 12 -
.../webflow/engine/ActionState.java | 13 +-
.../webflow/engine/DecisionState.java | 9 +-
.../webflow/engine/EndState.java | 102 +-
.../springframework/webflow/engine/Flow.java | 229 ++-
.../engine/FlowExecutionExceptionHandler.java | 11 +-
.../FlowExecutionExceptionHandlerSet.java | 23 +-
.../engine/NoMatchingTransitionException.java | 2 +-
.../webflow/engine/NullViewSelector.java | 66 -
.../webflow/engine/RequestControlContext.java | 57 +-
.../springframework/webflow/engine/State.java | 37 +-
.../webflow/engine/SubflowState.java | 98 +-
.../webflow/engine/Transition.java | 25 +-
.../webflow/engine/TransitionableState.java | 12 +-
.../webflow/engine/ViewSelector.java | 69 -
.../webflow/engine/ViewState.java | 92 +-
.../engine/builder/AbstractFlowBuilder.java | 881 --------
.../engine/builder/BaseFlowBuilder.java | 148 --
.../builder/BaseFlowServiceLocator.java | 246 ---
.../builder/DefaultFlowServiceLocator.java | 95 -
.../engine/builder/FlowArtifactFactory.java | 51 +-
.../builder/FlowArtifactLookupException.java | 105 -
.../webflow/engine/builder/FlowAssembler.java | 69 +-
.../webflow/engine/builder/FlowBuilder.java | 47 +-
.../engine/builder/FlowBuilderContext.java | 73 +
.../builder/FlowRegistryFactoryBean.java | 112 --
.../builder/FlowRegistryFactoryBeanTests.java | 58 -
.../engine/builder/FlowServiceLocator.java | 152 --
.../RefreshableFlowDefinitionHolder.java | 93 +-
.../engine/builder/TextToViewSelector.java | 138 --
.../engine/builder/ViewFactoryCreator.java | 13 +
.../builder/support/AbstractFlowBuilder.java | 97 +
.../support/ActionInvokingViewFactory.java | 50 +
.../support/FlowBuilderContextImpl.java | 82 +
.../builder/support/FlowBuilderServices.java | 121 ++
.../TextToTargetStateResolver.java | 22 +-
.../TextToTransitionCriteria.java | 26 +-
.../builder/xml/DefaultDocumentLoader.java | 1 -
.../builder/xml/LocalFlowBuilderContext.java | 100 +
.../builder/xml/LocalFlowServiceLocator.java | 224 ---
.../builder/xml/LocalFlowServiceRegistry.java | 68 -
.../builder/xml/WebFlowEntityResolver.java | 8 +-
.../engine/builder/xml/XmlFlowBuilder.java | 578 +++---
.../engine/builder/xml/XmlFlowRegistrar.java | 101 -
...webflow-1.0.xsd => spring-webflow-2.0.xsd} | 38 +-
.../engine/impl/FlowExecutionImpl.java | 641 +++---
.../engine/impl/FlowExecutionImplFactory.java | 114 +-
.../FlowExecutionImplServicesConfigurer.java | 80 +
.../impl/FlowExecutionImplStateRestorer.java | 80 +-
.../engine/impl/FlowExecutionListeners.java | 21 +-
.../webflow/engine/impl/FlowSessionImpl.java | 32 +-
.../impl/RequestControlContextImpl.java | 149 +-
.../support/ApplicationViewSelector.java | 167 --
.../engine/support/AttributeExpression.java | 111 -
.../BooleanExpressionTransitionCriteria.java | 29 +-
.../ConfigurableFlowAttributeMapper.java | 213 --
.../support/DefaultTargetStateResolver.java | 2 +-
.../support/ExternalRedirectSelector.java | 81 -
.../FlowDefinitionRedirectSelector.java | 95 -
...xecutingFlowExecutionExceptionHandler.java | 7 +-
.../webflow/execution/Action.java | 3 +-
.../webflow/execution/FlowExecution.java | 78 +-
.../execution/FlowExecutionContext.java | 19 +-
.../execution/FlowExecutionContextHolder.java | 58 -
.../execution/FlowExecutionException.java | 10 +-
.../execution/FlowExecutionFactory.java | 7 +-
.../{repository => }/FlowExecutionKey.java | 13 +-
.../execution/FlowExecutionKeyFactory.java | 70 +-
.../execution/FlowExecutionListener.java | 23 +-
.../FlowExecutionListenerAdapter.java | 8 +-
.../webflow/execution/FlowSession.java | 25 -
.../webflow/execution/FlowSessionStatus.java | 68 -
.../webflow/execution/RequestContext.java | 35 +-
.../execution/RequestContextHolder.java | 53 +
.../webflow/execution/View.java | 37 +-
.../webflow/execution/ViewFactory.java} | 30 +-
.../webflow/execution/ViewSelection.java | 56 -
...onditionalFlowExecutionListenerLoader.java | 126 +-
.../FlowExecutionListenerCriteria.java | 1 -
.../FlowExecutionListenerCriteriaFactory.java | 30 +-
.../StaticFlowExecutionListenerLoader.java | 14 +-
.../FlowExecutionAccessException.java | 2 +
.../repository/FlowExecutionRepository.java | 64 +-
...wExecutionRestorationFailureException.java | 2 +
.../NoSuchFlowExecutionException.java | 2 +
...ionDeniedFlowExecutionAccessException.java | 2 +
...ctFlowExecutionContinuationRepository.java | 66 +
.../FlowExecutionContinuationFactory.java | 6 +-
.../SerializedFlowExecutionContinuation.java | 19 +-
...lizedFlowExecutionContinuationFactory.java | 4 +-
.../repository/continuation/package.html | 2 +-
.../ClientFlowExecutionRepository.java} | 93 +-
.../DefaultFlowExecutionRepository.java} | 104 +-
.../FlowExecutionContinuationGroup.java | 8 +-
.../execution/repository/impl/package.html | 7 +
...ctConversationFlowExecutionRepository.java | 269 ---
.../AbstractFlowExecutionRepository.java | 226 ++-
.../support/CompositeFlowExecutionKey.java | 2 +-
.../support/FlowExecutionStateRestorer.java | 11 +-
.../InvalidContinuationIdException.java | 51 -
.../SimpleFlowExecutionRepository.java | 213 --
.../execution/support/ApplicationView.java | 91 -
.../execution/support/ExternalRedirect.java | 65 -
.../support/FlowDefinitionRedirect.java | 89 -
.../support/FlowExecutionRedirect.java | 56 -
.../webflow/execution/support/package.html | 7 -
.../webflow/executor/FlowExecutor.java | 37 +-
.../webflow/executor/FlowExecutorImpl.java | 235 +--
.../executor/RequestParameterInputMapper.java | 41 -
.../webflow/executor/ResponseInstruction.java | 196 --
.../webflow/executor/mvc/FlowController.java | 221 --
.../executor/mvc/PortletFlowController.java | 311 ---
.../webflow/executor/mvc/package.html | 5 -
.../webflow/executor/struts/FlowAction.java | 295 ---
.../struts/StrutsExternalContext.java | 72 -
.../webflow/executor/struts/package.html | 5 -
.../support/FlowExecutorArgumentExposer.java | 77 -
...owExecutorArgumentExtractionException.java | 45 -
.../FlowExecutorArgumentExtractor.java | 80 -
.../support/FlowExecutorArgumentHandler.java | 343 ----
.../FlowIdMappingArgumentHandlerWrapper.java | 199 --
.../executor/support/FlowRequestHandler.java | 132 --
...tParameterFlowExecutorArgumentHandler.java | 242 ---
...equestPathFlowExecutorArgumentHandler.java | 158 --
.../support/ResponseInstructionHandler.java | 153 --
.../webflow/executor/support/package.html | 5 -
.../HibernateFlowExecutionListener.java | 12 +-
.../persistence/JpaFlowExecutionListener.java | 12 +-
.../webflow/servlet/SpringWebServlet.java | 74 +
.../test/FlowBuilderSystemDefaults.java | 42 +
.../webflow/test/MockExternalContext.java | 155 +-
...cator.java => MockFlowBuilderContext.java} | 21 +-
.../test/MockFlowExecutionContext.java | 34 +-
.../webflow/test/MockFlowExecutionKey.java | 60 +
.../test/MockFlowExecutionKeyFactory.java | 17 +
.../webflow/test/MockFlowSession.java | 27 +-
.../webflow/test/MockRequestContext.java | 70 +-
.../test/MockRequestControlContext.java | 70 +-
...bstractExternalizedFlowExecutionTests.java | 133 +-
.../execution/AbstractFlowExecutionTests.java | 292 +--
.../AbstractXmlFlowExecutionTests.java | 16 +-
.../action/AttributeMapperActionTests.java | 2 +-
.../webflow/action/EvaluateActionTests.java | 15 +-
.../EventFactorySupportTests.java | 3 +-
.../action/ExternalRedirectActionTests.java | 26 +
.../FlowDefinitionRedirectActionTests.java | 49 +
.../action/FormActionBindingTests.java | 4 +-
.../webflow/action/FormActionTests.java | 9 +-
.../action/LocalBeanInvokingActionTests.java | 86 -
.../webflow/action/MultiActionTests.java | 3 +-
.../action/ResultObjectEventFactoryTests.java | 16 +-
.../webflow/action/SetActionTests.java | 70 -
.../webflow/config/BeanConfigTests.java | 47 -
...FlowExecutorBeanDefinitionParserTests.java | 39 +
.../config/FlowExecutorFactoryBeanTests.java | 201 +-
...FlowRegistryBeanDefinitionParserTests.java | 59 +
.../config/FlowRegistryFactoryBeanTests.java | 71 +
.../webflow/config/FooFlowBuilder.java | 13 +
.../TestFlowExecutionListenerCriteria.java | 32 -
.../WebFlowConfigNamespaceHandlerTests.java | 246 ---
.../config/flow-executor-factory-bean.xml | 33 -
.../webflow/config/flow-executor.xml | 31 +
.../webflow/config/flow-registry.xml | 31 +
.../springframework/webflow/config/flow.xml | 10 +
.../springframework/webflow/config/flow1.xml | 12 -
.../springframework/webflow/config/flow2.xml | 12 -
.../webflow/config/namespace-error-1.xml | 19 -
.../webflow/config/namespace-error-2.xml | 23 -
.../webflow/config/namespace-error-3.xml | 19 -
.../config/scope/ConversationScopeTests.java | 106 -
.../webflow/config/scope/FlashScopeTests.java | 105 -
.../webflow/config/scope/FlowScopeTests.java | 105 -
.../webflow/config/webflow-config-classic.xml | 120 --
.../config/webflow-config-namespace-bad.xml | 15 -
.../config/webflow-config-namespace.xml | 85 -
.../webflow/context/RequestPathTests.java | 83 +
.../portlet/PortletExternalContextTests.java | 58 -
.../servlet/ServletExternalContextTests.java | 165 +-
.../impl/ConversationSizeTests.java | 132 --
.../WebFlowOgnlExpressionParserTests.java | 68 -
.../DefaultExpressionParserFactoryTests.java | 3 +-
.../FlowDefinitionRegistryImplTests.java | 112 +-
.../registry/FlowPathUtilsTests.java | 132 --
.../webflow/engine/ActionExecutorTests.java | 62 +-
.../webflow/engine/ActionStateTests.java | 94 +-
.../webflow/engine/AnnotedActionTests.java | 4 +-
.../webflow/engine/DecisionStateTests.java | 2 +-
.../webflow/engine/EndStateTests.java | 113 +-
.../engine/FlowExecutionHandlerSetTests.java | 69 +
.../webflow/engine/FlowTests.java | 60 +-
.../webflow/engine/SimpleFlow.java | 39 -
.../engine/StateExceptionHandlerTests.java | 95 -
.../webflow/engine/StateTests.java | 30 +-
.../webflow/engine/StubViewFactory.java | 48 +
.../webflow/engine/SubflowStateTests.java | 146 +-
.../webflow/engine/TransitionTests.java | 108 +-
.../webflow/engine/ViewStateTests.java | 104 +-
...tractFlowBuilderParameterizationTests.java | 114 --
.../builder/AbstractFlowBuilderTests.java | 235 ---
.../builder/BaseFlowServiceLocatorTests.java | 57 -
.../engine/builder/FlowAssemblerTests.java | 50 +
.../MyCustomStateExceptionHandler.java | 33 -
.../builder/ParameterizationTestAction.java | 51 -
.../RefreshableFlowDefinitionHolderTests.java | 171 +-
.../engine/builder/SimpleFlowBuilder.java | 22 -
.../builder/TextToViewSelectorTests.java | 133 --
.../webflow/engine/builder/file.txt | 1 +
.../TextToTransitionCriteriaTests.java | 22 +-
.../xml/DefaultDocumentLoaderTests.java | 32 -
.../EvaluateActionXmlFlowBuilderTests.java | 51 -
.../builder/xml/MessageSourceAwareAction.java | 47 -
.../builder/xml/MessageSourceAwareTests.java | 61 -
.../xml/NamedActionXmlFlowBuilderTests.java | 98 -
.../xml/NamespaceXmlFlowBuilderTests.java | 38 -
.../xml/PojoActionXmlFlowBuilderTests.java | 97 -
.../builder/xml/TestFlowServiceLocator.java | 93 -
.../webflow/engine/builder/xml/TestPojo.java | 51 -
.../xml/XmlFlowBuilderCustomTypeTests.java | 110 -
.../xml/XmlFlowBuilderNestingTests.java | 187 --
.../builder/xml/XmlFlowBuilderTests.java | 214 +-
.../builder/xml/XmlFlowRegistrarTests.java | 75 -
.../engine/builder/xml/evaluateActionFlow.xml | 29 -
.../engine/builder/xml/flow-endstate.xml | 10 +
.../engine/builder/xml/flow-incomplete.xml | 6 +
.../webflow/engine/builder/xml/flow.xml | 7 -
.../builder/xml/messageSourceAwareContext.xml | 6 -
.../builder/xml/messageSourceAwareFlow.xml | 16 -
.../engine/builder/xml/namedActionFlow.xml | 19 -
.../builder/xml/namedActionFlowContext.xml | 12 -
.../webflow/engine/builder/xml/nsFlow.xml | 9 -
.../engine/builder/xml/parameterizedFlow.xml | 13 -
.../engine/builder/xml/pojoActionFlow.xml | 81 -
.../webflow/engine/builder/xml/testFlow1.xml | 155 --
.../engine/builder/xml/testFlow1Context.xml | 6 -
.../webflow/engine/builder/xml/testFlow2.xml | 40 -
.../engine/builder/xml/testFlow2Context.xml | 8 -
.../builder/xml/testFlow2ParentContext.xml | 6 -
.../builder/xml/testFlow2SubFlow1Context.xml | 6 -
.../webflow/engine/builder/xml/testFlow3.xml | 38 -
.../engine/builder/xml/testFlow3Context.xml | 8 -
.../engine/impl/ExceptionThrowingAction.java | 34 -
.../impl/FlowExecutionImplFactoryTests.java | 59 +-
.../FlowExecutionImplStateRestorerTests.java | 131 --
.../engine/impl/FlowExecutionImplTests.java | 554 +++--
.../FlowExecutionStateRestorerImplTests.java | 96 +
.../webflow/engine/impl/FooException.java | 20 -
.../webflow/engine/impl/FooFlowAction.java | 24 -
.../engine/impl/InfiniteLoopTestAction.java | 31 -
.../engine/impl/MiscFlowExecutionTests.java | 94 -
.../impl/NestedSubflowRestorationTests.java | 65 -
.../engine/impl/exceptionHandlingFlow.xml | 25 -
.../webflow/engine/impl/external-subflow.xml | 13 -
.../webflow/engine/impl/fooFlow.xml | 21 -
.../globalTransitionExceptionHandler-flow.xml | 23 -
.../webflow/engine/impl/infinite-loop.xml | 20 -
.../webflow/engine/impl/nestedSubflow.xml | 54 -
.../webflow/engine/impl/required-mapping.xml | 12 -
.../webflow/engine/impl/runtime-exception.xml | 15 -
.../webflow/engine/impl/testFlow.xml | 27 -
.../support/ApplicationViewSelectorTests.java | 93 -
.../support/AttributeExpressionTests.java | 92 -
...leanExpressionTransitionCriteriaTests.java | 68 -
.../ConfigurableFlowAttributeMapperTests.java | 219 --
.../DefaultTargetStateResolverTests.java | 89 -
.../FlowDefinitionRedirectSelectorTests.java | 55 -
.../support/NullViewSelectionTests.java | 35 -
.../support/TransitionCriteriaChainTests.java | 2 +-
...ingFlowExecutionExceptionHandlerTests.java | 58 +-
.../execution/MockFlowExecutionListener.java | 168 +-
...ionalFlowExecutionListenerLoaderTests.java | 90 +-
...tinuationFlowExecutionRepositoryTests.java | 124 --
...tinuationFlowExecutionRepositoryTests.java | 123 --
.../FlowExecutionContinuationGroupTests.java | 208 --
...FlowExecutionContinuationFactoryTests.java | 76 +
...ializedFlowExecutionContinuationTests.java | 55 -
.../ClientFlowExecutionRepositoryTests.java | 14 +
.../DefaultFlowExecutionRepositoryTests.java | 224 +++
.../CompositeFlowExecutionKeyTests.java | 7 +-
.../SimpleFlowExecutionRepositoryTests.java | 135 --
.../support/ApplicationViewTests.java | 56 -
.../support/ExternalRedirectTests.java | 34 -
.../support/FlowDefinitionRedirectTests.java | 58 -
...tinuationFlowExecutorIntegrationTests.java | 23 -
...tinuationFlowExecutorIntegrationTests.java | 23 -
.../executor/FlowExecutorImplTests.java | 97 +
.../FlowExecutorIntegrationTests.java | 130 --
.../webflow/executor/context.xml | 36 -
.../springframework/webflow/executor/flow.xml | 16 -
.../executor/mvc/FlowControllerTests.java | 77 -
.../mvc/PortletFlowControllerTests.java | 82 -
.../webflow/executor/repository-client.xml | 12 -
.../executor/repository-continuation.xml | 12 -
.../webflow/executor/repository-simple.xml | 13 -
.../executor/struts/FlowActionTests.java | 85 -
...wIdMappingArgumentHandlerWrapperTests.java | 150 --
.../support/FlowRequestHandlerTests.java | 99 -
...meterFlowExecutorArgumentHandlerTests.java | 198 --
...tPathFlowExecutorArgumentHandlerTests.java | 105 -
.../HibernateFlowExecutionListenerTests.java | 29 +-
.../JpaFlowExecutionListenerTests.java | 21 +-
.../test/SearchFlowExecutionTests.java | 50 +-
.../webflow/test/search-flow.xml | 2 +-
984 files changed, 11849 insertions(+), 39596 deletions(-)
create mode 100644 spring-binding/src/main/java/org/springframework/binding/expression/ExpressionVariable.java
delete mode 100644 spring-binding/src/main/java/org/springframework/binding/expression/el/DefaultELContextFactory.java
create mode 100644 spring-binding/src/main/java/org/springframework/binding/expression/el/MapAdaptableELResolver.java
delete mode 100644 spring-binding/src/main/java/org/springframework/binding/expression/support/BeanWrapperExpression.java
delete mode 100644 spring-binding/src/main/java/org/springframework/binding/expression/support/BeanWrapperExpressionParser.java
create mode 100644 spring-binding/src/main/java/org/springframework/binding/message/DefaultMessageContextFactory.java
create mode 100644 spring-binding/src/main/java/org/springframework/binding/message/Message.java
create mode 100644 spring-binding/src/main/java/org/springframework/binding/message/MessageContext.java
create mode 100644 spring-binding/src/main/java/org/springframework/binding/message/MessageContextFactory.java
create mode 100644 spring-binding/src/main/java/org/springframework/binding/message/MessageResolver.java
create mode 100644 spring-binding/src/main/java/org/springframework/binding/message/Messages.java
create mode 100644 spring-binding/src/main/java/org/springframework/binding/message/Severity.java
create mode 100644 spring-binding/src/main/java/org/springframework/binding/message/StateManageableMessageContext.java
rename spring-binding/src/test/java/org/springframework/binding/expression/{support => ognl}/TestBean.java (94%)
delete mode 100644 spring-binding/src/test/java/org/springframework/binding/expression/support/CollectionAddingExpressionTests.java
delete mode 100644 spring-binding/src/test/java/org/springframework/binding/expression/support/SimpleExpressionTests.java
delete mode 100644 spring-binding/src/test/java/org/springframework/binding/expression/support/TestMethods.java
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/ext.js (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/css/ext-all.css (82%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/basic-dialog/btn-arrow.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/basic-dialog/btn-sprite.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/basic-dialog/close.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/basic-dialog/collapse.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/basic-dialog/e-handle.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/basic-dialog/expand.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/basic-dialog/hd-sprite.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/basic-dialog/progress.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/basic-dialog/progress2.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/basic-dialog/s-handle.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/basic-dialog/se-handle.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/box/corners-blue.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/box/corners.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/box/l-blue.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/box/l.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/box/r-blue.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/box/r.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/box/tb-blue.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/box/tb.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/dd/drop-add.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/dd/drop-no.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/dd/drop-yes.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/editor/tb-sprite.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/form/clear-trigger.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/form/clear-trigger.psd (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/form/date-trigger.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/form/date-trigger.psd (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/form/error-tip-corners.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/form/exclamation.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/form/search-trigger.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/form/search-trigger.psd (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/form/text-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/form/trigger-tpl.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/form/trigger.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/form/trigger.psd (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/gradient-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/Thumbs.db (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/arrow-left-white.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/arrow-right-white.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/col-move-bottom.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/col-move-top.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/dirty.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/done.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/drop-no.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/drop-yes.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/footer-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/grid-blue-hd.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/grid-blue-split.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/grid-hrow.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/grid-loading.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/grid-split.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/grid-vista-hd.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/grid3-hd-btn.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/grid3-hrow-over.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/grid3-hrow.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/grid3-special-col-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/hd-pop.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/hmenu-asc.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/hmenu-desc.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/hmenu-lock.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/hmenu-lock.png (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/hmenu-unlock.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/hmenu-unlock.png (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/invalid_line.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/loading.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/mso-hd.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/nowait.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/page-first-disabled.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/page-first.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/page-last-disabled.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/page-last.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/page-next-disabled.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/page-next.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/page-prev-disabled.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/page-prev.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/pick-button.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/refresh.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/row-check-sprite.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/row-expand-sprite.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/row-over.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/row-sel.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/sort_asc.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/sort_desc.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/grid/wait.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/layout/collapse.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/layout/expand.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/layout/gradient-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/layout/ns-collapse.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/layout/ns-expand.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/layout/panel-close.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/layout/panel-title-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/layout/panel-title-light-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/layout/stick.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/layout/stuck.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/layout/tab-close-on.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/layout/tab-close.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/menu/checked.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/menu/group-checked.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/menu/menu-parent.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/menu/menu.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/menu/unchecked.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/panel/tool-sprites.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/qtip/bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/qtip/close.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/qtip/tip-sprite.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/s.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/shadow-c.png (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/shadow-lr.png (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/shadow.png (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/shared/calendar.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/shared/glass-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/shared/left-btn.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/shared/right-btn.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/shared/warning.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/e-handle-dark.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/e-handle.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/ne-handle-dark.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/ne-handle.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/nw-handle-dark.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/nw-handle.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/s-handle-dark.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/s-handle.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/se-handle-dark.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/se-handle.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/square.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/sw-handle-dark.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/sizer/sw-handle.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tabs/tab-btm-left-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tabs/tab-btm-right-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tabs/tab-sprite.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/toolbar/btn-arrow-light.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/toolbar/btn-arrow.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/toolbar/btn-over-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/toolbar/gray-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/toolbar/tb-bg.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/toolbar/tb-btn-sprite.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/drop-add.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/drop-between.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/drop-no.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/drop-over.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/drop-under.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/drop-yes.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/elbow-end-minus-nl.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/elbow-end-minus.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/elbow-end-plus-nl.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/elbow-end-plus.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/elbow-end.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/elbow-line.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/elbow-minus-nl.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/elbow-minus.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/elbow-plus-nl.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/elbow-plus.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/elbow.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/folder-open.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/folder.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/leaf.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/loading.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF}/ext/resources/images/default/tree/s.gif (100%)
rename spring-faces/src/main/java/{org/springframework/faces/ui => META-INF/spring-faces}/SpringFaces.js (100%)
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/el/Jsf11ELExpressionParser.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/el/Jsf11ELResolverAdapter.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/el/Jsf12ELExpressionParser.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/ui/resource/FlowResourceHelper.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceAction.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/ui/resource/ResourcesFlowBuilder.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowActionListener.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionHolder.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionHolderUtils.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionKeyStateHolder.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionViewHandler.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContext.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContextFactory.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesUtils.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowLifecycle.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowLifecycleFactory.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowNavigationHandler.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowNavigationHandlerArgumentExtractor.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowPhaseListener.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowRenderKitFactory.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowRenderKitWrapper.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowResponseStateManager.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowSystemCleanupFilter.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/JsfExternalContext.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/JsfFlowUtils.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/JsfRenderFinalResponseAction.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/JsfView.java
create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactory.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/ViewIdMapper.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/el/AbstractFlowExecutionPropertyResolver.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/el/DelegatingFlowVariableResolver.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowExecutionPropertyResolver.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowExecutionVariableResolver.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowPropertyResolver.java
delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowVariableResolver.java
create mode 100644 spring-faces/src/main/java/org/springframework/webflow/engine/builder/xml/JsfViewFactoryCreator.java
create mode 100644 spring-faces/src/test/java/org/springframework/faces/ui/resource/FlowResourceHelperTests.java
create mode 100644 spring-faces/src/test/java/org/springframework/faces/ui/resource/RequestInfoMatcher.java
create mode 100644 spring-faces/src/test/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceActionTests.java
create mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/FlowActionListenerTests.java
create mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/FlowFacesContextTests.java
delete mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/FlowNavigationHandlerArgumentExtractorTests.java
delete mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/FlowPropertyResolverTests.java
delete mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/FlowSystemCleanupFilterTests.java
delete mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/FlowVariableResolverTests.java
delete mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/JSF11ManagedBeanAccessTests.java
delete mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/JSF12ManagedBeanAccessTests.java
create mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/JSFFlowExecutionTests.java
create mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/JsfRenderFinalResponseActionTests.java
create mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewFactoryTests.java
create mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewTests.java
create mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/MockBaseFacesContext.java
create mode 100644 spring-faces/src/test/java/org/springframework/faces/webflow/MockBaseFacesContextFactory.java
create mode 100644 spring-faces/src/test/java/org/springframework/webflow/engine/builder/xml/JsfXmlFlowBuilderTests.java
create mode 100644 spring-faces/src/test/java/org/springframework/webflow/engine/builder/xml/jsf-flow.xml
delete mode 100644 spring-webflow-samples/birthdate/.classpath
delete mode 100644 spring-webflow-samples/birthdate/.project
delete mode 100644 spring-webflow-samples/birthdate/.settings/org.eclipse.jdt.core.prefs
delete mode 100644 spring-webflow-samples/birthdate/.settings/org.eclipse.jdt.ui.prefs
delete mode 100755 spring-webflow-samples/birthdate/.settings/org.eclipse.jst.common.project.facet.core.prefs
delete mode 100755 spring-webflow-samples/birthdate/.settings/org.eclipse.wst.common.component
delete mode 100755 spring-webflow-samples/birthdate/.settings/org.eclipse.wst.common.project.facet.core.xml
delete mode 100644 spring-webflow-samples/birthdate/.settings/org.eclipse.wst.validation.prefs
delete mode 100644 spring-webflow-samples/birthdate/.springBeans
delete mode 100644 spring-webflow-samples/birthdate/.springWebflow
delete mode 100644 spring-webflow-samples/birthdate/build.xml
delete mode 100644 spring-webflow-samples/birthdate/ivy.xml
delete mode 100644 spring-webflow-samples/birthdate/project.properties
delete mode 100644 spring-webflow-samples/birthdate/src/etc/filter.properties
delete mode 100644 spring-webflow-samples/birthdate/src/etc/test-resources/log4j.properties
delete mode 100644 spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/BirthDate.java
delete mode 100644 spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/BirthDateFormAction.java
delete mode 100644 spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/BirthDateValidator.java
delete mode 100644 spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/MessageResources.properties
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/birthdate-alternate.xml
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/birthdate.xml
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/classes/log4j.properties
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/jsp/birthdateForm.jsp
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/jsp/cardForm.jsp
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/jsp/yourAge.jsp
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/struts-config.xml
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/web.xml
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/webflow-config.xml
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/images/spring-logo.jpg
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/images/submit.gif
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/images/webflow-logo.jpg
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/index.jsp
delete mode 100644 spring-webflow-samples/birthdate/src/main/webapp/style.css
delete mode 100644 spring-webflow-samples/birthdate/src/test/java/log4j.properties
delete mode 100644 spring-webflow-samples/birthdate/src/test/java/org/springframework/webflow/samples/birthdate/BirthdateValidatorTests.java
delete mode 100644 spring-webflow-samples/fileupload/.classpath
delete mode 100644 spring-webflow-samples/fileupload/.project
delete mode 100644 spring-webflow-samples/fileupload/.settings/org.eclipse.jdt.core.prefs
delete mode 100644 spring-webflow-samples/fileupload/.settings/org.eclipse.jdt.ui.prefs
delete mode 100755 spring-webflow-samples/fileupload/.settings/org.eclipse.jst.common.project.facet.core.prefs
delete mode 100755 spring-webflow-samples/fileupload/.settings/org.eclipse.wst.common.component
delete mode 100755 spring-webflow-samples/fileupload/.settings/org.eclipse.wst.common.project.facet.core.xml
delete mode 100644 spring-webflow-samples/fileupload/.settings/org.eclipse.wst.validation.prefs
delete mode 100644 spring-webflow-samples/fileupload/.springBeans
delete mode 100644 spring-webflow-samples/fileupload/.springWebflow
delete mode 100644 spring-webflow-samples/fileupload/build.xml
delete mode 100644 spring-webflow-samples/fileupload/ivy.xml
delete mode 100644 spring-webflow-samples/fileupload/project.properties
delete mode 100644 spring-webflow-samples/fileupload/src/etc/filter.properties
delete mode 100644 spring-webflow-samples/fileupload/src/etc/test-resources/log4j.properties
delete mode 100644 spring-webflow-samples/fileupload/src/main/java/org/springframework/webflow/samples/fileupload/FileUploadAction.java
delete mode 100644 spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/classes/log4j.properties
delete mode 100644 spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/fileupload-servlet.xml
delete mode 100644 spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/fileupload.xml
delete mode 100644 spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/jsp/fileForm.jsp
delete mode 100644 spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/web.xml
delete mode 100644 spring-webflow-samples/fileupload/src/main/webapp/images/spring-logo.jpg
delete mode 100644 spring-webflow-samples/fileupload/src/main/webapp/images/webflow-logo.jpg
delete mode 100644 spring-webflow-samples/fileupload/src/main/webapp/index.jsp
delete mode 100644 spring-webflow-samples/fileupload/src/main/webapp/style.css
delete mode 100644 spring-webflow-samples/flowlauncher/.classpath
delete mode 100644 spring-webflow-samples/flowlauncher/.project
delete mode 100644 spring-webflow-samples/flowlauncher/.settings/org.eclipse.jdt.core.prefs
delete mode 100644 spring-webflow-samples/flowlauncher/.settings/org.eclipse.jdt.ui.prefs
delete mode 100755 spring-webflow-samples/flowlauncher/.settings/org.eclipse.jst.common.project.facet.core.prefs
delete mode 100755 spring-webflow-samples/flowlauncher/.settings/org.eclipse.wst.common.component
delete mode 100755 spring-webflow-samples/flowlauncher/.settings/org.eclipse.wst.common.project.facet.core.xml
delete mode 100644 spring-webflow-samples/flowlauncher/.settings/org.eclipse.wst.validation.prefs
delete mode 100644 spring-webflow-samples/flowlauncher/.springBeans
delete mode 100644 spring-webflow-samples/flowlauncher/.springWebflow
delete mode 100644 spring-webflow-samples/flowlauncher/build.xml
delete mode 100644 spring-webflow-samples/flowlauncher/ivy.xml
delete mode 100644 spring-webflow-samples/flowlauncher/project.properties
delete mode 100644 spring-webflow-samples/flowlauncher/src/etc/filter.properties
delete mode 100644 spring-webflow-samples/flowlauncher/src/etc/test-resources/log4j.properties
delete mode 100644 spring-webflow-samples/flowlauncher/src/main/webapp/WEB-INF/classes/log4j.properties
delete mode 100644 spring-webflow-samples/flowlauncher/src/main/webapp/WEB-INF/flowlauncher-servlet.xml
delete mode 100644 spring-webflow-samples/flowlauncher/src/main/webapp/WEB-INF/jsp/aPage.jsp
delete mode 100644 spring-webflow-samples/flowlauncher/src/main/webapp/WEB-INF/jsp/bPage.jsp
delete mode 100644 spring-webflow-samples/flowlauncher/src/main/webapp/WEB-INF/sampleA.xml
delete mode 100644 spring-webflow-samples/flowlauncher/src/main/webapp/WEB-INF/sampleB.xml
delete mode 100644 spring-webflow-samples/flowlauncher/src/main/webapp/WEB-INF/web.xml
delete mode 100644 spring-webflow-samples/flowlauncher/src/main/webapp/images/spring-logo.jpg
delete mode 100644 spring-webflow-samples/flowlauncher/src/main/webapp/images/webflow-logo.jpg
delete mode 100644 spring-webflow-samples/flowlauncher/src/main/webapp/index.html
delete mode 100644 spring-webflow-samples/flowlauncher/src/main/webapp/style.css
delete mode 100644 spring-webflow-samples/itemlist/.classpath
delete mode 100644 spring-webflow-samples/itemlist/.project
delete mode 100644 spring-webflow-samples/itemlist/.settings/org.eclipse.jdt.core.prefs
delete mode 100644 spring-webflow-samples/itemlist/.settings/org.eclipse.jdt.ui.prefs
delete mode 100755 spring-webflow-samples/itemlist/.settings/org.eclipse.jst.common.project.facet.core.prefs
delete mode 100755 spring-webflow-samples/itemlist/.settings/org.eclipse.wst.common.component
delete mode 100755 spring-webflow-samples/itemlist/.settings/org.eclipse.wst.common.project.facet.core.xml
delete mode 100644 spring-webflow-samples/itemlist/.settings/org.eclipse.wst.validation.prefs
delete mode 100644 spring-webflow-samples/itemlist/.springBeans
delete mode 100644 spring-webflow-samples/itemlist/.springWebflow
delete mode 100644 spring-webflow-samples/itemlist/build.xml
delete mode 100644 spring-webflow-samples/itemlist/ivy.xml
delete mode 100644 spring-webflow-samples/itemlist/project.properties
delete mode 100644 spring-webflow-samples/itemlist/src/etc/filter.properties
delete mode 100644 spring-webflow-samples/itemlist/src/etc/test-resources/log4j.properties
delete mode 100644 spring-webflow-samples/itemlist/src/main/java/org/springframework/webflow/samples/itemlist/AddItemAction.java
delete mode 100644 spring-webflow-samples/itemlist/src/main/java/org/springframework/webflow/samples/itemlist/NewItemAction.java
delete mode 100644 spring-webflow-samples/itemlist/src/main/webapp/WEB-INF/classes/log4j.properties
delete mode 100644 spring-webflow-samples/itemlist/src/main/webapp/WEB-INF/itemlist-alternate.xml
delete mode 100644 spring-webflow-samples/itemlist/src/main/webapp/WEB-INF/itemlist-servlet.xml
delete mode 100644 spring-webflow-samples/itemlist/src/main/webapp/WEB-INF/itemlist.xml
delete mode 100644 spring-webflow-samples/itemlist/src/main/webapp/WEB-INF/jsp/item.jsp
delete mode 100644 spring-webflow-samples/itemlist/src/main/webapp/WEB-INF/jsp/itemlist.jsp
delete mode 100644 spring-webflow-samples/itemlist/src/main/webapp/WEB-INF/web.xml
delete mode 100644 spring-webflow-samples/itemlist/src/main/webapp/images/spring-logo.jpg
delete mode 100644 spring-webflow-samples/itemlist/src/main/webapp/images/webflow-logo.jpg
delete mode 100644 spring-webflow-samples/itemlist/src/main/webapp/index.jsp
delete mode 100644 spring-webflow-samples/itemlist/src/main/webapp/style.css
delete mode 100644 spring-webflow-samples/numberguess/.classpath
delete mode 100644 spring-webflow-samples/numberguess/.project
delete mode 100644 spring-webflow-samples/numberguess/.settings/org.eclipse.jdt.core.prefs
delete mode 100644 spring-webflow-samples/numberguess/.settings/org.eclipse.jdt.ui.prefs
delete mode 100755 spring-webflow-samples/numberguess/.settings/org.eclipse.jst.common.project.facet.core.prefs
delete mode 100755 spring-webflow-samples/numberguess/.settings/org.eclipse.wst.common.component
delete mode 100755 spring-webflow-samples/numberguess/.settings/org.eclipse.wst.common.project.facet.core.xml
delete mode 100644 spring-webflow-samples/numberguess/.settings/org.eclipse.wst.validation.prefs
delete mode 100644 spring-webflow-samples/numberguess/.settings/org.springframework.ide.eclipse.core.prefs
delete mode 100644 spring-webflow-samples/numberguess/.springBeans
delete mode 100644 spring-webflow-samples/numberguess/.springWebflow
delete mode 100644 spring-webflow-samples/numberguess/build.xml
delete mode 100644 spring-webflow-samples/numberguess/ivy.xml
delete mode 100644 spring-webflow-samples/numberguess/project.properties
delete mode 100644 spring-webflow-samples/numberguess/src/etc/filter.properties
delete mode 100644 spring-webflow-samples/numberguess/src/etc/test-resources/log4j.properties
delete mode 100644 spring-webflow-samples/numberguess/src/main/java/org/springframework/webflow/samples/numberguess/HigherLowerGame.java
delete mode 100644 spring-webflow-samples/numberguess/src/main/java/org/springframework/webflow/samples/numberguess/MastermindGame.java
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/WEB-INF/classes/log4j.properties
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/WEB-INF/dispatcher-servlet.xml
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/WEB-INF/higherlower.xml
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/WEB-INF/jsp/higherlower.enterGuess.jsp
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/WEB-INF/jsp/higherlower.showAnswer.jsp
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/WEB-INF/jsp/mastermind.enterGuess.jsp
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/WEB-INF/jsp/mastermind.showAnswer.jsp
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/WEB-INF/mastermind.xml
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/WEB-INF/web.xml
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/images/spring-logo.jpg
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/images/webflow-logo.jpg
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/index.html
delete mode 100644 spring-webflow-samples/numberguess/src/main/webapp/style.css
delete mode 100644 spring-webflow-samples/numberguess/src/test/java/org/springframework/webflow/samples/numberguess/MastermindGameTests.java
delete mode 100644 spring-webflow-samples/phonebook-portlet/.classpath
delete mode 100644 spring-webflow-samples/phonebook-portlet/.project
delete mode 100644 spring-webflow-samples/phonebook-portlet/.settings/org.eclipse.jdt.core.prefs
delete mode 100644 spring-webflow-samples/phonebook-portlet/.settings/org.eclipse.jdt.ui.prefs
delete mode 100644 spring-webflow-samples/phonebook-portlet/.settings/org.eclipse.wst.validation.prefs
delete mode 100644 spring-webflow-samples/phonebook-portlet/.springBeans
delete mode 100644 spring-webflow-samples/phonebook-portlet/.springWebflow
delete mode 100644 spring-webflow-samples/phonebook-portlet/build.xml
delete mode 100644 spring-webflow-samples/phonebook-portlet/ivy.xml
delete mode 100644 spring-webflow-samples/phonebook-portlet/project.properties
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/etc/filter.properties
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/etc/test-resources/log4j.properties
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/java/org/springframework/webflow/samples/phonebook/Person.java
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/java/org/springframework/webflow/samples/phonebook/Phonebook.java
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/java/org/springframework/webflow/samples/phonebook/SearchCriteria.java
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/java/org/springframework/webflow/samples/phonebook/SearchCriteriaValidator.java
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/java/org/springframework/webflow/samples/phonebook/stub/StubPhonebook.java
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/java/org/springframework/webflow/samples/phonebook/stub/services-config.xml
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/java/org/springframework/webflow/samples/phonebook/webflow/PersonDetailFlowBuilder.java
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/java/org/springframework/webflow/samples/phonebook/webflow/PhonebookFlowRegistryFactoryBean.java
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/java/org/springframework/webflow/samples/phonebook/webflow/SearchPersonFlowBuilder.java
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/java/org/springframework/webflow/samples/phonebook/webflow/phonebook-webflow-config.xml
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/WEB-INF/classes/log4j.properties
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/WEB-INF/flows/detail-flow.xml
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/WEB-INF/flows/search-flow-beans.xml
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/WEB-INF/flows/search-flow.xml
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/WEB-INF/jsp/details.jsp
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/WEB-INF/jsp/searchCriteria.jsp
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/WEB-INF/jsp/searchResults.jsp
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/WEB-INF/phonebook-portlet-config.xml
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/WEB-INF/phonebook-webflow-config.xml
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/WEB-INF/portlet.xml
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/WEB-INF/web.xml
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/images/spring-logo.jpg
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/images/webflow-logo.jpg
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/main/webapp/style.css
delete mode 100644 spring-webflow-samples/phonebook-portlet/src/test/java/org/springframework/webflow/samples/phonebook/webflow/SearchFlowExecutionTests.java
delete mode 100644 spring-webflow-samples/phonebook/.classpath
delete mode 100644 spring-webflow-samples/phonebook/.project
delete mode 100644 spring-webflow-samples/phonebook/.settings/org.eclipse.jdt.core.prefs
delete mode 100644 spring-webflow-samples/phonebook/.settings/org.eclipse.jdt.ui.prefs
delete mode 100755 spring-webflow-samples/phonebook/.settings/org.eclipse.jst.common.project.facet.core.prefs
delete mode 100755 spring-webflow-samples/phonebook/.settings/org.eclipse.wst.common.component
delete mode 100755 spring-webflow-samples/phonebook/.settings/org.eclipse.wst.common.project.facet.core.xml
delete mode 100644 spring-webflow-samples/phonebook/.settings/org.eclipse.wst.validation.prefs
delete mode 100644 spring-webflow-samples/phonebook/.settings/org.springframework.ide.eclipse.core.prefs
delete mode 100644 spring-webflow-samples/phonebook/.springBeans
delete mode 100644 spring-webflow-samples/phonebook/.springWebflow
delete mode 100644 spring-webflow-samples/phonebook/build.xml
delete mode 100644 spring-webflow-samples/phonebook/ivy.xml
delete mode 100644 spring-webflow-samples/phonebook/project.properties
delete mode 100644 spring-webflow-samples/phonebook/src/main/java/org/springframework/webflow/samples/phonebook/Person.java
delete mode 100644 spring-webflow-samples/phonebook/src/main/java/org/springframework/webflow/samples/phonebook/Phonebook.java
delete mode 100644 spring-webflow-samples/phonebook/src/main/java/org/springframework/webflow/samples/phonebook/SearchCriteria.java
delete mode 100644 spring-webflow-samples/phonebook/src/main/java/org/springframework/webflow/samples/phonebook/SearchCriteriaValidator.java
delete mode 100644 spring-webflow-samples/phonebook/src/main/java/org/springframework/webflow/samples/phonebook/stub/StubPhonebook.java
delete mode 100644 spring-webflow-samples/phonebook/src/main/java/org/springframework/webflow/samples/phonebook/stub/services-config.xml
delete mode 100644 spring-webflow-samples/phonebook/src/main/java/org/springframework/webflow/samples/phonebook/webflow/PersonDetailFlowBuilder.java
delete mode 100644 spring-webflow-samples/phonebook/src/main/java/org/springframework/webflow/samples/phonebook/webflow/PhonebookFlowRegistryFactoryBean.java
delete mode 100644 spring-webflow-samples/phonebook/src/main/java/org/springframework/webflow/samples/phonebook/webflow/SearchPersonFlowBuilder.java
delete mode 100644 spring-webflow-samples/phonebook/src/main/java/org/springframework/webflow/samples/phonebook/webflow/phonebook-webflow-config.xml
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/WEB-INF/classes/log4j.properties
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/WEB-INF/flows/detail-flow.xml
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/WEB-INF/flows/search-flow-beans.xml
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/WEB-INF/flows/search-flow.xml
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/WEB-INF/jsp/details.jsp
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/WEB-INF/jsp/searchCriteria.jsp
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/WEB-INF/jsp/searchResults.jsp
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/WEB-INF/phonebook-servlet-config.xml
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/WEB-INF/phonebook-webflow-config.xml
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/WEB-INF/web.xml
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/images/spring-logo.jpg
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/images/webflow-logo.jpg
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/index.jsp
delete mode 100644 spring-webflow-samples/phonebook/src/main/webapp/style.css
delete mode 100644 spring-webflow-samples/phonebook/src/test/java/log4j.properties
delete mode 100644 spring-webflow-samples/phonebook/src/test/java/org/springframework/webflow/samples/phonebook/webflow/SearchFlowExecutionTests.java
delete mode 100644 spring-webflow-samples/sellitem-jsf/.classpath
delete mode 100644 spring-webflow-samples/sellitem-jsf/.m7project
delete mode 100644 spring-webflow-samples/sellitem-jsf/.project
delete mode 100644 spring-webflow-samples/sellitem-jsf/.settings/org.eclipse.jdt.core.prefs
delete mode 100644 spring-webflow-samples/sellitem-jsf/.settings/org.eclipse.jdt.ui.prefs
delete mode 100644 spring-webflow-samples/sellitem-jsf/.settings/org.eclipse.jpt.core.prefs
delete mode 100755 spring-webflow-samples/sellitem-jsf/.settings/org.eclipse.jst.common.project.facet.core.prefs
delete mode 100755 spring-webflow-samples/sellitem-jsf/.settings/org.eclipse.wst.common.component
delete mode 100755 spring-webflow-samples/sellitem-jsf/.settings/org.eclipse.wst.common.project.facet.core.xml
delete mode 100644 spring-webflow-samples/sellitem-jsf/.settings/org.eclipse.wst.validation.prefs
delete mode 100644 spring-webflow-samples/sellitem-jsf/.springBeans
delete mode 100644 spring-webflow-samples/sellitem-jsf/.springWebflow
delete mode 100644 spring-webflow-samples/sellitem-jsf/build.xml
delete mode 100644 spring-webflow-samples/sellitem-jsf/ivy.xml
delete mode 100644 spring-webflow-samples/sellitem-jsf/project.properties
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/etc/filter.properties
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/etc/test-resources/log4j.properties
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/java/org/springframework/webflow/samples/sellitem/InMemoryDatabaseCreator.java
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/java/org/springframework/webflow/samples/sellitem/JdbcSaleProcessor.java
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/java/org/springframework/webflow/samples/sellitem/Sale.java
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/java/org/springframework/webflow/samples/sellitem/SaleProcessor.java
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/java/org/springframework/webflow/samples/sellitem/SellItemAction.java
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/java/org/springframework/webflow/samples/sellitem/services-config.xml
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/WEB-INF/classes/log4j.properties
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/WEB-INF/flows/sellitem-flow.xml
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/WEB-INF/web.xml
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/WEB-INF/webflow-config.xml
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/categoryForm.jsp
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/costOverview.jsp
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/images/spring-logo.jpg
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/images/webflow-logo.jpg
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/index.jsp
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/intro.jsp
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/priceAndItemCountForm.jsp
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/shippingDetailsForm.jsp
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/main/webapp/style.css
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/test/java/log4j.properties
delete mode 100644 spring-webflow-samples/sellitem-jsf/src/test/java/org/springframework/webflow/samples/sellitem/SaleProcessorIntegrationTests.java
delete mode 100644 spring-webflow-samples/sellitem/.classpath
delete mode 100644 spring-webflow-samples/sellitem/.project
delete mode 100644 spring-webflow-samples/sellitem/.settings/org.eclipse.jdt.core.prefs
delete mode 100644 spring-webflow-samples/sellitem/.settings/org.eclipse.jdt.ui.prefs
delete mode 100755 spring-webflow-samples/sellitem/.settings/org.eclipse.jst.common.project.facet.core.prefs
delete mode 100755 spring-webflow-samples/sellitem/.settings/org.eclipse.wst.common.component
delete mode 100755 spring-webflow-samples/sellitem/.settings/org.eclipse.wst.common.project.facet.core.xml
delete mode 100644 spring-webflow-samples/sellitem/.settings/org.eclipse.wst.validation.prefs
delete mode 100644 spring-webflow-samples/sellitem/.settings/org.springframework.ide.eclipse.core.prefs
delete mode 100644 spring-webflow-samples/sellitem/.springBeans
delete mode 100644 spring-webflow-samples/sellitem/.springWebflow
delete mode 100644 spring-webflow-samples/sellitem/build.xml
delete mode 100644 spring-webflow-samples/sellitem/ivy.xml
delete mode 100644 spring-webflow-samples/sellitem/project.properties
delete mode 100644 spring-webflow-samples/sellitem/src/etc/filter.properties
delete mode 100644 spring-webflow-samples/sellitem/src/etc/test-resources/log4j.properties
delete mode 100644 spring-webflow-samples/sellitem/src/main/java/org/springframework/webflow/samples/sellitem/InMemoryDatabaseCreator.java
delete mode 100644 spring-webflow-samples/sellitem/src/main/java/org/springframework/webflow/samples/sellitem/JdbcSaleProcessor.java
delete mode 100644 spring-webflow-samples/sellitem/src/main/java/org/springframework/webflow/samples/sellitem/Sale.java
delete mode 100644 spring-webflow-samples/sellitem/src/main/java/org/springframework/webflow/samples/sellitem/SaleProcessor.java
delete mode 100644 spring-webflow-samples/sellitem/src/main/java/org/springframework/webflow/samples/sellitem/SaleValidator.java
delete mode 100644 spring-webflow-samples/sellitem/src/main/java/org/springframework/webflow/samples/sellitem/SellItemFlowExecutionListener.java
delete mode 100644 spring-webflow-samples/sellitem/src/main/java/org/springframework/webflow/samples/sellitem/SellItemPropertyEditorRegistrar.java
delete mode 100644 spring-webflow-samples/sellitem/src/main/java/org/springframework/webflow/samples/sellitem/services-config.xml
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/classes/log4j.properties
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/flows/conversation-scope/sellitem-beans.xml
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/flows/conversation-scope/sellitem-conversation-scope-flow.xml
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/flows/conversation-scope/shipping-conversation-scope-flow.xml
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/flows/sellitem-beans.xml
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/flows/sellitem-flow.xml
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/flows/shipping-flow.xml
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/flows/simple/sellitem-simple-flow.xml
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/jsp/categoryForm.jsp
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/jsp/costOverview.jsp
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/jsp/priceAndItemCountForm.jsp
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/jsp/shippingDetailsForm.jsp
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/sellitem-servlet-config.xml
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/sellitem-webflow-config.xml
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/WEB-INF/web.xml
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/images/spring-logo.jpg
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/images/webflow-logo.jpg
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/index.jsp
delete mode 100644 spring-webflow-samples/sellitem/src/main/webapp/style.css
delete mode 100644 spring-webflow-samples/sellitem/src/test/java/log4j.properties
delete mode 100644 spring-webflow-samples/sellitem/src/test/java/org/springframework/webflow/samples/sellitem/SaleProcessorIntegrationTests.java
delete mode 100644 spring-webflow-samples/sellitem/src/test/java/org/springframework/webflow/samples/sellitem/SellItemFlowExecutionTests.java
delete mode 100644 spring-webflow-samples/shippingrate/.classpath
delete mode 100644 spring-webflow-samples/shippingrate/.project
delete mode 100644 spring-webflow-samples/shippingrate/.settings/org.eclipse.jdt.core.prefs
delete mode 100644 spring-webflow-samples/shippingrate/.settings/org.eclipse.jdt.ui.prefs
delete mode 100755 spring-webflow-samples/shippingrate/.settings/org.eclipse.jst.common.project.facet.core.prefs
delete mode 100755 spring-webflow-samples/shippingrate/.settings/org.eclipse.wst.common.component
delete mode 100755 spring-webflow-samples/shippingrate/.settings/org.eclipse.wst.common.project.facet.core.xml
delete mode 100644 spring-webflow-samples/shippingrate/.settings/org.eclipse.wst.validation.prefs
delete mode 100644 spring-webflow-samples/shippingrate/.springBeans
delete mode 100644 spring-webflow-samples/shippingrate/build.xml
delete mode 100644 spring-webflow-samples/shippingrate/ivy.xml
delete mode 100644 spring-webflow-samples/shippingrate/project.properties
delete mode 100644 spring-webflow-samples/shippingrate/src/etc/filter.properties
delete mode 100644 spring-webflow-samples/shippingrate/src/etc/test-resources/log4j.properties
delete mode 100644 spring-webflow-samples/shippingrate/src/main/java/org/springframework/webflow/samples/shippingrate/domain/Rate.java
delete mode 100644 spring-webflow-samples/shippingrate/src/main/java/org/springframework/webflow/samples/shippingrate/domain/RateCriteria.java
delete mode 100644 spring-webflow-samples/shippingrate/src/main/java/org/springframework/webflow/samples/shippingrate/domain/RateCriteriaValidator.java
delete mode 100644 spring-webflow-samples/shippingrate/src/main/java/org/springframework/webflow/samples/shippingrate/domain/RateService.java
delete mode 100644 spring-webflow-samples/shippingrate/src/main/java/org/springframework/webflow/samples/shippingrate/domain/StubRateService.java
delete mode 100644 spring-webflow-samples/shippingrate/src/main/java/org/springframework/webflow/samples/shippingrate/domain/services.xml
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/WEB-INF/classes/MessageResources.properties
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/WEB-INF/classes/log4j.properties
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/WEB-INF/flows/getRate-flow.xml
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/WEB-INF/jsp/selectCustomer.jsp
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/WEB-INF/jsp/selectPackageDetails.jsp
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/WEB-INF/jsp/selectReceiver.jsp
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/WEB-INF/jsp/selectSender.jsp
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/WEB-INF/jsp/showRate.jsp
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/WEB-INF/shippingrate-servlet.xml
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/WEB-INF/web.xml
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/images/spring-logo.jpg
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/images/webflow-logo.jpg
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/index.jsp
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/prototype.js
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/style.css
delete mode 100644 spring-webflow-samples/shippingrate/src/main/webapp/swf_ajax.js
rename spring-webflow/src/main/java/org/springframework/webflow/{execution/support => action}/EventFactorySupport.java (95%)
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/action/ExternalRedirectAction.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/action/FlowDefinitionRedirectAction.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/EnableScopesBeanDefinitionParser.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/ExecutionAttributesBeanDefinitionParser.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/FlowBuilderInfo.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/FlowDefinitionResource.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/FlowDefinitionResourceFactory.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/FlowElementAttribute.java
rename spring-webflow/src/main/java/org/springframework/webflow/config/{ExecutionListenersBeanDefinitionParser.java => FlowExecutionListenerLoaderBeanDefinitionParser.java} (89%)
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/FlowExecutionListenerLoaderFactoryBean.java
rename spring-webflow/src/main/java/org/springframework/webflow/config/{RepositoryType.java => FlowExecutionRepositoryType.java} (54%)
rename spring-webflow/src/main/java/org/springframework/webflow/config/{ExecutorBeanDefinitionParser.java => FlowExecutorBeanDefinitionParser.java} (74%)
rename spring-webflow/src/main/java/org/springframework/webflow/config/{FlowSystemDefaults.java => FlowExecutorSystemDefaults.java} (79%)
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/FlowLocation.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/FlowRegistryBeanDefinitionParser.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/FlowRegistryFactoryBean.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/RegistryBeanDefinitionParser.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/scope/AbstractWebFlowScope.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/scope/ConversationScope.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/scope/FlashScope.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/scope/FlowScope.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/scope/ScopeRegistrar.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/scope/package.html
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/config/spring-webflow-config-1.0.xsd
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/context/AbstractFlowRequestInfo.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/context/FlowDefinitionRequestInfo.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/context/FlowExecutionRequestInfo.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/context/RequestPath.java
rename spring-webflow/src/main/java/org/springframework/webflow/core/{ => expression}/DefaultExpressionParserFactory.java (79%)
rename spring-webflow/src/main/java/org/springframework/webflow/core/{ => expression}/WebFlowOgnlExpressionParser.java (97%)
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/core/expression/el/RequestContextELResolver.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/core/expression/el/ScopeSearchingELResolver.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/core/expression/el/WebFlowELExpressionParser.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/definition/registry/ExternalizedFlowDefinitionRegistrar.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/definition/registry/FlowDefinitionRegistrar.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/definition/registry/FlowDefinitionRegistryMBean.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/definition/registry/FlowDefinitionResource.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/definition/registry/FlowPathUtils.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/NullViewSelector.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/ViewSelector.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/AbstractFlowBuilder.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/BaseFlowBuilder.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/BaseFlowServiceLocator.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/DefaultFlowServiceLocator.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/FlowArtifactLookupException.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/FlowBuilderContext.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/FlowRegistryFactoryBean.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/FlowRegistryFactoryBeanTests.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/FlowServiceLocator.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/TextToViewSelector.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/ViewFactoryCreator.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/support/AbstractFlowBuilder.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/support/ActionInvokingViewFactory.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/support/FlowBuilderContextImpl.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/support/FlowBuilderServices.java
rename spring-webflow/src/main/java/org/springframework/webflow/engine/builder/{ => support}/TextToTargetStateResolver.java (73%)
rename spring-webflow/src/main/java/org/springframework/webflow/engine/builder/{ => support}/TextToTransitionCriteria.java (77%)
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/LocalFlowBuilderContext.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/LocalFlowServiceLocator.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/LocalFlowServiceRegistry.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/XmlFlowRegistrar.java
rename spring-webflow/src/main/java/org/springframework/webflow/engine/builder/xml/{spring-webflow-1.0.xsd => spring-webflow-2.0.xsd} (95%)
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/impl/FlowExecutionImplServicesConfigurer.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/support/ApplicationViewSelector.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/support/AttributeExpression.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/support/ConfigurableFlowAttributeMapper.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/support/ExternalRedirectSelector.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/engine/support/FlowDefinitionRedirectSelector.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/FlowExecutionContextHolder.java
rename spring-webflow/src/main/java/org/springframework/webflow/execution/{repository => }/FlowExecutionKey.java (80%)
rename spring-binding/src/main/java/org/springframework/binding/expression/EvaluationContext.java => spring-webflow/src/main/java/org/springframework/webflow/execution/FlowExecutionKeyFactory.java (54%)
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/FlowSessionStatus.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/RequestContextHolder.java
rename spring-binding/src/main/java/org/springframework/binding/expression/SettableExpression.java => spring-webflow/src/main/java/org/springframework/webflow/execution/View.java (51%)
rename spring-webflow/src/{test/java/org/springframework/webflow/config/scope/StubObjectFactory.java => main/java/org/springframework/webflow/execution/ViewFactory.java} (54%)
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/ViewSelection.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/repository/continuation/AbstractFlowExecutionContinuationRepository.java
rename spring-webflow/src/main/java/org/springframework/webflow/execution/repository/{continuation/ClientContinuationFlowExecutionRepository.java => impl/ClientFlowExecutionRepository.java} (66%)
rename spring-webflow/src/main/java/org/springframework/webflow/execution/repository/{continuation/ContinuationFlowExecutionRepository.java => impl/DefaultFlowExecutionRepository.java} (62%)
rename spring-webflow/src/main/java/org/springframework/webflow/execution/repository/{continuation => impl}/FlowExecutionContinuationGroup.java (86%)
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/repository/impl/package.html
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/repository/support/AbstractConversationFlowExecutionRepository.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/repository/support/InvalidContinuationIdException.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/repository/support/SimpleFlowExecutionRepository.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/support/ApplicationView.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/support/ExternalRedirect.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/support/FlowDefinitionRedirect.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/support/FlowExecutionRedirect.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/execution/support/package.html
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/RequestParameterInputMapper.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/ResponseInstruction.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/mvc/FlowController.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/mvc/PortletFlowController.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/mvc/package.html
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/struts/FlowAction.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/struts/StrutsExternalContext.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/struts/package.html
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/support/FlowExecutorArgumentExposer.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/support/FlowExecutorArgumentExtractionException.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/support/FlowExecutorArgumentExtractor.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/support/FlowExecutorArgumentHandler.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/support/FlowIdMappingArgumentHandlerWrapper.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/support/FlowRequestHandler.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/support/RequestParameterFlowExecutorArgumentHandler.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/support/RequestPathFlowExecutorArgumentHandler.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/support/ResponseInstructionHandler.java
delete mode 100644 spring-webflow/src/main/java/org/springframework/webflow/executor/support/package.html
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/servlet/SpringWebServlet.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/test/FlowBuilderSystemDefaults.java
rename spring-webflow/src/main/java/org/springframework/webflow/test/{MockFlowServiceLocator.java => MockFlowBuilderContext.java} (77%)
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/test/MockFlowExecutionKey.java
create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/test/MockFlowExecutionKeyFactory.java
rename spring-webflow/src/test/java/org/springframework/webflow/{execution/support => action}/EventFactorySupportTests.java (92%)
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/action/ExternalRedirectActionTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/action/FlowDefinitionRedirectActionTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/action/LocalBeanInvokingActionTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/action/SetActionTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/BeanConfigTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/FlowExecutorBeanDefinitionParserTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/FlowRegistryBeanDefinitionParserTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/FlowRegistryFactoryBeanTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/FooFlowBuilder.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/TestFlowExecutionListenerCriteria.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/WebFlowConfigNamespaceHandlerTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/flow-executor-factory-bean.xml
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/flow-executor.xml
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/flow-registry.xml
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/flow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/flow1.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/flow2.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/namespace-error-1.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/namespace-error-2.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/namespace-error-3.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/scope/ConversationScopeTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/scope/FlashScopeTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/scope/FlowScopeTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/webflow-config-classic.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/webflow-config-namespace-bad.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/config/webflow-config-namespace.xml
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/context/RequestPathTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/context/portlet/PortletExternalContextTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/conversation/impl/ConversationSizeTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/core/WebFlowOgnlExpressionParserTests.java
rename spring-webflow/src/test/java/org/springframework/webflow/core/{ => expression}/DefaultExpressionParserFactoryTests.java (88%)
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/definition/registry/FlowPathUtilsTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/FlowExecutionHandlerSetTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/SimpleFlow.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/StateExceptionHandlerTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/StubViewFactory.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/AbstractFlowBuilderParameterizationTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/AbstractFlowBuilderTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/BaseFlowServiceLocatorTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/FlowAssemblerTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/MyCustomStateExceptionHandler.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/ParameterizationTestAction.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/SimpleFlowBuilder.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/TextToViewSelectorTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/file.txt
rename spring-webflow/src/test/java/org/springframework/webflow/engine/builder/{ => support}/TextToTransitionCriteriaTests.java (90%)
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/DefaultDocumentLoaderTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/EvaluateActionXmlFlowBuilderTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/MessageSourceAwareAction.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/MessageSourceAwareTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/NamedActionXmlFlowBuilderTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/NamespaceXmlFlowBuilderTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/PojoActionXmlFlowBuilderTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/TestFlowServiceLocator.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/TestPojo.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/XmlFlowBuilderCustomTypeTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/XmlFlowBuilderNestingTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/XmlFlowRegistrarTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/evaluateActionFlow.xml
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-endstate.xml
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow-incomplete.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/flow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/messageSourceAwareContext.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/messageSourceAwareFlow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/namedActionFlow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/namedActionFlowContext.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/nsFlow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/parameterizedFlow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/pojoActionFlow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/testFlow1.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/testFlow1Context.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/testFlow2.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/testFlow2Context.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/testFlow2ParentContext.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/testFlow2SubFlow1Context.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/testFlow3.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/builder/xml/testFlow3Context.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/ExceptionThrowingAction.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/FlowExecutionImplStateRestorerTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/FlowExecutionStateRestorerImplTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/FooException.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/FooFlowAction.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/InfiniteLoopTestAction.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/MiscFlowExecutionTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/NestedSubflowRestorationTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/exceptionHandlingFlow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/external-subflow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/fooFlow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/globalTransitionExceptionHandler-flow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/infinite-loop.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/nestedSubflow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/required-mapping.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/runtime-exception.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/impl/testFlow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/support/ApplicationViewSelectorTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/support/AttributeExpressionTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/support/BooleanExpressionTransitionCriteriaTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/support/ConfigurableFlowAttributeMapperTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/support/DefaultTargetStateResolverTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/support/FlowDefinitionRedirectSelectorTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/engine/support/NullViewSelectionTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/execution/repository/continuation/ClientContinuationFlowExecutionRepositoryTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/execution/repository/continuation/ContinuationFlowExecutionRepositoryTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/execution/repository/continuation/FlowExecutionContinuationGroupTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/execution/repository/continuation/SerializedFlowExecutionContinuationFactoryTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/execution/repository/continuation/SerializedFlowExecutionContinuationTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/execution/repository/impl/ClientFlowExecutionRepositoryTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/execution/repository/impl/DefaultFlowExecutionRepositoryTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/execution/repository/support/SimpleFlowExecutionRepositoryTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/execution/support/ApplicationViewTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/execution/support/ExternalRedirectTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/execution/support/FlowDefinitionRedirectTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/ClientContinuationFlowExecutorIntegrationTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/ContinuationFlowExecutorIntegrationTests.java
create mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/FlowExecutorImplTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/FlowExecutorIntegrationTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/context.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/flow.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/mvc/FlowControllerTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/mvc/PortletFlowControllerTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/repository-client.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/repository-continuation.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/repository-simple.xml
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/struts/FlowActionTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/support/FlowIdMappingArgumentHandlerWrapperTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/support/FlowRequestHandlerTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/support/RequestParameterFlowExecutorArgumentHandlerTests.java
delete mode 100644 spring-webflow/src/test/java/org/springframework/webflow/executor/support/RequestPathFlowExecutorArgumentHandlerTests.java
diff --git a/spring-binding/.classpath b/spring-binding/.classpath
index 696357d8..40e0e526 100644
--- a/spring-binding/.classpath
+++ b/spring-binding/.classpath
@@ -7,8 +7,8 @@
-
-
+
+
diff --git a/spring-binding/src/main/java/org/springframework/binding/convert/support/TextToExpression.java b/spring-binding/src/main/java/org/springframework/binding/convert/support/TextToExpression.java
index 311d3d36..747c3d87 100644
--- a/spring-binding/src/main/java/org/springframework/binding/convert/support/TextToExpression.java
+++ b/spring-binding/src/main/java/org/springframework/binding/convert/support/TextToExpression.java
@@ -18,15 +18,12 @@ package org.springframework.binding.convert.support;
import org.springframework.binding.convert.ConversionContext;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
-import org.springframework.binding.expression.SettableExpression;
-import org.springframework.binding.expression.support.StaticExpression;
import org.springframework.util.Assert;
/**
* Converter that converts a String into an Expression object.
*
* @see org.springframework.binding.expression.Expression
- * @see org.springframework.binding.expression.SettableExpression
*
* @author Erwin Vervaet
*/
@@ -58,15 +55,11 @@ public class TextToExpression extends AbstractConverter {
}
public Class[] getTargetClasses() {
- return new Class[] { Expression.class, SettableExpression.class };
+ return new Class[] { Expression.class };
}
protected Object doConvert(Object source, Class targetClass, ConversionContext context) throws Exception {
String expressionString = (String) source;
- if (getExpressionParser().isDelimitedExpression(expressionString)) {
- return getExpressionParser().parseExpression((String) source);
- } else {
- return new StaticExpression(expressionString);
- }
+ return expressionParser.parseExpression(expressionString, Object.class, Object.class, null);
}
}
\ No newline at end of file
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/EvaluationAttempt.java b/spring-binding/src/main/java/org/springframework/binding/expression/EvaluationAttempt.java
index f2a50bc3..76777a2e 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/EvaluationAttempt.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/EvaluationAttempt.java
@@ -34,21 +34,14 @@ public class EvaluationAttempt {
*/
private Object target;
- /**
- * The evaluation context.
- */
- private EvaluationContext context;
-
/**
* Create an evaluation attempt.
* @param expression the expression that failed to evaluate
* @param target the target of the expression
- * @param context the context attributes that might have affected evaluation behavior
*/
- public EvaluationAttempt(Expression expression, Object target, EvaluationContext context) {
+ public EvaluationAttempt(Expression expression, Object target) {
this.expression = expression;
this.target = target;
- this.context = context;
}
/**
@@ -65,18 +58,11 @@ public class EvaluationAttempt {
return target;
}
- /**
- * Returns context attributes that may have influenced the evaluation process.
- */
- public EvaluationContext getContext() {
- return context;
- }
-
public String toString() {
return createToString(new ToStringCreator(this)).toString();
}
protected ToStringCreator createToString(ToStringCreator creator) {
- return creator.append("expression", expression).append("target", target).append("context", context);
+ return creator.append("expression", expression).append("target", target);
}
}
\ No newline at end of file
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/Expression.java b/spring-binding/src/main/java/org/springframework/binding/expression/Expression.java
index 62c00e8c..e98e32d6 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/Expression.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/Expression.java
@@ -27,9 +27,16 @@ public interface Expression {
* Evaluate the expression encapsulated by this evaluator against the provided target object and return the result
* of the evaluation.
* @param target the target of the expression
- * @param context the expression evaluation context
* @return the evaluation result
* @throws EvaluationException an exception occured during evaluation
*/
- public Object evaluate(Object target, EvaluationContext context) throws EvaluationException;
+ public Object getValue(Object target) throws EvaluationException;
+
+ /**
+ * Evaluate this expression against the target object to set its value to the value provided.
+ * @param target the target object
+ * @param value the new value to be set
+ * @throws EvaluationException an exception occurred during evaluation
+ */
+ public void setValue(Object target, Object value) throws EvaluationException;
}
\ No newline at end of file
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/ExpressionParser.java b/spring-binding/src/main/java/org/springframework/binding/expression/ExpressionParser.java
index 8692af31..0f5b3092 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/ExpressionParser.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/ExpressionParser.java
@@ -16,7 +16,7 @@
package org.springframework.binding.expression;
/**
- * Parses expression strings, returing a configured evaluator instance capable of performing parsed expression
+ * Parses expression strings, returning a configured evaluator instance capable of performing parsed expression
* evaluation in a thread safe way.
*
* @author Keith Donald
@@ -24,30 +24,38 @@ package org.springframework.binding.expression;
public interface ExpressionParser {
/**
- * Is this expression string delimited in a manner that indicates it is a parseable expression? For example
- * "${expression}".
- * @param expressionString the proposed expression string
- * @return true if yes, false if not
+ * Is the provided expression string an "eval" expression: meaning an expression that validates to a dynamic value,
+ * and not a literal expression? "Eval" expressions are normally enclosed in delimiters like #{}, where literal
+ * expressions are not delimited.
+ * @param string the string
+ * @return true if the expression is an eval expression string, false otherwise.
*/
- public boolean isDelimitedExpression(String expressionString);
+ public boolean isEvalExpressionString(String string);
/**
- * Parse the provided expression string, returning an evaluator capable of evaluating it against input.
- * @param expressionString the parseable expression string
- * @return the evaluator for the parsed expression
- * @throws ParserException an exception occured during parsing
+ * Parse the raw string into an "eval" expression string that when parsed produces a dynamic value when evaluated
+ * against a target object. For example, the raw expression string "person.id" might become #{person.id}. If the
+ * string is already an eval expression string, the string argument is returned unchanged. If the string is an
+ * composite expression string that mixes eval and literal expressions, a parser exception is thrown.
+ * @param string the raw string to be transformed into a parseable eval expression string
+ * @return the eval expression spring
+ * @throws ParserException an exception occurred during parsing
*/
- public Expression parseExpression(String expressionString) throws ParserException;
+ public String parseEvalExpressionString(String string) throws ParserException;
/**
- * Parse the provided settable expression string, returning an evaluator capable of evaluating its value as well as
- * setting its value.
+ * Parse the provided expression string, returning an expression evaluator capable of evaluating it. The expression
+ * string may be a literal expression string like "foo", an eval-expression string like #{foo}, or a
+ * composite-expression string like "foo#{foo}bar#{bar}".
* @param expressionString the parseable expression string
+ * @param expressionTargetType the class of target object this expression can successfully evaluate; for example,
+ * Map.class for an expression that is expected to evaluate against Maps.
+ * @param expectedEvaluationResultType the class of object this expression is expected to return or set: for
+ * example, Boolean.class for an expression that is expected to get or set a boolean value.
+ * @param expressionVariables variables providing aliases for this expression during evaluation parsing. Optional.
* @return the evaluator for the parsed expression
- * @throws ParserException an exception occured during parsing
- * @throws UnsupportedOperationException this parser does not support settable expressions
+ * @throws ParserException an exception occurred during parsing
*/
- public SettableExpression parseSettableExpression(String expressionString) throws ParserException,
- UnsupportedOperationException;
-
+ public Expression parseExpression(String expressionString, Class expressionTargetType,
+ Class expectedEvaluationResultType, ExpressionVariable[] expressionVariables) throws ParserException;
}
\ No newline at end of file
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/ExpressionVariable.java b/spring-binding/src/main/java/org/springframework/binding/expression/ExpressionVariable.java
new file mode 100644
index 00000000..65820c80
--- /dev/null
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/ExpressionVariable.java
@@ -0,0 +1,61 @@
+package org.springframework.binding.expression;
+
+import org.springframework.util.Assert;
+
+/**
+ * A simple, convenient alias for a more-complex expression.
+ *
+ * TODO - consider making the valueExpressionString a parsed Expression object for more flexibility.
+ *
+ * @author Keith Donald
+ */
+public class ExpressionVariable {
+
+ private String name;
+
+ private String valueExpressionString;
+
+ /**
+ * Creates a new expression variable
+ * @param name the name of the variable, acting as an convenient alias
+ * @param valueExpressionString the complex expression to be aliased in string form
+ */
+ public ExpressionVariable(String name, String valueExpressionString) {
+ Assert.hasText(name, "The expression variable must be named");
+ Assert.hasText(valueExpressionString, "The expression value expression string is required");
+ this.name = name;
+ this.valueExpressionString = valueExpressionString;
+ }
+
+ /**
+ * Returns the variable name, typically vary simple like "index".
+ * @return the variable name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Returns the expression that will be evaluated when the variable is referenced by its name in another expression.
+ * @return the expression value.
+ */
+ public String getValueExpressionString() {
+ return valueExpressionString;
+ }
+
+ public boolean equals(Object o) {
+ if (!(o instanceof ExpressionVariable)) {
+ return false;
+ }
+ ExpressionVariable var = (ExpressionVariable) o;
+ return name.equals(var.name);
+ }
+
+ public int hashCode() {
+ return name.hashCode();
+ }
+
+ public String toString() {
+ return "[Expression Variable '" + name + "']";
+ }
+}
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/SetValueAttempt.java b/spring-binding/src/main/java/org/springframework/binding/expression/SetValueAttempt.java
index e4b2b9cd..24eabe4b 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/SetValueAttempt.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/SetValueAttempt.java
@@ -34,10 +34,9 @@ public class SetValueAttempt extends EvaluationAttempt {
* @param expression the settable expression
* @param target the target of the expression
* @param value the value that was attempted to be set
- * @param context context attributes that may have influenced the evaluation and set process
*/
- public SetValueAttempt(SettableExpression expression, Object target, Object value, EvaluationContext context) {
- super(expression, target, context);
+ public SetValueAttempt(Expression expression, Object target, Object value) {
+ super(expression, target);
this.value = value;
}
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/el/DefaultELContextFactory.java b/spring-binding/src/main/java/org/springframework/binding/expression/el/DefaultELContextFactory.java
deleted file mode 100644
index 76f95d30..00000000
--- a/spring-binding/src/main/java/org/springframework/binding/expression/el/DefaultELContextFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.springframework.binding.expression.el;
-
-import javax.el.ELContext;
-import javax.el.ELResolver;
-import javax.el.FunctionMapper;
-import javax.el.VariableMapper;
-
-/**
- * A default {@link ELContextFactory} for facilitating use of EL for expression evaluation.
- * @author Jeremy Grelle
- *
- */
-public class DefaultELContextFactory implements ELContextFactory {
-
- /**
- * Configures and returns a simple EL context to use to parse EL expressions.
- * @return The configured simple ELContext instance.
- */
- public ELContext getParseContext() {
- return new SimpleELContext();
- }
-
- /**
- * Configures and returns a simple EL context to use to evaluate EL expressions on the given base target object.
- * @return The configured simple ELContext instance.
- */
- public ELContext getEvaluationContext(Object target) {
- return new SimpleELContext(target);
- }
-
- private static class SimpleELContext extends ELContext {
- private DefaultELResolver resolver = new DefaultELResolver();
-
- public SimpleELContext() {
-
- }
-
- public SimpleELContext(Object target) {
- this.resolver.setTarget(target);
- }
-
- public ELResolver getELResolver() {
- return resolver;
- }
-
- public FunctionMapper getFunctionMapper() {
- return null;
- }
-
- public VariableMapper getVariableMapper() {
- return null;
- }
- }
-}
\ No newline at end of file
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/el/DefaultELResolver.java b/spring-binding/src/main/java/org/springframework/binding/expression/el/DefaultELResolver.java
index 9a45eb17..8fb98122 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/el/DefaultELResolver.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/el/DefaultELResolver.java
@@ -1,17 +1,17 @@
package org.springframework.binding.expression.el;
+import java.util.Iterator;
+import java.util.List;
+
import javax.el.ArrayELResolver;
import javax.el.BeanELResolver;
import javax.el.CompositeELResolver;
import javax.el.ELContext;
+import javax.el.ELResolver;
import javax.el.ListELResolver;
import javax.el.MapELResolver;
-import javax.el.PropertyNotFoundException;
-import javax.el.PropertyNotWritableException;
import javax.el.ResourceBundleELResolver;
-import org.springframework.binding.collection.MapAdaptable;
-
/**
* A generic ELResolver to be used as a default when no other ELResolvers have been configured by the client
* application.
@@ -27,55 +27,48 @@ public class DefaultELResolver extends CompositeELResolver {
private Object target;
- public DefaultELResolver() {
- configureResolvers();
- }
-
- public Class getType(ELContext context, Object base, Object property) {
- return super.getType(context, adaptIfNecessary(base), property);
- }
-
- public Object getValue(ELContext context, Object base, Object property) {
- if (base == null) {
- try {
- return super.getValue(context, target, property);
- } catch (PropertyNotFoundException ex) {
- context.setPropertyResolved(false);
- }
- }
- return super.getValue(context, adaptIfNecessary(base), property);
- }
-
- public void setValue(ELContext context, Object base, Object property, Object val) {
- if (base == null) {
- try {
- super.setValue(context, target, property, val);
- if (context.isPropertyResolved())
- return;
- } catch (PropertyNotWritableException ex) {
- context.setPropertyResolved(false);
- }
- }
- super.setValue(context, adaptIfNecessary(base), property, val);
+ /**
+ * Creates a new default EL resolver for resolving properties of the root object.
+ * @param target the target, or "root", object of the expression
+ */
+ public DefaultELResolver(Object target, List customResolvers) {
+ this.target = target;
+ configureResolvers(customResolvers);
}
public Object getTarget() {
return target;
}
- public void setTarget(Object target) {
- this.target = adaptIfNecessary(target);
+ public Class getType(ELContext context, Object base, Object property) {
+ return super.getType(context, base, property);
}
- private Object adaptIfNecessary(Object base) {
- if (base instanceof MapAdaptable) {
- return ((MapAdaptable) base).asMap();
+ public Object getValue(ELContext context, Object base, Object property) {
+ if (base == null) {
+ return super.getValue(context, target, property);
} else {
- return base;
+ return super.getValue(context, base, property);
}
}
- private void configureResolvers() {
+ public void setValue(ELContext context, Object base, Object property, Object val) {
+ if (base == null) {
+ super.setValue(context, target, property, val);
+ } else {
+ super.setValue(context, base, property, val);
+ }
+ }
+
+ private void configureResolvers(List customResolvers) {
+ if (customResolvers != null) {
+ Iterator i = customResolvers.iterator();
+ while (i.hasNext()) {
+ ELResolver resolver = (ELResolver) i.next();
+ add(resolver);
+ }
+ }
+ add(new MapAdaptableELResolver());
add(new ArrayELResolver());
add(new ListELResolver());
add(new MapELResolver());
@@ -83,4 +76,4 @@ public class DefaultELResolver extends CompositeELResolver {
add(new BeanELResolver());
}
-}
+}
\ No newline at end of file
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/el/ELContextFactory.java b/spring-binding/src/main/java/org/springframework/binding/expression/el/ELContextFactory.java
index 3abfa434..01508de7 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/el/ELContextFactory.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/el/ELContextFactory.java
@@ -2,6 +2,7 @@ package org.springframework.binding.expression.el;
import javax.el.ELContext;
import javax.el.ELResolver;
+import javax.el.VariableMapper;
/**
* A factory for creating a EL context object that will be used to evaluate a target object of an EL expression.
@@ -10,19 +11,14 @@ import javax.el.ELResolver;
*/
public interface ELContextFactory {
- /**
- * Configures and returns an {@link ELContext} to be used in parsing EL expressions.
- * @return ELContext The configured ELContext instance for parsing expressions.
- */
- public ELContext getParseContext();
-
/**
* Configures and returns an {@link ELContext} to be used in evaluating EL expressions on the given base target
* object. In certain environments the target will be null and the base object of the expression is expected to be
* resolved via the ELContext's {@link ELResolver} chain.
- * @param target The base object for the expression evaluation.
+ * @param target The base object for the expression evaluation
+ * @param variableMapper The mapping storing variables needed during expression evaluation
* @return ELContext The configured ELContext instance for evaluating expressions.
*/
- public ELContext getEvaluationContext(Object target);
+ public ELContext getELContext(Object target, VariableMapper variableMapper);
}
\ No newline at end of file
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpression.java b/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpression.java
index 7f9d7c7f..0edddb6a 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpression.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpression.java
@@ -3,68 +3,60 @@ package org.springframework.binding.expression.el;
import javax.el.ELContext;
import javax.el.ELException;
import javax.el.ValueExpression;
+import javax.el.VariableMapper;
import org.springframework.binding.expression.EvaluationAttempt;
-import org.springframework.binding.expression.EvaluationContext;
import org.springframework.binding.expression.EvaluationException;
-import org.springframework.binding.expression.SettableExpression;
+import org.springframework.binding.expression.Expression;
+import org.springframework.util.Assert;
/**
* Evaluates a parsed EL expression.
*
* @author Jeremy Grelle
*/
-public class ELExpression implements SettableExpression {
+public class ELExpression implements Expression {
- private ELContextFactory factory;
+ private ELContextFactory elContextFactory;
- private ValueExpression expression;
+ private ValueExpression valueExpression;
- public ELExpression(ELContextFactory factory, ValueExpression expression) {
- this.factory = factory;
- this.expression = expression;
- }
-
- public void evaluateToSet(Object target, Object value, EvaluationContext context) throws EvaluationException {
- ELContext ctx = getELContext(target);
- try {
- expression.setValue(ctx, value);
- } catch (ELException ex) {
- throw new EvaluationException(new EvaluationAttempt(this, target, context), ex);
- }
- }
-
- public Object evaluate(Object target, EvaluationContext context) throws EvaluationException {
- ELContext ctx = getELContext(target);
- try {
- return expression.getValue(ctx);
- } catch (ELException ex) {
- throw new EvaluationException(new EvaluationAttempt(this, target, context), ex);
- }
- }
-
- protected Class getType(Object target, EvaluationContext context) throws EvaluationException {
- ELContext ctx = getELContext(target);
- try {
- return expression.getType(ctx);
- } catch (ELException ex) {
- throw new EvaluationException(new EvaluationAttempt(this, target, context), ex);
- }
- }
+ private VariableMapper variableMapper;
/**
- * Retrieves an {@link ELContext} instance, configured with a DefaultELResolver if no other resolvers have been
- * configured.
- *
- * @return {@link ELContext} The thread-bound {@link ELContext} instance.
+ * Creates a new el expression
+ * @param factory the el context factory for creating the EL context that will be used during expression evaluation
+ * @param valueExpression the value expression to evaluate
+ * @param variableMapper the variable mapper containing variables needed during expression evaluation
*/
- protected ELContext getELContext(Object target) {
- ELContext ctx = factory.getEvaluationContext(target);
- return ctx;
+ public ELExpression(ELContextFactory factory, ValueExpression valueExpression, VariableMapper variableMapper) {
+ Assert.notNull(factory, "The ELContextFactory is required to evaluate EL expressions");
+ Assert.notNull(valueExpression, "The EL value expression is required for evaluation");
+ this.elContextFactory = factory;
+ this.valueExpression = valueExpression;
+ this.variableMapper = variableMapper;
+ }
+
+ public Object getValue(Object target) throws EvaluationException {
+ ELContext ctx = elContextFactory.getELContext(target, variableMapper);
+ try {
+ return valueExpression.getValue(ctx);
+ } catch (ELException ex) {
+ throw new EvaluationException(new EvaluationAttempt(this, target), ex);
+ }
+ }
+
+ public void setValue(Object target, Object value) throws EvaluationException {
+ ELContext ctx = elContextFactory.getELContext(target, variableMapper);
+ try {
+ valueExpression.setValue(ctx, value);
+ } catch (ELException ex) {
+ throw new EvaluationException(new EvaluationAttempt(this, target), ex);
+ }
}
public int hashCode() {
- return expression.hashCode();
+ return valueExpression.hashCode();
}
public boolean equals(Object o) {
@@ -72,11 +64,11 @@ public class ELExpression implements SettableExpression {
return false;
}
ELExpression other = (ELExpression) o;
- return expression.equals(other.expression);
+ return valueExpression.equals(other.valueExpression);
}
public String toString() {
- return expression.getExpressionString();
+ return valueExpression.getExpressionString();
}
-}
+}
\ No newline at end of file
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpressionParser.java b/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpressionParser.java
index 3f383446..e9d6af6f 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpressionParser.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/el/ELExpressionParser.java
@@ -1,13 +1,20 @@
package org.springframework.binding.expression.el;
+import java.util.HashMap;
+import java.util.Map;
+
import javax.el.ELContext;
import javax.el.ELException;
+import javax.el.ELResolver;
import javax.el.ExpressionFactory;
+import javax.el.FunctionMapper;
+import javax.el.ValueExpression;
+import javax.el.VariableMapper;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
+import org.springframework.binding.expression.ExpressionVariable;
import org.springframework.binding.expression.ParserException;
-import org.springframework.binding.expression.SettableExpression;
/**
* An expression parser that parses EL expressions.
@@ -16,90 +23,118 @@ import org.springframework.binding.expression.SettableExpression;
public class ELExpressionParser implements ExpressionParser {
/**
- * The expression prefix for deferred EL expressions.
+ * The expression prefix.
*/
- private static final String DEFERRED_EL_EXPRESSION_PREFIX = "#{";
+ private static final String EXPRESSION_PREFIX = "#{";
/**
- * The expression suffix for deferred EL expressions.
+ * The expression suffix.
*/
- private static final String DEFERRED_EL_EXPRESSION_SUFFIX = "}";
-
- /**
- * The marked expression delimiter prefix.
- */
- private String expressionPrefix = DEFERRED_EL_EXPRESSION_PREFIX;
-
- /**
- * The marked expression delimiter suffix.
- */
- private String expressionSuffix = DEFERRED_EL_EXPRESSION_SUFFIX;
-
- /**
- * The {@link ELContextFactory} for retrieving a configured ELContext.
- */
- private ELContextFactory contextFactory;
+ private static final String EXPRESSION_SUFFIX = "}";
/**
* The ExpressionFactory for constructing EL expressions
*/
private ExpressionFactory expressionFactory;
+ private Map contextFactories = new HashMap();
+
/**
* Creates a new EL expression parser for standalone usage.
*/
public ELExpressionParser(ExpressionFactory expressionFactory) {
this.expressionFactory = expressionFactory;
- this.contextFactory = new DefaultELContextFactory();
}
/**
- * Creates a new EL expression parser with a custom context factory for a specific environment.
- *
- * @param contextFactory the context factory
+ * Register the ELContextFactory for expressions that evaluate the given class of target object.
+ * @param expressionTargetType the expression target class
+ * @param contextFactory the context factory to use for expressions that evaluate those types of targets
*/
- public ELExpressionParser(ExpressionFactory expressionFactory, ELContextFactory contextFactory) {
- this.expressionFactory = expressionFactory;
- this.contextFactory = contextFactory;
+ public void putContextFactory(Class expressionTargetType, ELContextFactory contextFactory) {
+ this.contextFactories.put(expressionTargetType, contextFactory);
}
- /**
- * Check whether or not given criteria are expressed as an expression.
- */
- public boolean isDelimitedExpression(String expressionString) {
- int prefixIndex = expressionString.indexOf(expressionPrefix);
- if (prefixIndex == -1) {
- return false;
- }
- int suffixIndex = expressionString.indexOf(expressionSuffix, prefixIndex);
- if (suffixIndex == -1) {
- return false;
- } else {
- if (suffixIndex == prefixIndex + expressionPrefix.length()) {
- return false;
- } else {
- return true;
- }
- }
+ public boolean isEvalExpressionString(String expressionString) {
+ return expressionString.startsWith(EXPRESSION_PREFIX) && expressionString.endsWith(EXPRESSION_SUFFIX);
}
- public final Expression parseExpression(String expressionString) throws ParserException {
- return parseSettableExpression(expressionString);
+ public String parseEvalExpressionString(String string) {
+ return encloseInDelimitersIfNecessary(string);
}
- /**
- * Parses the expression string into an EL value expression.
- * @param expressionString
- * @throws ParserException
- */
- public final SettableExpression parseSettableExpression(String expressionString) throws ParserException,
- UnsupportedOperationException {
- ELContext ctx = contextFactory.getParseContext();
+ public Expression parseExpression(String expressionString, Class expressionTargetType,
+ Class expectedEvaluationResultType, ExpressionVariable[] expressionVariables) throws ParserException {
+ ParserELContext context = new ParserELContext();
try {
- return new ELExpression(contextFactory, expressionFactory.createValueExpression(ctx, expressionString,
- Object.class));
+ context.mapVariables(expressionVariables, expressionFactory);
+ ValueExpression expression = expressionFactory.createValueExpression(context, expressionString,
+ expectedEvaluationResultType);
+ ELContextFactory contextFactory = getContextFactory(expressionString, expressionTargetType);
+ return new ELExpression(contextFactory, expression, context.getVariableMapper());
} catch (ELException ex) {
throw new ParserException(expressionString, ex);
}
}
+
+ private String encloseInDelimitersIfNecessary(String expressionString) {
+ if (isEvalExpressionString(expressionString)) {
+ return expressionString;
+ } else {
+ return EXPRESSION_PREFIX + expressionString + EXPRESSION_SUFFIX;
+ }
+ }
+
+ private ELContextFactory getContextFactory(String expressionString, Class expressionTargetType) {
+ if (!contextFactories.containsKey(expressionTargetType)) {
+ throw new ParserException(expressionString, new IllegalArgumentException(
+ "No ELContextFactory registered for expressionTargetType [" + expressionTargetType + "]"));
+ }
+ return (ELContextFactory) contextFactories.get(expressionTargetType);
+ }
+
+ private static class ParserELContext extends ELContext {
+ private VariableMapper variableMapper;
+
+ public ELResolver getELResolver() {
+ return null;
+ }
+
+ public FunctionMapper getFunctionMapper() {
+ return null;
+ }
+
+ public VariableMapper getVariableMapper() {
+ return variableMapper;
+ }
+
+ public void mapVariables(ExpressionVariable[] variables, ExpressionFactory expressionFactory) {
+ if (variables != null && variables.length > 0) {
+ variableMapper = new VariableMapperImpl();
+ for (int i = 0; i < variables.length; i++) {
+ ExpressionVariable var = variables[i];
+ ValueExpression expr = expressionFactory.createValueExpression(this,
+ var.getValueExpressionString(), Object.class);
+ variableMapper.setVariable(var.getName(), expr);
+ }
+ }
+ }
+ }
+
+ private static class VariableMapperImpl extends VariableMapper {
+ private Map variables = new HashMap();
+
+ public ValueExpression resolveVariable(String name) {
+ return (ValueExpression) variables.get(name);
+ }
+
+ public ValueExpression setVariable(String name, ValueExpression value) {
+ return (ValueExpression) variables.put(name, value);
+ }
+
+ public String toString() {
+ return variables.toString();
+ }
+ }
+
}
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/el/MapAdaptableELResolver.java b/spring-binding/src/main/java/org/springframework/binding/expression/el/MapAdaptableELResolver.java
new file mode 100644
index 00000000..83fc6374
--- /dev/null
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/el/MapAdaptableELResolver.java
@@ -0,0 +1,52 @@
+package org.springframework.binding.expression.el;
+
+import java.util.Map;
+
+import javax.el.ELContext;
+import javax.el.ELResolver;
+import javax.el.MapELResolver;
+
+import org.springframework.binding.collection.MapAdaptable;
+
+/**
+ * An {@link ELResolver} for properly resolving variables in an instance of {@link MapAdaptable}
+ * @author Jeremy Grelle
+ */
+public class MapAdaptableELResolver extends MapELResolver {
+
+ public Class getType(ELContext context, Object base, Object property) {
+ if (base instanceof MapAdaptable) {
+ return super.getType(context, adapt(base), property);
+ } else {
+ return null;
+ }
+ }
+
+ public Object getValue(ELContext context, Object base, Object property) {
+ if (base instanceof MapAdaptable) {
+ return super.getValue(context, adapt(base), property);
+ } else {
+ return null;
+ }
+ }
+
+ public boolean isReadOnly(ELContext context, Object base, Object property) {
+ if (base instanceof MapAdaptable) {
+ return super.isReadOnly(context, adapt(base), property);
+ } else {
+ return false;
+ }
+ }
+
+ public void setValue(ELContext context, Object base, Object property, Object value) {
+ if (base instanceof MapAdaptable) {
+ super.setValue(context, adapt(base), property, value);
+ }
+ }
+
+ private Map adapt(Object base) {
+ MapAdaptable adaptable = (MapAdaptable) base;
+ return adaptable.asMap();
+ }
+
+}
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/ognl/OgnlExpression.java b/spring-binding/src/main/java/org/springframework/binding/expression/ognl/OgnlExpression.java
index d3c0198d..5fca7b5f 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/ognl/OgnlExpression.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/ognl/OgnlExpression.java
@@ -16,16 +16,14 @@
package org.springframework.binding.expression.ognl;
import java.util.Collections;
-import java.util.Map;
import ognl.Ognl;
import ognl.OgnlException;
import org.springframework.binding.expression.EvaluationAttempt;
-import org.springframework.binding.expression.EvaluationContext;
import org.springframework.binding.expression.EvaluationException;
+import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.SetValueAttempt;
-import org.springframework.binding.expression.SettableExpression;
import org.springframework.util.Assert;
/**
@@ -36,7 +34,7 @@ import org.springframework.util.Assert;
*
* @author Keith Donald
*/
-class OgnlExpression implements SettableExpression {
+class OgnlExpression implements Expression {
/**
* The expression.
@@ -65,29 +63,29 @@ class OgnlExpression implements SettableExpression {
return expression.equals(other.expression);
}
- public Object evaluate(Object target, EvaluationContext context) throws EvaluationException {
+ public Object getValue(Object target) throws EvaluationException {
Assert.notNull(target, "The target object to evaluate is required");
- Map contextAttributes = (context != null ? context.getAttributes() : Collections.EMPTY_MAP);
try {
- return Ognl.getValue(expression, contextAttributes, target);
+ // TODO context map
+ return Ognl.getValue(expression, Collections.EMPTY_MAP, target);
} catch (OgnlException e) {
if (e.getReason() != null && e.getReason() != e) {
// unwrap the OgnlException since the actual exception is wrapped inside it
// and there is not generic (getCause) way to get to it later on
- throw new EvaluationException(new EvaluationAttempt(this, target, context), e.getReason());
+ throw new EvaluationException(new EvaluationAttempt(this, target), e.getReason());
} else {
- throw new EvaluationException(new EvaluationAttempt(this, target, context), e);
+ throw new EvaluationException(new EvaluationAttempt(this, target), e);
}
}
}
- public void evaluateToSet(Object target, Object value, EvaluationContext context) {
+ public void setValue(Object target, Object value) {
Assert.notNull(target, "The target object to evaluate is required");
- Map contextAttributes = (context != null ? context.getAttributes() : Collections.EMPTY_MAP);
try {
- Ognl.setValue(expression, contextAttributes, target, value);
+ // TODO context map
+ Ognl.setValue(expression, Collections.EMPTY_MAP, target, value);
} catch (OgnlException e) {
- throw new EvaluationException(new SetValueAttempt(this, target, value, context), e);
+ throw new EvaluationException(new SetValueAttempt(this, target, value), e);
}
}
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/ognl/OgnlExpressionParser.java b/spring-binding/src/main/java/org/springframework/binding/expression/ognl/OgnlExpressionParser.java
index 195e08e5..49583209 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/ognl/OgnlExpressionParser.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/ognl/OgnlExpressionParser.java
@@ -22,7 +22,6 @@ import ognl.PropertyAccessor;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ParserException;
-import org.springframework.binding.expression.SettableExpression;
import org.springframework.binding.expression.support.AbstractExpressionParser;
/**
@@ -33,10 +32,6 @@ import org.springframework.binding.expression.support.AbstractExpressionParser;
public class OgnlExpressionParser extends AbstractExpressionParser {
protected Expression doParseExpression(String expressionString) throws ParserException {
- return doParseSettableExpression(expressionString);
- }
-
- public SettableExpression doParseSettableExpression(String expressionString) throws ParserException {
try {
return new OgnlExpression(Ognl.parseExpression(expressionString));
} catch (OgnlException e) {
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/support/AbstractExpressionParser.java b/spring-binding/src/main/java/org/springframework/binding/expression/support/AbstractExpressionParser.java
index e2cddb83..5dca7269 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/support/AbstractExpressionParser.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/support/AbstractExpressionParser.java
@@ -20,8 +20,8 @@ import java.util.List;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
+import org.springframework.binding.expression.ExpressionVariable;
import org.springframework.binding.expression.ParserException;
-import org.springframework.binding.expression.SettableExpression;
import org.springframework.util.StringUtils;
/**
@@ -80,27 +80,17 @@ public abstract class AbstractExpressionParser implements ExpressionParser {
this.expressionSuffix = expressionSuffix;
}
- /**
- * Check whether or not given criteria are expressed as an expression.
- */
- public boolean isDelimitedExpression(String expressionString) {
- int prefixIndex = expressionString.indexOf(getExpressionPrefix());
- if (prefixIndex == -1) {
- return false;
- }
- int suffixIndex = expressionString.indexOf(getExpressionSuffix(), prefixIndex);
- if (suffixIndex == -1) {
- return false;
- } else {
- if (suffixIndex == prefixIndex + getExpressionPrefix().length()) {
- return false;
- } else {
- return true;
- }
- }
+ public boolean isEvalExpressionString(String string) {
+ return string.startsWith(expressionPrefix) && string.endsWith(expressionSuffix);
}
- public final Expression parseExpression(String expressionString) throws ParserException {
+ public String parseEvalExpressionString(String string) {
+ return encloseInDelimitersIfNecessary(string);
+ }
+
+ public Expression parseExpression(String expressionString, Class expressionTargetType,
+ Class expectedEvaluationResultType, ExpressionVariable[] expressionVariables) throws ParserException {
+ // TODO variables
Expression[] expressions = parseExpressions(expressionString);
if (expressions.length == 1) {
return expressions[0];
@@ -109,15 +99,12 @@ public abstract class AbstractExpressionParser implements ExpressionParser {
}
}
- public final SettableExpression parseSettableExpression(String expressionString) throws ParserException,
- UnsupportedOperationException {
- expressionString = expressionString.trim();
- // a settable expression should just be a single expression
- if (expressionString.startsWith(getExpressionPrefix()) && expressionString.endsWith(getExpressionSuffix())) {
- expressionString = expressionString.substring(getExpressionPrefix().length(), expressionString.length()
- - getExpressionSuffix().length());
+ private String encloseInDelimitersIfNecessary(String expressionString) {
+ if (isEvalExpressionString(expressionString)) {
+ return expressionString;
+ } else {
+ return expressionPrefix + expressionString + expressionSuffix;
}
- return doParseSettableExpression(expressionString);
}
/**
@@ -191,14 +178,4 @@ public abstract class AbstractExpressionParser implements ExpressionParser {
*/
protected abstract Expression doParseExpression(String expressionString) throws ParserException;
- /**
- * Template method for parsing a filtered settable expression string. Subclasses should override.
- * @param expressionString the expression string
- * @return the parsed expression
- * @throws ParserException an exception occured during parsing
- * @throws UnsupportedOperationException this parser does not support settable expressions
- */
- protected abstract SettableExpression doParseSettableExpression(String expressionString) throws ParserException,
- UnsupportedOperationException;
-
}
\ No newline at end of file
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/support/BeanWrapperExpression.java b/spring-binding/src/main/java/org/springframework/binding/expression/support/BeanWrapperExpression.java
deleted file mode 100644
index 1e67ed4c..00000000
--- a/spring-binding/src/main/java/org/springframework/binding/expression/support/BeanWrapperExpression.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.binding.expression.support;
-
-import org.springframework.beans.BeanWrapperImpl;
-import org.springframework.beans.BeansException;
-import org.springframework.binding.expression.EvaluationAttempt;
-import org.springframework.binding.expression.EvaluationContext;
-import org.springframework.binding.expression.EvaluationException;
-import org.springframework.binding.expression.SetValueAttempt;
-import org.springframework.binding.expression.SettableExpression;
-import org.springframework.util.Assert;
-
-/**
- * An expression evaluator that uses the Spring bean wrapper.
- *
- * @author Keith Donald
- */
-class BeanWrapperExpression implements SettableExpression {
-
- /**
- * The expression.
- */
- private String expression;
-
- public BeanWrapperExpression(String expression) {
- this.expression = expression;
- }
-
- public int hashCode() {
- return expression.hashCode();
- }
-
- public boolean equals(Object o) {
- if (!(o instanceof BeanWrapperExpression)) {
- return false;
- }
- BeanWrapperExpression other = (BeanWrapperExpression) o;
- return expression.equals(other.expression);
- }
-
- public Object evaluate(Object target, EvaluationContext context) throws EvaluationException {
- try {
- return new BeanWrapperImpl(target).getPropertyValue(expression);
- } catch (BeansException e) {
- throw new EvaluationException(new EvaluationAttempt(this, target, context), e);
- }
- }
-
- public void evaluateToSet(Object target, Object value, EvaluationContext context) throws EvaluationException {
- try {
- Assert.notNull(target, "The target object to evaluate is required");
- new BeanWrapperImpl(target).setPropertyValue(expression, value);
- } catch (BeansException e) {
- throw new EvaluationException(new SetValueAttempt(this, target, value, context), e);
- }
- }
-
- public String toString() {
- return expression;
- }
-}
\ No newline at end of file
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/support/BeanWrapperExpressionParser.java b/spring-binding/src/main/java/org/springframework/binding/expression/support/BeanWrapperExpressionParser.java
deleted file mode 100644
index bd4f6b96..00000000
--- a/spring-binding/src/main/java/org/springframework/binding/expression/support/BeanWrapperExpressionParser.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.binding.expression.support;
-
-import org.springframework.binding.expression.Expression;
-import org.springframework.binding.expression.ParserException;
-import org.springframework.binding.expression.SettableExpression;
-
-/**
- * An expression parser that parses bean wrapper expressions.
- *
- * @author Keith Donald
- */
-public class BeanWrapperExpressionParser extends AbstractExpressionParser {
-
- protected Expression doParseExpression(String expressionString) throws ParserException {
- return doParseSettableExpression(expressionString);
- }
-
- public SettableExpression doParseSettableExpression(String expressionString) throws ParserException {
- return new BeanWrapperExpression(expressionString);
- }
-}
\ No newline at end of file
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/support/CollectionAddingExpression.java b/spring-binding/src/main/java/org/springframework/binding/expression/support/CollectionAddingExpression.java
index e18136a6..4950828b 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/support/CollectionAddingExpression.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/support/CollectionAddingExpression.java
@@ -17,11 +17,9 @@ package org.springframework.binding.expression.support;
import java.util.Collection;
-import org.springframework.binding.expression.EvaluationContext;
import org.springframework.binding.expression.EvaluationException;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.SetValueAttempt;
-import org.springframework.binding.expression.SettableExpression;
import org.springframework.core.style.ToStringCreator;
import org.springframework.util.Assert;
@@ -30,7 +28,7 @@ import org.springframework.util.Assert;
*
* @author Keith Donald
*/
-public class CollectionAddingExpression implements SettableExpression {
+public class CollectionAddingExpression implements Expression {
/**
* The expression that resolves a mutable collection reference.
@@ -45,14 +43,14 @@ public class CollectionAddingExpression implements SettableExpression {
this.collectionExpression = collectionExpression;
}
- public Object evaluate(Object target, EvaluationContext context) throws EvaluationException {
- return collectionExpression.evaluate(target, context);
+ public Object getValue(Object target) throws EvaluationException {
+ return collectionExpression.getValue(target);
}
- public void evaluateToSet(Object target, Object value, EvaluationContext context) throws EvaluationException {
- Object result = evaluate(target, context);
+ public void setValue(Object target, Object value) throws EvaluationException {
+ Object result = getValue(target);
if (result == null) {
- throw new EvaluationException(new SetValueAttempt(this, target, value, null), new IllegalArgumentException(
+ throw new EvaluationException(new SetValueAttempt(this, target, value), new IllegalArgumentException(
"The collection expression evaluated to a [null] reference"));
}
Assert.isInstanceOf(Collection.class, result, "Not a collection: ");
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/support/CompositeStringExpression.java b/spring-binding/src/main/java/org/springframework/binding/expression/support/CompositeStringExpression.java
index 89ce2581..72795c28 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/support/CompositeStringExpression.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/support/CompositeStringExpression.java
@@ -15,7 +15,6 @@
*/
package org.springframework.binding.expression.support;
-import org.springframework.binding.expression.EvaluationContext;
import org.springframework.binding.expression.EvaluationException;
import org.springframework.binding.expression.Expression;
import org.springframework.core.style.ToStringCreator;
@@ -41,14 +40,18 @@ public class CompositeStringExpression implements Expression {
this.expressions = expressions;
}
- public Object evaluate(Object target, EvaluationContext evaluationContext) throws EvaluationException {
+ public Object getValue(Object target) throws EvaluationException {
StringBuffer buffer = new StringBuffer(128);
for (int i = 0; i < expressions.length; i++) {
- buffer.append(expressions[i].evaluate(target, evaluationContext));
+ buffer.append(expressions[i].getValue(target));
}
return buffer.toString();
}
+ public void setValue(Object target, Object value) throws EvaluationException {
+ throw new UnsupportedOperationException("Cannot set a composite string expression value");
+ }
+
public String toString() {
return new ToStringCreator(this).append("expressions", expressions).toString();
}
diff --git a/spring-binding/src/main/java/org/springframework/binding/expression/support/StaticExpression.java b/spring-binding/src/main/java/org/springframework/binding/expression/support/StaticExpression.java
index 7ed9bdf9..c7496cd5 100644
--- a/spring-binding/src/main/java/org/springframework/binding/expression/support/StaticExpression.java
+++ b/spring-binding/src/main/java/org/springframework/binding/expression/support/StaticExpression.java
@@ -15,7 +15,6 @@
*/
package org.springframework.binding.expression.support;
-import org.springframework.binding.expression.EvaluationContext;
import org.springframework.binding.expression.EvaluationException;
import org.springframework.binding.expression.Expression;
import org.springframework.util.ObjectUtils;
@@ -25,7 +24,7 @@ import org.springframework.util.ObjectUtils;
*
* @author Keith Donald
*/
-public class StaticExpression implements Expression {
+public final class StaticExpression implements Expression {
/**
* The value expression.
@@ -56,10 +55,14 @@ public class StaticExpression implements Expression {
return ObjectUtils.nullSafeEquals(value, other.value);
}
- public Object evaluate(Object target, EvaluationContext context) throws EvaluationException {
+ public Object getValue(Object target) throws EvaluationException {
return value;
}
+ public void setValue(Object target, Object value) throws EvaluationException {
+ this.value = value;
+ }
+
public String toString() {
return String.valueOf(value);
}
diff --git a/spring-binding/src/main/java/org/springframework/binding/mapping/Mapping.java b/spring-binding/src/main/java/org/springframework/binding/mapping/Mapping.java
index c58db23b..d8dce049 100644
--- a/spring-binding/src/main/java/org/springframework/binding/mapping/Mapping.java
+++ b/spring-binding/src/main/java/org/springframework/binding/mapping/Mapping.java
@@ -19,7 +19,6 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.binding.convert.ConversionExecutor;
import org.springframework.binding.expression.Expression;
-import org.springframework.binding.expression.SettableExpression;
import org.springframework.core.style.ToStringCreator;
import org.springframework.util.Assert;
@@ -41,7 +40,7 @@ public class Mapping implements AttributeMapper {
/**
* The target expression to set on a target object to map to.
*/
- private final SettableExpression targetExpression;
+ private final Expression targetExpression;
/**
* A type converter to apply during the mapping process.
@@ -59,7 +58,7 @@ public class Mapping implements AttributeMapper {
* @param targetExpression the target expression
* @param typeConverter a type converter
*/
- public Mapping(Expression sourceExpression, SettableExpression targetExpression, ConversionExecutor typeConverter) {
+ public Mapping(Expression sourceExpression, Expression targetExpression, ConversionExecutor typeConverter) {
this(sourceExpression, targetExpression, typeConverter, false);
}
@@ -70,8 +69,8 @@ public class Mapping implements AttributeMapper {
* @param typeConverter a type converter
* @param required whether or not this mapping is required
*/
- protected Mapping(Expression sourceExpression, SettableExpression targetExpression,
- ConversionExecutor typeConverter, boolean required) {
+ protected Mapping(Expression sourceExpression, Expression targetExpression, ConversionExecutor typeConverter,
+ boolean required) {
Assert.notNull(sourceExpression, "The source expression is required");
Assert.notNull(targetExpression, "The target expression is required");
this.sourceExpression = sourceExpression;
@@ -88,7 +87,7 @@ public class Mapping implements AttributeMapper {
*/
public void map(Object source, Object target, MappingContext context) {
// get source value
- Object sourceValue = sourceExpression.evaluate(source, null);
+ Object sourceValue = sourceExpression.getValue(source);
if (sourceValue == null) {
if (required) {
throw new RequiredMappingException("This mapping is required; evaluation of expression '"
@@ -108,7 +107,7 @@ public class Mapping implements AttributeMapper {
logger.debug("Mapping '" + sourceExpression + "' value [" + sourceValue + "] to target property '"
+ targetExpression + "'; setting property value to [" + targetValue + "]");
}
- targetExpression.evaluateToSet(target, targetValue, null);
+ targetExpression.setValue(target, targetValue);
}
public boolean equals(Object o) {
diff --git a/spring-binding/src/main/java/org/springframework/binding/mapping/MappingBuilder.java b/spring-binding/src/main/java/org/springframework/binding/mapping/MappingBuilder.java
index 6d836956..7ce80446 100644
--- a/spring-binding/src/main/java/org/springframework/binding/mapping/MappingBuilder.java
+++ b/spring-binding/src/main/java/org/springframework/binding/mapping/MappingBuilder.java
@@ -20,7 +20,6 @@ import org.springframework.binding.convert.ConversionService;
import org.springframework.binding.convert.support.DefaultConversionService;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ExpressionParser;
-import org.springframework.binding.expression.SettableExpression;
import org.springframework.binding.expression.support.CollectionAddingExpression;
import org.springframework.util.Assert;
@@ -61,7 +60,7 @@ public class MappingBuilder {
/**
* The target mapping settable expression.
*/
- private SettableExpression targetExpression;
+ private Expression targetExpression;
/**
* The type of the object returned by evaluating the source expression.
@@ -102,7 +101,7 @@ public class MappingBuilder {
* @return this, to support call-chaining
*/
public MappingBuilder source(String expressionString) {
- sourceExpression = expressionParser.parseExpression(expressionString);
+ sourceExpression = expressionParser.parseExpression(expressionString, Object.class, Object.class, null);
return this;
}
@@ -112,7 +111,7 @@ public class MappingBuilder {
* @return this, to support call-chaining
*/
public MappingBuilder target(String expressionString) {
- targetExpression = (SettableExpression) expressionParser.parseExpression(expressionString);
+ targetExpression = expressionParser.parseExpression(expressionString, Object.class, Object.class, null);
return this;
}
@@ -122,7 +121,8 @@ public class MappingBuilder {
* @return this, to support call-chaining
*/
public MappingBuilder targetCollection(String expressionString) {
- targetExpression = new CollectionAddingExpression(expressionParser.parseSettableExpression(expressionString));
+ targetExpression = new CollectionAddingExpression(expressionParser.parseExpression(expressionString,
+ Object.class, Object.class, null));
return this;
}
@@ -164,7 +164,7 @@ public class MappingBuilder {
public Mapping value() {
Assert.notNull(sourceExpression, "The source expression must be set at a minimum");
if (targetExpression == null) {
- targetExpression = (SettableExpression) sourceExpression;
+ targetExpression = sourceExpression;
}
ConversionExecutor typeConverter = null;
if (sourceType != null) {
diff --git a/spring-binding/src/main/java/org/springframework/binding/mapping/RequiredMapping.java b/spring-binding/src/main/java/org/springframework/binding/mapping/RequiredMapping.java
index 0e659319..39410065 100644
--- a/spring-binding/src/main/java/org/springframework/binding/mapping/RequiredMapping.java
+++ b/spring-binding/src/main/java/org/springframework/binding/mapping/RequiredMapping.java
@@ -17,7 +17,6 @@ package org.springframework.binding.mapping;
import org.springframework.binding.convert.ConversionExecutor;
import org.springframework.binding.expression.Expression;
-import org.springframework.binding.expression.SettableExpression;
/**
* A mapping that is required.
@@ -32,7 +31,7 @@ public class RequiredMapping extends Mapping {
* @param targetPropertyExpression the target property expression
* @param typeConverter a type converter
*/
- public RequiredMapping(Expression sourceExpression, SettableExpression targetPropertyExpression,
+ public RequiredMapping(Expression sourceExpression, Expression targetPropertyExpression,
ConversionExecutor typeConverter) {
super(sourceExpression, targetPropertyExpression, typeConverter, true);
}
diff --git a/spring-binding/src/main/java/org/springframework/binding/message/DefaultMessageContextFactory.java b/spring-binding/src/main/java/org/springframework/binding/message/DefaultMessageContextFactory.java
new file mode 100644
index 00000000..221956cb
--- /dev/null
+++ b/spring-binding/src/main/java/org/springframework/binding/message/DefaultMessageContextFactory.java
@@ -0,0 +1,88 @@
+package org.springframework.binding.message;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.springframework.context.MessageSource;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.util.Assert;
+import org.springframework.util.CachingMapDecorator;
+
+/**
+ * Default message context factory that simply stores messages indexed in a map by their source. Suitable for use in
+ * most Spring applications that use Spring message sources for message resource bundles. Holds a reference to a Spring
+ * message resource bundle for performing message text resolution.
+ *
+ * @author Keith Donald
+ */
+public class DefaultMessageContextFactory implements MessageContextFactory {
+
+ private MessageSource messageSource;
+
+ /**
+ * Create a new message context factory.
+ * @param messageSource
+ */
+ public DefaultMessageContextFactory(MessageSource messageSource) {
+ Assert.notNull(messageSource, "The message source is required");
+ this.messageSource = messageSource;
+ }
+
+ public StateManageableMessageContext createMessageContext() {
+ return new MessageContextImpl(messageSource);
+ }
+
+ private static class MessageContextImpl implements StateManageableMessageContext {
+
+ private MessageSource messageSource;
+
+ private Map objectMessages = new CachingMapDecorator() {
+ protected Object create(Object objectId) {
+ return new ArrayList();
+ }
+ };
+
+ public MessageContextImpl(MessageSource messageSource) {
+ this.messageSource = messageSource;
+ }
+
+ public Serializable createMessagesMemento() {
+ return new HashMap(objectMessages);
+ }
+
+ public void restoreMessages(Serializable messagesMemento) {
+ this.objectMessages.putAll((Map) messagesMemento);
+ }
+
+ public void addMessage(MessageResolver messageResolver) {
+ Locale currentLocale = LocaleContextHolder.getLocale();
+ Message message = messageResolver.resolveMessage(messageSource, currentLocale);
+ List messages = (List) objectMessages.get(message.getSource());
+ messages.add(message);
+ }
+
+ public Message[] getMessages() {
+ List messages = new ArrayList();
+ Iterator i = objectMessages.keySet().iterator();
+ while (i.hasNext()) {
+ messages.addAll((List) objectMessages.get(i.next()));
+ }
+ return (Message[]) messages.toArray(new Message[messages.size()]);
+ }
+
+ public Message[] getMessages(Object source) {
+ List messages = (List) objectMessages.get(source);
+ return (Message[]) messages.toArray(new Message[messages.size()]);
+ }
+
+ public void clearMessages() {
+ objectMessages.clear();
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/spring-binding/src/main/java/org/springframework/binding/message/Message.java b/spring-binding/src/main/java/org/springframework/binding/message/Message.java
new file mode 100644
index 00000000..35d24c14
--- /dev/null
+++ b/spring-binding/src/main/java/org/springframework/binding/message/Message.java
@@ -0,0 +1,57 @@
+package org.springframework.binding.message;
+
+import java.io.Serializable;
+
+/**
+ * An object of communication that provides text information from a source. For example, a validation message may inform
+ * a web application user a business rule was violated. A messages comes from a source, has text providing the basis for
+ * communication, and has severity indicating the priority or intensity of the message for its receiver.
+ *
+ * @author Keith Donald
+ */
+public class Message implements Serializable {
+
+ private Object source;
+
+ private String text;
+
+ private Severity severity;
+
+ /**
+ * Creates a new message.
+ * @param source the source of the message
+ * @param text the message text
+ * @param severity the message severity
+ */
+ public Message(Object source, String text, Severity severity) {
+ super();
+ this.source = source;
+ this.text = text;
+ this.severity = severity;
+ }
+
+ /**
+ * Returns the source of this message. The source is the object that sent the message.
+ * @return the source
+ */
+ public Object getSource() {
+ return source;
+ }
+
+ /**
+ * Returns the message text. The text is the message's communication payload.
+ * @return the message text
+ */
+ public String getText() {
+ return text;
+ }
+
+ /**
+ * Returns the severity of this message. The severity indicates the intensity or priority of the communication.
+ * @return the message severity
+ */
+ public Severity getSeverity() {
+ return severity;
+ }
+
+}
diff --git a/spring-binding/src/main/java/org/springframework/binding/message/MessageContext.java b/spring-binding/src/main/java/org/springframework/binding/message/MessageContext.java
new file mode 100644
index 00000000..7440999c
--- /dev/null
+++ b/spring-binding/src/main/java/org/springframework/binding/message/MessageContext.java
@@ -0,0 +1,32 @@
+package org.springframework.binding.message;
+
+/**
+ * A context for recording and retrieving messages for display.
+ */
+public interface MessageContext {
+
+ /**
+ * Get all messages in this context. The messages returned should be suitable for display as-is.
+ * @return the messages
+ */
+ public Message[] getMessages();
+
+ /**
+ * Get all messages in this context from the source provided.
+ * @param source the source that recorded the message
+ * @return the source's messages
+ */
+ public Message[] getMessages(Object source);
+
+ /**
+ * Add a new message to this context.
+ * @param messageResolver the resolver that will resolve the message to be added
+ */
+ public void addMessage(MessageResolver messageResolver);
+
+ /**
+ * Clear all messages added to this context.
+ */
+ public void clearMessages();
+
+}
diff --git a/spring-binding/src/main/java/org/springframework/binding/message/MessageContextFactory.java b/spring-binding/src/main/java/org/springframework/binding/message/MessageContextFactory.java
new file mode 100644
index 00000000..5226fc1b
--- /dev/null
+++ b/spring-binding/src/main/java/org/springframework/binding/message/MessageContextFactory.java
@@ -0,0 +1,16 @@
+package org.springframework.binding.message;
+
+/**
+ * A factory for creating message context's whose internal state can be externally managed. Encapsulates the message
+ * context implementation used in a given environment.
+ *
+ * @author Keith Donald
+ */
+public interface MessageContextFactory {
+
+ /**
+ * Create a new message context.
+ * @return the message context, initially empty, capable of having its state managed by an external care-taker.
+ */
+ public StateManageableMessageContext createMessageContext();
+}
diff --git a/spring-binding/src/main/java/org/springframework/binding/message/MessageResolver.java b/spring-binding/src/main/java/org/springframework/binding/message/MessageResolver.java
new file mode 100644
index 00000000..7d3eab92
--- /dev/null
+++ b/spring-binding/src/main/java/org/springframework/binding/message/MessageResolver.java
@@ -0,0 +1,24 @@
+package org.springframework.binding.message;
+
+import java.util.Locale;
+
+import org.springframework.context.MessageSource;
+
+/**
+ * A factory for a Message. Allows a Message to be internationalized and to be resolved from a
+ * {@link MessageSource message resource bundle}.
+ *
+ * @author Keith Donald
+ * @see Message
+ * @see MessageSource
+ */
+public interface MessageResolver {
+
+ /**
+ * Resolve the message from the message source using the current locale.
+ * @param messageSource the message source, an abstraction for a resource bundle
+ * @param locale the current locale of this request
+ * @return the resolved message
+ */
+ public Message resolveMessage(MessageSource messageSource, Locale locale);
+}
diff --git a/spring-binding/src/main/java/org/springframework/binding/message/Messages.java b/spring-binding/src/main/java/org/springframework/binding/message/Messages.java
new file mode 100644
index 00000000..ccb8c72f
--- /dev/null
+++ b/spring-binding/src/main/java/org/springframework/binding/message/Messages.java
@@ -0,0 +1,225 @@
+package org.springframework.binding.message;
+
+import java.util.Locale;
+
+import org.springframework.context.MessageSource;
+
+/**
+ * A convenient factory for creating {@link MessageResolver} objects programmatically. Often used by model code such as
+ * validation logic to conveniently record validation messages. Supports the production of "text" message resolvers that
+ * hard-code their message text, as well as message resolvers that retrieve their text from a
+ * {@link MessageSource message resource bundle}.
+ *
+ * @author Keith Donald
+ */
+public class Messages implements MessageResolver {
+
+ private Object source;
+
+ private String code;
+
+ private Severity severity;
+
+ private Object[] args;
+
+ private String defaultText;
+
+ private Messages(Object source, String code, Severity severity, Object[] args, String defaultText) {
+ this.source = source;
+ this.code = code;
+ this.severity = severity;
+ this.args = args;
+ this.defaultText = defaultText;
+ }
+
+ public Message resolveMessage(MessageSource messageSource, Locale locale) {
+ if (messageSource != null && (code != null && code.length() > 0)) {
+ return new Message(source, getMessageText(messageSource, locale), severity);
+ } else {
+ return new Message(source, defaultText, severity);
+ }
+ }
+
+ /**
+ * Creates a message resolver that creates a INFO {@link Message} with the text provided.
+ * @param text the raw message text that will be used as-is
+ * @return the message resolver
+ */
+ public static Messages text(String text) {
+ return new Messages(null, null, Severity.INFO, null, text);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Message} with the text and severity provided.
+ * @param text the raw message text that will be used as-is
+ * @param severity the desired message severity
+ * @return the message resolver
+ */
+ public static Messages text(String text, Severity severity) {
+ return new Messages(null, null, severity, null, text);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#INFO info} {@link Message message} with its text
+ * resolved from a message bundle by using the provided message code.
+ * @param code the message code
+ * @return the message resolver
+ */
+ public static Messages info(String code) {
+ return new Messages(null, code, Severity.INFO, null, null);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#WARNING warning} {@link Message message} with its text
+ * resolved from a message bundle by using the provided message code.
+ * @param code the message code
+ * @return the message resolver
+ */
+ public static Messages warning(String code) {
+ return new Messages(null, code, Severity.WARNING, null, null);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#ERROR error} {@link Message message} with its text
+ * resolved from a message bundle by using the provided message code.
+ * @param code the message code
+ * @return the message resolver
+ */
+ public static Messages error(String code) {
+ return new Messages(null, code, Severity.ERROR, null, null);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#INFO info} {@link Message message} with its text
+ * resolved from a message bundle by using the provided message code and message arguments.
+ * @param code the message code
+ * @param args the message arguments
+ * @return the message resolver
+ */
+ public static Messages info(String code, Object[] args) {
+ return new Messages(null, code, Severity.INFO, args, null);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#WARNING warning} {@link Message message} with its text
+ * resolved from a message bundle by using the provided message code and message arguments.
+ * @param code the message code
+ * @param args the message arguments
+ * @return the message resolver
+ */
+ public static Messages warning(String code, Object[] args) {
+ return new Messages(null, code, Severity.WARNING, args, null);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#ERROR error} {@link Message message} with its text
+ * resolved from a message bundle by using the provided message code and message arguments.
+ * @param code the message code
+ * @param args the message arguments
+ * @return the message resolver
+ */
+ public static Messages error(String code, Object[] args) {
+ return new Messages(null, code, Severity.ERROR, args, null);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#INFO info} {@link Message message} from the source with
+ * the text provided.
+ * @param source the source of the message
+ * @param text the message text
+ * @return the message resolver
+ */
+ public static Messages text(Object source, String text) {
+ return new Messages(source, null, Severity.INFO, null, text);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Message message} from the source with the text and severity
+ * provided.
+ * @param source the source of the message
+ * @param text the message text
+ * @param severity the message severity
+ * @return the message resolver
+ */
+ public static Messages text(Object source, String text, Severity severity) {
+ return new Messages(source, null, severity, null, text);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#INFO info} {@link Message message} from the source with
+ * its text resolved from a message bundle by using the provided message code.
+ * @param source the source of the message
+ * @param code the message code
+ * @return the message resolver
+ */
+ public static Messages info(Object source, String code) {
+ return new Messages(source, code, Severity.INFO, null, null);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#WARNING warning} {@link Message message} from the
+ * source with its text resolved from a message bundle by using the provided message code.
+ * @param source the source of the message
+ * @param code the message code
+ * @return the message resolver
+ */
+ public static Messages warning(Object source, String code) {
+ return new Messages(source, code, Severity.WARNING, null, null);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#ERROR error} {@link Message message} from the source
+ * with its text resolved from a message bundle by using the provided message code.
+ * @param source the source of the message
+ * @param code the message code
+ * @return the message resolver
+ */
+ public static Messages error(Object source, String code) {
+ return new Messages(source, code, Severity.ERROR, null, null);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#INFO info} {@link Message message} from the source with
+ * its text resolved from a message bundle by using the provided message code and message arguments.
+ * @param source the source of the message
+ * @param code the message code
+ * @param args the message arguments
+ * @return the message resolver
+ */
+ public static Messages info(Object source, String code, Object[] args) {
+ return new Messages(source, code, Severity.INFO, args, null);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#WARNING warning} {@link Message message} from the
+ * source with its text resolved from a message bundle by using the provided message code and message arguments.
+ * @param source the source of the message
+ * @param code the message code
+ * @param args the message arguments
+ * @return the message resolver
+ */
+ public static Messages warning(Object source, String code, Object[] args) {
+ return new Messages(source, code, Severity.WARNING, args, null);
+ }
+
+ /**
+ * Creates a message resolver that creates a {@link Severity#ERROR error} {@link Message message} from the source
+ * with its text resolved from a message bundle by using the provided message code and message arguments.
+ * @param source the source of the message
+ * @param code the message code
+ * @param args the message arguments
+ * @return the message resolver
+ */
+ public static Messages error(Object source, String code, Object[] args) {
+ return new Messages(source, code, Severity.ERROR, args, null);
+ }
+
+ private String getMessageText(MessageSource source, Locale locale) {
+ if (defaultText == null) {
+ return source.getMessage(code, args, locale);
+ } else {
+ return source.getMessage(code, args, defaultText, locale);
+ }
+ }
+
+}
diff --git a/spring-binding/src/main/java/org/springframework/binding/message/Severity.java b/spring-binding/src/main/java/org/springframework/binding/message/Severity.java
new file mode 100644
index 00000000..de7a64a6
--- /dev/null
+++ b/spring-binding/src/main/java/org/springframework/binding/message/Severity.java
@@ -0,0 +1,32 @@
+package org.springframework.binding.message;
+
+import org.springframework.core.enums.StaticLabeledEnum;
+
+/**
+ * Enum exposing supported message severities.
+ *
+ * @author Keith Donald
+ * @see Message
+ */
+public class Severity extends StaticLabeledEnum {
+
+ /**
+ * The "Informational" severity. Used to indicate a successful operation or result.
+ */
+ public static final Severity INFO = new Severity(0, "Info");
+
+ /**
+ * The "Warning" severity. Used to indicate there is a minor problem, or to inform the message receiver of possible
+ * misuse, or to indicate a problem may arise in the future.
+ */
+ public static final Severity WARNING = new Severity(1, "Warning");
+
+ /**
+ * THe "Error" severity. Used to indicate a significant problem like a business rule violation.
+ */
+ public static final Severity ERROR = new Severity(2, "Error");
+
+ private Severity(int code, String label) {
+ super(code, label);
+ }
+}
diff --git a/spring-binding/src/main/java/org/springframework/binding/message/StateManageableMessageContext.java b/spring-binding/src/main/java/org/springframework/binding/message/StateManageableMessageContext.java
new file mode 100644
index 00000000..67aa21a7
--- /dev/null
+++ b/spring-binding/src/main/java/org/springframework/binding/message/StateManageableMessageContext.java
@@ -0,0 +1,26 @@
+package org.springframework.binding.message;
+
+import java.io.Serializable;
+
+/**
+ * A message context whose internal state can be managed by an external care-taker. State management employs the GOF
+ * Memento pattern. This context can produce a serializable memento representing its internal state at any time. A
+ * care-taker can then use that memento at a later time to restore any context instance to a previous state.
+ *
+ * @author Keith Donald
+ */
+public interface StateManageableMessageContext extends MessageContext {
+
+ /**
+ * Create a serializable memento (token) representing a snapshot of the internal state of this message context.
+ * @return the messages memento
+ */
+ public Serializable createMessagesMemento();
+
+ /**
+ * Set the state of this context from the memento provided. After this call, the messages in this context will match
+ * what is encapsulated inside the memento. Any previous state will be overridden.
+ * @param messagesMemento the messages memento
+ */
+ public void restoreMessages(Serializable messagesMemento);
+}
diff --git a/spring-binding/src/main/java/org/springframework/binding/method/MethodInvoker.java b/spring-binding/src/main/java/org/springframework/binding/method/MethodInvoker.java
index 28e30520..67e71790 100644
--- a/spring-binding/src/main/java/org/springframework/binding/method/MethodInvoker.java
+++ b/spring-binding/src/main/java/org/springframework/binding/method/MethodInvoker.java
@@ -70,7 +70,7 @@ public class MethodInvoker {
Object[] arguments = new Object[parameters.size()];
for (int i = 0; i < parameters.size(); i++) {
Parameter parameter = parameters.getParameter(i);
- Object argument = parameter.evaluateArgument(argumentSource, null);
+ Object argument = parameter.evaluateArgument(argumentSource);
arguments[i] = applyTypeConversion(argument, parameter.getType());
}
Class[] parameterTypes = parameters.getTypesArray();
diff --git a/spring-binding/src/main/java/org/springframework/binding/method/Parameter.java b/spring-binding/src/main/java/org/springframework/binding/method/Parameter.java
index 45888eef..455d7541 100644
--- a/spring-binding/src/main/java/org/springframework/binding/method/Parameter.java
+++ b/spring-binding/src/main/java/org/springframework/binding/method/Parameter.java
@@ -15,7 +15,6 @@
*/
package org.springframework.binding.method;
-import org.springframework.binding.expression.EvaluationContext;
import org.springframework.binding.expression.Expression;
import org.springframework.core.style.ToStringCreator;
import org.springframework.util.Assert;
@@ -66,12 +65,11 @@ public class Parameter {
/**
* Evaluate this method parameter against the provided argument source, returning a single method argument value.
- * @param argumentSource the meyhod argument source
- * @param context the evaluation context
+ * @param argumentSource the method argument source
* @return the method argument value
*/
- public Object evaluateArgument(Object argumentSource, EvaluationContext context) {
- return name.evaluate(argumentSource, context);
+ public Object evaluateArgument(Object argumentSource) {
+ return name.getValue(argumentSource);
}
public boolean equals(Object obj) {
diff --git a/spring-binding/src/test/java/org/springframework/binding/expression/el/ELExpressionParserTests.java b/spring-binding/src/test/java/org/springframework/binding/expression/el/ELExpressionParserTests.java
index 236d9553..a8938d41 100644
--- a/spring-binding/src/test/java/org/springframework/binding/expression/el/ELExpressionParserTests.java
+++ b/spring-binding/src/test/java/org/springframework/binding/expression/el/ELExpressionParserTests.java
@@ -1,92 +1,160 @@
package org.springframework.binding.expression.el;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.el.ELContext;
+import javax.el.ELResolver;
+import javax.el.FunctionMapper;
+import javax.el.VariableMapper;
import junit.framework.TestCase;
-import org.easymock.EasyMock;
import org.jboss.el.ExpressionFactoryImpl;
import org.springframework.binding.expression.Expression;
-import org.springframework.binding.expression.support.TestBean;
-import org.springframework.binding.expression.support.TestMethods;
+import org.springframework.binding.expression.ExpressionVariable;
-/**
- * Tests to exercise the extended method invoking expression extensions of JBoss-el.
- * @author Jeremy Grelle
- */
public class ELExpressionParserTests extends TestCase {
- ELExpressionParser parser = new ELExpressionParser(new ExpressionFactoryImpl());
+ private ELExpressionParser parser = new ELExpressionParser(new ExpressionFactoryImpl());
- Map context;
-
- Map container;
-
- TestMethods target;
-
- protected void setUp() throws Exception {
- context = new HashMap();
- container = new HashMap();
- target = (TestMethods) EasyMock.createMock(TestMethods.class);
- context.put("container", container);
- container.put("myObject", target);
+ public void setUp() {
+ parser.putContextFactory(TestBean.class, new TestELContextFactory());
}
- public void testWithIntParam() {
- String expression = "#{container.myObject.doSomethingWithInt(container.param1)}";
- int param = 5;
- container.put("param1", new Integer(param));
- target.doSomethingWithInt(param);
- EasyMock.replay(new Object[] { target });
+ private static class TestELContextFactory implements ELContextFactory {
+ public ELContext getELContext(final Object target, final VariableMapper variableMapper) {
+ return new ELContext() {
+ public ELResolver getELResolver() {
+ return new DefaultELResolver(target, null);
+ }
- parser.parseExpression(expression).evaluate(context, null);
- EasyMock.verify(new Object[] { target });
+ public FunctionMapper getFunctionMapper() {
+ return null;
+ }
+ public VariableMapper getVariableMapper() {
+ return variableMapper;
+ }
+ };
+ }
}
- public void testReturnWithIntParam() {
- String expected = "sucess";
- String expression = "#{container.myObject.returnStringFromInt(container.param1)}";
- int param = 5;
- container.put("param1", new Integer(param));
- EasyMock.expect(target.returnStringFromInt(param)).andReturn(expected);
- EasyMock.replay(new Object[] { target });
-
- String result = (String) parser.parseExpression(expression).evaluate(context, null);
- EasyMock.verify(new Object[] { target });
- assertEquals(expected, result);
+ public void testParseEvalExpression() {
+ String expressionString = "#{value}";
+ Class expressionTargetType = TestBean.class;
+ Class expectedEvaluationResultType = String.class;
+ ExpressionVariable[] expressionVariables = null;
+ Expression exp = parser.parseExpression(expressionString, expressionTargetType, expectedEvaluationResultType,
+ expressionVariables);
+ TestBean target = new TestBean();
+ assertEquals("foo", exp.getValue(target));
}
- public void testReturnWithIntAndObject() {
- String expected = "success";
- String expression = "#{container.myObject.returnStringFromIntAndObject(container.param1, container.param2)}";
- int param1 = 5;
- container.put("param1", new Integer(param1));
- TestBean param2 = new TestBean();
- container.put("param2", param2);
- EasyMock.expect(target.returnStringFromIntAndObject(param1, param2)).andReturn(expected);
- EasyMock.replay(new Object[] { target });
-
- String result = (String) parser.parseExpression(expression).evaluate(context, null);
- EasyMock.verify(new Object[] { target });
- assertEquals(expected, result);
+ public void testParseLiteralExpressionStringAsEvalExpression() {
+ String expressionString = "value";
+ Class expressionTargetType = TestBean.class;
+ Class expectedEvaluationResultType = String.class;
+ ExpressionVariable[] expressionVariables = null;
+ Expression exp = parser.parseExpression(parser.parseEvalExpressionString(expressionString),
+ expressionTargetType, expectedEvaluationResultType, expressionVariables);
+ TestBean target = new TestBean();
+ assertEquals("foo", exp.getValue(target));
}
- public void testEmptyMethod() {
-
- String expStr1 = "#{foo.bar()}";
- Expression result1 = parser.parseExpression(expStr1);
- assertNotNull(result1);
- assertEquals(expStr1, result1.toString());
+ public void testParseLiteralExpression() {
+ String expressionString = "value";
+ Class expressionTargetType = TestBean.class;
+ Class expectedEvaluationResultType = String.class;
+ ExpressionVariable[] expressionVariables = null;
+ Expression exp = parser.parseExpression(expressionString, expressionTargetType, expectedEvaluationResultType,
+ expressionVariables);
+ TestBean target = new TestBean();
+ assertEquals("value", exp.getValue(target));
}
- public void testMethodWithParams() {
-
- String expStr1 = "#{foo.bar(moe.curly, groucho.harpo)}";
- Expression result1 = parser.parseExpression(expStr1);
- assertNotNull(result1);
- assertEquals(expStr1, result1.toString());
+ public void testParseExpressionWithVariables() {
+ String expressionString = "#{value}#{max}";
+ Class expressionTargetType = TestBean.class;
+ Class expectedEvaluationResultType = String.class;
+ ExpressionVariable[] expressionVariables = new ExpressionVariable[] { new ExpressionVariable("max",
+ "#{maximum}") };
+ Expression exp = parser.parseExpression(expressionString, expressionTargetType, expectedEvaluationResultType,
+ expressionVariables);
+ TestBean target = new TestBean();
+ assertEquals("foo2", exp.getValue(target));
}
+ public void testParseExpressionWithVariables2() {
+ String expressionString = "#{value}#{bean.encode(value)}";
+ Class expressionTargetType = TestBean.class;
+ Class expectedEvaluationResultType = String.class;
+ ExpressionVariable[] expressionVariables = null;
+ Expression exp = parser.parseExpression(expressionString, expressionTargetType, expectedEvaluationResultType,
+ expressionVariables);
+ TestBean target = new TestBean(new TestBean());
+ assertEquals("foo!foo", exp.getValue(target));
+ }
+
+ public void testParseExpressionCoerceToInteger() {
+ String expressionString = "#{maximum}#{max}";
+ Class expressionTargetType = TestBean.class;
+ Class expectedEvaluationResultType = Integer.class;
+ ExpressionVariable[] expressionVariables = new ExpressionVariable[] { new ExpressionVariable("max",
+ "#{maximum}") };
+ Expression exp = parser.parseExpression(expressionString, expressionTargetType, expectedEvaluationResultType,
+ expressionVariables);
+ TestBean target = new TestBean();
+ assertEquals(new Integer(22), exp.getValue(target));
+ }
+
+ public static class TestBean {
+ private String value = "foo";
+
+ private int maximum = 2;
+
+ private TestBean bean;
+
+ private List list = new ArrayList();
+
+ public TestBean() {
+ initList();
+ }
+
+ public TestBean(TestBean bean) {
+ this.bean = bean;
+ initList();
+ }
+
+ private void initList() {
+ list.add("1");
+ list.add("2");
+ list.add("3");
+ }
+
+ public TestBean getBean() {
+ return bean;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public String encode(String data) {
+ return "!" + data;
+ }
+
+ public void setValue(String value) {
+
+ }
+
+ public int getMaximum() {
+ return maximum;
+ }
+
+ public void setMaximum(int maximum) {
+ this.maximum = maximum;
+ }
+
+ }
}
diff --git a/spring-binding/src/test/java/org/springframework/binding/expression/ognl/OgnlExpressionParserTests.java b/spring-binding/src/test/java/org/springframework/binding/expression/ognl/OgnlExpressionParserTests.java
index 92d104a5..bd0220c5 100644
--- a/spring-binding/src/test/java/org/springframework/binding/expression/ognl/OgnlExpressionParserTests.java
+++ b/spring-binding/src/test/java/org/springframework/binding/expression/ognl/OgnlExpressionParserTests.java
@@ -19,8 +19,6 @@ import junit.framework.TestCase;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.ParserException;
-import org.springframework.binding.expression.ognl.OgnlExpressionParser;
-import org.springframework.binding.expression.support.TestBean;
/**
* Unit tests for {@link org.springframework.binding.expression.ognl.OgnlExpressionParser}.
@@ -33,44 +31,44 @@ public class OgnlExpressionParserTests extends TestCase {
public void testParseSimpleDelimited() {
String exp = "${flag}";
- Expression e = parser.parseExpression(exp);
+ Expression e = parser.parseExpression(exp, null, null, null);
assertNotNull(e);
- Boolean b = (Boolean) e.evaluate(bean, null);
+ Boolean b = (Boolean) e.getValue(bean);
assertFalse(b.booleanValue());
}
public void testParseSimple() {
String exp = "flag";
- Expression e = parser.parseExpression(exp);
+ Expression e = parser.parseExpression(exp, null, null, null);
assertNotNull(e);
- Boolean b = (Boolean) e.evaluate(bean, null);
+ Boolean b = (Boolean) e.getValue(bean);
assertFalse(b.booleanValue());
}
public void testParseNull() {
- Expression e = parser.parseExpression(null);
+ Expression e = parser.parseExpression(null, null, null, null);
assertNotNull(e);
- assertNull(e.evaluate(bean, null));
+ assertNull(e.getValue(bean));
}
public void testParseEmpty() {
- Expression e = parser.parseExpression("");
+ Expression e = parser.parseExpression("", null, null, null);
assertNotNull(e);
- assertEquals("", e.evaluate(bean, null));
+ assertEquals("", e.getValue(bean));
}
public void testParseComposite() {
String exp = "hello ${flag} ${flag} ${flag}";
- Expression e = parser.parseExpression(exp);
+ Expression e = parser.parseExpression(exp, null, null, null);
assertNotNull(e);
- String str = (String) e.evaluate(bean, null);
+ String str = (String) e.getValue(bean);
assertEquals("hello false false false", str);
}
public void testEnclosedCompositeNotSupported() {
String exp = "${hello ${flag} ${flag} ${flag}}";
try {
- parser.parseExpression(exp);
+ parser.parseExpression(exp, null, null, null);
fail("Should've failed - not intended use");
} catch (ParserException e) {
}
@@ -78,14 +76,13 @@ public class OgnlExpressionParserTests extends TestCase {
public void testSyntaxError1() {
try {
- parser.parseExpression("${");
+ parser.parseExpression("${", null, null, null);
fail();
} catch (ParserException e) {
}
-
try {
String exp = "hello ${flag} ${abcd defg";
- parser.parseExpression(exp);
+ parser.parseExpression(exp, null, null, null);
fail("Should've failed - not intended use");
} catch (ParserException e) {
}
@@ -93,50 +90,38 @@ public class OgnlExpressionParserTests extends TestCase {
public void testSyntaxError2() {
try {
- parser.parseExpression("${}");
+ parser.parseExpression("${}", null, null, null);
fail("Should've failed - not intended use");
} catch (ParserException e) {
}
-
try {
String exp = "hello ${flag} ${}";
- parser.parseExpression(exp);
+ parser.parseExpression(exp, null, null, null);
fail("Should've failed - not intended use");
} catch (ParserException e) {
}
}
- public void testIsDelimitedExpression() {
- assertTrue(parser.isDelimitedExpression("${foo}"));
- assertTrue(parser.isDelimitedExpression("${foo ${foo}}"));
- assertTrue(parser.isDelimitedExpression("foo ${bar}"));
- }
-
- public void testIsNotDelimitedExpression() {
- assertFalse(parser.isDelimitedExpression("foo"));
- assertFalse(parser.isDelimitedExpression("foo ${"));
- assertFalse(parser.isDelimitedExpression("$foo}"));
- assertFalse(parser.isDelimitedExpression("foo ${}"));
- }
-
- public void testCollectionContructionSyntax() {
+ public void testCollectionConstructionSyntax() {
// lists
- parser.parseExpression("name in {null, \"Untitled\"}");
- parser.parseExpression("${name in {null, \"Untitled\"}}");
+ parser.parseExpression("name in {null, \"Untitled\"}", null, null, null);
+ parser.parseExpression("${name in {null, \"Untitled\"}}", null, null, null);
// native arrays
- parser.parseExpression("new int[] {1, 2, 3}");
- parser.parseExpression("${new int[] {1, 2, 3}}");
+ parser.parseExpression("new int[] {1, 2, 3}", null, null, null);
+ parser.parseExpression("${new int[] {1, 2, 3}}", null, null, null);
// maps
- parser.parseExpression("#{ 'foo' : 'foo value', 'bar' : 'bar value' }");
- parser.parseExpression("${#{ 'foo' : 'foo value', 'bar' : 'bar value' }}");
- parser.parseExpression("#@java.util.LinkedHashMap@{ 'foo' : 'foo value', 'bar' : 'bar value' }");
- parser.parseExpression("${#@java.util.LinkedHashMap@{ 'foo' : 'foo value', 'bar' : 'bar value' }}");
+ parser.parseExpression("#{ 'foo' : 'foo value', 'bar' : 'bar value' }", null, null, null);
+ parser.parseExpression("${#{ 'foo' : 'foo value', 'bar' : 'bar value' }}", null, null, null);
+ parser.parseExpression("#@java.util.LinkedHashMap@{ 'foo' : 'foo value', 'bar' : 'bar value' }", null, null,
+ null);
+ parser.parseExpression("${#@java.util.LinkedHashMap@{ 'foo' : 'foo value', 'bar' : 'bar value' }}", null, null,
+ null);
// complex examples
- parser.parseExpression("b,#{1:2}");
- parser.parseExpression("${b,#{1:2}}");
- parser.parseExpression("a${b,#{1:2},e}f${g,#{3:4},j}k");
+ parser.parseExpression("b,#{1:2}", null, null, null);
+ parser.parseExpression("${b,#{1:2}}", null, null, null);
+ parser.parseExpression("a${b,#{1:2},e}f${g,#{3:4},j}k", null, null, null);
}
}
\ No newline at end of file
diff --git a/spring-binding/src/test/java/org/springframework/binding/expression/support/TestBean.java b/spring-binding/src/test/java/org/springframework/binding/expression/ognl/TestBean.java
similarity index 94%
rename from spring-binding/src/test/java/org/springframework/binding/expression/support/TestBean.java
rename to spring-binding/src/test/java/org/springframework/binding/expression/ognl/TestBean.java
index e8f97636..8b6f5a9d 100644
--- a/spring-binding/src/test/java/org/springframework/binding/expression/support/TestBean.java
+++ b/spring-binding/src/test/java/org/springframework/binding/expression/ognl/TestBean.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.springframework.binding.expression.support;
+package org.springframework.binding.expression.ognl;
import java.util.ArrayList;
import java.util.List;
diff --git a/spring-binding/src/test/java/org/springframework/binding/expression/support/CollectionAddingExpressionTests.java b/spring-binding/src/test/java/org/springframework/binding/expression/support/CollectionAddingExpressionTests.java
deleted file mode 100644
index 5cf232bd..00000000
--- a/spring-binding/src/test/java/org/springframework/binding/expression/support/CollectionAddingExpressionTests.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.binding.expression.support;
-
-import java.util.ArrayList;
-
-import junit.framework.TestCase;
-
-import org.springframework.binding.expression.Expression;
-import org.springframework.binding.expression.ExpressionParser;
-
-/**
- * Unit tests for {@link org.springframework.binding.expression.support.CollectionAddingExpression}.
- */
-public class CollectionAddingExpressionTests extends TestCase {
-
- ExpressionParser parser = new BeanWrapperExpressionParser();
-
- TestBean bean = new TestBean();
-
- Expression exp = parser.parseExpression("list");
-
- public void testEvaluation() {
- ArrayList list = new ArrayList();
- bean.setList(list);
- CollectionAddingExpression colExp = new CollectionAddingExpression(exp);
- assertSame(list, colExp.evaluate(bean, null));
- }
-
- public void testAddToCollection() {
- CollectionAddingExpression colExp = new CollectionAddingExpression(exp);
- colExp.evaluateToSet(bean, "1", null);
- colExp.evaluateToSet(bean, "2", null);
- assertEquals("1", bean.getList().get(0));
- assertEquals("2", bean.getList().get(1));
- }
-
- public void testNotACollection() {
- Expression exp = parser.parseExpression("flag");
- CollectionAddingExpression colExp = new CollectionAddingExpression(exp);
- try {
- colExp.evaluateToSet(bean, "1", null);
- fail("not a collection");
- } catch (IllegalArgumentException e) {
- }
- }
-
- public void testNoAddOnNullValue() {
- CollectionAddingExpression colExp = new CollectionAddingExpression(exp);
- colExp.evaluateToSet(bean, null, null);
- colExp.evaluateToSet(bean, "2", null);
- assertEquals("2", bean.getList().get(0));
- }
-}
\ No newline at end of file
diff --git a/spring-binding/src/test/java/org/springframework/binding/expression/support/SimpleExpressionTests.java b/spring-binding/src/test/java/org/springframework/binding/expression/support/SimpleExpressionTests.java
deleted file mode 100644
index 18576100..00000000
--- a/spring-binding/src/test/java/org/springframework/binding/expression/support/SimpleExpressionTests.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.binding.expression.support;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.jboss.el.ExpressionFactoryImpl;
-import org.springframework.binding.expression.EvaluationException;
-import org.springframework.binding.expression.ExpressionParser;
-import org.springframework.binding.expression.ParserException;
-import org.springframework.binding.expression.el.ELExpressionParser;
-import org.springframework.binding.expression.ognl.OgnlExpressionParser;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
- * Tests simple expressions. Any expression language capable enough for real life usage should be able to pass these
- * tests.
- *
- * @author Erwin Vervaet
- * @author Jeremy Grelle
- */
-public class SimpleExpressionTests extends TestCase {
-
- private ExpressionParser expressionParser;
- private String expressionPrefix;
- private TestBean bean;
-
- public static TestSuite suite() {
- TestSuite suite = new TestSuite();
- suite.addTest(new SimpleExpressionTests("testGetValue", new OgnlExpressionParser(), "$"));
- suite.addTest(new SimpleExpressionTests("testSetValue", new OgnlExpressionParser(), "$"));
- suite.addTest(new SimpleExpressionTests("testSyntaxError", new OgnlExpressionParser(), "$"));
- suite.addTest(new SimpleExpressionTests("testGetValue", new BeanWrapperExpressionParser(), "$"));
- suite.addTest(new SimpleExpressionTests("testSetValue", new BeanWrapperExpressionParser(), "$"));
- suite.addTest(new SimpleExpressionTests("testSyntaxError", new BeanWrapperExpressionParser(), "$"));
- suite.addTest(new SimpleExpressionTests("testGetValue", new ELExpressionParser(new ExpressionFactoryImpl()),
- "#"));
- suite.addTest(new SimpleExpressionTests("testSetValue", new ELExpressionParser(new ExpressionFactoryImpl()),
- "#"));
- suite.addTest(new SimpleExpressionTests("testSyntaxError", new ELExpressionParser(new ExpressionFactoryImpl()),
- "#"));
- return suite;
- }
-
- public SimpleExpressionTests(String name, ExpressionParser expressionParser, String expressionPrefix) {
- super(name);
- this.expressionParser = expressionParser;
- this.expressionPrefix = expressionPrefix;
- }
-
- protected void setUp() throws Exception {
- bean = new TestBean();
- bean.setFlag(true);
- List list = new ArrayList();
- list.add("foo");
- list.add("bar");
- bean.setList(list);
- }
-
- public void testGetValue() {
- assertEquals(Boolean.TRUE, expressionParser.parseExpression(expressionPrefix + "{flag}").evaluate(bean, null));
- assertSame(bean.getList(), expressionParser.parseExpression(expressionPrefix + "{list}").evaluate(bean, null));
- assertEquals("foo", expressionParser.parseExpression(expressionPrefix + "{list[0]}").evaluate(bean, null));
- }
-
- public void testSetValue() {
- expressionParser.parseSettableExpression(expressionPrefix + "{flag}").evaluateToSet(bean, Boolean.FALSE, null);
- assertFalse(bean.isFlag());
- List newList = new ArrayList();
- newList.add("boo");
- expressionParser.parseSettableExpression(expressionPrefix + "{list}").evaluateToSet(bean, newList, null);
- assertSame(newList, bean.getList());
- expressionParser.parseSettableExpression(expressionPrefix + "{list[0]}").evaluateToSet(bean, "baa", null);
- assertEquals("baa", bean.getList().get(0));
- }
-
- public void testSyntaxError() {
- try {
- expressionParser.parseExpression(expressionPrefix + "{foo(}").evaluate(bean, null);
- fail("should have failed");
- } catch (ParserException e) {
- } catch (EvaluationException e) {
- }
- }
-}
diff --git a/spring-binding/src/test/java/org/springframework/binding/expression/support/TestMethods.java b/spring-binding/src/test/java/org/springframework/binding/expression/support/TestMethods.java
deleted file mode 100644
index 478e6080..00000000
--- a/spring-binding/src/test/java/org/springframework/binding/expression/support/TestMethods.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.springframework.binding.expression.support;
-
-public interface TestMethods {
-
- public void doSomethingWithInt(int arg);
-
- public String returnStringFromInt(int arg);
-
- public String returnStringFromIntAndObject(int arg, TestBean bean);
-}
diff --git a/spring-binding/src/test/java/org/springframework/binding/method/TextToMethodSignatureTests.java b/spring-binding/src/test/java/org/springframework/binding/method/TextToMethodSignatureTests.java
index 577a9c6e..76764291 100644
--- a/spring-binding/src/test/java/org/springframework/binding/method/TextToMethodSignatureTests.java
+++ b/spring-binding/src/test/java/org/springframework/binding/method/TextToMethodSignatureTests.java
@@ -103,7 +103,7 @@ public class TextToMethodSignatureTests extends TestCase {
assertEquals("foo", signature.getMethodName());
assertEquals(1, signature.getParameters().size());
assertNull(signature.getParameters().getParameter(0).getType());
- assertEquals("{1, 2, 3}", signature.getParameters().getParameter(0).getName().toString());
+ assertEquals("{ 1, 2, 3 }", signature.getParameters().getParameter(0).getName().toString());
}
public void testCollectionConstructionSyntaxWithType() {
@@ -111,7 +111,7 @@ public class TextToMethodSignatureTests extends TestCase {
assertEquals("foo", signature.getMethodName());
assertEquals(1, signature.getParameters().size());
assertEquals(java.util.List.class, signature.getParameters().getParameter(0).getType());
- assertEquals("{1, 2, 3}", signature.getParameters().getParameter(0).getName().toString());
+ assertEquals("{ 1, 2, 3 }", signature.getParameters().getParameter(0).getName().toString());
signature = (MethodSignature) converter.convert("foo(a${b,#{1:2},e}f${g,#{3:4},j}k)");
}
diff --git a/spring-faces/.classpath b/spring-faces/.classpath
index aa7873af..8e880c82 100644
--- a/spring-faces/.classpath
+++ b/spring-faces/.classpath
@@ -6,11 +6,9 @@
-
-
@@ -32,5 +30,7 @@
+
+
diff --git a/spring-faces/.settings/org.eclipse.jdt.core.prefs b/spring-faces/.settings/org.eclipse.jdt.core.prefs
index c416b20c..32388fa4 100644
--- a/spring-faces/.settings/org.eclipse.jdt.core.prefs
+++ b/spring-faces/.settings/org.eclipse.jdt.core.prefs
@@ -1,4 +1,4 @@
-#Wed Aug 15 08:35:04 EDT 2007
+#Tue Sep 25 14:10:50 EDT 2007
eclipse.preferences.version=1
org.eclipse.jdt.core.codeComplete.argumentPrefixes=
org.eclipse.jdt.core.codeComplete.argumentSuffixes=
@@ -9,9 +9,9 @@ org.eclipse.jdt.core.codeComplete.localSuffixes=
org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.3
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.3
+org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -79,7 +79,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
+org.eclipse.jdt.core.compiler.source=1.5
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
diff --git a/spring-faces/.settings/org.eclipse.jdt.ui.prefs b/spring-faces/.settings/org.eclipse.jdt.ui.prefs
index 02fbb7e9..77e40833 100644
--- a/spring-faces/.settings/org.eclipse.jdt.ui.prefs
+++ b/spring-faces/.settings/org.eclipse.jdt.ui.prefs
@@ -1,14 +1,13 @@
-#Wed Aug 15 08:38:35 EDT 2007
+#Tue Sep 25 14:14:24 EDT 2007
eclipse.preferences.version=1
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_Spring Java Conventions
formatter_settings_version=11
-internal.default.compliance=user
org.eclipse.jdt.ui.exception.name=e
org.eclipse.jdt.ui.gettersetter.use.is=false
org.eclipse.jdt.ui.javadoc=false
org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.overrideannotation=false
org.eclipse.jdt.ui.text.custom_code_templates=/**\n * @return the ${bare_field_name}\n *//**\n * @param ${param} the ${bare_field_name} to set\n *//**\n * ${tags}\n *//*\n * Copyright 2004-2007 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http\://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *//**\n * @author ${user}\n *\n * ${tags}\n *//**\n * \n *//**\n * ${tags}\n *//* (non-Javadoc)\n * ${see_to_overridden}\n *//**\n * ${tags}\n * ${see_to_target}\n */${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}\n\n\n\n// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();// ${todo} Auto-generated method stub\nthrow new UnsupportedOperationException("Auto-generated method stub");${body_statement}\n// ${todo} Auto-generated constructor stubreturn ${field};${field} \= ${param};
sp_cleanup.add_default_serial_version_id=true
sp_cleanup.add_generated_serial_version_id=false
diff --git a/spring-faces/project.properties b/spring-faces/project.properties
index 7319dec3..01ae0b16 100644
--- a/spring-faces/project.properties
+++ b/spring-faces/project.properties
@@ -7,5 +7,5 @@ project.base.version=2.0-m2-SNAPSHOT
#project.version=${project.base.version}
#ivy.status=release
-javac.source=1.4
-javac.target=1.4
+javac.source=1.5
+javac.target=1.5
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/ext.js b/spring-faces/src/main/java/META-INF/ext/ext.js
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/ext.js
rename to spring-faces/src/main/java/META-INF/ext/ext.js
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/css/ext-all.css b/spring-faces/src/main/java/META-INF/ext/resources/css/ext-all.css
similarity index 82%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/css/ext-all.css
rename to spring-faces/src/main/java/META-INF/ext/resources/css/ext-all.css
index 600915f9..f894f842 100644
--- a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/css/ext-all.css
+++ b/spring-faces/src/main/java/META-INF/ext/resources/css/ext-all.css
@@ -26,7 +26,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
top: 0;
left: 0;
border:1px solid #6593cf;
- background: #c3daf9 url(../images/default/box/tb-blue.gif.spring) repeat-x 0 -16px;
+ background: #c3daf9 url(../images/default/box/tb-blue.gif) repeat-x 0 -16px;
padding:2px;
}
.ext-el-mask-msg div {
@@ -51,7 +51,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
.x-mask-loading div {
padding:5px 10px 5px 25px;
- background: #eee url( '../images/default/grid/loading.gif.spring' ) no-repeat 5px 5px;
+ background: #eee url( '../images/default/grid/loading.gif' ) no-repeat 5px 5px;
line-height: 16px;
}
@@ -210,7 +210,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
.x-shadow .xsmc {
float: left;
height: 100%;
- background: transparent url( ../images/default/shadow-c.png.spring );
+ background: transparent url( ../images/default/shadow-c.png );
}
.x-shadow .xst, .x-shadow .xsb {
@@ -220,40 +220,40 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
}
.x-shadow .xsml {
- background: transparent url( ../images/default/shadow-lr.png.spring ) repeat-y 0 0;
+ background: transparent url( ../images/default/shadow-lr.png ) repeat-y 0 0;
}
.x-shadow .xsmr {
- background: transparent url( ../images/default/shadow-lr.png.spring ) repeat-y -6px 0;
+ background: transparent url( ../images/default/shadow-lr.png ) repeat-y -6px 0;
}
.x-shadow .xstl {
- background: transparent url( ../images/default/shadow.png.spring ) no-repeat 0 0;
+ background: transparent url( ../images/default/shadow.png ) no-repeat 0 0;
}
.x-shadow .xstc {
- background: transparent url( ../images/default/shadow.png.spring ) repeat-x 0 -30px;
+ background: transparent url( ../images/default/shadow.png ) repeat-x 0 -30px;
}
.x-shadow .xstr {
- background: transparent url( ../images/default/shadow.png.spring ) repeat-x 0 -18px;
+ background: transparent url( ../images/default/shadow.png ) repeat-x 0 -18px;
}
.x-shadow .xsbl {
- background: transparent url( ../images/default/shadow.png.spring ) no-repeat 0 -12px;
+ background: transparent url( ../images/default/shadow.png ) no-repeat 0 -12px;
}
.x-shadow .xsbc {
- background: transparent url( ../images/default/shadow.png.spring ) repeat-x 0 -36px;
+ background: transparent url( ../images/default/shadow.png ) repeat-x 0 -36px;
}
.x-shadow .xsbr {
- background: transparent url( ../images/default/shadow.png.spring ) repeat-x 0 -6px;
+ background: transparent url( ../images/default/shadow.png ) repeat-x 0 -6px;
}
.loading-indicator {
font-size: 11px;
- background-image: url( '../images/default/grid/loading.gif.spring' );
+ background-image: url( '../images/default/grid/loading.gif' );
background-repeat: no-repeat;
background-position: left;
padding-left: 20px;
@@ -336,16 +336,16 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
}
.x-tabs-strip .on .x-tabs-right {
- background: url(../images/default/tabs/tab-sprite.gif.spring) no-repeat right 0;
+ background: url(../images/default/tabs/tab-sprite.gif) no-repeat right 0;
}
.x-tabs-strip .on .x-tabs-left {
- background: url(../images/default/tabs/tab-sprite.gif.spring) no-repeat 0 -100px;
+ background: url(../images/default/tabs/tab-sprite.gif) no-repeat 0 -100px;
}
.x-tabs-strip .x-tabs-right {
- background: url(../images/default/tabs/tab-sprite.gif.spring) no-repeat right -50px;
+ background: url(../images/default/tabs/tab-sprite.gif) no-repeat right -50px;
}
.x-tabs-strip .x-tabs-left {
- background: url(../images/default/tabs/tab-sprite.gif.spring) no-repeat 0 -150px;
+ background: url(../images/default/tabs/tab-sprite.gif) no-repeat 0 -150px;
}
.x-tabs-strip a {
@@ -366,7 +366,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
.x-tabs-strip .x-tabs-closable .close-icon{
line-height: 1px;
font-size:1px;
- background-image:url(../images/default/layout/tab-close.gif.spring);
+ background-image:url(../images/default/layout/tab-close.gif);
display:block;
position:absolute;
right:5px;top:4px;
@@ -374,10 +374,10 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
cursor:pointer;
}
.x-tabs-strip .on .close-icon{
- background-image:url(../images/default/layout/tab-close-on.gif.spring);
+ background-image:url(../images/default/layout/tab-close-on.gif);
}
.x-tabs-strip .x-tabs-closable .close-over{
- background-image:url(../images/default/layout/tab-close-on.gif.spring);
+ background-image:url(../images/default/layout/tab-close-on.gif);
}
.x-tabs-body {
border:1px solid #6593cf;
@@ -390,16 +390,16 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
padding-bottom:2px;
}
.x-tabs-bottom .x-tabs-strip .x-tabs-right {
- background: url(../images/default/tabs/tab-btm-inactive-right-bg.gif.spring) no-repeat bottom left;
+ background: url(../images/default/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom left;
}
.x-tabs-bottom .x-tabs-strip .x-tabs-left {
- background: url(../images/default/tabs/tab-btm-inactive-left-bg.gif.spring) no-repeat bottom right;
+ background: url(../images/default/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom right;
}
.x-tabs-bottom .x-tabs-strip .on .x-tabs-right {
- background: url(../images/default/tabs/tab-btm-right-bg.gif.spring) no-repeat bottom left;
+ background: url(../images/default/tabs/tab-btm-right-bg.gif) no-repeat bottom left;
}
.x-tabs-bottom .x-tabs-strip .on .x-tabs-left {
- background: url(../images/default/tabs/tab-btm-left-bg.gif.spring) no-repeat bottom right;
+ background: url(../images/default/tabs/tab-btm-left-bg.gif) no-repeat bottom right;
}
.x-tabs-bottom .x-tabs-strip a {
position:relative;
@@ -427,7 +427,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
.x-form-text, textarea.x-form-field{
padding: 1px 3px;
- background:#fff url(../images/default/form/text-bg.gif.spring) repeat-x 0 0;
+ background:#fff url(../images/default/form/text-bg.gif) repeat-x 0 0;
border: 1px solid #B5B8C8;
}
.x-form-text {
@@ -489,7 +489,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
width:17px;
height:21px;
border:0;
- background:transparent url(../images/default/form/trigger.gif.spring) no-repeat 0 0;
+ background:transparent url(../images/default/form/trigger.gif) no-repeat 0 0;
cursor:pointer;
border-bottom: 1px solid #B5B8C8;
position:absolute;
@@ -500,15 +500,15 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
}
.x-form-field-wrap .x-form-date-trigger{
- background-image: url(../images/default/form/date-trigger.gif.spring);
+ background-image: url(../images/default/form/date-trigger.gif);
cursor:pointer;
}
.x-form-field-wrap .x-form-clear-trigger{
- background-image: url(../images/default/form/clear-trigger.gif.spring);
+ background-image: url(../images/default/form/clear-trigger.gif);
cursor:pointer;
}
.x-form-field-wrap .x-form-search-trigger{
- background-image: url(../images/default/form/search-trigger.gif.spring);
+ background-image: url(../images/default/form/search-trigger.gif);
cursor:pointer;
}
.ext-safari .x-form-field-wrap .x-form-trigger{
@@ -560,7 +560,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
.x-form-invalid, textarea.x-form-invalid{
- background:#fff url(../images/default/grid/invalid_line.gif.spring) repeat-x bottom;
+ background:#fff url(../images/default/grid/invalid_line.gif) repeat-x bottom;
border: 1px solid #dd7870;
}
.ext-safari .x-form-invalid{
@@ -638,7 +638,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
padding:2px;
padding-left:18px;
font:normal 11px tahoma, arial, helvetica, sans-serif;
- background: transparent url(../images/default/shared/warning.gif.spring) no-repeat 0 2px;
+ background: transparent url(../images/default/shared/warning.gif) no-repeat 0 2px;
line-height:16px;
width:200px;
}
@@ -809,7 +809,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
left:0;
top:0;
display:block;
- background:transparent url(../images/default/form/exclamation.gif.spring) no-repeat 0 2px;
+ background:transparent url(../images/default/form/exclamation.gif) no-repeat 0 2px;
}
.x-btn{
font:normal 11px tahoma, verdana, helvetica;
@@ -875,12 +875,12 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
.x-btn-left{
width:3px;
height:21px;
- background:url(../images/default/basic-dialog/btn-sprite.gif.spring) no-repeat 0 0;
+ background:url(../images/default/basic-dialog/btn-sprite.gif) no-repeat 0 0;
}
.x-btn-right{
width:3px;
height:21px;
- background:url(../images/default/basic-dialog/btn-sprite.gif.spring) no-repeat 0 -21px;
+ background:url(../images/default/basic-dialog/btn-sprite.gif) no-repeat 0 -21px;
}
.x-btn-left i, .x-btn-right i{
display:block;
@@ -890,7 +890,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
line-height:1px;
}
.x-btn-center{
- background:url(../images/default/basic-dialog/btn-sprite.gif.spring) repeat-x 0 -42px;
+ background:url(../images/default/basic-dialog/btn-sprite.gif) repeat-x 0 -42px;
vertical-align: middle;
text-align:center;
padding:0 5px;
@@ -927,20 +927,20 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
height:21px;
padding:0 !important;
display:block;
- background:transparent url(../images/default/basic-dialog/btn-arrow.gif.spring) no-repeat left 3px;
+ background:transparent url(../images/default/basic-dialog/btn-arrow.gif) no-repeat left 3px;
}
.x-btn-with-menu .x-btn-center {
padding-right:2px !important;
}
.x-btn-with-menu .x-btn-center em {
display:block;
- background:transparent url(../images/default/toolbar/btn-arrow.gif.spring) no-repeat right 0;
+ background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat right 0;
padding-right:10px;
}
.x-btn-text-icon .x-btn-with-menu .x-btn-center em {
display:block;
- background:transparent url(../images/default/toolbar/btn-arrow.gif.spring) no-repeat right 3px;
+ background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat right 3px;
padding-right:10px;
}
.x-toolbar{
@@ -948,7 +948,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
border-bottom: 1px solid #a9bfd3;
display: block;
padding:2px;
- background:#d0def0 url(../images/default/layout/panel-title-light-bg.gif.spring) repeat-x;
+ background:#d0def0 url(../images/default/layout/panel-title-light-bg.gif) repeat-x;
position:relative;
zoom:1;
}
@@ -962,7 +962,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
}
.mso .x-toolbar, .x-grid-mso .x-toolbar{
border: 0 none;
- background: url(../images/default/grid/mso-hd.gif.spring);
+ background: url(../images/default/grid/mso-hd.gif);
}
.x-toolbar td, .x-toolbar span, .x-toolbar input, .x-toolbar div, .x-toolbar select, .x-toolbar label{
white-space: nowrap;
@@ -1001,33 +1001,33 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
}
.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button {
width:12px;
- background:transparent url(../images/default/toolbar/btn-arrow.gif.spring) no-repeat 0 3px;
+ background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat 0 3px;
}
.x-toolbar .x-btn-text-icon .x-btn-menu-arrow-wrap .x-btn-center button {
width:12px;
- background:transparent url(../images/default/toolbar/btn-arrow.gif.spring) no-repeat 0 3px;
+ background:transparent url(../images/default/toolbar/btn-arrow.gif) no-repeat 0 3px;
}
.x-toolbar .x-btn-over .x-btn-menu-arrow-wrap .x-btn-center button {
background-position: 0 -47px;
}
.x-toolbar .x-btn-over .x-btn-left{
- background:url(../images/default/toolbar/tb-btn-sprite.gif.spring) no-repeat 0 0;
+ background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 0;
}
.x-toolbar .x-btn-over .x-btn-right{
- background:url(../images/default/toolbar/tb-btn-sprite.gif.spring) no-repeat 0 -21px;
+ background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -21px;
}
.x-toolbar .x-btn-over .x-btn-center{
- background:url(../images/default/toolbar/tb-btn-sprite.gif.spring) repeat-x 0 -42px;
+ background:url(../images/default/toolbar/tb-btn-sprite.gif) repeat-x 0 -42px;
}
.x-toolbar .x-btn-click .x-btn-left, .x-toolbar .x-btn-pressed .x-btn-left, .x-toolbar .x-btn-menu-active .x-btn-left{
- background:url(../images/default/toolbar/tb-btn-sprite.gif.spring) no-repeat 0 -63px;
+ background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -63px;
}
.x-toolbar .x-btn-click .x-btn-right, .x-toolbar .x-btn-pressed .x-btn-right, .x-toolbar .x-btn-menu-active .x-btn-right{
- background:url(../images/default/toolbar/tb-btn-sprite.gif.spring) no-repeat 0 -84px;
+ background:url(../images/default/toolbar/tb-btn-sprite.gif) no-repeat 0 -84px;
}
.x-toolbar .x-btn-click .x-btn-center, .x-toolbar .x-btn-pressed .x-btn-center, .x-toolbar .x-btn-menu-active .x-btn-center{
- background:url(../images/default/toolbar/tb-btn-sprite.gif.spring) repeat-x 0 -105px;
+ background:url(../images/default/toolbar/tb-btn-sprite.gif) repeat-x 0 -105px;
}
.x-toolbar .x-btn-with-menu .x-btn-center em{
@@ -1038,7 +1038,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
padding:2px;
}
.x-toolbar .ytb-sep {
- background-image: url(../images/default/grid/grid-split.gif.spring);
+ background-image: url(../images/default/grid/grid-split.gif);
background-position: center;
background-repeat: no-repeat;
display: block;
@@ -1054,7 +1054,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
width:2px;
}
.mso .x-toolbar .ytb-sep, .x-grid-mso .x-toolbar .ytb-sep{
- background-image: url(../images/default/grid/grid-blue-split.gif.spring);
+ background-image: url(../images/default/grid/grid-blue-split.gif);
}
@@ -1075,34 +1075,34 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
height:14px;
}
.x-grid-page-first .x-btn-text{
- background-image: url(../images/default/grid/page-first.gif.spring);
+ background-image: url(../images/default/grid/page-first.gif);
}
.x-grid-loading .x-btn-text{
- background-image: url(../images/default/grid/done.gif.spring);
+ background-image: url(../images/default/grid/done.gif);
}
.x-grid-page-last .x-btn-text{
- background-image: url(../images/default/grid/page-last.gif.spring);
+ background-image: url(../images/default/grid/page-last.gif);
}
.x-grid-page-next .x-btn-text{
- background-image: url(../images/default/grid/page-next.gif.spring);
+ background-image: url(../images/default/grid/page-next.gif);
}
.x-grid-page-prev .x-btn-text{
- background-image: url(../images/default/grid/page-prev.gif.spring);
+ background-image: url(../images/default/grid/page-prev.gif);
}
.x-item-disabled .x-grid-loading .x-btn-text{
- background-image: url(../images/default/grid/loading.gif.spring);
+ background-image: url(../images/default/grid/loading.gif);
}
.x-item-disabled .x-grid-page-first .x-btn-text{
- background-image: url(../images/default/grid/page-first-disabled.gif.spring);
+ background-image: url(../images/default/grid/page-first-disabled.gif);
}
.x-item-disabled .x-grid-page-last .x-btn-text{
- background-image: url(../images/default/grid/page-last-disabled.gif.spring);
+ background-image: url(../images/default/grid/page-last-disabled.gif);
}
.x-item-disabled .x-grid-page-next .x-btn-text{
- background-image: url(../images/default/grid/page-next-disabled.gif.spring);
+ background-image: url(../images/default/grid/page-next-disabled.gif);
}
.x-item-disabled .x-grid-page-prev .x-btn-text{
- background-image: url(../images/default/grid/page-prev-disabled.gif.spring);
+ background-image: url(../images/default/grid/page-prev-disabled.gif);
}
.x-paging-info {
position:absolute;
@@ -1194,35 +1194,35 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
opacity:1;
}
.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east{
- background:url(../images/default/sizer/e-handle.gif.spring);
+ background:url(../images/default/sizer/e-handle.gif);
background-position: left;
}
.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west{
- background:url(../images/default/sizer/e-handle.gif.spring);
+ background:url(../images/default/sizer/e-handle.gif);
background-position: left;
}
.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south{
- background:url(../images/default/sizer/s-handle.gif.spring);
+ background:url(../images/default/sizer/s-handle.gif);
background-position: top;
}
.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north{
- background:url(../images/default/sizer/s-handle.gif.spring);
+ background:url(../images/default/sizer/s-handle.gif);
background-position: top;
}
.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{
- background:url(../images/default/sizer/se-handle.gif.spring);
+ background:url(../images/default/sizer/se-handle.gif);
background-position: top left;
}
.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{
- background:url(../images/default/sizer/nw-handle.gif.spring);
+ background:url(../images/default/sizer/nw-handle.gif);
background-position:bottom right;
}
.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{
- background:url(../images/default/sizer/ne-handle.gif.spring);
+ background:url(../images/default/sizer/ne-handle.gif);
background-position: bottom left;
}
.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{
- background:url(../images/default/sizer/sw-handle.gif.spring);
+ background:url(../images/default/sizer/sw-handle.gif);
background-position: top right;
}
.x-resizable-proxy{
@@ -1340,7 +1340,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
.x-grid-header{
- background: #ebeadb url(../images/default/grid/grid-hrow.gif.spring) repeat-x;
+ background: #ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x;
overflow:hidden;
position:relative;
cursor:default;
@@ -1356,7 +1356,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
border-bottom: 1px solid #c3daf9;
}
.x-grid-hd-over .x-grid-hd-text {
- background: #fafafa url(../images/default/grid/grid-hrow.gif.spring) repeat-x 0 1px;
+ background: #fafafa url(../images/default/grid/grid-hrow.gif) repeat-x 0 1px;
padding-bottom:1px;
border-bottom: 1px solid #b3cae9;
}
@@ -1369,11 +1369,11 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
vertical-align: middle;
}
.x-grid-header .sort-asc .x-grid-sort-icon {
- background-image: url(../images/default/grid/sort_asc.gif.spring);
+ background-image: url(../images/default/grid/sort_asc.gif);
display: inline;
}
.x-grid-header .sort-desc .x-grid-sort-icon {
- background-image: url(../images/default/grid/sort_desc.gif.spring);
+ background-image: url(../images/default/grid/sort_desc.gif);
display: inline;
}
@@ -1396,7 +1396,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
padding-top:4px;
}
.x-grid-split {
- background-image: url(../images/default/grid/grid-split.gif.spring);
+ background-image: url(../images/default/grid/grid-split.gif);
background-position: center;
background-repeat: no-repeat;
cursor: e-resize;
@@ -1416,7 +1416,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
}
.x-dd-drag-proxy .x-grid-hd-inner{
- background: #ebeadb url(../images/default/grid/grid-hrow.gif.spring) repeat-x;
+ background: #ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x;
height:22px;
width:120px;
}
@@ -1433,10 +1433,10 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
z-index:20000;
}
.col-move-top{
- background:transparent url(../images/default/grid/col-move-top.gif.spring) no-repeat left top;
+ background:transparent url(../images/default/grid/col-move-top.gif) no-repeat left top;
}
.col-move-bottom{
- background:transparent url(../images/default/grid/col-move-bottom.gif.spring) no-repeat left top;
+ background:transparent url(../images/default/grid/col-move-bottom.gif) no-repeat left top;
}
@@ -1462,7 +1462,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
}
.x-grid-locked td.x-grid-row-marker, .x-grid-locked .x-grid-row-selected td.x-grid-row-marker{
- background: #ebeadb url(../images/default/grid/grid-hrow.gif.spring) repeat-x 0 bottom !important;
+ background: #ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x 0 bottom !important;
vertical-align:middle !important;
color:black;
padding:0;
@@ -1479,7 +1479,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
.x-grid-dirty-cell {
- background: transparent url(../images/default/grid/dirty.gif.spring) no-repeat 0 0;
+ background: transparent url(../images/default/grid/dirty.gif) no-repeat 0 0;
}
.x-grid-row-alt .x-grid-dirty-cell{
@@ -1521,16 +1521,16 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
.xg-hmenu-sort-asc .x-menu-item-icon{
- background-image: url(../images/default/grid/hmenu-asc.gif.spring);
+ background-image: url(../images/default/grid/hmenu-asc.gif);
}
.xg-hmenu-sort-desc .x-menu-item-icon{
- background-image: url(../images/default/grid/hmenu-desc.gif.spring);
+ background-image: url(../images/default/grid/hmenu-desc.gif);
}
.xg-hmenu-lock .x-menu-item-icon{
- background-image: url(../images/default/grid/hmenu-lock.gif.spring);
+ background-image: url(../images/default/grid/hmenu-lock.gif);
}
.xg-hmenu-unlock .x-menu-item-icon{
- background-image: url(../images/default/grid/hmenu-unlock.gif.spring);
+ background-image: url(../images/default/grid/hmenu-unlock.gif);
}
@@ -1624,7 +1624,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
background-color:#c3daf9;
}
.x-layout-panel-hd{
- background-image: url(../images/default/layout/panel-title-light-bg.gif.spring);
+ background-image: url(../images/default/layout/panel-title-light-bg.gif);
color: black;
border-bottom:1px solid #98c0f4;
position:relative;
@@ -1665,33 +1665,33 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
background-position:center;
}
.x-layout-close{
- background-image:url(../images/default/layout/panel-close.gif.spring);
+ background-image:url(../images/default/layout/panel-close.gif);
}
.x-layout-stick{
- background-image:url(../images/default/layout/stick.gif.spring);
+ background-image:url(../images/default/layout/stick.gif);
}
.x-layout-collapse-west,.x-layout-expand-east{
- background-image:url(../images/default/layout/collapse.gif.spring);
+ background-image:url(../images/default/layout/collapse.gif);
}
.x-layout-expand-west,.x-layout-collapse-east{
- background-image:url(../images/default/layout/expand.gif.spring);
+ background-image:url(../images/default/layout/expand.gif);
}
.x-layout-collapse-north,.x-layout-expand-south{
- background-image:url(../images/default/layout/ns-collapse.gif.spring);
+ background-image:url(../images/default/layout/ns-collapse.gif);
}
.x-layout-expand-north,.x-layout-collapse-south{
- background-image:url(../images/default/layout/ns-expand.gif.spring);
+ background-image:url(../images/default/layout/ns-expand.gif);
}
.x-layout-split-h{
- background-image:url(../images/default/sizer/e-handle.gif.spring);
+ background-image:url(../images/default/sizer/e-handle.gif);
background-position: left;
}
.x-layout-split-v{
- background-image:url(../images/default/sizer/s-handle.gif.spring);
+ background-image:url(../images/default/sizer/s-handle.gif);
background-position: top;
}
.x-layout-panel .x-tabs-wrap{
- background:url(../images/default/layout/gradient-bg.gif.spring);
+ background:url(../images/default/layout/gradient-bg.gif);
}
.x-layout-panel .x-tabs-body {
background-color:white;
@@ -1724,7 +1724,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
border: 2px solid #6593cf;
}
.x-layout-panel-proxy {
- background-image: url(../images/default/layout/gradient-bg.gif.spring);
+ background-image: url(../images/default/layout/gradient-bg.gif);
background-color:#c3daf9;
border:1px dashed #6593cf;
z-index:10001;
@@ -1782,7 +1782,7 @@ html,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquot
border:1px solid #99bbe8;
}
.x-dlg-proxy {
- background-image: url(../images/default/gradient-bg.gif.spring);
+ background-image: url(../images/default/gradient-bg.gif);
background-color:#c3daf9;
border:1px solid #6593cf;
z-index:10001;
@@ -1829,7 +1829,7 @@ body.x-body-masked .x-dlg select {
left:300;top:0;
}
.x-dlg .x-dlg-hd {
- background: url(../images/default/basic-dialog/hd-sprite.gif.spring) repeat-x 0 -82px;
+ background: url(../images/default/basic-dialog/hd-sprite.gif) repeat-x 0 -82px;
background-color:navy;
color:#FFF;
font:bold 12px "sans serif", tahoma, verdana, helvetica;
@@ -1838,16 +1838,16 @@ body.x-body-masked .x-dlg select {
white-space: nowrap;
}
.x-dlg .x-dlg-hd-left {
- background: url(../images/default/basic-dialog/hd-sprite.gif.spring) no-repeat 0 -41px;
+ background: url(../images/default/basic-dialog/hd-sprite.gif) no-repeat 0 -41px;
padding-left:3px;
margin:0;
}
.x-dlg .x-dlg-hd-right {
- background: url(../images/default/basic-dialog/hd-sprite.gif.spring) no-repeat right 0;
+ background: url(../images/default/basic-dialog/hd-sprite.gif) no-repeat right 0;
padding-right:3px;
}
.x-dlg .x-dlg-dlg-body{
- background:url(../images/default/layout/gradient-bg.gif.spring);
+ background:url(../images/default/layout/gradient-bg.gif);
border:1px solid #6593cf;
border-top:0 none;
padding:10px;
@@ -1961,54 +1961,54 @@ body.x-body-masked .x-dlg select {
visibility:inherit;
}
.x-dlg .x-dlg-close {
- background-image:url(../images/default/basic-dialog/close.gif.spring);
+ background-image:url(../images/default/basic-dialog/close.gif);
}
.x-dlg .x-dlg-collapse {
- background-image:url(../images/default/basic-dialog/collapse.gif.spring);
+ background-image:url(../images/default/basic-dialog/collapse.gif);
}
.x-dlg-collapsed .x-dlg-collapse {
- background-image:url(../images/default/basic-dialog/expand.gif.spring);
+ background-image:url(../images/default/basic-dialog/expand.gif);
}
.x-dlg .x-dlg-close-over, .x-dlg .x-dlg-collapse-over {
}
.x-dlg div.x-resizable-handle-east{
- background-image:url(../images/default/basic-dialog/e-handle.gif.spring);
+ background-image:url(../images/default/basic-dialog/e-handle.gif);
border:0;
background-position:right;
margin-right:0;
}
.x-dlg div.x-resizable-handle-south{
- background-image:url(../images/default/sizer/s-handle-dark.gif.spring);
+ background-image:url(../images/default/sizer/s-handle-dark.gif);
border:0;
height:6px;
}
.x-dlg div.x-resizable-handle-west{
- background-image:url(../images/default/basic-dialog/e-handle.gif.spring);
+ background-image:url(../images/default/basic-dialog/e-handle.gif);
border:0;
background-position:1px;
}
.x-dlg div.x-resizable-handle-north{
- background-image:url(../images/default/s.gif.spring);
+ background-image:url(../images/default/s.gif);
border:0;
}
.x-dlg div.x-resizable-handle-northeast, .xtheme-gray .x-dlg div.x-resizable-handle-northeast{
- background-image:url(../images/default/s.gif.spring);
+ background-image:url(../images/default/s.gif);
border:0;
}
.x-dlg div.x-resizable-handle-northwest, .xtheme-gray .x-dlg div.x-resizable-handle-northwest{
- background-image:url(../images/default/s.gif.spring);
+ background-image:url(../images/default/s.gif);
border:0;
}
.x-dlg div.x-resizable-handle-southeast{
- background-image:url(../images/default/basic-dialog/se-handle.gif.spring);
+ background-image:url(../images/default/basic-dialog/se-handle.gif);
background-position: bottom right;
width:8px;
height:8px;
border:0;
}
.x-dlg div.x-resizable-handle-southwest{
- background-image:url(../images/default/sizer/sw-handle-dark.gif.spring);
+ background-image:url(../images/default/sizer/sw-handle-dark.gif);
background-position: top right;
margin-left:1px;
margin-bottom:1px;
@@ -2040,7 +2040,7 @@ body.x-body-masked .x-dlg select {
}
#x-msg-box .ext-mb-progress {
height:18px;
- background: #e0e8f3 url(../images/default/qtip/bg.gif.spring) repeat-x;
+ background: #e0e8f3 url(../images/default/qtip/bg.gif) repeat-x;
}
#x-msg-box .ext-mb-progress-bar {
height:18px;
@@ -2053,7 +2053,7 @@ body.x-body-masked .x-dlg select {
}
#x-msg-box .x-msg-box-wait {
- background: transparent url(../images/default/grid/loading.gif.spring) no-repeat left;
+ background: transparent url(../images/default/grid/loading.gif) no-repeat left;
display:block;
width:300px;
padding-left:18px;
@@ -2104,13 +2104,13 @@ body.x-body-masked .x-dlg select {
z-index:1;
}
.x-dd-drop-nodrop .x-dd-drop-icon{
- background-image: url(../images/default/dd/drop-no.gif.spring);
+ background-image: url(../images/default/dd/drop-no.gif);
}
.x-dd-drop-ok .x-dd-drop-icon{
- background-image: url(../images/default/dd/drop-yes.gif.spring);
+ background-image: url(../images/default/dd/drop-yes.gif);
}
.x-dd-drop-ok-add .x-dd-drop-icon{
- background-image: url(../images/default/dd/drop-add.gif.spring);
+ background-image: url(../images/default/dd/drop-add.gif);
}
.x-tree-icon, .x-tree-ec-icon, .x-tree-elbow-line, .x-tree-elbow, .x-tree-elbow-end, .x-tree-elbow-plus, .x-tree-elbow-minus, .x-tree-elbow-end-plus, .x-tree-elbow-end-minus{
border: 0 none;
@@ -2134,13 +2134,13 @@ body.x-body-masked .x-dlg select {
.x-tree-node-collapsed .x-tree-node-icon{
- background-image:url(../images/default/tree/folder.gif.spring);
+ background-image:url(../images/default/tree/folder.gif);
}
.x-tree-node-expanded .x-tree-node-icon{
- background-image:url(../images/default/tree/folder-open.gif.spring);
+ background-image:url(../images/default/tree/folder-open.gif);
}
.x-tree-node-leaf .x-tree-node-icon{
- background-image:url(../images/default/tree/leaf.gif.spring);
+ background-image:url(../images/default/tree/leaf.gif);
}
@@ -2161,7 +2161,7 @@ input.x-tree-node-cb {
}
.x-tree-node-loading .x-tree-node-icon{
- background-image:url(../images/default/tree/loading.gif.spring) !important;
+ background-image:url(../images/default/tree/loading.gif) !important;
}
.x-tree-node-loading a span{
font-style: italic;
@@ -2170,25 +2170,25 @@ input.x-tree-node-cb {
.x-tree-lines .x-tree-elbow{
- background-image:url(../images/default/tree/elbow.gif.spring);
+ background-image:url(../images/default/tree/elbow.gif);
}
.x-tree-lines .x-tree-elbow-plus{
- background-image:url(../images/default/tree/elbow-plus.gif.spring);
+ background-image:url(../images/default/tree/elbow-plus.gif);
}
.x-tree-lines .x-tree-elbow-minus{
- background-image:url(../images/default/tree/elbow-minus.gif.spring);
+ background-image:url(../images/default/tree/elbow-minus.gif);
}
.x-tree-lines .x-tree-elbow-end{
- background-image:url(../images/default/tree/elbow-end.gif.spring);
+ background-image:url(../images/default/tree/elbow-end.gif);
}
.x-tree-lines .x-tree-elbow-end-plus{
- background-image:url(../images/default/tree/elbow-end-plus.gif.spring);
+ background-image:url(../images/default/tree/elbow-end-plus.gif);
}
.x-tree-lines .x-tree-elbow-end-minus{
- background-image:url(../images/default/tree/elbow-end-minus.gif.spring);
+ background-image:url(../images/default/tree/elbow-end-minus.gif);
}
.x-tree-lines .x-tree-elbow-line{
- background-image:url(../images/default/tree/elbow-line.gif.spring);
+ background-image:url(../images/default/tree/elbow-line.gif);
}
@@ -2196,19 +2196,19 @@ input.x-tree-node-cb {
background:transparent;
}
.x-tree-no-lines .x-tree-elbow-plus{
- background-image:url(../images/default/tree/elbow-plus-nl.gif.spring);
+ background-image:url(../images/default/tree/elbow-plus-nl.gif);
}
.x-tree-no-lines .x-tree-elbow-minus{
- background-image:url(../images/default/tree/elbow-minus-nl.gif.spring);
+ background-image:url(../images/default/tree/elbow-minus-nl.gif);
}
.x-tree-no-lines .x-tree-elbow-end{
background:transparent;
}
.x-tree-no-lines .x-tree-elbow-end-plus{
- background-image:url(../images/default/tree/elbow-end-plus-nl.gif.spring);
+ background-image:url(../images/default/tree/elbow-end-plus-nl.gif);
}
.x-tree-no-lines .x-tree-elbow-end-minus{
- background-image:url(../images/default/tree/elbow-end-minus-nl.gif.spring);
+ background-image:url(../images/default/tree/elbow-end-minus-nl.gif);
}
.x-tree-no-lines .x-tree-elbow-line{
background:transparent;
@@ -2285,16 +2285,16 @@ input.x-tree-node-cb {
display:none !important;
}
.x-tree-drop-ok-append .x-dd-drop-icon{
- background-image: url(../images/default/tree/drop-add.gif.spring);
+ background-image: url(../images/default/tree/drop-add.gif);
}
.x-tree-drop-ok-above .x-dd-drop-icon{
- background-image: url(../images/default/tree/drop-over.gif.spring);
+ background-image: url(../images/default/tree/drop-over.gif);
}
.x-tree-drop-ok-below .x-dd-drop-icon{
- background-image: url(../images/default/tree/drop-under.gif.spring);
+ background-image: url(../images/default/tree/drop-under.gif);
}
.x-tree-drop-ok-between .x-dd-drop-icon{
- background-image: url(../images/default/tree/drop-between.gif.spring);
+ background-image: url(../images/default/tree/drop-between.gif);
}
.x-tip{
@@ -2306,7 +2306,7 @@ input.x-tree-node-cb {
border:0 none;
}
.x-tip .x-tip-close{
- background-image: url(../images/default/qtip/close.gif.spring);
+ background-image: url(../images/default/qtip/close.gif);
height: 15px;
float:right;
width: 15px;
@@ -2315,32 +2315,32 @@ input.x-tree-node-cb {
display:none;
}
.x-tip .x-tip-top {
- background: transparent url(../images/default/qtip/tip-sprite.gif.spring) no-repeat 0 -12px;
+ background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -12px;
height:6px;
overflow:hidden;
}
.x-tip .x-tip-top-left {
- background: transparent url(../images/default/qtip/tip-sprite.gif.spring) no-repeat 0 0;
+ background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 0;
padding-left:6px;
zoom:1;
}
.x-tip .x-tip-top-right {
- background: transparent url(../images/default/qtip/tip-sprite.gif.spring) no-repeat right 0;
+ background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right 0;
padding-right:6px;
zoom:1;
}
.x-tip .x-tip-ft {
- background: transparent url(../images/default/qtip/tip-sprite.gif.spring) no-repeat 0 -18px;
+ background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -18px;
height:6px;
overflow:hidden;
}
.x-tip .x-tip-ft-left {
- background: transparent url(../images/default/qtip/tip-sprite.gif.spring) no-repeat 0 -6px;
+ background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -6px;
padding-left:6px;
zoom:1;
}
.x-tip .x-tip-ft-right {
- background: transparent url(../images/default/qtip/tip-sprite.gif.spring) no-repeat right -6px;
+ background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right -6px;
padding-right:6px;
zoom:1;
}
@@ -2349,12 +2349,12 @@ input.x-tree-node-cb {
font: normal 11px tahoma,arial,helvetica,sans-serif;
}
.x-tip .x-tip-bd-left {
- background: #fff url(../images/default/qtip/tip-sprite.gif.spring) no-repeat 0 -24px;
+ background: #fff url(../images/default/qtip/tip-sprite.gif) no-repeat 0 -24px;
padding-left:6px;
zoom:1;
}
.x-tip .x-tip-bd-right {
- background: transparent url(../images/default/qtip/tip-sprite.gif.spring) no-repeat right -24px;
+ background: transparent url(../images/default/qtip/tip-sprite.gif) no-repeat right -24px;
padding-right:6px;
zoom:1;
}
@@ -2379,32 +2379,32 @@ input.x-tree-node-cb {
}
.x-form-invalid-tip .x-tip-top {
- background-image: url(../images/default/form/error-tip-corners.gif.spring);
+ background-image: url(../images/default/form/error-tip-corners.gif);
}
.x-form-invalid-tip .x-tip-top-left {
- background-image: url(../images/default/form/error-tip-corners.gif.spring);
+ background-image: url(../images/default/form/error-tip-corners.gif);
}
.x-form-invalid-tip .x-tip-top-right {
- background-image: url(../images/default/form/error-tip-corners.gif.spring);
+ background-image: url(../images/default/form/error-tip-corners.gif);
}
.x-form-invalid-tip .x-tip-ft {
- background-image: url(../images/default/form/error-tip-corners.gif.spring);
+ background-image: url(../images/default/form/error-tip-corners.gif);
}
.x-form-invalid-tip .x-tip-ft-left {
- background-image: url(../images/default/form/error-tip-corners.gif.spring);
+ background-image: url(../images/default/form/error-tip-corners.gif);
}
.x-form-invalid-tip .x-tip-ft-right {
- background-image: url(../images/default/form/error-tip-corners.gif.spring);
+ background-image: url(../images/default/form/error-tip-corners.gif);
}
.x-form-invalid-tip .x-tip-bd-left {
- background-image: url(../images/default/form/error-tip-corners.gif.spring);
+ background-image: url(../images/default/form/error-tip-corners.gif);
}
.x-form-invalid-tip .x-tip-bd-right {
- background-image: url(../images/default/form/error-tip-corners.gif.spring);
+ background-image: url(../images/default/form/error-tip-corners.gif);
}
.x-form-invalid-tip .x-tip-bd .x-tip-bd-inner {
padding-left:24px;
- background:transparent url(../images/default/form/exclamation.gif.spring) no-repeat 2px 2px;
+ background:transparent url(../images/default/form/exclamation.gif) no-repeat 2px 2px;
}
.x-form-invalid-tip .x-tip-bd-inner {
padding:2px;
@@ -2423,7 +2423,7 @@ input.x-tree-node-cb {
border-collapse:separate;
}
.x-date-middle,.x-date-left,.x-date-right {
- background: url(../images/default/basic-dialog/hd-sprite.gif.spring) repeat-x 0 -83px;
+ background: url(../images/default/basic-dialog/hd-sprite.gif) repeat-x 0 -83px;
color:#FFF;
font:bold 11px "sans serif", tahoma, verdana, helvetica;
overflow:hidden;
@@ -2437,7 +2437,7 @@ input.x-tree-node-cb {
color:#fff;
}
.x-date-middle .x-btn-with-menu .x-btn-center em {
- background:transparent url(../images/default/toolbar/btn-arrow-light.gif.spring) no-repeat right 0;
+ background:transparent url(../images/default/toolbar/btn-arrow-light.gif) no-repeat right 0;
}
.x-date-right, .x-date-left {
width:18px;
@@ -2465,12 +2465,12 @@ input.x-tree-node-cb {
filter: alpha(opacity=100);
}
.x-date-right a {
- background-image: url(../images/default/shared/right-btn.gif.spring);
+ background-image: url(../images/default/shared/right-btn.gif);
margin-right:2px;
text-decoration:none !important;
}
.x-date-left a{
- background-image: url(../images/default/shared/left-btn.gif.spring);
+ background-image: url(../images/default/shared/left-btn.gif);
margin-left:2px;
text-decoration:none !important;
}
@@ -2482,7 +2482,7 @@ table.x-date-inner {
width:25px;
}
.x-date-inner th {
- background: #dfecfb url(../images/default/shared/glass-bg.gif.spring) repeat-x left top;
+ background: #dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;
text-align:right !important;
border-bottom: 1px solid #a3bad9;
font:normal 10px arial, helvetica,tahoma,sans-serif;
@@ -2515,7 +2515,7 @@ table.x-date-inner {
color:black;
}
.x-date-inner .x-date-selected a{
- background: #dfecfb url(../images/default/shared/glass-bg.gif.spring) repeat-x left top;
+ background: #dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;
border:1px solid #8db2e3;
padding:1px 4px;
}
@@ -2533,7 +2533,7 @@ table.x-date-inner {
.x-date-bottom {
padding:4px;
border-top: 1px solid #a3bad9;
- background: #dfecfb url(../images/default/shared/glass-bg.gif.spring) repeat-x left top;
+ background: #dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;
}
.x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{
@@ -2594,7 +2594,7 @@ td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn {
cursor:pointer;
}
.x-date-mp-btns {
- background: #dfecfb url(../images/default/shared/glass-bg.gif.spring) repeat-x left top;
+ background: #dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;
}
.x-date-mp-btns td {
border-top: 1px solid #c5d2df;
@@ -2617,7 +2617,7 @@ td.x-date-mp-month a:hover,td.x-date-mp-year a:hover {
td.x-date-mp-sel a {
padding:1px 3px;
- background: #dfecfb url(../images/default/shared/glass-bg.gif.spring) repeat-x left top;
+ background: #dfecfb url(../images/default/shared/glass-bg.gif) repeat-x left top;
border:1px solid #8db2e3;
}
.x-date-mp-ybtn a {
@@ -2625,7 +2625,7 @@ td.x-date-mp-sel a {
width:15px;
height:15px;
cursor:pointer;
- background:transparent url(../images/default/panel/tool-sprites.gif.spring) no-repeat;
+ background:transparent url(../images/default/panel/tool-sprites.gif) no-repeat;
display:block;
margin:0 auto;
}
@@ -2650,7 +2650,7 @@ td.x-date-mp-sep {
.x-menu {
border:1px solid #718bb7;
z-index: 15000;
- background: #fff url(../images/default/menu/menu.gif.spring) repeat-y;
+ background: #fff url(../images/default/menu/menu.gif) repeat-y;
}
.ext-ie .x-menu {
zoom:1;
@@ -2675,7 +2675,7 @@ td.x-date-mp-sep {
padding:1px;
}
.x-menu-item-arrow{
- background:transparent url(../images/default/menu/menu-parent.gif.spring) no-repeat right;
+ background:transparent url(../images/default/menu/menu-parent.gif) no-repeat right;
}
.x-menu-sep {
display:block;
@@ -2721,18 +2721,18 @@ td.x-date-mp-sep {
}
.x-menu-check-item .x-menu-item-icon{
- background: transparent url(../images/default/menu/unchecked.gif.spring) no-repeat center;
+ background: transparent url(../images/default/menu/unchecked.gif) no-repeat center;
}
.x-menu-item-checked .x-menu-item-icon{
- background-image:url(../images/default/menu/checked.gif.spring);
+ background-image:url(../images/default/menu/checked.gif);
}
.x-menu-group-item .x-menu-item-icon{
background: transparent;
}
.x-menu-item-checked .x-menu-group-item .x-menu-item-icon{
- background: transparent url(../images/default/menu/group-checked.gif.spring) no-repeat center;
+ background: transparent url(../images/default/menu/group-checked.gif) no-repeat center;
}
.x-menu-plain {
@@ -2762,29 +2762,29 @@ td.x-date-mp-sep {
.x-box-tl {
- background: transparent url(../images/default/box/corners.gif.spring) no-repeat 0 0;
+ background: transparent url(../images/default/box/corners.gif) no-repeat 0 0;
zoom:1;
}
.x-box-tc {
height: 8px;
- background: transparent url(../images/default/box/tb.gif.spring) repeat-x 0 0;
+ background: transparent url(../images/default/box/tb.gif) repeat-x 0 0;
overflow: hidden;
}
.x-box-tr {
- background: transparent url(../images/default/box/corners.gif.spring) no-repeat right -8px;
+ background: transparent url(../images/default/box/corners.gif) no-repeat right -8px;
}
.x-box-ml {
- background: transparent url(../images/default/box/l.gif.spring) repeat-y 0;
+ background: transparent url(../images/default/box/l.gif) repeat-y 0;
padding-left: 4px;
overflow: hidden;
zoom:1;
}
.x-box-mc {
- background: #eee url(../images/default/box/tb.gif.spring) repeat-x 0 -16px;
+ background: #eee url(../images/default/box/tb.gif) repeat-x 0 -16px;
padding: 4px 10px;
font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif;
color: #393939;
@@ -2799,24 +2799,24 @@ td.x-date-mp-sep {
}
.x-box-mr {
- background: transparent url(../images/default/box/r.gif.spring) repeat-y right;
+ background: transparent url(../images/default/box/r.gif) repeat-y right;
padding-right: 4px;
overflow: hidden;
}
.x-box-bl {
- background: transparent url(../images/default/box/corners.gif.spring) no-repeat 0 -16px;
+ background: transparent url(../images/default/box/corners.gif) no-repeat 0 -16px;
zoom:1;
}
.x-box-bc {
- background: transparent url(../images/default/box/tb.gif.spring) repeat-x 0 -8px;
+ background: transparent url(../images/default/box/tb.gif) repeat-x 0 -8px;
height: 8px;
overflow: hidden;
}
.x-box-br {
- background: transparent url(../images/default/box/corners.gif.spring) no-repeat right -24px;
+ background: transparent url(../images/default/box/corners.gif) no-repeat right -24px;
}
.x-box-tl, .x-box-bl {
@@ -2830,11 +2830,11 @@ td.x-date-mp-sep {
}
.x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr {
- background-image: url(../images/default/box/corners-blue.gif.spring);
+ background-image: url(../images/default/box/corners-blue.gif);
}
.x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc {
- background-image: url(../images/default/box/tb-blue.gif.spring);
+ background-image: url(../images/default/box/tb-blue.gif);
}
.x-box-blue .x-box-mc {
@@ -2846,11 +2846,11 @@ td.x-date-mp-sep {
}
.x-box-blue .x-box-ml {
- background-image: url(../images/default/box/l-blue.gif.spring);
+ background-image: url(../images/default/box/l-blue.gif);
}
.x-box-blue .x-box-mr {
- background-image: url(../images/default/box/r-blue.gif.spring);
+ background-image: url(../images/default/box/r-blue.gif);
}
#x-debug-browser .x-tree .x-tree-node a span {
color:#222297;
@@ -2915,7 +2915,7 @@ td.x-date-mp-sep {
.x-combo-list-hd {
font:bold 11px tahoma, arial, helvetica, sans-serif;
color:#15428b;
- background-image: url(../images/default/layout/panel-title-light-bg.gif.spring);
+ background-image: url(../images/default/layout/panel-title-light-bg.gif);
border-bottom:1px solid #98c0f4;
padding:3px;
}
@@ -2946,7 +2946,7 @@ td.x-date-mp-sep {
background:white;
}
.x-html-editor-tb .x-btn-text {
- background:transparent url(../images/default/editor/tb-sprite.gif.spring) no-repeat;
+ background:transparent url(../images/default/editor/tb-sprite.gif) no-repeat;
}
.x-html-editor-tb .x-edit-bold .x-btn-text {
background-position:0 0;
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/btn-arrow.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/btn-arrow.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/btn-arrow.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/btn-arrow.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/btn-sprite.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/btn-sprite.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/btn-sprite.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/btn-sprite.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/close.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/close.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/close.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/close.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/collapse.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/collapse.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/collapse.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/collapse.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/e-handle.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/e-handle.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/e-handle.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/e-handle.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/expand.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/expand.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/expand.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/expand.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/hd-sprite.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/hd-sprite.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/hd-sprite.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/hd-sprite.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/progress.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/progress.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/progress.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/progress.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/progress2.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/progress2.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/progress2.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/progress2.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/s-handle.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/s-handle.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/s-handle.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/s-handle.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/se-handle.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/se-handle.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/basic-dialog/se-handle.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/basic-dialog/se-handle.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/corners-blue.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/box/corners-blue.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/corners-blue.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/box/corners-blue.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/corners.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/box/corners.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/corners.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/box/corners.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/l-blue.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/box/l-blue.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/l-blue.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/box/l-blue.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/l.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/box/l.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/l.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/box/l.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/r-blue.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/box/r-blue.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/r-blue.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/box/r-blue.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/r.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/box/r.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/r.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/box/r.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/tb-blue.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/box/tb-blue.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/tb-blue.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/box/tb-blue.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/tb.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/box/tb.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/box/tb.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/box/tb.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/dd/drop-add.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/dd/drop-add.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/dd/drop-add.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/dd/drop-add.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/dd/drop-no.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/dd/drop-no.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/dd/drop-no.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/dd/drop-no.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/dd/drop-yes.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/dd/drop-yes.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/dd/drop-yes.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/dd/drop-yes.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/editor/tb-sprite.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/editor/tb-sprite.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/editor/tb-sprite.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/editor/tb-sprite.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/clear-trigger.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/form/clear-trigger.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/clear-trigger.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/form/clear-trigger.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/clear-trigger.psd b/spring-faces/src/main/java/META-INF/ext/resources/images/default/form/clear-trigger.psd
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/clear-trigger.psd
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/form/clear-trigger.psd
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/date-trigger.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/form/date-trigger.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/date-trigger.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/form/date-trigger.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/date-trigger.psd b/spring-faces/src/main/java/META-INF/ext/resources/images/default/form/date-trigger.psd
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/date-trigger.psd
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/form/date-trigger.psd
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/error-tip-corners.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/form/error-tip-corners.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/error-tip-corners.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/form/error-tip-corners.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/exclamation.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/form/exclamation.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/exclamation.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/form/exclamation.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/search-trigger.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/form/search-trigger.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/search-trigger.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/form/search-trigger.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/search-trigger.psd b/spring-faces/src/main/java/META-INF/ext/resources/images/default/form/search-trigger.psd
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/search-trigger.psd
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/form/search-trigger.psd
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/text-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/form/text-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/text-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/form/text-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/trigger-tpl.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/form/trigger-tpl.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/trigger-tpl.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/form/trigger-tpl.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/trigger.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/form/trigger.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/trigger.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/form/trigger.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/trigger.psd b/spring-faces/src/main/java/META-INF/ext/resources/images/default/form/trigger.psd
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/form/trigger.psd
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/form/trigger.psd
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/gradient-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/gradient-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/gradient-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/gradient-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/Thumbs.db b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/Thumbs.db
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/Thumbs.db
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/Thumbs.db
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/arrow-left-white.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/arrow-left-white.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/arrow-left-white.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/arrow-left-white.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/arrow-right-white.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/arrow-right-white.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/arrow-right-white.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/arrow-right-white.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/col-move-bottom.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/col-move-bottom.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/col-move-bottom.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/col-move-bottom.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/col-move-top.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/col-move-top.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/col-move-top.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/col-move-top.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/dirty.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/dirty.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/dirty.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/dirty.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/done.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/done.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/done.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/done.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/drop-no.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/drop-no.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/drop-no.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/drop-no.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/drop-yes.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/drop-yes.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/drop-yes.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/drop-yes.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/footer-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/footer-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/footer-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/footer-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid-blue-hd.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid-blue-hd.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid-blue-hd.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid-blue-hd.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid-blue-split.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid-blue-split.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid-blue-split.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid-blue-split.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid-hrow.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid-hrow.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid-hrow.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid-hrow.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid-loading.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid-loading.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid-loading.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid-loading.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid-split.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid-split.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid-split.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid-split.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid-vista-hd.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid-vista-hd.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid-vista-hd.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid-vista-hd.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid3-hd-btn.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid3-hd-btn.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid3-hd-btn.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid3-hd-btn.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid3-hrow-over.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid3-hrow-over.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid3-hrow-over.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid3-hrow-over.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid3-hrow.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid3-hrow.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid3-hrow.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid3-hrow.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid3-special-col-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid3-special-col-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid3-special-col-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid3-special-col-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hd-pop.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hd-pop.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hd-pop.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hd-pop.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hmenu-asc.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hmenu-asc.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hmenu-asc.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hmenu-asc.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hmenu-desc.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hmenu-desc.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hmenu-desc.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hmenu-desc.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hmenu-lock.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hmenu-lock.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hmenu-lock.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hmenu-lock.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hmenu-lock.png b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hmenu-lock.png
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hmenu-lock.png
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hmenu-lock.png
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hmenu-unlock.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hmenu-unlock.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hmenu-unlock.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hmenu-unlock.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hmenu-unlock.png b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hmenu-unlock.png
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/hmenu-unlock.png
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/hmenu-unlock.png
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/invalid_line.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/invalid_line.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/invalid_line.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/invalid_line.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/loading.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/loading.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/loading.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/loading.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/mso-hd.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/mso-hd.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/mso-hd.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/mso-hd.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/nowait.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/nowait.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/nowait.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/nowait.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-first-disabled.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-first-disabled.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-first-disabled.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-first-disabled.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-first.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-first.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-first.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-first.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-last-disabled.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-last-disabled.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-last-disabled.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-last-disabled.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-last.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-last.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-last.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-last.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-next-disabled.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-next-disabled.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-next-disabled.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-next-disabled.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-next.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-next.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-next.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-next.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-prev-disabled.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-prev-disabled.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-prev-disabled.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-prev-disabled.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-prev.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-prev.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/page-prev.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/page-prev.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/pick-button.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/pick-button.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/pick-button.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/pick-button.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/refresh.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/refresh.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/refresh.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/refresh.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/row-check-sprite.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/row-check-sprite.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/row-check-sprite.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/row-check-sprite.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/row-expand-sprite.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/row-expand-sprite.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/row-expand-sprite.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/row-expand-sprite.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/row-over.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/row-over.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/row-over.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/row-over.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/row-sel.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/row-sel.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/row-sel.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/row-sel.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/sort_asc.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/sort_asc.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/sort_asc.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/sort_asc.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/sort_desc.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/sort_desc.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/sort_desc.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/sort_desc.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/wait.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/wait.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/grid/wait.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/grid/wait.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/collapse.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/collapse.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/collapse.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/collapse.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/expand.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/expand.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/expand.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/expand.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/gradient-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/gradient-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/gradient-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/gradient-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/ns-collapse.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/ns-collapse.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/ns-collapse.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/ns-collapse.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/ns-expand.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/ns-expand.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/ns-expand.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/ns-expand.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/panel-close.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/panel-close.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/panel-close.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/panel-close.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/panel-title-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/panel-title-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/panel-title-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/panel-title-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/panel-title-light-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/panel-title-light-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/panel-title-light-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/panel-title-light-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/stick.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/stick.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/stick.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/stick.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/stuck.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/stuck.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/stuck.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/stuck.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/tab-close-on.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/tab-close-on.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/tab-close-on.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/tab-close-on.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/tab-close.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/tab-close.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/layout/tab-close.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/layout/tab-close.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/menu/checked.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/menu/checked.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/menu/checked.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/menu/checked.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/menu/group-checked.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/menu/group-checked.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/menu/group-checked.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/menu/group-checked.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/menu/menu-parent.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/menu/menu-parent.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/menu/menu-parent.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/menu/menu-parent.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/menu/menu.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/menu/menu.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/menu/menu.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/menu/menu.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/menu/unchecked.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/menu/unchecked.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/menu/unchecked.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/menu/unchecked.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/panel/tool-sprites.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/panel/tool-sprites.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/panel/tool-sprites.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/panel/tool-sprites.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/qtip/bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/qtip/bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/qtip/bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/qtip/bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/qtip/close.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/qtip/close.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/qtip/close.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/qtip/close.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/qtip/tip-sprite.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/qtip/tip-sprite.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/qtip/tip-sprite.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/qtip/tip-sprite.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/s.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/s.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/s.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/s.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shadow-c.png b/spring-faces/src/main/java/META-INF/ext/resources/images/default/shadow-c.png
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shadow-c.png
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/shadow-c.png
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shadow-lr.png b/spring-faces/src/main/java/META-INF/ext/resources/images/default/shadow-lr.png
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shadow-lr.png
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/shadow-lr.png
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shadow.png b/spring-faces/src/main/java/META-INF/ext/resources/images/default/shadow.png
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shadow.png
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/shadow.png
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shared/calendar.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/shared/calendar.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shared/calendar.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/shared/calendar.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shared/glass-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/shared/glass-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shared/glass-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/shared/glass-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shared/left-btn.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/shared/left-btn.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shared/left-btn.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/shared/left-btn.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shared/right-btn.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/shared/right-btn.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shared/right-btn.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/shared/right-btn.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shared/warning.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/shared/warning.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/shared/warning.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/shared/warning.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/e-handle-dark.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/e-handle-dark.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/e-handle-dark.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/e-handle-dark.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/e-handle.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/e-handle.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/e-handle.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/e-handle.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/ne-handle-dark.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/ne-handle-dark.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/ne-handle-dark.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/ne-handle-dark.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/ne-handle.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/ne-handle.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/ne-handle.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/ne-handle.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/nw-handle-dark.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/nw-handle-dark.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/nw-handle-dark.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/nw-handle-dark.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/nw-handle.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/nw-handle.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/nw-handle.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/nw-handle.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/s-handle-dark.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/s-handle-dark.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/s-handle-dark.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/s-handle-dark.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/s-handle.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/s-handle.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/s-handle.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/s-handle.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/se-handle-dark.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/se-handle-dark.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/se-handle-dark.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/se-handle-dark.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/se-handle.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/se-handle.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/se-handle.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/se-handle.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/square.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/square.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/square.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/square.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/sw-handle-dark.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/sw-handle-dark.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/sw-handle-dark.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/sw-handle-dark.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/sw-handle.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/sw-handle.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/sizer/sw-handle.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/sizer/sw-handle.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tabs/tab-btm-left-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tabs/tab-btm-left-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tabs/tab-btm-left-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tabs/tab-btm-left-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tabs/tab-btm-right-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tabs/tab-btm-right-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tabs/tab-btm-right-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tabs/tab-btm-right-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tabs/tab-sprite.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tabs/tab-sprite.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tabs/tab-sprite.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tabs/tab-sprite.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/toolbar/btn-arrow-light.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/toolbar/btn-arrow-light.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/toolbar/btn-arrow-light.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/toolbar/btn-arrow-light.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/toolbar/btn-arrow.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/toolbar/btn-arrow.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/toolbar/btn-arrow.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/toolbar/btn-arrow.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/toolbar/btn-over-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/toolbar/btn-over-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/toolbar/btn-over-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/toolbar/btn-over-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/toolbar/gray-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/toolbar/gray-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/toolbar/gray-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/toolbar/gray-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/toolbar/tb-bg.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/toolbar/tb-bg.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/toolbar/tb-bg.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/toolbar/tb-bg.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/toolbar/tb-btn-sprite.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/toolbar/tb-btn-sprite.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/toolbar/tb-btn-sprite.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/toolbar/tb-btn-sprite.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/drop-add.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/drop-add.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/drop-add.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/drop-add.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/drop-between.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/drop-between.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/drop-between.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/drop-between.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/drop-no.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/drop-no.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/drop-no.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/drop-no.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/drop-over.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/drop-over.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/drop-over.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/drop-over.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/drop-under.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/drop-under.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/drop-under.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/drop-under.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/drop-yes.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/drop-yes.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/drop-yes.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/drop-yes.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-end-minus-nl.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-end-minus-nl.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-end-minus-nl.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-end-minus-nl.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-end-minus.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-end-minus.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-end-minus.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-end-minus.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-end-plus-nl.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-end-plus-nl.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-end-plus-nl.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-end-plus-nl.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-end-plus.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-end-plus.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-end-plus.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-end-plus.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-end.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-end.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-end.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-end.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-line.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-line.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-line.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-line.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-minus-nl.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-minus-nl.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-minus-nl.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-minus-nl.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-minus.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-minus.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-minus.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-minus.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-plus-nl.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-plus-nl.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-plus-nl.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-plus-nl.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-plus.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-plus.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow-plus.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow-plus.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/elbow.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/elbow.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/folder-open.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/folder-open.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/folder-open.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/folder-open.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/folder.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/folder.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/folder.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/folder.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/leaf.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/leaf.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/leaf.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/leaf.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/loading.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/loading.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/loading.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/loading.gif
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/s.gif b/spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/s.gif
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/ext/resources/images/default/tree/s.gif
rename to spring-faces/src/main/java/META-INF/ext/resources/images/default/tree/s.gif
diff --git a/spring-faces/src/main/java/META-INF/faces-config.xml b/spring-faces/src/main/java/META-INF/faces-config.xml
index 0d8ebe24..22ac2fa0 100644
--- a/spring-faces/src/main/java/META-INF/faces-config.xml
+++ b/spring-faces/src/main/java/META-INF/faces-config.xml
@@ -1,19 +1,21 @@
-
+
-
-
-
- org.springframework.faces.webflow.FlowNavigationHandler
- org.springframework.faces.webflow.el.DelegatingFlowVariableResolver
- org.springframework.web.jsf.DelegatingVariableResolver
-
+
+ org.springframework.faces.webflow.FlowLifecycleFactory
+ org.springframework.faces.webflow.FlowFacesContextFactory
+ org.springframework.faces.webflow.FlowRenderKitFactory
+
-
- org.springframework.faces.webflow.FlowPhaseListener
-
+
+ org.springframework.faces.webflow.FlowActionListener
+ org.springframework.webflow.core.expression.el.RequestContextELResolver
+ org.springframework.webflow.core.expression.el.ScopeSearchingELResolver
+ org.springframework.faces.webflow.FlowExecutionViewHandler
+ spring.faces.ClientTextValidator
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/SpringFaces.js b/spring-faces/src/main/java/META-INF/spring-faces/SpringFaces.js
similarity index 100%
rename from spring-faces/src/main/java/org/springframework/faces/ui/SpringFaces.js
rename to spring-faces/src/main/java/META-INF/spring-faces/SpringFaces.js
diff --git a/spring-faces/src/main/java/org/springframework/faces/el/Jsf11ELExpressionParser.java b/spring-faces/src/main/java/org/springframework/faces/el/Jsf11ELExpressionParser.java
deleted file mode 100644
index a840e5e8..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/el/Jsf11ELExpressionParser.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.springframework.faces.el;
-
-import javax.el.ELContext;
-import javax.el.ELResolver;
-import javax.el.ExpressionFactory;
-import javax.el.FunctionMapper;
-import javax.el.VariableMapper;
-import javax.faces.context.FacesContext;
-
-import org.springframework.binding.expression.el.DefaultELContextFactory;
-import org.springframework.binding.expression.el.ELExpressionParser;
-
-/**
- * A JSF-aware ExpressionParser that allows JSF 1.1 managed beans to be referenced in expressions in the FlowDefinition.
- * @author Jeremy Grelle
- */
-public class Jsf11ELExpressionParser extends ELExpressionParser {
-
- /**
- * Creates a new JSF 1.1 compatible expression parser
- * @param expressionFactory the unified EL expression factory implementation
- */
- public Jsf11ELExpressionParser(ExpressionFactory expressionFactory) {
- super(expressionFactory, new Jsf11ELContextFactory());
- }
-
- /**
- * Inner helper class that plus in the EL Resolver that resolves expressions using JSF 1.1 APIs.
- */
- private static class Jsf11ELContextFactory extends DefaultELContextFactory {
-
- public ELContext getEvaluationContext(Object target) {
- return new Jsf11ELContext(FacesContext.getCurrentInstance());
- }
-
- private static class Jsf11ELContext extends ELContext {
-
- private ELResolver baseResolver;
-
- public Jsf11ELContext(FacesContext context) {
- baseResolver = new Jsf11ELResolverAdapter(context);
- }
-
- public ELResolver getELResolver() {
- return baseResolver;
- }
-
- public FunctionMapper getFunctionMapper() {
- return null;
- }
-
- public VariableMapper getVariableMapper() {
- return null;
- }
- }
- }
-
-}
diff --git a/spring-faces/src/main/java/org/springframework/faces/el/Jsf11ELResolverAdapter.java b/spring-faces/src/main/java/org/springframework/faces/el/Jsf11ELResolverAdapter.java
deleted file mode 100644
index 7628ab23..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/el/Jsf11ELResolverAdapter.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package org.springframework.faces.el;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.el.ELContext;
-import javax.el.ELException;
-import javax.el.ELResolver;
-import javax.el.PropertyNotWritableException;
-import javax.faces.context.FacesContext;
-import javax.faces.el.EvaluationException;
-import javax.faces.el.PropertyNotFoundException;
-import javax.faces.el.PropertyResolver;
-import javax.faces.el.VariableResolver;
-
-/**
- * An adapter for using JSF 1.1 {@link VariableResolver}s and {@link PropertyResolver}s in an {@link ELContext}.
- * @author Jeremy Grelle0
- */
-public class Jsf11ELResolverAdapter extends ELResolver {
-
- private FacesContext facesContext;
-
- /**
- * Creates a new adapter that adapts JSF 1.1 EL constructs to the Unified EL Resolver construct.
- * @param facesContext the current faces context
- */
- public Jsf11ELResolverAdapter(FacesContext facesContext) {
- this.facesContext = facesContext;
- }
-
- public Class getCommonPropertyType(ELContext context, Object base) {
- return Object.class;
- }
-
- public Iterator getFeatureDescriptors(ELContext context, Object base) {
- return Collections.EMPTY_LIST.iterator();
- }
-
- public Class getType(ELContext context, Object base, Object property) {
- if (property == null) {
- return null;
- }
- try {
- context.setPropertyResolved(true);
- if (base == null) {
- Object var = getVariableResolver().resolveVariable(facesContext, property.toString());
- return (var != null) ? var.getClass() : null;
- } else {
- if (base instanceof List || base.getClass().isArray()) {
- return getPropertyResolver().getType(base, Integer.parseInt(property.toString()));
- } else {
- return getPropertyResolver().getType(base, property);
- }
- }
- } catch (PropertyNotFoundException ex) {
- throw new javax.el.PropertyNotFoundException(ex.getMessage(), ex.getCause());
- } catch (EvaluationException ex) {
- throw new ELException(ex.getMessage(), ex.getCause());
- }
- }
-
- public Object getValue(ELContext context, Object base, Object property) {
- if (property == null) {
- return null;
- }
- try {
- context.setPropertyResolved(true);
- if (base == null) {
- return getVariableResolver().resolveVariable(facesContext, property.toString());
- } else {
- if (base instanceof List || base.getClass().isArray()) {
- return getPropertyResolver().getValue(base, Integer.parseInt(property.toString()));
- } else {
- return getPropertyResolver().getValue(base, property);
- }
- }
- } catch (PropertyNotFoundException ex) {
- throw new javax.el.PropertyNotFoundException(ex.getMessage(), ex.getCause());
- } catch (EvaluationException ex) {
- throw new ELException(ex.getMessage(), ex.getCause());
- }
- }
-
- public boolean isReadOnly(ELContext context, Object base, Object property) {
- if (property == null) {
- return true;
- }
- try {
- context.setPropertyResolved(true);
- if (base == null) {
- return false; // VariableResolver provides no way to determine isReadOnly
- } else {
- if (base instanceof List || base.getClass().isArray()) {
- return getPropertyResolver().isReadOnly(base, Integer.parseInt(property.toString()));
- } else {
- return getPropertyResolver().isReadOnly(base, property);
- }
- }
- } catch (PropertyNotFoundException ex) {
- throw new javax.el.PropertyNotFoundException(ex.getMessage(), ex.getCause());
- } catch (EvaluationException ex) {
- throw new ELException(ex.getMessage(), ex.getCause());
- }
- }
-
- public void setValue(ELContext context, Object base, Object property, Object value) {
- if (property == null) {
- throw new PropertyNotWritableException("Property is Null");
- }
- try {
- context.setPropertyResolved(true);
- if (base instanceof List || base.getClass().isArray()) {
- getPropertyResolver().setValue(base, Integer.parseInt(property.toString()), value);
- } else {
- getPropertyResolver().setValue(base, property, value);
- }
-
- } catch (PropertyNotFoundException ex) {
- throw new javax.el.PropertyNotFoundException(ex.getMessage(), ex.getCause());
- } catch (EvaluationException ex) {
- throw new ELException(ex.getMessage(), ex.getCause());
- }
- }
-
- private VariableResolver getVariableResolver() {
- return facesContext.getApplication().getVariableResolver();
- }
-
- private PropertyResolver getPropertyResolver() {
- return facesContext.getApplication().getPropertyResolver();
- }
-
-}
diff --git a/spring-faces/src/main/java/org/springframework/faces/el/Jsf12ELExpressionParser.java b/spring-faces/src/main/java/org/springframework/faces/el/Jsf12ELExpressionParser.java
deleted file mode 100644
index 2772044c..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/el/Jsf12ELExpressionParser.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.springframework.faces.el;
-
-import javax.el.ELContext;
-import javax.el.ExpressionFactory;
-import javax.faces.context.FacesContext;
-
-import org.springframework.binding.expression.el.DefaultELContextFactory;
-import org.springframework.binding.expression.el.ELExpressionParser;
-
-/**
- * A JSF-aware ExpressionParser that allows JSF 1.2 managed beans to be referenced in expressions in the FlowDefinition.
- * @author Jeremy Grelle
- */
-public class Jsf12ELExpressionParser extends ELExpressionParser {
-
- /**
- * Creates a JSF 1.2 expression parser
- * @param expressionFactory the unified EL expression factory implementation to use
- */
- public Jsf12ELExpressionParser(ExpressionFactory expressionFactory) {
- super(expressionFactory, new Jsf12ELContextFactory());
- }
-
- /**
- * Simple little helper that grabs the current EL context from the faces context to support EL expression
- * evaluation.
- */
- private static class Jsf12ELContextFactory extends DefaultELContextFactory {
- public ELContext getEvaluationContext(Object target) {
- return FacesContext.getCurrentInstance().getELContext();
- }
- }
-
-}
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ExtJsRenderer.java b/spring-faces/src/main/java/org/springframework/faces/ui/ExtJsRenderer.java
index 94c460e9..9906753f 100644
--- a/spring-faces/src/main/java/org/springframework/faces/ui/ExtJsRenderer.java
+++ b/spring-faces/src/main/java/org/springframework/faces/ui/ExtJsRenderer.java
@@ -4,34 +4,32 @@ import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
-import javax.faces.context.ResponseWriter;
import javax.faces.render.Renderer;
-import org.apache.shale.remoting.Mechanism;
-import org.apache.shale.remoting.XhtmlHelper;
+import org.springframework.faces.ui.resource.FlowResourceHelper;
public class ExtJsRenderer extends Renderer {
- private static final String EXT_CSS = "/org/springframework/faces/ui/ext/resources/css/ext-all.css";
+ private static final String EXT_CSS = "/ext/resources/css/ext-all.css";
- private static final String EXT_SCRIPT = "/org/springframework/faces/ui/ext/ext.js";
+ private static final String EXT_SCRIPT = "/ext/ext.js";
- private static final String SPRING_FACES_SCRIPT = "/org/springframework/faces/ui/SpringFaces.js";
+ private static final String SPRING_FACES_SCRIPT = "/spring-faces/SpringFaces.js";
- private XhtmlHelper resourceHelper = new XhtmlHelper();
+ private FlowResourceHelper resourceHelper = new FlowResourceHelper();
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
ExtJsComponent extJsComponent = (ExtJsComponent) component;
- ResponseWriter writer = context.getResponseWriter();
+ if (extJsComponent.getIncludeExtStyles().equals(Boolean.TRUE)) {
+ resourceHelper.renderStyleLink(context, EXT_CSS);
+ }
- if (extJsComponent.getIncludeExtStyles().equals(Boolean.TRUE))
- resourceHelper.linkStylesheet(context, extJsComponent, writer, Mechanism.CLASS_RESOURCE, EXT_CSS);
+ if (extJsComponent.getIncludeExtScript().equals(Boolean.TRUE)) {
+ resourceHelper.renderScriptLink(context, EXT_SCRIPT);
+ }
- if (extJsComponent.getIncludeExtScript().equals(Boolean.TRUE))
- resourceHelper.linkJavascript(context, extJsComponent, writer, Mechanism.CLASS_RESOURCE, EXT_SCRIPT);
-
- resourceHelper.linkJavascript(context, extJsComponent, writer, Mechanism.CLASS_RESOURCE, SPRING_FACES_SCRIPT);
+ resourceHelper.renderScriptLink(context, SPRING_FACES_SCRIPT);
}
}
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/ExtValidateAllRenderer.java b/spring-faces/src/main/java/org/springframework/faces/ui/ExtValidateAllRenderer.java
index 8f2fe2aa..8eadf286 100644
--- a/spring-faces/src/main/java/org/springframework/faces/ui/ExtValidateAllRenderer.java
+++ b/spring-faces/src/main/java/org/springframework/faces/ui/ExtValidateAllRenderer.java
@@ -16,11 +16,13 @@ public class ExtValidateAllRenderer extends ExtJsRenderer {
ResponseWriter writer = context.getResponseWriter();
- if (component.getChildCount() == 0)
+ if (component.getChildCount() == 0) {
throw new FacesException("A Spring Faces advisor expects to have at least one child component.");
+ }
- if (!(component.getChildren().get(0) instanceof UICommand))
+ if (!(component.getChildren().get(0) instanceof UICommand)) {
throw new FacesException("ValidateAll expects to have a child of type UICommand.");
+ }
UIComponent advisedChild = (UIComponent) component.getChildren().get(0);
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/resource/FlowResourceHelper.java b/spring-faces/src/main/java/org/springframework/faces/ui/resource/FlowResourceHelper.java
new file mode 100644
index 00000000..0829eaab
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/ui/resource/FlowResourceHelper.java
@@ -0,0 +1,104 @@
+package org.springframework.faces.ui.resource;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+
+import org.springframework.webflow.context.FlowDefinitionRequestInfo;
+import org.springframework.webflow.context.RequestPath;
+import org.springframework.webflow.execution.RequestContext;
+import org.springframework.webflow.execution.RequestContextHolder;
+
+/**
+ * Helper used by Spring Faces component renderers to add links to javascript and css resources. The resource links will
+ * be rendered in the correct format for the requests to be handled by Web Flow and routed to a special "resources" flow
+ * that is engineered at runtime. The resource paths are cached so that a particular resource link is only rendered once
+ * per request.
+ * @author Jeremy Grelle
+ *
+ */
+public class FlowResourceHelper {
+
+ private static final String RENDERED_RESOURCES_KEY = "org.springframework.faces.RenderedResources";
+
+ /**
+ * Render a tag for a given script resource.
+ * @param facesContext
+ * @param scriptPath
+ * @throws IOException
+ */
+ public void renderScriptLink(FacesContext facesContext, String scriptPath) throws IOException {
+
+ if (alreadyRendered(facesContext, scriptPath)) {
+ return;
+ }
+
+ RequestContext requestContext = RequestContextHolder.getRequestContext();
+
+ ResponseWriter writer = facesContext.getResponseWriter();
+
+ writer.startElement("script", null);
+
+ writer.writeAttribute("type", "text/javascript", null);
+
+ FlowDefinitionRequestInfo requestInfo = new FlowDefinitionRequestInfo("resources", new RequestPath(scriptPath),
+ null, null);
+ String src = requestContext.getExternalContext().buildFlowDefinitionUrl(requestInfo);
+
+ writer.writeAttribute("src", src, null);
+
+ writer.endElement("script");
+
+ markRendered(facesContext, scriptPath);
+ }
+
+ /**
+ * Render a tag for a given stylesheet resource.
+ * @param facesContext
+ * @param cssPath
+ * @throws IOException
+ */
+ public void renderStyleLink(FacesContext facesContext, String cssPath) throws IOException {
+
+ if (alreadyRendered(facesContext, cssPath)) {
+ return;
+ }
+
+ RequestContext requestContext = RequestContextHolder.getRequestContext();
+
+ ResponseWriter writer = facesContext.getResponseWriter();
+
+ writer.startElement("link", null);
+
+ writer.writeAttribute("type", "text/css", null);
+ writer.writeAttribute("rel", "stylesheet", null);
+
+ FlowDefinitionRequestInfo requestInfo = new FlowDefinitionRequestInfo("resources", new RequestPath(cssPath),
+ null, null);
+ String src = requestContext.getExternalContext().buildFlowDefinitionUrl(requestInfo);
+
+ writer.writeAttribute("href", src, null);
+
+ writer.endElement("link");
+
+ markRendered(facesContext, cssPath);
+ }
+
+ private void markRendered(FacesContext facesContext, String scriptPath) {
+ Set renderedResources = (Set) facesContext.getExternalContext().getRequestMap().get(RENDERED_RESOURCES_KEY);
+ if (renderedResources == null) {
+ renderedResources = new HashSet();
+ facesContext.getExternalContext().getRequestMap().put(RENDERED_RESOURCES_KEY, renderedResources);
+ }
+ renderedResources.add(scriptPath);
+ }
+
+ private boolean alreadyRendered(FacesContext facesContext, String scriptPath) {
+ Set renderedResources = (Set) facesContext.getExternalContext().getRequestMap().get(RENDERED_RESOURCES_KEY);
+ return renderedResources != null && renderedResources.contains(scriptPath);
+ }
+
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceAction.java b/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceAction.java
new file mode 100644
index 00000000..9c36573e
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceAction.java
@@ -0,0 +1,85 @@
+package org.springframework.faces.ui.resource;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLConnection;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.util.ClassUtils;
+import org.springframework.webflow.execution.Action;
+import org.springframework.webflow.execution.Event;
+import org.springframework.webflow.execution.RequestContext;
+
+/**
+ * Special action for resolving and rendering static resources from within a JAR file.
+ *
+ * @author Jeremy Grelle
+ */
+public class ResolveAndRenderResourceAction implements Action {
+
+ private static final String IF_MODIFIED_SINCE_HEADER = "If-Modified-Since";
+
+ private static final String HTTP_CONTENT_LENGTH_HEADER = "Content-Length";
+
+ private static final String HTTP_LAST_MODIFIED_HEADER = "Last-Modified";
+
+ private Map defaultMimeTypes = new HashMap();
+ {
+ defaultMimeTypes.put(".css", "text/css");
+ defaultMimeTypes.put(".gif", "image/gif");
+ defaultMimeTypes.put(".ico", "image/vnd.microsoft.icon");
+ defaultMimeTypes.put(".jpeg", "image/jpeg");
+ defaultMimeTypes.put(".jpg", "image/jpeg");
+ defaultMimeTypes.put(".js", "text/javascript");
+ defaultMimeTypes.put(".png", "image/png");
+ }
+
+ public Event execute(RequestContext context) throws Exception {
+
+ String resourcePath = "META-INF" + context.getExternalContext().getRequestPath().toString();
+ URLConnection resourceConn = ClassUtils.getDefaultClassLoader().getResource(resourcePath).openConnection();
+ long lastModified = resourceConn.getLastModified();
+
+ HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
+ HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
+ ServletContext servletContext = (ServletContext) context.getExternalContext().getContext();
+
+ long ifModifiedSince = request.getDateHeader(IF_MODIFIED_SINCE_HEADER);
+ if (ifModifiedSince > 0 && lastModified / 1000 <= ifModifiedSince / 1000) {
+ response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
+ return new Event(this, "success");
+ }
+
+ String mimeType = servletContext.getMimeType(resourcePath);
+ if (mimeType == null) {
+ String extension = resourcePath.substring(resourcePath.lastIndexOf('.'));
+ mimeType = defaultMimeTypes.get(extension);
+ }
+ response.setContentType(mimeType);
+
+ response.setHeader(HTTP_CONTENT_LENGTH_HEADER, Long.toString(resourceConn.getContentLength()));
+
+ response.setDateHeader(HTTP_LAST_MODIFIED_HEADER, lastModified);
+
+ // TODO - Should probably be setting cache and expires headers as well
+
+ InputStream in = resourceConn.getInputStream();
+ OutputStream out = response.getOutputStream();
+ try {
+ byte[] buffer = new byte[1024];
+ while (in.available() > 0) {
+ int len = in.read(buffer);
+ out.write(buffer, 0, len);
+ }
+ } finally {
+ in.close();
+ out.close();
+ }
+ return new Event(this, "success");
+ }
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResourcesFlowBuilder.java b/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResourcesFlowBuilder.java
new file mode 100644
index 00000000..01d5f660
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResourcesFlowBuilder.java
@@ -0,0 +1,16 @@
+package org.springframework.faces.ui.resource;
+
+import org.springframework.webflow.engine.EndState;
+import org.springframework.webflow.engine.builder.FlowBuilderException;
+import org.springframework.webflow.engine.builder.support.AbstractFlowBuilder;
+
+/**
+ * Builder for generating the "resources" flow which is responsible for serving static resources from the classpath.
+ * @author Jeremy Grelle
+ */
+public class ResourcesFlowBuilder extends AbstractFlowBuilder {
+ public void buildStates() throws FlowBuilderException {
+ EndState endState = new EndState(getFlow(), "renderResource");
+ endState.setFinalResponseAction(new ResolveAndRenderResourceAction());
+ }
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowActionListener.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowActionListener.java
new file mode 100644
index 00000000..b57a96a2
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowActionListener.java
@@ -0,0 +1,30 @@
+package org.springframework.faces.webflow;
+
+import javax.faces.component.ActionSource;
+import javax.faces.context.FacesContext;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.ActionEvent;
+import javax.faces.event.ActionListener;
+
+import org.springframework.util.StringUtils;
+
+public class FlowActionListener implements ActionListener {
+
+ public void processAction(ActionEvent actionEvent) throws AbortProcessingException {
+
+ FacesContext context = FacesContext.getCurrentInstance();
+ ActionSource source = (ActionSource) actionEvent.getSource();
+ String result = null;
+
+ if (source.getAction() != null) {
+ result = (String) source.getAction().invoke(context, null);
+ }
+
+ if (StringUtils.hasText(result)) {
+ context.getExternalContext().getRequestMap().put(JsfView.EVENT_KEY, result);
+ } else {
+ context.getExternalContext().getRequestMap().remove(JsfView.EVENT_KEY);
+ }
+ }
+
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionHolder.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionHolder.java
deleted file mode 100644
index 72916e48..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionHolder.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import java.io.Serializable;
-
-import org.springframework.core.style.ToStringCreator;
-import org.springframework.webflow.execution.FlowExecution;
-import org.springframework.webflow.execution.ViewSelection;
-import org.springframework.webflow.execution.repository.FlowExecutionKey;
-import org.springframework.webflow.execution.repository.FlowExecutionLock;
-
-/**
- * A holder storing a reference to a flow execution and the key of that flow execution if it has been (or is about to
- * be) managed in a repository.
- *
- * @author Keith Donald
- */
-public class FlowExecutionHolder implements Serializable {
-
- /**
- * The flow execution continuation key (may be null if the flow execution has not yet been generated a repository
- * key). May change as well over the life of this object, as a flow execution can be given a new key to capture its
- * state at another point in time.
- */
- private FlowExecutionKey flowExecutionKey;
-
- /**
- * The held flow execution representing the state of an ongoing conversation at a point in time.
- */
- private FlowExecution flowExecution;
-
- /**
- * The lock obtained to exclusively manipulate the flow execution.
- */
- private FlowExecutionLock flowExecutionLock;
-
- /**
- * The currently selected view selection for this request.
- */
- private ViewSelection viewSelection;
-
- /**
- * Creates a new flow execution holder for a flow execution that has not yet been placed in a repository.
- * @param flowExecution the flow execution to hold
- */
- public FlowExecutionHolder(FlowExecution flowExecution) {
- this.flowExecution = flowExecution;
- }
-
- /**
- * Creates a new flow execution holder for a flow execution that has been restored from a repository.
- * @param flowExecutionKey the continuation key
- * @param flowExecution the flow execution to hold
- * @param flowExecutionLock the lock acquired on the flow execution
- */
- public FlowExecutionHolder(FlowExecutionKey flowExecutionKey, FlowExecution flowExecution,
- FlowExecutionLock flowExecutionLock) {
- this.flowExecutionKey = flowExecutionKey;
- this.flowExecution = flowExecution;
- this.flowExecutionLock = flowExecutionLock;
- }
-
- /**
- * Returns the continuation key.
- */
- public FlowExecutionKey getFlowExecutionKey() {
- return flowExecutionKey;
- }
-
- /**
- * Sets the continuation key.
- */
- public void setFlowExecutionKey(FlowExecutionKey key) {
- this.flowExecutionKey = key;
- }
-
- /**
- * Returns the flow execution.
- */
- public FlowExecution getFlowExecution() {
- return flowExecution;
- }
-
- /**
- * Returns the flow execution lock
- */
- public FlowExecutionLock getFlowExecutionLock() {
- return flowExecutionLock;
- }
-
- /**
- * Sets the lock acquired on the flow execution
- * @param lock the flow execution lock
- */
- public void setFlowExecutionLock(FlowExecutionLock lock) {
- this.flowExecutionLock = lock;
- }
-
- /**
- * Returns the view selected from the current flow execution request.
- */
- public ViewSelection getViewSelection() {
- return viewSelection;
- }
-
- /**
- * Sets the selected view from the current flow execution request.
- * @param viewSelection the view selection
- */
- public void setViewSelection(ViewSelection viewSelection) {
- this.viewSelection = viewSelection;
- }
-
- /**
- * Replace the current flow execution with the one provided. This method will clear out all state associated with
- * the original execution and unlock it if necessary.
- * @param flowExecution the new "current" flow execution
- */
- public void replaceWith(FlowExecution flowExecution) {
- this.flowExecutionKey = null;
- this.viewSelection = null;
- unlockFlowExecutionIfNecessary();
- this.flowExecution = flowExecution;
- }
-
- /**
- * Unlock the held flow execution if necessary.
- */
- public void unlockFlowExecutionIfNecessary() {
- if (flowExecutionLock != null) {
- flowExecutionLock.unlock();
- this.flowExecutionLock = null;
- }
- }
-
- public String toString() {
- return new ToStringCreator(this).append("flowExecutionKey", flowExecutionKey).append("flowExecution",
- flowExecution).toString();
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionHolderUtils.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionHolderUtils.java
deleted file mode 100644
index c87ff6a8..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionHolderUtils.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import javax.faces.context.ExternalContext;
-import javax.faces.context.FacesContext;
-import javax.faces.el.EvaluationException;
-
-import org.springframework.webflow.execution.FlowExecution;
-import org.springframework.webflow.execution.FlowExecutionContextHolder;
-
-/**
- * A static utility class for accessing the current flow execution holder.
- *
- * By default, the current flow execution holder is associated with the current thread via the {@link FacesContext}'s
- * {@link ExternalContext#getRequestMap()}.
- *
- * @author Keith Donald
- * @author Craig McClanahan
- */
-public class FlowExecutionHolderUtils {
-
- /**
- * Returns the current flow execution holder for the given faces context.
- * @param context faces context
- * @return the flow execution holder, or null if none set.
- */
- public static FlowExecutionHolder getFlowExecutionHolder(FacesContext context) {
- return (FlowExecutionHolder) context.getExternalContext().getRequestMap().get(getFlowExecutionHolderKey());
- }
-
- /**
- * Sets the current flow execution holder for the given faces context.
- * @param holder the flow execution holder
- * @param context faces context
- */
- public static void setFlowExecutionHolder(FlowExecutionHolder holder, FacesContext context) {
- context.getExternalContext().getRequestMap().put(getFlowExecutionHolderKey(), holder);
- FlowExecutionContextHolder.setFlowExecutionContext(holder.getFlowExecution());
- }
-
- /**
- * Returns true if the flow execution has been restored in the current thread.
- * @param context the faces context
- * @return true if restored, false otherwise
- */
- public static boolean isFlowExecutionRestored(FacesContext context) {
- return getFlowExecutionHolder(context) != null;
- }
-
- /**
- * Returns the current flow execution in the given faces context.
- * @param context faces context
- * @return the flow execution or null if no execution is bound
- */
- public static FlowExecution getCurrentFlowExecution(FacesContext context) {
- FlowExecutionHolder holder = getFlowExecutionHolder(context);
- if (holder != null) {
- return holder.getFlowExecution();
- } else {
- return null;
- }
- }
-
- /**
- * Returns the current required flow execution in the given faces context.
- * @param context faces context
- * @return the flow execution
- * @throws EvaluationException if no flow execution was bound
- */
- public static FlowExecution getRequiredCurrentFlowExecution(FacesContext context) throws EvaluationException {
- FlowExecution execution = getCurrentFlowExecution(context);
- if (execution != null) {
- return execution;
- } else {
- throw new EvaluationException("No current FlowExecution bound to the Faces Context "
- + "- was the current flow execution not restored before a view referenced it? "
- + "Has the flow execution ended or expired?");
- }
- }
-
- /**
- * Cleans up the current flow execution in the faces context if necessary. Specifically, handles unlocking the
- * execution if necessary, setting the holder to null, and cleaning up the flow execution context thread local. Can
- * be safely called even if no execution is bound or one is bound but not locked.
- * @param context the faces context
- */
- public static void cleanupCurrentFlowExecution(FacesContext context) {
- if (isFlowExecutionRestored(context)) {
- FlowExecutionContextHolder.setFlowExecutionContext(null);
- getFlowExecutionHolder(context).unlockFlowExecutionIfNecessary();
- context.getExternalContext().getRequestMap().remove(getFlowExecutionHolderKey());
- }
- }
-
- /**
- * Returns the key used to index the flow execution holder in the request attributes.
- */
- static String getFlowExecutionHolderKey() {
- return FlowExecutionHolder.class.getName();
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionKeyStateHolder.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionKeyStateHolder.java
deleted file mode 100644
index 175795a8..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionKeyStateHolder.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIComponentBase;
-import javax.faces.component.UIViewRoot;
-import javax.faces.context.FacesContext;
-import javax.faces.event.PhaseId;
-import javax.faces.render.Renderer;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.util.StringUtils;
-import org.springframework.webflow.execution.FlowExecution;
-import org.springframework.webflow.execution.repository.FlowExecutionAccessException;
-import org.springframework.webflow.execution.repository.FlowExecutionKey;
-import org.springframework.webflow.execution.repository.FlowExecutionLock;
-import org.springframework.webflow.execution.repository.FlowExecutionRepository;
-
-/**
- * This {@link UIComponent} instance can be added to the {@link UIViewRoot} before rendering so that the
- * {@link FlowExecution} can be properly saved and then restored during the next request's {@link PhaseId#RESTORE_VIEW}
- * phase.
- *
- * @author Jeremy Grelle
- * @author Keith Donald
- */
-public class FlowExecutionKeyStateHolder extends UIComponentBase {
-
- /**
- * Logger, usable by subclasses.
- */
- protected final Log logger = LogFactory.getLog(getClass());
-
- private static final String COMPONENT_FAMILY = "javax.faces.Parameter";
-
- /**
- * Immutable id of the flow execution key component for easier lookup later.
- */
- public static final String COMPONENT_ID = "FlowExecutionKeyStateHolder";
-
- /**
- * The key value
- */
- private String flowExecutionKey;
-
- private boolean transientValue;
-
- public String getId() {
- return COMPONENT_ID;
- }
-
- public void setId(String id) {
- // Do nothing so as to ensure the id never gets overwritten.
- return;
- }
-
- public String getFamily() {
- return COMPONENT_FAMILY;
- }
-
- public Renderer getRenderer() {
- // this component is not rendered
- return null;
- }
-
- /**
- * Returns the flow execution key.
- */
- public String getFlowExecutionKey() {
- return flowExecutionKey;
- }
-
- /**
- * Sets the tracked flow execution key used to restore the current flow execution during
- * {@link #restoreState(FacesContext, Object)}.
- * @param flowExecutionKey the flow execution key
- */
- public void setFlowExecutionKey(String flowExecutionKey) {
- this.flowExecutionKey = flowExecutionKey;
- }
-
- public boolean isTransient() {
- return transientValue;
- }
-
- public void setTransient(boolean transientValue) {
- this.transientValue = transientValue;
- }
-
- /**
- * Restore the FlowExecution from the stored FlowExecutionKey
- */
- public void restoreState(FacesContext context, Object state) {
- Object values[] = (Object[]) state;
- flowExecutionKey = (String) values[0];
- restoreFlowExecution(context);
- }
-
- private void restoreFlowExecution(FacesContext facesContext) {
- JsfExternalContext context = new JsfExternalContext(facesContext);
- // restore only if the key is present and the current flow execution has not already been restored
- if (StringUtils.hasText(flowExecutionKey) && !FlowExecutionHolderUtils.isFlowExecutionRestored(facesContext)) {
- // restore the "current" flow execution from repository so it will be available to variable/property
- // resolvers
- // and the flow navigation handler (this could happen as part of a view action like a form submission)
- FlowExecutionRepository repository = getRepository(context);
- // restore the key from the stored encoded key string
- FlowExecutionKey key = repository.parseFlowExecutionKey(flowExecutionKey);
- try {
- FlowExecutionLock lock = repository.getLock(key);
- lock.lock();
- try {
- FlowExecution flowExecution = repository.getFlowExecution(key);
- if (logger.isDebugEnabled()) {
- logger
- .debug("Loaded existing flow execution with key '"
- + flowExecutionKey
- + "' as part of component restoration [triggered via an action event like a button click]");
- }
- FlowExecutionHolderUtils.setFlowExecutionHolder(new FlowExecutionHolder(key, flowExecution, lock),
- facesContext);
- } catch (RuntimeException e) {
- lock.unlock();
- throw e;
- } catch (Error e) {
- lock.unlock();
- throw e;
- }
- } catch (FlowExecutionAccessException e) {
- handleFlowExecutionAccessException(e, facesContext);
- }
- }
- }
-
- /**
- * Hook method to handle a thrown flow execution access exception. By default this implementation simply rethrows
- * the exception. Subclasses may override this method to redirect to an error page or take some other action.
- * @param e the flow execution access exception
- * @param context the current faces context
- */
- protected void handleFlowExecutionAccessException(FlowExecutionAccessException e, FacesContext context) {
- throw e;
- }
-
- /**
- * Save the just the current FlowExecutionKey value.
- */
- public Object saveState(FacesContext context) {
- Object values[] = new Object[1];
- values[0] = flowExecutionKey;
- return values;
- }
-
- public String getClientId(FacesContext context) {
- return COMPONENT_ID;
- }
-
- private FlowExecutionRepository getRepository(JsfExternalContext context) {
- return FlowFacesUtils.getExecutionRepository(context.getFacesContext());
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionViewHandler.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionViewHandler.java
new file mode 100644
index 00000000..50a068b4
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowExecutionViewHandler.java
@@ -0,0 +1,62 @@
+package org.springframework.faces.webflow;
+
+import java.io.IOException;
+import java.util.Locale;
+
+import javax.faces.FacesException;
+import javax.faces.application.ViewHandler;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.FacesContext;
+
+import org.springframework.webflow.execution.RequestContextHolder;
+
+public class FlowExecutionViewHandler extends ViewHandler {
+
+ ViewHandler delegate;
+
+ public FlowExecutionViewHandler(ViewHandler delegate) {
+ this.delegate = delegate;
+ }
+
+ public String getActionURL(FacesContext context, String viewId) {
+ return RequestContextHolder.getRequestContext().getFlowExecutionUrl();
+ }
+
+ // ------------------- Pass-through delegate methods ------------------//
+ public String calculateCharacterEncoding(FacesContext context) {
+ return delegate.calculateCharacterEncoding(context);
+ }
+
+ public Locale calculateLocale(FacesContext context) {
+ return delegate.calculateLocale(context);
+ }
+
+ public String calculateRenderKitId(FacesContext context) {
+ return delegate.calculateRenderKitId(context);
+ }
+
+ public UIViewRoot createView(FacesContext context, String viewId) {
+ return delegate.createView(context, viewId);
+ }
+
+ public String getResourceURL(FacesContext context, String path) {
+ return delegate.getResourceURL(context, path);
+ }
+
+ public void initView(FacesContext context) throws FacesException {
+ delegate.initView(context);
+ }
+
+ public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException {
+ delegate.renderView(context, viewToRender);
+ }
+
+ public UIViewRoot restoreView(FacesContext context, String viewId) {
+ return delegate.restoreView(context, viewId);
+ }
+
+ public void writeState(FacesContext context) throws IOException {
+ delegate.writeState(context);
+ }
+
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContext.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContext.java
new file mode 100644
index 00000000..4a120ce2
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContext.java
@@ -0,0 +1,269 @@
+package org.springframework.faces.webflow;
+
+import java.util.Iterator;
+
+import javax.el.ELContext;
+import javax.faces.application.Application;
+import javax.faces.application.FacesMessage;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseStream;
+import javax.faces.context.ResponseWriter;
+import javax.faces.render.RenderKit;
+
+import org.springframework.binding.message.Message;
+import org.springframework.binding.message.MessageResolver;
+import org.springframework.binding.message.Messages;
+import org.springframework.binding.message.Severity;
+import org.springframework.util.StringUtils;
+import org.springframework.webflow.execution.RequestContextHolder;
+
+public class FlowFacesContext extends FacesContext {
+
+ /**
+ * The key for storing the responseComplete flag
+ */
+ static final String RESPONSE_COMPLETE_KEY = "responseComplete";
+
+ /**
+ * The key for storing the renderResponse flag
+ */
+ static final String RENDER_RESPONSE_KEY = "renderResponse";
+
+ /**
+ * The base FacesContext delegate
+ */
+ private FacesContext delegate;
+
+ public FlowFacesContext(FacesContext delegate) {
+ this.delegate = delegate;
+ FacesContext.setCurrentInstance(this);
+ }
+
+ /**
+ * Translates a FacesMessage to an SWF Message and adds it to the current MessageContext
+ */
+ public void addMessage(String clientId, FacesMessage message) {
+ MessageResolver messageResolver;
+
+ StringBuffer msgText = new StringBuffer();
+
+ if (StringUtils.hasText(message.getSummary())) {
+ msgText.append(message.getSummary());
+ }
+
+ if (message.getSeverity() == FacesMessage.SEVERITY_INFO) {
+ messageResolver = Messages.text(msgText.toString(), Severity.INFO);
+ } else if (message.getSeverity() == FacesMessage.SEVERITY_WARN) {
+ messageResolver = Messages.text(msgText.toString(), Severity.WARNING);
+ } else {
+ messageResolver = Messages.text(msgText.toString(), Severity.ERROR);
+ }
+
+ RequestContextHolder.getRequestContext().getMessageContext().addMessage(messageResolver);
+ }
+
+ /**
+ * Returns an Iterator for all component clientId's for which messages have been added.
+ */
+ @SuppressWarnings("unchecked")
+ public Iterator getClientIdsWithMessages() {
+ return new ClientIdIterator();
+ }
+
+ /**
+ * Return the maximum severity level recorded on any FacesMessages that has been queued, whether or not they are
+ * associated with any specific UIComponent. If no such messages have been queued, return null.
+ */
+ public FacesMessage.Severity getMaximumSeverity() {
+
+ if (RequestContextHolder.getRequestContext().getMessageContext().getMessages() == null
+ || RequestContextHolder.getRequestContext().getMessageContext().getMessages().length == 0)
+ return null;
+
+ FacesMessage.Severity max = FacesMessage.SEVERITY_INFO;
+ Iterator i = getMessages();
+ while (i.hasNext()) {
+ FacesMessage message = i.next();
+ if (message.getSeverity().getOrdinal() > max.getOrdinal()) {
+ max = message.getSeverity();
+ }
+ if (max.getOrdinal() == FacesMessage.SEVERITY_ERROR.getOrdinal())
+ break;
+ }
+ return max;
+ }
+
+ /**
+ * Returns an Iterator for all Messages in the current MessageContext that does translation to FacesMessages.
+ */
+ @SuppressWarnings("unchecked")
+ public Iterator getMessages() {
+ return new FacesMessageIterator();
+ }
+
+ /**
+ * Returns an Iterator for all Messages with the given clientId in the current MessageContext that does translation
+ * to FacesMessages.
+ */
+ @SuppressWarnings("unchecked")
+ public Iterator getMessages(String clientId) {
+ return new FacesMessageIterator(clientId);
+ }
+
+ public boolean getRenderResponse() {
+ Boolean renderResponse = RequestContextHolder.getRequestContext().getFlashScope().getBoolean(
+ RENDER_RESPONSE_KEY);
+ if (renderResponse == null) {
+ return false;
+ }
+ return renderResponse;
+ }
+
+ public boolean getResponseComplete() {
+ Boolean responseComplete = RequestContextHolder.getRequestContext().getFlashScope().getBoolean(
+ RESPONSE_COMPLETE_KEY);
+ if (responseComplete == null) {
+ return false;
+ }
+ return responseComplete;
+ }
+
+ public void renderResponse() {
+ RequestContextHolder.getRequestContext().getFlashScope().put(RENDER_RESPONSE_KEY, Boolean.TRUE);
+ }
+
+ public void responseComplete() {
+ RequestContextHolder.getRequestContext().getFlashScope().put(RESPONSE_COMPLETE_KEY, Boolean.TRUE);
+ }
+
+ // ------------------ Pass-through delegate methods ----------------------//
+
+ public Application getApplication() {
+ return delegate.getApplication();
+ }
+
+ public ELContext getELContext() {
+ return delegate.getELContext();
+ }
+
+ public ExternalContext getExternalContext() {
+ return delegate.getExternalContext();
+ }
+
+ public RenderKit getRenderKit() {
+ return delegate.getRenderKit();
+ }
+
+ public ResponseStream getResponseStream() {
+ return delegate.getResponseStream();
+ }
+
+ public ResponseWriter getResponseWriter() {
+ return delegate.getResponseWriter();
+ }
+
+ public UIViewRoot getViewRoot() {
+ return delegate.getViewRoot();
+ }
+
+ public void release() {
+ delegate.release();
+ }
+
+ public void setResponseStream(ResponseStream responseStream) {
+ delegate.setResponseStream(responseStream);
+ }
+
+ public void setResponseWriter(ResponseWriter responseWriter) {
+ delegate.setResponseWriter(responseWriter);
+ }
+
+ public void setViewRoot(UIViewRoot root) {
+ delegate.setViewRoot(root);
+ }
+
+ protected FacesContext getDelegate() {
+ return delegate;
+ }
+
+ private class FacesMessageIterator implements Iterator {
+
+ private Message[] messages;
+
+ private int currentIndex = -1;
+
+ protected FacesMessageIterator() {
+ this.messages = RequestContextHolder.getRequestContext().getMessageContext().getMessages();
+ }
+
+ protected FacesMessageIterator(String clientId) {
+ this.messages = RequestContextHolder.getRequestContext().getMessageContext().getMessages(clientId);
+ }
+
+ public boolean hasNext() {
+ return messages.length > currentIndex + 1;
+ }
+
+ public Object next() {
+ currentIndex++;
+ Message nextMessage = messages[currentIndex];
+
+ FacesMessage facesMessage;
+ if (nextMessage.getSeverity() == Severity.INFO) {
+ facesMessage = new FacesMessage(FacesMessage.SEVERITY_INFO, nextMessage.getText(), nextMessage
+ .getText());
+ } else if (nextMessage.getSeverity() == Severity.WARNING) {
+ facesMessage = new FacesMessage(FacesMessage.SEVERITY_WARN, nextMessage.getText(), nextMessage
+ .getText());
+ } else {
+ facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, nextMessage.getText(), nextMessage
+ .getText());
+ }
+ return facesMessage;
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException("Messages cannot be removed through this iterator.");
+ }
+
+ }
+
+ private class ClientIdIterator implements Iterator {
+
+ private Message[] messages;
+
+ int currentIndex = -1;
+
+ @SuppressWarnings("unchecked")
+ protected ClientIdIterator() {
+ this.messages = RequestContextHolder.getRequestContext().getMessageContext().getMessages();
+ }
+
+ public boolean hasNext() {
+ while (messages.length > currentIndex + 1) {
+ Message next = messages[currentIndex + 1];
+ if (next.getSource() != null && !"".equals(next.getSource())) {
+ return true;
+ }
+ currentIndex++;
+ }
+ return false;
+ }
+
+ public Object next() {
+ Message next = messages[++currentIndex];
+ while (next.getSource() == null || "".equals(next.getSource())) {
+ next = messages[++currentIndex];
+ }
+ return next.getSource().toString();
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException("Messages cannot be removed through this iterator.");
+ }
+
+ }
+
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContextFactory.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContextFactory.java
new file mode 100644
index 00000000..1bc47683
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContextFactory.java
@@ -0,0 +1,21 @@
+package org.springframework.faces.webflow;
+
+import javax.faces.FacesException;
+import javax.faces.context.FacesContext;
+import javax.faces.context.FacesContextFactory;
+import javax.faces.lifecycle.Lifecycle;
+
+public class FlowFacesContextFactory extends FacesContextFactory {
+
+ FacesContextFactory delegate;
+
+ public FlowFacesContextFactory(FacesContextFactory delegate) {
+ this.delegate = delegate;
+ }
+
+ public FacesContext getFacesContext(Object context, Object request, Object response, Lifecycle lifecycle)
+ throws FacesException {
+ return new FlowFacesContext(delegate.getFacesContext(context, request, response, lifecycle));
+ }
+
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesUtils.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesUtils.java
deleted file mode 100644
index ec7ab844..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesUtils.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import javax.faces.context.FacesContext;
-
-import org.springframework.context.ApplicationContext;
-import org.springframework.web.jsf.FacesContextUtils;
-import org.springframework.webflow.conversation.impl.SessionBindingConversationManager;
-import org.springframework.webflow.definition.registry.FlowDefinitionLocator;
-import org.springframework.webflow.engine.impl.FlowExecutionImplFactory;
-import org.springframework.webflow.engine.impl.FlowExecutionImplStateRestorer;
-import org.springframework.webflow.execution.FlowExecutionFactory;
-import org.springframework.webflow.execution.repository.FlowExecutionRepository;
-import org.springframework.webflow.execution.repository.support.SimpleFlowExecutionRepository;
-import org.springframework.webflow.executor.FlowExecutorImpl;
-
-/**
- * Trivial helper utility class for SWF within a JSF environment. Used mainly to locate Web Flow services needed to run
- * the JSF integration.
- *
- * @author Keith Donald
- */
-public class FlowFacesUtils {
-
- /**
- * Bean name of a custom flow executor implementation.
- *
- * Note the flow executor object is used only at configuration time to extract other lower-level services needed by
- * the JSF integration (flow execution repository, flow execution factory). The runtime FlowExecutor interface is
- * never used by this JSF integration.
- */
- private static final String FLOW_EXECUTOR_BEAN_NAME = "flowExecutor";
-
- /**
- * Bean name of a custom flow execution repository implementation.
- */
- private static final String FLOW_EXECUTION_REPOSITORY_BEAN_NAME = "flowExecutionRepository";
-
- /**
- * Bean name of a custom flow definition locator implementation.
- */
- private static final String FLOW_DEFINITION_LOCATOR_BEAN_NAME = "flowDefinitionLocator";
-
- /**
- * Bean name of a custom flow execution factory implementation.
- */
- private static final String FLOW_EXECUTION_FACTORY_BEAN_NAME = "flowExecutionFactory";
-
- /**
- * The default flow execution repository implementation to use.
- */
- private static FlowExecutionRepository defaultExecutionRepository;
-
- /**
- * The default flow execution factory implementation to use.
- */
- private static FlowExecutionFactory defaultExecutionFactory;
-
- /**
- * Returns the locator for flow definitions to use in a JSF environment. Searches for a bean in the root web
- * application context named {@link #FLOW_DEFINITION_LOCATOR_BEAN_NAME}. A bean of type
- * {@link FlowDefinitionLocator} must exist by this name.
- * @param context the faces context
- * @return the flow definition locator
- */
- public static FlowDefinitionLocator getDefinitionLocator(FacesContext context) {
- ApplicationContext ac = FacesContextUtils.getRequiredWebApplicationContext(context);
- if (ac.containsBean(FLOW_DEFINITION_LOCATOR_BEAN_NAME)) {
- return (FlowDefinitionLocator) ac.getBean(FLOW_DEFINITION_LOCATOR_BEAN_NAME, FlowDefinitionLocator.class);
- } else {
- FlowExecutorImpl flowExecutor = getFlowExecutor(context);
- if (flowExecutor != null) {
- return flowExecutor.getDefinitionLocator();
- } else {
- String message = "No bean definition with id '"
- + FLOW_DEFINITION_LOCATOR_BEAN_NAME
- + "' or '"
- + FLOW_EXECUTOR_BEAN_NAME
- + "' could be found; to use Spring Web Flow with JSF a FlowDefinitionLocator must be resolvable";
- throw new JsfFlowConfigurationException(message);
- }
- }
- }
-
- /**
- * Returns the flow execution repository to use in a JSF environment. Searches for a bean in the root web
- * application context named {@link #FLOW_EXECUTION_REPOSITORY_BEAN_NAME}. If no such bean exists with this name,
- * falls back on the repository configured by a bean with name {@link #FLOW_EXECUTOR_BEAN_NAME}. If no bean exists
- * with that name, uses the default 'simple' repository implementation.
- * @param context the faces context
- * @return the flow execution repository
- */
- public synchronized static FlowExecutionRepository getExecutionRepository(FacesContext context) {
- ApplicationContext ac = FacesContextUtils.getRequiredWebApplicationContext(context);
- if (ac.containsBean(FLOW_EXECUTION_REPOSITORY_BEAN_NAME)) {
- return (FlowExecutionRepository) ac.getBean(FLOW_EXECUTION_REPOSITORY_BEAN_NAME,
- FlowExecutionRepository.class);
- } else {
- if (defaultExecutionRepository == null) {
- FlowExecutorImpl flowExecutor = getFlowExecutor(context);
- if (flowExecutor != null) {
- defaultExecutionRepository = flowExecutor.getExecutionRepository();
- } else {
- defaultExecutionRepository = new SimpleFlowExecutionRepository(new FlowExecutionImplStateRestorer(
- getDefinitionLocator(context)), new SessionBindingConversationManager());
- }
- }
- return defaultExecutionRepository;
- }
- }
-
- /**
- * Returns the flow execution factory to use in a JSF environment. Searches for a bean in the root web application
- * context named {@link #FLOW_EXECUTION_FACTORY_BEAN_NAME}. If no such bean exists with this name, falls back on
- * the repository configured by a bean with name {@link #FLOW_EXECUTOR_BEAN_NAME}. If no bean exists with that
- * name, uses the default factory implementation.
- * @param context the faces context
- * @return the flow execution factory
- */
- public synchronized static FlowExecutionFactory getExecutionFactory(FacesContext context) {
- ApplicationContext ac = FacesContextUtils.getRequiredWebApplicationContext(context);
- if (ac.containsBean(FLOW_EXECUTION_FACTORY_BEAN_NAME)) {
- return (FlowExecutionFactory) ac.getBean(FLOW_EXECUTION_FACTORY_BEAN_NAME, FlowExecutionFactory.class);
- } else {
- if (defaultExecutionFactory == null) {
- FlowExecutorImpl flowExecutor = getFlowExecutor(context);
- if (flowExecutor != null) {
- defaultExecutionFactory = flowExecutor.getExecutionFactory();
- } else {
- defaultExecutionFactory = new FlowExecutionImplFactory();
- }
- }
- return defaultExecutionFactory;
- }
- }
-
- /**
- * Returns the flow executor providing access to services used by the Spring Web Flow JSF integration. Searches for
- * a bean in the root web application context named {@link #FLOW_EXECUTOR_BEAN_NAME}. If no such bean exists
- * returns null.
- * @param context the faces context
- * @return the flow executor, or null if no such bean exists
- */
- private synchronized static FlowExecutorImpl getFlowExecutor(FacesContext context) {
- ApplicationContext ac = FacesContextUtils.getRequiredWebApplicationContext(context);
- if (ac.containsBean(FLOW_EXECUTOR_BEAN_NAME)) {
- return (FlowExecutorImpl) ac.getBean(FLOW_EXECUTOR_BEAN_NAME, FlowExecutorImpl.class);
- } else {
- return null;
- }
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowLifecycle.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowLifecycle.java
new file mode 100644
index 00000000..274eff5c
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowLifecycle.java
@@ -0,0 +1,69 @@
+package org.springframework.faces.webflow;
+
+import javax.faces.FacesException;
+import javax.faces.context.FacesContext;
+import javax.faces.event.PhaseId;
+import javax.faces.event.PhaseListener;
+import javax.faces.lifecycle.Lifecycle;
+
+public class FlowLifecycle extends Lifecycle {
+
+ private final Lifecycle delegate;
+
+ public FlowLifecycle(Lifecycle delegate) {
+ this.delegate = delegate;
+ }
+
+ /**
+ * Executes APPLY_REQUEST_VALUES through INVOKE_APPLICATION.
+ */
+ public void execute(FacesContext context) throws FacesException {
+
+ for (int p = PhaseId.APPLY_REQUEST_VALUES.getOrdinal(); p <= PhaseId.INVOKE_APPLICATION.getOrdinal(); p++) {
+ PhaseId phaseId = (PhaseId) PhaseId.VALUES.get(p);
+ if (!skipPhase(context, phaseId)) {
+ invokePhase(context, phaseId);
+ }
+ }
+ }
+
+ public void render(FacesContext context) throws FacesException {
+ delegate.render(context);
+ }
+
+ public void addPhaseListener(PhaseListener listener) {
+ delegate.addPhaseListener(listener);
+ }
+
+ public PhaseListener[] getPhaseListeners() {
+ return delegate.getPhaseListeners();
+ }
+
+ public void removePhaseListener(PhaseListener listener) {
+ delegate.removePhaseListener(listener);
+ }
+
+ private boolean skipPhase(FacesContext context, PhaseId phaseId) {
+ if (context.getResponseComplete()) {
+ return true;
+ } else if (context.getRenderResponse()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private void invokePhase(FacesContext context, PhaseId phaseId) {
+ JsfFlowUtils.notifyBeforeListeners(phaseId, this);
+ if (phaseId == PhaseId.APPLY_REQUEST_VALUES) {
+ context.getViewRoot().processDecodes(context);
+ } else if (phaseId == PhaseId.PROCESS_VALIDATIONS) {
+ context.getViewRoot().processValidators(context);
+ } else if (phaseId == PhaseId.UPDATE_MODEL_VALUES) {
+ context.getViewRoot().processUpdates(context);
+ } else {
+ context.getViewRoot().processApplication(context);
+ }
+ JsfFlowUtils.notifyAfterListeners(phaseId, this);
+ }
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowLifecycleFactory.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowLifecycleFactory.java
new file mode 100644
index 00000000..6aaf7938
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowLifecycleFactory.java
@@ -0,0 +1,31 @@
+package org.springframework.faces.webflow;
+
+import java.util.Iterator;
+
+import javax.faces.lifecycle.Lifecycle;
+import javax.faces.lifecycle.LifecycleFactory;
+
+public class FlowLifecycleFactory extends LifecycleFactory {
+
+ public static final String FLOW_LIFECYCLE_ID = "org.springframework.FlowLifecycle";
+
+ private final LifecycleFactory delegate;
+
+ public FlowLifecycleFactory(LifecycleFactory delegate) {
+ this.delegate = delegate;
+ addLifecycle(FLOW_LIFECYCLE_ID, new FlowLifecycle(delegate.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE)));
+ }
+
+ public void addLifecycle(String lifecycleId, Lifecycle lifecycle) {
+ delegate.addLifecycle(lifecycleId, lifecycle);
+ }
+
+ public Lifecycle getLifecycle(String lifecycleId) {
+ return delegate.getLifecycle(lifecycleId);
+ }
+
+ public Iterator getLifecycleIds() {
+ return delegate.getLifecycleIds();
+ }
+
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowNavigationHandler.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowNavigationHandler.java
deleted file mode 100644
index c0f4a8f4..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowNavigationHandler.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import javax.faces.application.NavigationHandler;
-import javax.faces.context.FacesContext;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.binding.mapping.AttributeMapper;
-import org.springframework.web.jsf.DecoratingNavigationHandler;
-import org.springframework.webflow.context.ExternalContext;
-import org.springframework.webflow.context.ExternalContextHolder;
-import org.springframework.webflow.core.collection.LocalAttributeMap;
-import org.springframework.webflow.core.collection.MutableAttributeMap;
-import org.springframework.webflow.definition.FlowDefinition;
-import org.springframework.webflow.definition.registry.FlowDefinitionLocator;
-import org.springframework.webflow.engine.NoMatchingTransitionException;
-import org.springframework.webflow.execution.FlowExecution;
-import org.springframework.webflow.execution.FlowExecutionFactory;
-import org.springframework.webflow.execution.ViewSelection;
-import org.springframework.webflow.executor.RequestParameterInputMapper;
-import org.springframework.webflow.executor.support.FlowExecutorArgumentExtractor;
-
-/**
- * An implementation of a JSF NavigationHandler that provides integration with Spring Web Flow.
- * Responsible for delegating to Spring Web Flow to launch and resume flow executions, treating JSF action outcomes
- * (like a command button click) as web flow events.
- *
- * This class delegates to the standard NavigationHandler implementation when a navigation request does not pertain to a
- * flow execution.
- *
- * The following navigation handler algorithm is implemented by default:
- *
- *
- * If a flow execution has been restored in the current request:
- *
- *
Resume the flow execution by signaling the JSF action outcome as an event against the current state.
- *
Once event processing completes expose the selected view as the "current" {@link ViewSelection}.
- *
- *
- *
- * If a flow execution has not been restored in the current request:
- *
- *
If the specified logical outcome is of the form flowId:xxx look up the corresponding
- * {@link FlowDefinition} with that id and launch a new flow execution in the starting state. Expose the new execution
- * as the "current" flow execution for this request. Expose the first selected view as the "current" view selection.
- *
If the specified logical outcome is not of the form flowId:xxx, simply delegate to the standard
- * NavigationHandler implementation and return.
- *
- *
- * How the flowId and eventId arguments are extracted can be customized by setting a custom
- * {@link #setArgumentExtractor(FlowExecutorArgumentExtractor) argument extractor}.
- *
- * Note about customization: since NavigationHandlers managed directly by the JSF provider cannot be benefit from
- * DependencyInjection, See Spring's {@link org.springframework.web.jsf.DelegatingNavigationHandlerProxy} when you need
- * to customize a FlowNavigationHandler instance.
- *
- * @author Craig McClanahan
- * @author Colin Sampaleanu
- * @author Keith Donald
- */
-public class FlowNavigationHandler extends DecoratingNavigationHandler {
-
- /**
- * Logger, usable by subclasses.
- */
- protected final Log logger = LogFactory.getLog(getClass());
-
- /**
- * A helper for extracting parameters needed by this flow navigation handler.
- */
- private FlowExecutorArgumentExtractor argumentExtractor = new FlowNavigationHandlerArgumentExtractor();
-
- /**
- * The service responsible for mapping attributes of an {@link ExternalContext} to a new {@link FlowExecution}
- * during the {@link #launch(String, ExternalContext) launch flow} operation.
- *
- * This allows developers to control what attributes are made available in the inputMap to new
- * top-level flow executions. The starting execution may then choose to map that available input into its own local
- * scope.
- *
- * The default implementation simply exposes all request parameters as flow execution input attributes. May be null.
- */
- private AttributeMapper inputMapper = new RequestParameterInputMapper();
-
- /**
- * Create a new {@link FlowNavigationHandler} using the default constructor.
- */
- public FlowNavigationHandler() {
- super();
- }
-
- /**
- * Create a new {@link FlowNavigationHandler}, wrapping the specified standard navigation handler implementation.
- * @param originalNavigationHandler Standard NavigationHandler we are wrapping
- */
- public FlowNavigationHandler(NavigationHandler originalNavigationHandler) {
- super(originalNavigationHandler);
- }
-
- /**
- * Returns the argument extractor used by this navigation handler.
- */
- public FlowExecutorArgumentExtractor getArgumentExtractor() {
- return argumentExtractor;
- }
-
- /**
- * Sets the argument extractor to use by this navigation handler. Call to customize how flow id and event id
- * arguments are extracted.
- */
- public void setArgumentExtractor(FlowExecutorArgumentExtractor argumentExtractor) {
- this.argumentExtractor = argumentExtractor;
- }
-
- /**
- * Returns the configured flow execution input mapper.
- */
- public AttributeMapper getInputMapper() {
- return inputMapper;
- }
-
- /**
- * Sets the service responsible for mapping attributes of an {@link ExternalContext} to a new {@link FlowExecution}
- * during a launch flow operation.
- *
- * The default implementation simply exposes all request parameters as flow execution input attributes. May be null.
- * @see RequestParameterInputMapper
- */
- public void setInputMapper(AttributeMapper inputMapper) {
- this.inputMapper = inputMapper;
- }
-
- public void handleNavigation(FacesContext facesContext, String fromAction, String outcome,
- NavigationHandler originalNavigationHandler) {
- try {
- JsfExternalContext context = getCurrentContext();
- // record the navigation handler context
- context.handleNavigationCalled(fromAction, outcome);
- // first see if we need to launch a new flow execution if the flow id is present
- if (argumentExtractor.isFlowIdPresent(context)) {
- // a flow execution launch has been requested - create the new execution
- String flowId = argumentExtractor.extractFlowId(context);
- FlowDefinition flowDefinition = getLocator(context).getFlowDefinition(flowId);
- FlowExecution flowExecution = getFactory(context).createFlowExecution(flowDefinition);
- // check to see if this execution was created while another was running
- if (FlowExecutionHolderUtils.isFlowExecutionRestored(facesContext)) {
- // replace the current flow execution with the new one
- FlowExecutionHolderUtils.getFlowExecutionHolder(facesContext).replaceWith(flowExecution);
- } else {
- // bind the new execution as the 'current execution'
- FlowExecutionHolderUtils.setFlowExecutionHolder(new FlowExecutionHolder(flowExecution),
- facesContext);
- }
- // start the new execution
- ViewSelection selectedView = flowExecution.start(createInput(context), context);
- // set the starting view to render
- FlowExecutionHolderUtils.getFlowExecutionHolder(facesContext).setViewSelection(selectedView);
- } else {
- // not a launch request - see if this is a resume request to continue an existing execution
- if (FlowExecutionHolderUtils.isFlowExecutionRestored(facesContext)) {
- // a flow execution has been restored - see if we need to signal an event against it
- if (argumentExtractor.isEventIdPresent(context)) {
- // signal the event against the current flow execution
- String eventId = argumentExtractor.extractEventId(context);
- try {
- FlowExecutionHolder holder = FlowExecutionHolderUtils.getFlowExecutionHolder(facesContext);
- ViewSelection selectedView = holder.getFlowExecution().signalEvent(eventId, context);
- // set the next view to render
- holder.setViewSelection(selectedView);
- } catch (NoMatchingTransitionException e) {
- if (logger.isDebugEnabled()) {
- logger.debug("No flow state transition found for event '" + eventId
- + "'; falling back to standard navigation handler.");
- }
- // not a valid event in the current state: proceed with standard navigation
- originalNavigationHandler.handleNavigation(facesContext, fromAction, outcome);
- }
- }
- } else {
- // neither a flow launch or resume request: proceed with standard navigation
- originalNavigationHandler.handleNavigation(facesContext, fromAction, outcome);
- }
- }
- } catch (RuntimeException e) {
- cleanupResources(facesContext);
- throw e;
- } catch (Error e) {
- cleanupResources(facesContext);
- throw e;
- }
- }
-
- /**
- * Factory method that creates the input attribute map for a newly created {@link FlowExecution}. This
- * implementation uses the registered input mapper, if any.
- * @param context the external context
- * @return the input map, or null if no input
- */
- protected MutableAttributeMap createInput(ExternalContext context) {
- if (inputMapper != null) {
- MutableAttributeMap inputMap = new LocalAttributeMap();
- inputMapper.map(context, inputMap, null);
- return inputMap;
- } else {
- return null;
- }
- }
-
- // helpers
-
- private JsfExternalContext getCurrentContext() {
- return (JsfExternalContext) ExternalContextHolder.getExternalContext();
- }
-
- private FlowDefinitionLocator getLocator(JsfExternalContext context) {
- return FlowFacesUtils.getDefinitionLocator(context.getFacesContext());
- }
-
- private FlowExecutionFactory getFactory(JsfExternalContext context) {
- return FlowFacesUtils.getExecutionFactory(context.getFacesContext());
- }
-
- private void cleanupResources(FacesContext context) {
- if (logger.isDebugEnabled()) {
- logger.debug("Cleaning up allocated flow system resources");
- }
- FlowExecutionHolderUtils.cleanupCurrentFlowExecution(context);
- ExternalContextHolder.setExternalContext(null);
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowNavigationHandlerArgumentExtractor.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowNavigationHandlerArgumentExtractor.java
deleted file mode 100644
index 5d3d5a27..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowNavigationHandlerArgumentExtractor.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import org.springframework.util.StringUtils;
-import org.springframework.webflow.context.ExternalContext;
-import org.springframework.webflow.executor.support.FlowExecutorArgumentExtractionException;
-import org.springframework.webflow.executor.support.FlowExecutorArgumentExtractor;
-
-/**
- * An {@link FlowExecutorArgumentExtractor} that is aware of JSF outcomes that communicate requests to launch flow
- * executions and signal event in existing flow executions. Designed to be used wih a {@link FlowNavigationHandler}.
- *
- * Note: this class only implements flow id and event id extraction methods. A FlowNavigationHandler is not expected to
- * extract a flow execution key, as flow execution restoration is fully handled by the {@link FlowPhaseListener} and the
- * JSF restore view phase.
- *
- * @author Keith Donald
- */
-public class FlowNavigationHandlerArgumentExtractor implements FlowExecutorArgumentExtractor {
-
- /**
- * The default prefix of a JSF outcome string that indicates a new flow should be launched.
- */
- private static final String FLOW_ID_PREFIX = "flowId:";
-
- /**
- * The prefix for JSF outcome strings indicating a new flow should be launched.
- */
- private String flowIdPrefix = FLOW_ID_PREFIX;
-
- /**
- * Returns the configured prefix for outcome strings that indicate a new flow should be launched.
- */
- public String getFlowIdPrefix() {
- return flowIdPrefix;
- }
-
- /**
- * Sets the prefix of an outcome string that indicates a new flow should be launched.
- */
- public void setFlowIdPrefix(String flowIdPrefix) {
- this.flowIdPrefix = flowIdPrefix;
- }
-
- public boolean isFlowIdPresent(ExternalContext context) throws FlowExecutorArgumentExtractionException {
- String outcome = getOutcome(context);
- if (outcome != null && outcome.startsWith(getFlowIdPrefix())) {
- return true;
- } else {
- return false;
- }
- }
-
- public String extractFlowId(ExternalContext context) throws FlowExecutorArgumentExtractionException {
- // extract the flowId from a JSF outcome in format ${flowIdPrefix}${flowId}
- String outcome = getOutcome(context);
- int index = outcome.indexOf(getFlowIdPrefix());
- if (index == -1) {
- throw new FlowExecutorArgumentExtractionException(
- "Unable to extract flow id; make sure the JSF outcome is prefixed with '" + getFlowIdPrefix()
- + "' to launch a new flow execution");
- }
- String flowId = outcome.substring(getFlowIdPrefix().length());
- if (!StringUtils.hasText(flowId)) {
- throw new FlowExecutorArgumentExtractionException(
- "Unable to extract flow id; make sure the flow id is provided in the outcome string");
- }
- return flowId;
- }
-
- public boolean isEventIdPresent(ExternalContext context) {
- return StringUtils.hasText(getOutcome(context));
- }
-
- public String extractEventId(ExternalContext context) throws FlowExecutorArgumentExtractionException {
- // treat the action outcome string as the event id
- return getOutcome(context);
- }
-
- public boolean isFlowExecutionKeyPresent(ExternalContext context) {
- throw new UnsupportedOperationException("Should not be called by a FlowNavigationHandler");
- }
-
- public String extractFlowExecutionKey(ExternalContext context) throws FlowExecutorArgumentExtractionException {
- throw new UnsupportedOperationException("Should not be called by a FlowNavigationHandler");
- }
-
- // helpers
- private String getOutcome(ExternalContext context) {
- return ((JsfExternalContext) context).getOutcome();
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowPhaseListener.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowPhaseListener.java
deleted file mode 100644
index ea9ef023..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowPhaseListener.java
+++ /dev/null
@@ -1,567 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Map;
-
-import javax.faces.application.ViewHandler;
-import javax.faces.component.UIViewRoot;
-import javax.faces.context.FacesContext;
-import javax.faces.event.PhaseEvent;
-import javax.faces.event.PhaseId;
-import javax.faces.event.PhaseListener;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.binding.mapping.AttributeMapper;
-import org.springframework.webflow.context.ExternalContext;
-import org.springframework.webflow.context.ExternalContextHolder;
-import org.springframework.webflow.core.collection.LocalAttributeMap;
-import org.springframework.webflow.core.collection.MutableAttributeMap;
-import org.springframework.webflow.definition.FlowDefinition;
-import org.springframework.webflow.definition.registry.FlowDefinitionLocator;
-import org.springframework.webflow.execution.FlowExecution;
-import org.springframework.webflow.execution.FlowExecutionFactory;
-import org.springframework.webflow.execution.ViewSelection;
-import org.springframework.webflow.execution.repository.FlowExecutionAccessException;
-import org.springframework.webflow.execution.repository.FlowExecutionKey;
-import org.springframework.webflow.execution.repository.FlowExecutionLock;
-import org.springframework.webflow.execution.repository.FlowExecutionRepository;
-import org.springframework.webflow.execution.support.ApplicationView;
-import org.springframework.webflow.execution.support.ExternalRedirect;
-import org.springframework.webflow.execution.support.FlowDefinitionRedirect;
-import org.springframework.webflow.execution.support.FlowExecutionRedirect;
-import org.springframework.webflow.executor.RequestParameterInputMapper;
-import org.springframework.webflow.executor.ResponseInstruction;
-import org.springframework.webflow.executor.support.FlowExecutorArgumentHandler;
-import org.springframework.webflow.executor.support.RequestParameterFlowExecutorArgumentHandler;
-import org.springframework.webflow.executor.support.ResponseInstructionHandler;
-
-/**
- * JSF phase listener responsible for managing the {@link FlowExecution} object lifecycle in a JSF environment. This
- * class handles restoring and saving a FlowExecution so other JSF artifacts that execute in different phases of the JSF
- * lifecycle may access conversational state and utilize Web Flow navigation behavior.
- *
- * A restored flow execution is placed in a holder that other JSF artifacts such as VariableResolvers, PropertyResolvers
- * and NavigationHandlers may access during the request lifecycle. Once in the holder the execution is considered
- * "restored" and referred to as the "current" flow execution for this request.
- *
- *
- * This phase listener implements the following algorithm:
- *
- *
On BEFORE_RESTORE_VIEW, restore a {@link FlowExecution} if a call to
- * {@link FlowExecutorArgumentHandler#extractFlowExecutionKey(ExternalContext)} returns a valid flow execution key. This
- * occurs when a flow execution redirect or browser refresh is issued and ultimately results in a flow execution
- * refresh.
- *
On BEFORE_RESTORE_VIEW, launch a {@link FlowExecution} if a call to
- * {@link FlowExecutorArgumentHandler#extractFlowId(ExternalContext)} returns a valid flow id. This occurs when a
- * browser accesses a flow definition URL directly and is used to launch a new flow execution.
- *
During RESTORE_VIEW, the {@link FlowExecutionKeyStateHolder state holder component} will restore the current
- * FlowExecution if it is present in the JSF ViewRoot. This occurs when a postback from a JSF view that is participating
- * in a flow.
- *
On BEFORE_RENDER_RESPONSE, if a flow execution was restored in the RESTORE_VIEW phase generate a new key that
- * will identify the updated execution within the configured {@link FlowExecutionRepository}. Expose the new flow
- * execution key as a component in the view root for restoration on the next request.
- *
On AFTER_RENDER_RESPONSE, if a flow execution was restored in the RESTORE_VIEW phase save the updated
- * execution to the repository using the new key generated in the BEFORE_RENDER_RESPONSE phase.
- *
- *
- * Note about customization: since PhaseListeners managed directly by the JSF provider cannot be benefit from
- * DependencyInjection, See Spring's {@link org.springframework.web.jsf.DelegatingPhaseListenerMulticaster} when you
- * need to customize a FlowPhaseListener instance.
- *
- * @author Colin Sampaleanu
- * @author Keith Donald
- * @author Jeremy Grelle
- */
-public class FlowPhaseListener implements PhaseListener {
-
- /**
- * Logger, usable by subclasses.
- */
- protected final Log logger = LogFactory.getLog(getClass());
-
- /**
- * A helper for handling arguments needed by this phase listener to restore and launch flow executions.
- *
- * This helper is responsible for two main things:
- *
- *
Helping in the restoration of the "current" FlowExecution by extracting arguments from the request.
- * Specifically:
- *
- *
The flowExecutionKey argument is extracted to perform a flow execution refresh on redirects and browser
- * refreshes.
- *
The flowId argument is extracted to perform a flow execution launch on direct browser access of a flow
- * definition URL.
- *
Generating the flow execution URL to redirect to on a FlowExecutionRedirect response.
- *
Generating the flow definition URL to redirect to on a FlowDefinitionRedirect response.
- *
Generating external URLs to redirect to on a ExternalRedirect repsonse.
- *
- *
- * How arguments are extracted and how URLs are generated can be customized by setting a custom {{@link #setArgumentHandler(FlowExecutorArgumentHandler) argument handler}.
- */
- private FlowExecutorArgumentHandler argumentHandler = new RequestParameterFlowExecutorArgumentHandler();
-
- /**
- * The service responsible for mapping attributes of an {@link ExternalContext} to a new {@link FlowExecution}
- * during the launch flow operation.
- *
- * This allows developers to control what attributes are made available in the inputMap to new
- * top-level flow executions. The starting execution may then choose to map that available input into its own local
- * scope.
- *
- * The default implementation simply exposes all request parameters as flow execution input attributes. May be null.
- */
- private AttributeMapper inputMapper = new RequestParameterInputMapper();
-
- /**
- * Resolves selected Web Flow view names to JSF view ids.
- */
- private ViewIdMapper viewIdMapper = new DefaultViewIdMapper();
-
- /**
- * Returns the argument handler used by this phase listener.
- */
- public FlowExecutorArgumentHandler getArgumentHandler() {
- return argumentHandler;
- }
-
- /**
- * Sets the handler for arguments needed by this phase listener to restore and launch flow executions. This handler
- * is responsible for two things:
- *
- *
Helping in the restoration of the "current" FlowExecution by extracting arguments from the request.
- * Specifically:
- *
- *
The flowExecutionKey argument is extracted to perform a flow execution refresh on redirects and browser
- * refreshes.
- *
The flowId argument is extracted to perform a flow execution launch on direct browser access of a flow
- * definition URL.
- *
Generating the flow execution URL to redirect to on a FlowExecutionRedirect response.
- *
Generating the flow definition URL to redirect to on a FlowDefinitionRedirect response.
- *
Generating external URLs to redirect to on a ExternalRedirect response.
- *
- *
- * @param argumentHandler the argument handler
- */
- public void setArgumentHandler(FlowExecutorArgumentHandler argumentHandler) {
- this.argumentHandler = argumentHandler;
- }
-
- /**
- * Returns the configured flow execution input mapper.
- */
- public AttributeMapper getInputMapper() {
- return inputMapper;
- }
-
- /**
- * Sets the service responsible for mapping attributes of an {@link ExternalContext} to a new {@link FlowExecution}
- * during a launch flow operation. The default implementation simply exposes all request parameters as flow
- * execution input attributes. May be null.
- * @param inputMapper the input mapper
- * @see RequestParameterInputMapper
- */
- public void setInputMapper(AttributeMapper inputMapper) {
- this.inputMapper = inputMapper;
- }
-
- /**
- * Returns the JSF view id resolver used by this phase listener.
- */
- public ViewIdMapper getViewIdMapper() {
- return viewIdMapper;
- }
-
- /**
- * Sets the JSF view id mapper used by this phase listener. The {@link ViewIdMapper} provides a mechanism to convert
- * a logical Spring Web Flow application view name into a JSF view id.
- *
- * JSF view ids are important to this phase listener: it uses them to check whether the current view has changed,
- * and if a new view needs to be created and activated by delegating to the application's {@link ViewHandler}.
- *
- * A view handler typically treats a JSF view id as the physical location of a view template encapsulating a page
- * layout. The JSF view id normally specifies the physical location of the view template minus a suffix. View
- * handlers typically replace the suffix of any view id with their own default suffix (e.g. ".jsp" or ".xhtml") and
- * then try to locate a physical template view.
- *
- * The {@link ViewIdMapper} provides the ability to customize how SWF view name is mapped to a JSF view id that will
- * be passed to the ViewHandler. The default value for the view id mapper is a {@link DefaultViewIdMapper} which
- * just returns the SWF viewId as-is.
- * @param viewIdMapper the view id mapper
- * @see #prepareApplicationView(FacesContext, FlowExecutionHolder)
- */
- public void setViewIdMapper(ViewIdMapper viewIdMapper) {
- this.viewIdMapper = viewIdMapper;
- }
-
- public PhaseId getPhaseId() {
- return PhaseId.ANY_PHASE;
- }
-
- public void beforePhase(PhaseEvent event) {
- FacesContext context = event.getFacesContext();
- if (event.getPhaseId() == PhaseId.RESTORE_VIEW) {
- ExternalContextHolder.setExternalContext(new JsfExternalContext(context));
- restoreFlowExecution(event.getFacesContext());
- // we do not need to worry about clean up here since other phases will continue to run even if an exception
- // occurs in restoreFlowExecution(FacesContext)
- } else if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
- if (FlowExecutionHolderUtils.isFlowExecutionRestored(event.getFacesContext())) {
- try {
- prepareResponse(getCurrentContext(), FlowExecutionHolderUtils.getFlowExecutionHolder(context));
- } catch (RuntimeException e) {
- // we must cleanup here since this is the render response phase and the after phase callback will
- // NOT run when an exception occurs (which typically does the cleanup--see below)
- cleanupResources(context);
- throw e;
- } catch (Error e) {
- cleanupResources(context);
- throw e;
- }
- }
- }
- }
-
- public void afterPhase(PhaseEvent event) {
- FacesContext context = event.getFacesContext();
- if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
- if (FlowExecutionHolderUtils.isFlowExecutionRestored(context)) {
- try {
- saveFlowExecution(getCurrentContext(), FlowExecutionHolderUtils.getFlowExecutionHolder(context));
- } finally {
- // always cleanup after save - we are done with flow execution request processing
- cleanupResources(context);
- }
- }
- } else {
- // cleanup if some other JSF artifact marked 'response complete' to short-circuit the lifecycle early
- if (context.getResponseComplete()) {
- cleanupResources(context);
- }
- }
- }
-
- protected void restoreFlowExecution(FacesContext facesContext) {
- JsfExternalContext context = new JsfExternalContext(facesContext);
- if (argumentHandler.isFlowExecutionKeyPresent(context)) {
- // restore flow execution from repository so it will be available to JSF artifacts
- // (this could happen as part of a flow execution redirect or browser refresh)
- FlowExecutionRepository repository = getRepository(context);
- FlowExecutionKey flowExecutionKey = repository.parseFlowExecutionKey(argumentHandler
- .extractFlowExecutionKey(context));
- try {
- FlowExecutionLock lock = repository.getLock(flowExecutionKey);
- lock.lock();
- try {
- FlowExecution flowExecution = repository.getFlowExecution(flowExecutionKey);
- if (logger.isDebugEnabled()) {
- logger.debug("Loaded existing flow execution with key '" + flowExecutionKey
- + "' due to browser access "
- + "[either via a flow execution redirect or direct browser refresh]");
- }
- FlowExecutionHolderUtils.setFlowExecutionHolder(new FlowExecutionHolder(flowExecutionKey,
- flowExecution, lock), facesContext);
- } catch (RuntimeException e) {
- lock.unlock();
- throw e;
- } catch (Error e) {
- lock.unlock();
- throw e;
- }
- } catch (FlowExecutionAccessException e) {
- // thrown if access to the execution could not be granted
- handleFlowExecutionAccessException(e, facesContext);
- }
- } else if (argumentHandler.isFlowIdPresent(context)) {
- // launch a new flow execution
- // (this could happen as part of direct browser access or a flow definition redirect)
- String flowId = argumentHandler.extractFlowId(context);
- FlowDefinition flowDefinition = getLocator(context).getFlowDefinition(flowId);
- FlowExecution flowExecution = getFactory(context).createFlowExecution(flowDefinition);
- FlowExecutionHolder holder = new FlowExecutionHolder(flowExecution);
- FlowExecutionHolderUtils.setFlowExecutionHolder(holder, facesContext);
- ViewSelection selectedView = flowExecution.start(createInput(context), context);
- holder.setViewSelection(selectedView);
- if (logger.isDebugEnabled()) {
- logger.debug("Launched a new flow execution due to browser access "
- + "[either via a flow redirect or direct browser URL access]");
- }
- }
- }
-
- /**
- * Hook method to handle a thrown flow execution access exception. By default this implementation simply rethrows
- * the exception. Subclasses may override this method to redirect to an error page or take some other action in the
- * case where a flow execution could not be restored (for example, because the flow execution had previously ended
- * or expired).
- * @param e the flow execution access exception
- * @param context the current faces context
- */
- protected void handleFlowExecutionAccessException(FlowExecutionAccessException e, FacesContext context) {
- throw e;
- }
-
- /**
- * Factory method that creates the input attribute map for a newly created {@link FlowExecution}. This
- * implementation uses the registered input mapper, if any.
- * @param context the external context
- * @return the input map, or null if no input
- */
- protected MutableAttributeMap createInput(ExternalContext context) {
- if (inputMapper != null) {
- MutableAttributeMap inputMap = new LocalAttributeMap();
- inputMapper.map(context, inputMap, null);
- return inputMap;
- } else {
- return null;
- }
- }
-
- /**
- * Prepare the appropriate JSF response (e.g. rendering a view, sending a redirect, etc).
- * @param context the context
- * @param holder the holder
- */
- protected void prepareResponse(final JsfExternalContext context, final FlowExecutionHolder holder) {
- ViewSelection selectedView = holder.getViewSelection();
- if (selectedView == null) {
- // no navigation event has been processed - simply refresh the execution with the same key
- selectedView = holder.getFlowExecution().refresh(context);
- holder.setViewSelection(selectedView);
- } else {
- // an navigation event has been processed - generate a new flow execution key if necessary
- generateKey(context, holder);
- }
- new ResponseInstructionHandler() {
- protected void handleApplicationView(ApplicationView view) throws Exception {
- prepareApplicationView(context.getFacesContext(), holder);
- }
-
- protected void handleFlowDefinitionRedirect(FlowDefinitionRedirect redirect) throws Exception {
- String url = argumentHandler.createFlowDefinitionUrl(redirect, context);
- sendRedirect(url, context.getFacesContext());
- }
-
- protected void handleFlowExecutionRedirect(FlowExecutionRedirect redirect) throws Exception {
- String url = argumentHandler.createFlowExecutionUrl(holder.getFlowExecutionKey().toString(), holder
- .getFlowExecution(), context);
- sendRedirect(url, context.getFacesContext());
- }
-
- protected void handleExternalRedirect(ExternalRedirect redirect) throws Exception {
- String flowExecutionKey = holder.getFlowExecution().isActive() ? holder.getFlowExecutionKey()
- .toString() : null;
- String url = argumentHandler.createExternalUrl(redirect, flowExecutionKey, context);
- sendRedirect(url, context.getFacesContext());
- }
-
- protected void handleNull() throws Exception {
- // nothing to do
- }
-
- }.handleQuietly(new ResponseInstruction(holder.getFlowExecution(), selectedView));
- }
-
- /**
- * Prepare the JSF view for rendering.
- * @param facesContext the faces context
- * @param holder the holder of the current flow execution
- */
- protected void prepareApplicationView(FacesContext facesContext, FlowExecutionHolder holder) {
- ApplicationView view = (ApplicationView) holder.getViewSelection();
- if (view != null) {
- // expose the view's "model map" in the request map
- putInto(facesContext.getExternalContext().getRequestMap(), view.getModel());
- // update the root component if necessary
- updateViewRoot(facesContext, viewIdMapper.mapViewId(view.getViewName()));
- }
- String flowExecutionKey = holder.getFlowExecution().isActive() ? holder.getFlowExecutionKey().toString() : null;
- if (flowExecutionKey != null) {
- saveInViewRoot(facesContext, flowExecutionKey);
- }
- Map requestMap = facesContext.getExternalContext().getRequestMap();
- argumentHandler.exposeFlowExecutionContext(flowExecutionKey, holder.getFlowExecution(), requestMap);
- }
-
- /**
- * Factory method that creates the state holder UI component that will track the flow execution key used for
- * execution restoration during subsequent restore view phases. Subclasses may override to customize the state
- * holder component implementation, for example--to handle flow execution restoration/access exceptions in a certain
- * way.
- * @return the flow execution key state holder
- * @see #saveInViewRoot(FacesContext, String)
- */
- protected FlowExecutionKeyStateHolder createFlowExecutionKeyStateHolder() {
- return new FlowExecutionKeyStateHolder();
- }
-
- /**
- * Updates the current flow execution in the repository.
- * @param context the external context
- * @param holder the current flow execution holder
- */
- protected void saveFlowExecution(JsfExternalContext context, FlowExecutionHolder holder) {
- FlowExecution flowExecution = holder.getFlowExecution();
- FlowExecutionRepository repository = getRepository(context);
- if (flowExecution.isActive()) {
- // save the flow execution out to the repository
- if (logger.isDebugEnabled()) {
- logger.debug("Saving execution to repository with key " + holder.getFlowExecutionKey());
- }
- repository.putFlowExecution(holder.getFlowExecutionKey(), flowExecution);
- } else {
- if (holder.getFlowExecutionKey() != null) {
- // remove the flow execution from the repository
- if (logger.isDebugEnabled()) {
- logger.debug("Removing execution in repository with key '" + holder.getFlowExecutionKey() + "'");
- }
- repository.removeFlowExecution(holder.getFlowExecutionKey());
- }
- }
- }
-
- /**
- * Helper method to issue a redirect in a JSF environment properly. Subclasses may use as utility code.
- * @param url the url to redirect to
- * @param context the faces context
- */
- protected void sendRedirect(String url, FacesContext context) {
- try {
- url = context.getExternalContext().encodeResourceURL(url);
- context.getExternalContext().redirect(url);
- context.responseComplete();
- } catch (IOException e) {
- throw new IllegalArgumentException("Could not send redirect to " + url);
- }
- }
-
- // private helpers
-
- private JsfExternalContext getCurrentContext() {
- return (JsfExternalContext) ExternalContextHolder.getExternalContext();
- }
-
- private void cleanupResources(FacesContext context) {
- if (logger.isDebugEnabled()) {
- logger.debug("Cleaning up allocated flow system resources");
- }
- FlowExecutionHolderUtils.cleanupCurrentFlowExecution(context);
- ExternalContextHolder.setExternalContext(null);
- }
-
- private void updateViewRoot(FacesContext facesContext, String viewId) {
- UIViewRoot viewRoot = facesContext.getViewRoot();
- if (viewRoot == null || hasViewChanged(viewRoot, viewId)) {
- // create the specified view so that it can be rendered
- ViewHandler handler = facesContext.getApplication().getViewHandler();
- UIViewRoot view = handler.createView(facesContext, viewId);
- facesContext.setViewRoot(view);
- }
- }
-
- private boolean hasViewChanged(UIViewRoot viewRoot, String viewId) {
- return !viewRoot.getViewId().equals(viewId);
- }
-
- /**
- * Saves the flow execution key in a component in the view root for restoration on subsequent RESTORE_VIEW
- * operations.
- * @param facesContext the faces context exposing the view root
- * @param flowExecutionKey the flow execution key
- */
- private void saveInViewRoot(FacesContext facesContext, String flowExecutionKey) {
- // search for key holder in the component tree
- FlowExecutionKeyStateHolder keyHolder = (FlowExecutionKeyStateHolder) facesContext.getViewRoot().findComponent(
- FlowExecutionKeyStateHolder.COMPONENT_ID);
- if (keyHolder == null) {
- keyHolder = createFlowExecutionKeyStateHolder();
- // expose in the view root for preservation in the component tree
- facesContext.getViewRoot().getChildren().add(keyHolder);
- }
- keyHolder.setFlowExecutionKey(flowExecutionKey);
- }
-
- private void generateKey(JsfExternalContext context, FlowExecutionHolder holder) {
- FlowExecution flowExecution = holder.getFlowExecution();
- if (flowExecution.isActive()) {
- // generate new continuation key for the flow execution before rendering the response
- FlowExecutionKey flowExecutionKey = holder.getFlowExecutionKey();
- FlowExecutionRepository repository = getRepository(context);
- if (flowExecutionKey == null) {
- // it is a new conversation - generate a brand new key
- flowExecutionKey = repository.generateKey(flowExecution);
- FlowExecutionLock lock = repository.getLock(flowExecutionKey);
- lock.lock();
- // set that the flow execution lock has been acquired
- holder.setFlowExecutionLock(lock);
- } else {
- // it is an existing conversation - get the next key
- flowExecutionKey = repository.getNextKey(flowExecution, flowExecutionKey);
- }
- holder.setFlowExecutionKey(flowExecutionKey);
- }
- }
-
- /**
- * Utility method needed needed only because we can not rely on JSF RequestMap supporting Map's putAll method. Tries
- * putAll, falls back to individual adds.
- * @param targetMap the target map to add the model data to
- * @param map the model data to add to the target map
- */
- private void putInto(Map targetMap, Map map) {
- try {
- targetMap.putAll(map);
- } catch (UnsupportedOperationException e) {
- // work around nasty MyFaces bug where it's RequestMap doesn't
- // support putAll remove after it's fixed in MyFaces
- Iterator it = map.entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry entry = (Map.Entry) it.next();
- targetMap.put(entry.getKey(), entry.getValue());
- }
- }
- }
-
- private FlowDefinitionLocator getLocator(JsfExternalContext context) {
- return FlowFacesUtils.getDefinitionLocator(context.getFacesContext());
- }
-
- private FlowExecutionFactory getFactory(JsfExternalContext context) {
- return FlowFacesUtils.getExecutionFactory(context.getFacesContext());
- }
-
- private FlowExecutionRepository getRepository(JsfExternalContext context) {
- return FlowFacesUtils.getExecutionRepository(context.getFacesContext());
- }
-
- /**
- * Standard default view id resolver which uses the web flow view name as the jsf view id
- */
- public static class DefaultViewIdMapper implements ViewIdMapper {
- public String mapViewId(String viewName) {
- return viewName;
- }
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowRenderKitFactory.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowRenderKitFactory.java
new file mode 100644
index 00000000..74df882e
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowRenderKitFactory.java
@@ -0,0 +1,34 @@
+package org.springframework.faces.webflow;
+
+import java.util.Iterator;
+
+import javax.faces.context.FacesContext;
+import javax.faces.render.RenderKit;
+import javax.faces.render.RenderKitFactory;
+
+public class FlowRenderKitFactory extends RenderKitFactory {
+
+ private RenderKitFactory delegate;
+
+ public FlowRenderKitFactory(RenderKitFactory renderKitFactory) {
+ this.delegate = renderKitFactory;
+ }
+
+ public void addRenderKit(String renderKitId, RenderKit renderKit) {
+ FlowRenderKitWrapper wrapper = new FlowRenderKitWrapper(renderKit);
+ delegate.addRenderKit(renderKitId, wrapper);
+ }
+
+ public RenderKit getRenderKit(FacesContext context, String renderKitId) {
+ RenderKit renderKit = delegate.getRenderKit(context, renderKitId);
+ if (!(renderKit instanceof FlowRenderKitWrapper)) {
+ return new FlowRenderKitWrapper(renderKit);
+ }
+ return renderKit;
+ }
+
+ public Iterator getRenderKitIds() {
+ return delegate.getRenderKitIds();
+ }
+
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowRenderKitWrapper.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowRenderKitWrapper.java
new file mode 100644
index 00000000..8fb99c9c
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowRenderKitWrapper.java
@@ -0,0 +1,42 @@
+package org.springframework.faces.webflow;
+
+import java.io.OutputStream;
+import java.io.Writer;
+
+import javax.faces.context.ResponseStream;
+import javax.faces.context.ResponseWriter;
+import javax.faces.render.RenderKit;
+import javax.faces.render.Renderer;
+import javax.faces.render.ResponseStateManager;
+
+public class FlowRenderKitWrapper extends RenderKit {
+
+ RenderKit delegate;
+
+ ResponseStateManager manager = new FlowResponseStateManager();
+
+ public FlowRenderKitWrapper(RenderKit renderKit) {
+ this.delegate = renderKit;
+ }
+
+ public void addRenderer(String family, String rendererType, Renderer renderer) {
+ delegate.addRenderer(family, rendererType, renderer);
+ }
+
+ public ResponseStream createResponseStream(OutputStream out) {
+ return delegate.createResponseStream(out);
+ }
+
+ public ResponseWriter createResponseWriter(Writer writer, String contentTypeList, String characterEncoding) {
+ return delegate.createResponseWriter(writer, contentTypeList, characterEncoding);
+ }
+
+ public Renderer getRenderer(String family, String rendererType) {
+ return delegate.getRenderer(family, rendererType);
+ }
+
+ public ResponseStateManager getResponseStateManager() {
+ return manager;
+ }
+
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowResponseStateManager.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowResponseStateManager.java
new file mode 100644
index 00000000..70cfa0c4
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowResponseStateManager.java
@@ -0,0 +1,67 @@
+package org.springframework.faces.webflow;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import javax.el.ValueExpression;
+import javax.faces.application.StateManager.SerializedView;
+import javax.faces.context.FacesContext;
+import javax.faces.render.ResponseStateManager;
+
+import org.springframework.webflow.execution.FlowExecution;
+import org.springframework.webflow.execution.RequestContextHolder;
+
+public class FlowResponseStateManager extends ResponseStateManager {
+
+ private static final int TREE_STATE_INDEX = 0;
+
+ private static final int COMPONENT_STATE_INDEX = 1;
+
+ // TODO - This needs to be replaced with a common static, probably from FlowExecutorArgumentExtractor
+ private static final String VIEW_STATE_PARAM = "org.springframework.webflow.FlowExecutionKey";
+
+ private static final char[] STATE_FIELD_START = ("".toCharArray();
+
+ public Object getComponentStateToRestore(FacesContext context) {
+
+ Object[] state = (Object[]) RequestContextHolder.getRequestContext().getFlashScope().get(JsfView.STATE_KEY);
+ return state[COMPONENT_STATE_INDEX];
+ }
+
+ public Object getTreeStructureToRestore(FacesContext context, String viewId) {
+ Object[] state = (Object[]) RequestContextHolder.getRequestContext().getFlashScope().get(JsfView.STATE_KEY);
+ return state[TREE_STATE_INDEX];
+ }
+
+ public boolean isPostback(FacesContext context) {
+
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ private FlowExecution getFlowExecution() {
+ FacesContext ctx = FacesContext.getCurrentInstance();
+ ValueExpression expr = ctx.getApplication().getExpressionFactory().createValueExpression(ctx.getELContext(),
+ "#{flowExecution}", FlowExecution.class);
+ return (FlowExecution) expr.getValue(ctx.getELContext());
+ }
+
+ /**
+ * Stores the serializable component state in Flash scope and writes out the FlowExecutionKey
+ */
+ public void writeState(FacesContext context, SerializedView state) throws IOException {
+
+ Object[] serializableState = new Object[] { state.getStructure(), state.getState() };
+
+ RequestContextHolder.getRequestContext().getFlashScope().put(JsfView.STATE_KEY, serializableState);
+
+ Writer writer = context.getResponseWriter();
+ writer.write(STATE_FIELD_START);
+ writer.write(RequestContextHolder.getRequestContext().getFlowExecutionContext().getKey().toString());
+ writer.write(STATE_FIELD_END);
+ }
+
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowSystemCleanupFilter.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowSystemCleanupFilter.java
deleted file mode 100644
index e1c9afca..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowSystemCleanupFilter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import java.io.IOException;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.springframework.web.filter.OncePerRequestFilter;
-import org.springframework.webflow.context.ExternalContextHolder;
-import org.springframework.webflow.execution.FlowExecutionContextHolder;
-
-/**
- * A servlet filter used to guarantee that web flow context information is cleaned up in a JSF environment.
- *
- * @author Ben Hale
- * @since 1.0.4
- */
-public class FlowSystemCleanupFilter extends OncePerRequestFilter {
-
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
- throws ServletException, IOException {
- try {
- chain.doFilter(request, response);
- } finally {
- cleanupCurrentFlowExecution(request);
- ExternalContextHolder.setExternalContext(null);
- }
- }
-
- /**
- * Cleans up the current flow execution in the request context if necessary. Specifically, handles unlocking the
- * execution if necessary, setting the holder to null, and cleaning up the flow execution context thread local. Can
- * be safely called even if no execution is bound or one is bound but not locked.
- * @param request the servlet request
- */
- private void cleanupCurrentFlowExecution(ServletRequest request) {
- if (isFlowExecutionRestored(request)) {
- FlowExecutionContextHolder.setFlowExecutionContext(null);
- getFlowExecutionHolder(request).unlockFlowExecutionIfNecessary();
- request.removeAttribute(FlowExecutionHolderUtils.getFlowExecutionHolderKey());
- }
- }
-
- /**
- * Returns true if the flow execution has been restored in the current thread.
- * @param request the servlet request
- * @return true if restored, false otherwise
- */
- private boolean isFlowExecutionRestored(ServletRequest request) {
- return getFlowExecutionHolder(request) != null;
- }
-
- /**
- * Returns the current flow execution holder for the given servlet request.
- * @param request the servlet request
- * @return the flow execution holder, or null if none set.
- */
- private FlowExecutionHolder getFlowExecutionHolder(ServletRequest request) {
- return (FlowExecutionHolder) request.getAttribute(FlowExecutionHolderUtils.getFlowExecutionHolderKey());
- }
-}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfExternalContext.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfExternalContext.java
deleted file mode 100644
index f09cdb21..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfExternalContext.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import javax.faces.context.FacesContext;
-
-import org.springframework.binding.collection.SharedMapDecorator;
-import org.springframework.core.style.ToStringCreator;
-import org.springframework.webflow.context.ExternalContext;
-import org.springframework.webflow.core.collection.LocalAttributeMap;
-import org.springframework.webflow.core.collection.LocalParameterMap;
-import org.springframework.webflow.core.collection.LocalSharedAttributeMap;
-import org.springframework.webflow.core.collection.MutableAttributeMap;
-import org.springframework.webflow.core.collection.ParameterMap;
-import org.springframework.webflow.core.collection.SharedAttributeMap;
-
-/**
- * Provides contextual information about a JSF environment that has interacted with SWF.
- *
- * @author Keith Donald
- */
-public class JsfExternalContext implements ExternalContext {
-
- /**
- * The JSF Faces context.
- */
- private FacesContext facesContext;
-
- /**
- * The id of the action or "command button" that fired.
- */
- private String actionId;
-
- /**
- * The action outcome.
- */
- private String outcome;
-
- /**
- * An accessor for the JSF request parameter map.
- */
- private ParameterMap requestParameterMap;
-
- /**
- * An accessor for the JSF request attribute map.
- */
- private MutableAttributeMap requestMap;
-
- /**
- * An accessor for the JSF session map.
- */
- private SharedAttributeMap sessionMap;
-
- /**
- * An accessor for the JSF application map.
- */
- private SharedAttributeMap applicationMap;
-
- /**
- * Creates a JSF External Context.
- * @param facesContext the JSF faces context
- */
- public JsfExternalContext(FacesContext facesContext) {
- this.facesContext = facesContext;
- initMaps(facesContext);
- }
-
- /**
- * Initializes parameter and attribute maps from context data structures.
- * @param facesContext the faces context
- */
- private void initMaps(FacesContext facesContext) {
- this.requestParameterMap = new LocalParameterMap(facesContext.getExternalContext().getRequestParameterMap());
- this.requestMap = new LocalAttributeMap(facesContext.getExternalContext().getRequestMap());
- this.sessionMap = new LocalSharedAttributeMap(new SessionSharedMap(facesContext));
- this.applicationMap = new LocalSharedAttributeMap(new ApplicationSharedMap(facesContext));
- }
-
- public String getContextPath() {
- return facesContext.getExternalContext().getRequestContextPath();
- }
-
- public String getDispatcherPath() {
- return facesContext.getExternalContext().getRequestServletPath();
- }
-
- public String getRequestPathInfo() {
- return facesContext.getExternalContext().getRequestPathInfo();
- }
-
- public ParameterMap getRequestParameterMap() {
- return requestParameterMap;
- }
-
- public MutableAttributeMap getRequestMap() {
- return requestMap;
- }
-
- public SharedAttributeMap getSessionMap() {
- return sessionMap;
- }
-
- public SharedAttributeMap getGlobalSessionMap() {
- return getSessionMap();
- }
-
- public SharedAttributeMap getApplicationMap() {
- return applicationMap;
- }
-
- /**
- * Returns the JSF FacesContext.
- */
- public FacesContext getFacesContext() {
- return facesContext;
- }
-
- /**
- * Returns the action identifier.
- */
- public String getActionId() {
- return actionId;
- }
-
- /**
- * Returns the action outcome.
- */
- public String getOutcome() {
- return outcome;
- }
-
- /**
- * Records the action and outcome context information when navigation handling occurs.
- * @param actionId the from action identifier
- * @param outcome the action outcome
- */
- public void handleNavigationCalled(String actionId, String outcome) {
- this.actionId = actionId;
- this.outcome = outcome;
- }
-
- /**
- * An accessor of a JSF session map.
- * @author Keith Donald
- */
- private static class SessionSharedMap extends SharedMapDecorator {
-
- private FacesContext facesContext;
-
- public SessionSharedMap(FacesContext facesContext) {
- super(facesContext.getExternalContext().getSessionMap());
- this.facesContext = facesContext;
- }
-
- public Object getMutex() {
- return facesContext.getExternalContext().getSession(false);
- }
- }
-
- /**
- * An accessor of an JSF application map.
- * @author Keith Donald
- */
- private static class ApplicationSharedMap extends SharedMapDecorator {
-
- private FacesContext facesContext;
-
- public ApplicationSharedMap(FacesContext facesContext) {
- super(facesContext.getExternalContext().getApplicationMap());
- this.facesContext = facesContext;
- }
-
- public Object getMutex() {
- return facesContext.getExternalContext().getContext();
- }
- }
-
- public String toString() {
- return new ToStringCreator(this).append("actionId", actionId).append("outcome", outcome).append("facesContext",
- facesContext).toString();
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfFlowUtils.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfFlowUtils.java
new file mode 100644
index 00000000..1a2d42b0
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfFlowUtils.java
@@ -0,0 +1,48 @@
+package org.springframework.faces.webflow;
+
+import javax.faces.FactoryFinder;
+import javax.faces.context.FacesContext;
+import javax.faces.context.FacesContextFactory;
+import javax.faces.event.PhaseEvent;
+import javax.faces.event.PhaseId;
+import javax.faces.event.PhaseListener;
+import javax.faces.lifecycle.Lifecycle;
+
+import org.springframework.webflow.execution.RequestContext;
+import org.springframework.webflow.execution.RequestContextHolder;
+
+class JsfFlowUtils {
+
+ public static FacesContext getFacesContext(Lifecycle lifecycle) {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ if (facesContext == null) {
+ RequestContext requestContext = RequestContextHolder.getRequestContext();
+ FacesContextFactory facesContextFactory = (FacesContextFactory) FactoryFinder
+ .getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
+ facesContext = facesContextFactory.getFacesContext(requestContext.getExternalContext().getContext(),
+ requestContext.getExternalContext().getRequest(),
+ requestContext.getExternalContext().getResponse(), lifecycle);
+ }
+ return facesContext;
+ }
+
+ public static void notifyAfterListeners(PhaseId phaseId, Lifecycle lifecycle) {
+ PhaseEvent afterPhaseEvent = new PhaseEvent(getFacesContext(lifecycle), phaseId, lifecycle);
+ for (int i = 0; i < lifecycle.getPhaseListeners().length; i++) {
+ PhaseListener listener = lifecycle.getPhaseListeners()[i];
+ if (listener.getPhaseId() == phaseId || listener.getPhaseId() == PhaseId.ANY_PHASE) {
+ listener.afterPhase(afterPhaseEvent);
+ }
+ }
+ }
+
+ public static void notifyBeforeListeners(PhaseId phaseId, Lifecycle lifecycle) {
+ PhaseEvent beforePhaseEvent = new PhaseEvent(getFacesContext(lifecycle), phaseId, lifecycle);
+ for (int i = 0; i < lifecycle.getPhaseListeners().length; i++) {
+ PhaseListener listener = lifecycle.getPhaseListeners()[i];
+ if (listener.getPhaseId() == phaseId || listener.getPhaseId() == PhaseId.ANY_PHASE) {
+ listener.beforePhase(beforePhaseEvent);
+ }
+ }
+ }
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfRenderFinalResponseAction.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfRenderFinalResponseAction.java
new file mode 100644
index 00000000..5875f04a
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfRenderFinalResponseAction.java
@@ -0,0 +1,32 @@
+package org.springframework.faces.webflow;
+
+import org.springframework.util.Assert;
+import org.springframework.webflow.execution.Action;
+import org.springframework.webflow.execution.Event;
+import org.springframework.webflow.execution.RequestContext;
+import org.springframework.webflow.execution.View;
+import org.springframework.webflow.execution.ViewFactory;
+
+public class JsfRenderFinalResponseAction implements Action {
+
+ ViewFactory viewFactory;
+
+ public JsfRenderFinalResponseAction(ViewFactory viewFactory) {
+ Assert.notNull(viewFactory);
+ this.viewFactory = viewFactory;
+ }
+
+ public Event execute(RequestContext context) throws Exception {
+
+ View view = viewFactory.getView(context);
+ Assert.isInstanceOf(JsfView.class, view);
+
+ ((JsfView) view).getViewRoot().setTransient(true);
+
+ view.render();
+
+ return new Event(this, "success");
+
+ }
+
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfView.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfView.java
new file mode 100644
index 00000000..bd283e6a
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfView.java
@@ -0,0 +1,77 @@
+package org.springframework.faces.webflow;
+
+import java.io.IOException;
+
+import javax.faces.FacesException;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.FacesContext;
+import javax.faces.event.PhaseId;
+import javax.faces.lifecycle.Lifecycle;
+
+import org.springframework.util.Assert;
+import org.springframework.util.StringUtils;
+import org.springframework.webflow.execution.Event;
+import org.springframework.webflow.execution.RequestContextHolder;
+import org.springframework.webflow.execution.View;
+
+public class JsfView implements View {
+
+ public static final String EVENT_KEY = "org.springframework.webflow.FacesEvent";
+
+ public static final String STATE_KEY = "org.springframework.webflow.FacesState";
+
+ /**
+ * The root of the JSF component tree managed by this view
+ */
+ private UIViewRoot viewRoot;
+
+ private Event event;
+
+ private Lifecycle facesLifecycle;
+
+ public JsfView(UIViewRoot viewRoot, Lifecycle facesLifecycle) {
+
+ Assert.notNull(viewRoot);
+ Assert.notNull(facesLifecycle);
+
+ this.viewRoot = viewRoot;
+ this.facesLifecycle = facesLifecycle;
+ }
+
+ public boolean eventSignaled() {
+ return getEvent() != null;
+ }
+
+ public Event getEvent() {
+ if (event == null) {
+
+ String jsfEvent = (String) RequestContextHolder.getRequestContext().getExternalContext().getRequestMap()
+ .get(EVENT_KEY);
+ if (StringUtils.hasText(jsfEvent)) {
+ event = new Event(this, jsfEvent);
+ }
+ }
+ return event;
+ }
+
+ public UIViewRoot getViewRoot() {
+ return this.viewRoot;
+ }
+
+ public void render() {
+ FacesContext facesContext = JsfFlowUtils.getFacesContext(facesLifecycle);
+ facesContext.setViewRoot(viewRoot);
+ facesContext.renderResponse();
+ try {
+ JsfFlowUtils.notifyBeforeListeners(PhaseId.RENDER_RESPONSE, facesLifecycle);
+ facesContext.getApplication().getViewHandler().renderView(facesContext, viewRoot);
+ JsfFlowUtils.notifyAfterListeners(PhaseId.RENDER_RESPONSE, facesLifecycle);
+ } catch (IOException e) {
+ throw new FacesException("An I/O error occurred during view rendering", e);
+ } finally {
+ facesContext.responseComplete();
+ facesContext.release();
+ }
+ }
+
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactory.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactory.java
new file mode 100644
index 00000000..6d98338b
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactory.java
@@ -0,0 +1,99 @@
+package org.springframework.faces.webflow;
+
+import java.util.Iterator;
+
+import javax.el.ELContext;
+import javax.el.ValueExpression;
+import javax.faces.application.ViewHandler;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.FacesContext;
+import javax.faces.event.PhaseId;
+import javax.faces.lifecycle.Lifecycle;
+
+import org.springframework.binding.expression.Expression;
+import org.springframework.webflow.execution.RequestContext;
+import org.springframework.webflow.execution.View;
+import org.springframework.webflow.execution.ViewFactory;
+
+public class JsfViewFactory implements ViewFactory {
+
+ private final Lifecycle facesLifecycle;
+
+ private final Expression viewExpr;
+
+ public JsfViewFactory(Lifecycle facesLifecycle, Expression viewExpr) {
+
+ this.facesLifecycle = facesLifecycle;
+ this.viewExpr = viewExpr;
+ }
+
+ public View getView(RequestContext context) {
+
+ FacesContext facesContext = JsfFlowUtils.getFacesContext(facesLifecycle);
+ try {
+ boolean restored = false;
+
+ if (!facesContext.getRenderResponse()) {
+ JsfFlowUtils.notifyBeforeListeners(PhaseId.RESTORE_VIEW, facesLifecycle);
+ }
+
+ JsfView view;
+
+ ViewHandler handler = facesContext.getApplication().getViewHandler();
+
+ if (viewExists(facesContext, viewExpr.getValue(context).toString())) {
+ view = new JsfView(facesContext.getViewRoot(), facesLifecycle);
+ restored = true;
+ } else {
+ String viewName = (String) viewExpr.getValue(context);
+ UIViewRoot root = handler.restoreView(facesContext, viewName);
+ if (root != null) {
+ view = new JsfView(root, facesLifecycle);
+ restored = true;
+ } else {
+ view = new JsfView(handler.createView(facesContext, viewName), facesLifecycle);
+ restored = false;
+ }
+ }
+
+ facesContext.setViewRoot(view.getViewRoot());
+
+ processBindings(facesContext.getELContext(), view.getViewRoot());
+
+ if (!facesContext.getRenderResponse()) {
+ JsfFlowUtils.notifyAfterListeners(PhaseId.RESTORE_VIEW, facesLifecycle);
+ }
+
+ if (restored && !facesContext.getResponseComplete() && !facesContext.getRenderResponse()) {
+ facesLifecycle.execute(facesContext);
+ facesContext.renderResponse();
+ }
+
+ return view;
+ } finally {
+ facesContext.release();
+ }
+ }
+
+ private boolean viewExists(FacesContext facesContext, String viewId) {
+ if (facesContext.getViewRoot() != null && facesContext.getViewRoot().getViewId().equals(viewId)) {
+ return true;
+ }
+ return false;
+ }
+
+ private void processBindings(ELContext elContext, UIComponent component) {
+
+ ValueExpression expr = component.getValueExpression("binding");
+ if (expr != null) {
+ expr.setValue(elContext, component);
+ }
+
+ Iterator i = component.getChildren().iterator();
+ while (i.hasNext()) {
+ UIComponent child = (UIComponent) i.next();
+ processBindings(elContext, child);
+ }
+ }
+}
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/ViewIdMapper.java b/spring-faces/src/main/java/org/springframework/faces/webflow/ViewIdMapper.java
deleted file mode 100644
index 91a32905..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/ViewIdMapper.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import javax.faces.application.ViewHandler;
-
-/**
- * Interface to be implemented by objects that can map Web Flow view names to JSF view identifiers. JSF view identifiers
- * are used to determine if the current view has changed and to create views by delegating to the application's
- * {@link ViewHandler}.
- *
- * A view handler typically treats a JSF view id as the physical location of a view template encapsulating a page
- * layout. The JSF view id normally specifies the physical location of the view template minus a suffix. View handlers
- * typically replace the suffix of any view id with their own default suffix (e.g. ".jsp" or ".xhtml") and then try to
- * locate a physical template view.
- *
- * @author Colin Sampaleanu
- */
-public interface ViewIdMapper {
-
- /**
- * Map the given Spring Web Flow view name to a JSF view identifier.
- * @param viewName name of the view to map
- * @return the corresponding JSF view id
- */
- public String mapViewId(String viewName);
-
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/el/AbstractFlowExecutionPropertyResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/el/AbstractFlowExecutionPropertyResolver.java
deleted file mode 100644
index ea824f01..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/el/AbstractFlowExecutionPropertyResolver.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow.el;
-
-import javax.faces.el.EvaluationException;
-import javax.faces.el.PropertyNotFoundException;
-import javax.faces.el.PropertyResolver;
-import javax.faces.el.ReferenceSyntaxException;
-
-import org.springframework.webflow.execution.FlowExecution;
-
-/**
- * Base class for property resolvers that get and set flow execution attributes.
- *
- * @author Keith Donald
- */
-public abstract class AbstractFlowExecutionPropertyResolver extends PropertyResolver {
-
- /**
- * The standard property resolver to delegate to if this one doesn't apply.
- */
- private final PropertyResolver resolverDelegate;
-
- /**
- * Creates a new flow executon property resolver
- * @param resolverDelegate the resolver to delegate to when the property is not a flow execution attribute
- */
- public AbstractFlowExecutionPropertyResolver(PropertyResolver resolverDelegate) {
- this.resolverDelegate = resolverDelegate;
- }
-
- /**
- * Returns the property resolver this resolver delegates to if necessary.
- */
- protected final PropertyResolver getResolverDelegate() {
- return resolverDelegate;
- }
-
- public Class getType(Object base, Object property) throws EvaluationException, PropertyNotFoundException {
- if (base instanceof FlowExecution) {
- FlowExecution execution = (FlowExecution) base;
- assertPropertyNameValid(property);
- return doGetAttributeType(execution, (String) property);
- } else {
- return resolverDelegate.getType(base, property);
- }
- }
-
- public Class getType(Object base, int index) throws EvaluationException, PropertyNotFoundException {
- if (base instanceof FlowExecution) {
- // cannot access flow execution by index so we cannot determine type. Return null per JSF spec
- return null;
- } else {
- return resolverDelegate.getType(base, index);
- }
- }
-
- public Object getValue(Object base, Object property) throws EvaluationException, PropertyNotFoundException {
- if (base instanceof FlowExecution) {
- FlowExecution execution = (FlowExecution) base;
- assertPropertyNameValid(property);
- return doGetAttribute(execution, (String) property);
- } else {
- return resolverDelegate.getValue(base, property);
- }
- }
-
- public Object getValue(Object base, int index) throws EvaluationException, PropertyNotFoundException {
- if (base instanceof FlowExecution) {
- throw new ReferenceSyntaxException("Cannot apply an index value to a flow execution");
- } else {
- return resolverDelegate.getValue(base, index);
- }
- }
-
- public boolean isReadOnly(Object base, Object property) throws EvaluationException, PropertyNotFoundException {
- if (base instanceof FlowExecution) {
- return false;
- } else {
- return resolverDelegate.isReadOnly(base, property);
- }
- }
-
- public boolean isReadOnly(Object base, int index) throws EvaluationException, PropertyNotFoundException {
- if (base instanceof FlowExecution) {
- return false;
- } else {
- return resolverDelegate.isReadOnly(base, index);
- }
- }
-
- public void setValue(Object base, Object property, Object value) throws EvaluationException,
- PropertyNotFoundException {
- if ((base instanceof FlowExecution)) {
- FlowExecution execution = (FlowExecution) base;
- assertPropertyNameValid(property);
- doSetAttribute(execution, (String) property, value);
- } else {
- resolverDelegate.setValue(base, property, value);
- }
- }
-
- public void setValue(Object base, int index, Object value) throws EvaluationException, PropertyNotFoundException {
- if (base instanceof FlowExecution) {
- throw new ReferenceSyntaxException("Cannot apply an index value to a flow execution");
- } else {
- resolverDelegate.setValue(base, index, value);
- }
- }
-
- // helpers
-
- private void assertPropertyNameValid(Object property) {
- if (property == null) {
- throw new PropertyNotFoundException("The name of the flow execution attribute cannot be null");
- }
- if (!(property instanceof String)) {
- throw new PropertyNotFoundException("Flow execution attribute names must be strings but " + property
- + " was not");
- }
- if (((String) property).length() == 0) {
- throw new PropertyNotFoundException("The name of the flow execution attribute cannot be blank");
- }
- }
-
- /**
- * Gets the type of value returned by the flow execution attribute.
- * @param execution the flow execution
- * @param attributeName the name of the attribute
- * @return the type of value returned by the attribute
- */
- protected abstract Class doGetAttributeType(FlowExecution execution, String attributeName);
-
- /**
- * Gets the value of the flow execution attribute.
- * @param execution the flow execution
- * @param attributeName the name of the attribute
- * @return the attribute value
- */
- protected abstract Object doGetAttribute(FlowExecution execution, String attributeName);
-
- /**
- * Sets the value of the flow execution attribute.
- * @param execution the flow execution
- * @param attributeName the name of the attribute
- * @param attributeValue the attribute value
- */
- protected abstract void doSetAttribute(FlowExecution execution, String attributeName, Object attributeValue);
-
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/el/DelegatingFlowVariableResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/el/DelegatingFlowVariableResolver.java
deleted file mode 100644
index c9ddc338..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/el/DelegatingFlowVariableResolver.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow.el;
-
-import javax.faces.context.FacesContext;
-import javax.faces.el.EvaluationException;
-import javax.faces.el.VariableResolver;
-
-import org.springframework.faces.webflow.FlowExecutionHolderUtils;
-import org.springframework.web.jsf.DelegatingVariableResolver;
-import org.springframework.webflow.execution.FlowExecution;
-
-/**
- * Custom variable resolver that searches the current flow execution for variables to resolve. The search algorithm
- * looks in flash scope first, then flow scope, then conversation scope. If no variable is found this resolver delegates
- * to the next resolver in the chain.
- *
- * Suitable for use along side other variable resolvers to support EL binding expressions like {#bean.property} where
- * "bean" could be a property in any supported scope.
- *
- * Consider combining use of this class with a Spring {@link DelegatingVariableResolver} to also support
- * lazy-initialized binding variables managed by a Spring application context using custom bean scopes. Also consider
- * such a Spring-backed managed bean facility as the sole-provider for centralized JSF managed bean references.
- *
- * @author Keith Donald
- */
-public class DelegatingFlowVariableResolver extends VariableResolver {
-
- /**
- * The standard variable resolver to delegate to if this one doesn't apply.
- */
- private VariableResolver resolverDelegate;
-
- /**
- * Create a new FlowExecutionVariableResolver, using the given original VariableResolver.
- *
- * A JSF implementation will automatically pass its original resolver into the constructor of a configured resolver,
- * provided that there is a corresponding constructor argument.
- *
- * @param resolverDelegate the original VariableResolver
- */
- public DelegatingFlowVariableResolver(VariableResolver resolverDelegate) {
- this.resolverDelegate = resolverDelegate;
- }
-
- /**
- * Return the original VariableResolver that this resolver delegates to.
- */
- protected final VariableResolver getResolverDelegate() {
- return resolverDelegate;
- }
-
- public Object resolveVariable(FacesContext context, String name) throws EvaluationException {
- FlowExecution execution = FlowExecutionHolderUtils.getCurrentFlowExecution(context);
- if (execution != null) {
- if (execution.isActive()) {
- // flow execution is active: try flash/flow/conversation scope
- if (execution.getFlashScope().contains(name)) {
- return execution.getFlashScope().get(name);
- } else if (execution.getActiveSession().getScope().contains(name)) {
- return execution.getActiveSession().getScope().get(name);
- } else if (execution.getConversationScope().contains(name)) {
- return execution.getConversationScope().get(name);
- }
- } else {
- // flow execution has ended: check for end-state attributes exposed in the request map
- if (context.getExternalContext().getRequestMap().containsKey(name)) {
- return context.getExternalContext().getRequestMap().get(name);
- }
- }
- }
- // no flow execution bound or flow execution attribute found with that name - delegate
- return resolverDelegate.resolveVariable(context, name);
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowExecutionPropertyResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowExecutionPropertyResolver.java
deleted file mode 100644
index 6ccc7264..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowExecutionPropertyResolver.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow.el;
-
-import java.util.Map;
-
-import javax.faces.el.PropertyNotFoundException;
-import javax.faces.el.PropertyResolver;
-
-import org.springframework.webflow.execution.FlowExecution;
-
-/**
- * Custom property resolver that resolves supported properties of the current flow execution. Supports resolving all
- * scopes as java.util.Maps: "flowScope", "conversationScope", and "flashScope". Also supports attribute searching when
- * no scope prefix is specified. The search order is flash, flow, conversation.
- *
- * @author Keith Donald
- */
-public class FlowExecutionPropertyResolver extends AbstractFlowExecutionPropertyResolver {
-
- /**
- * The name of the special flash scope execution property.
- */
- private static final String FLASH_SCOPE_PROPERTY = "flashScope";
-
- /**
- * The name of the special flow scope execution property.
- */
- private static final String FLOW_SCOPE_PROPERTY = "flowScope";
-
- /**
- * The name of the special conversation scope execution property.
- */
- private static final String CONVERSATION_SCOPE_PROPERTY = "conversationScope";
-
- /**
- * Creates a new flow executon property resolver that resolves flash, flow, and conversation scope attributes.
- * @param resolverDelegate the resolver to delegate to when the property is not a flow execution attribute
- */
- public FlowExecutionPropertyResolver(PropertyResolver resolverDelegate) {
- super(resolverDelegate);
- }
-
- protected Class doGetAttributeType(FlowExecution execution, String attributeName) {
- if (FLASH_SCOPE_PROPERTY.equals(attributeName)) {
- return Map.class;
- } else if (FLOW_SCOPE_PROPERTY.equals(attributeName)) {
- return Map.class;
- } else if (CONVERSATION_SCOPE_PROPERTY.equals(attributeName)) {
- return Map.class;
- } else {
- // perform an attribute search
-
- // try flash scope first
- Object value = execution.getFlashScope().get(attributeName);
- if (value != null) {
- return value.getClass();
- }
- // try flow scope
- value = execution.getActiveSession().getScope().get(attributeName);
- if (value != null) {
- return value.getClass();
- }
- // try conversation scope
- value = execution.getConversationScope().get(attributeName);
- if (value != null) {
- return value.getClass();
- }
- // cannot determine
- return null;
- }
- }
-
- protected Object doGetAttribute(FlowExecution execution, String attributeName) {
- if (FLASH_SCOPE_PROPERTY.equals(attributeName)) {
- return execution.getFlashScope().asMap();
- } else if (FLOW_SCOPE_PROPERTY.equals(attributeName)) {
- return execution.getActiveSession().getScope().asMap();
- } else if (CONVERSATION_SCOPE_PROPERTY.equals(attributeName)) {
- return execution.getConversationScope().asMap();
- } else {
- // perform an attribute search
-
- // try flash scope
- Object value = execution.getFlashScope().get(attributeName);
- if (value != null) {
- return value;
- }
- // try flow scope
- value = execution.getActiveSession().getScope().get(attributeName);
- if (value != null) {
- return value;
- }
- // try conversation scope
- value = execution.getConversationScope().get(attributeName);
- if (value != null) {
- return value;
- }
- // cannot resolve as expected
- throw new PropertyNotFoundException("Readable flow execution attribute '" + attributeName
- + "' not found in any scope (flash, flow, or conversation)");
- }
- }
-
- protected void doSetAttribute(FlowExecution execution, String attributeName, Object attributeValue) {
- // perform a search
- if (execution.getFlashScope().contains(attributeName)) {
- execution.getFlashScope().put(attributeName, attributeValue);
- } else if (execution.getActiveSession().getScope().contains(attributeName)) {
- execution.getActiveSession().getScope().put(attributeName, attributeValue);
- } else if (execution.getConversationScope().contains(attributeName)) {
- execution.getConversationScope().put(attributeName, attributeValue);
- } else {
- // cannot resolve as expected
- throw new PropertyNotFoundException("Settable flow execution attribute '" + attributeName
- + "' not found in any scope (flash, flow, or conversation)");
- }
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowExecutionVariableResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowExecutionVariableResolver.java
deleted file mode 100644
index 0d334b35..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowExecutionVariableResolver.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow.el;
-
-import javax.faces.context.FacesContext;
-import javax.faces.el.EvaluationException;
-import javax.faces.el.VariableResolver;
-
-import org.springframework.faces.webflow.FlowExecutionHolderUtils;
-import org.springframework.webflow.execution.FlowExecution;
-
-/**
- * Custom variable resolver that resolves to a thread-bound FlowExecution object for binding expressions prefixed with a
- * {@link #FLOW_EXECUTION_VARIABLE_NAME}. For instance "flowExecution.conversationScope.myProperty".
- *
- * This class is designed to be used with a {@link FlowExecutionPropertyResolver}.
- *
- * This class is a more flexible alternative to the {@link FlowVariableResolver} which is expected to be used ONLY with
- * a {@link FlowPropertyResolver} to resolve flow scope variables ONLY. It is more flexible because it provides access
- * to any scope structure of a {@link FlowExecution} object.
- *
- * @author Keith Donald
- */
-public class FlowExecutionVariableResolver extends VariableResolver {
-
- /**
- * Name of the flow execution variable.
- */
- public static final String FLOW_EXECUTION_VARIABLE_NAME = "flowExecution";
-
- /**
- * The standard variable resolver to delegate to if this one doesn't apply.
- */
- private VariableResolver resolverDelegate;
-
- /**
- * Creates a new flow executon variable resolver that resolves the current FlowExecution object.
- * @param resolverDelegate the resolver to delegate to when the variable is not named "flowExecution".
- */
- public FlowExecutionVariableResolver(VariableResolver resolverDelegate) {
- this.resolverDelegate = resolverDelegate;
- }
-
- /**
- * Returns the variable resolver this resolver delegates to if necessary.
- */
- protected final VariableResolver getResolverDelegate() {
- return resolverDelegate;
- }
-
- public Object resolveVariable(FacesContext context, String name) throws EvaluationException {
- if (FLOW_EXECUTION_VARIABLE_NAME.equals(name)) {
- return FlowExecutionHolderUtils.getRequiredCurrentFlowExecution(context);
- } else {
- return resolverDelegate.resolveVariable(context, name);
- }
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowPropertyResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowPropertyResolver.java
deleted file mode 100644
index 60e7a006..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowPropertyResolver.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow.el;
-
-import javax.faces.context.FacesContext;
-import javax.faces.el.PropertyResolver;
-
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.util.Assert;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.jsf.DelegatingVariableResolver;
-import org.springframework.web.jsf.FacesContextUtils;
-import org.springframework.webflow.execution.FlowExecution;
-
-/**
- * Custom property resolver that resolves flow session scope attributes of the current flow execution. This resolver
- * will also create and set the attribute value to a bean from the root Spring Web Application Context if the value does
- * not already exist, allowing for lazy-initialized binding variables.
- *
- * Designed mainly to be used with the {@link FlowVariableResolver}. This is the original property resolver implemented
- * with Spring Web Flow 1.0. In general, prefer {@link DelegatingFlowVariableResolver} or
- * {@link FlowExecutionVariableResolver} over use of this class. Also, consider use of the
- * {@link DelegatingVariableResolver} as an alternative to accessing lazy-initialized binding variables managed by a
- * Spring application context that uses custom bean scopes.
- *
- * @author Colin Sampaleanu
- * @author Keith Donald
- */
-public class FlowPropertyResolver extends AbstractFlowExecutionPropertyResolver {
-
- /**
- * Creates a new flow execution property resolver that resolves flow scope attributes.
- * @param resolverDelegate the resolver to delegate to when the property is not a flow execution attribute
- */
- public FlowPropertyResolver(PropertyResolver resolverDelegate) {
- super(resolverDelegate);
- }
-
- protected Class doGetAttributeType(FlowExecution execution, String attributeName) {
- // we want to access flow scope of the active session (conversation)
- Object value = execution.getActiveSession().getScope().get(attributeName);
- // note that MyFaces returns Object.class for a null value here, but
- // as I read the JSF spec, null should be returned when the object
- // type can not be determined this certainly seems to be the case
- // for a map value which doesn' even exist
- return (value == null) ? null : value.getClass();
- }
-
- protected Object doGetAttribute(FlowExecution execution, String attributeName) {
- Object value = execution.getActiveSession().getScope().get(attributeName);
- if (value == null) {
- FacesContext facesContext = FacesContext.getCurrentInstance();
- Assert.notNull(facesContext, "The current FacesContext must be present during property resolution stage");
- BeanFactory beanFactory = getWebApplicationContext(facesContext);
- if (beanFactory.containsBean(attributeName)) {
- // note: this resolver doesn't care, but this should be
- // a stateless bean with singleton scope or a stateful bean with prototype scope
- value = beanFactory.getBean(attributeName);
- execution.getActiveSession().getScope().put(attributeName, value);
- }
- }
- return value;
- }
-
- protected void doSetAttribute(FlowExecution execution, String attributeName, Object attributeValue) {
- execution.getActiveSession().getScope().put(attributeName, attributeValue);
- }
-
- /**
- * Retrieve the web application context to delegate bean name resolution to. Default implementation delegates to
- * FacesContextUtils.
- * @param facesContext the current JSF context
- * @return the Spring web application context (never null)
- * @see FacesContextUtils#getRequiredWebApplicationContext
- */
- protected WebApplicationContext getWebApplicationContext(FacesContext facesContext) {
- return FacesContextUtils.getRequiredWebApplicationContext(facesContext);
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowVariableResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowVariableResolver.java
deleted file mode 100644
index 95335f79..00000000
--- a/spring-faces/src/main/java/org/springframework/faces/webflow/el/FlowVariableResolver.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow.el;
-
-import javax.faces.context.FacesContext;
-import javax.faces.el.EvaluationException;
-import javax.faces.el.VariableResolver;
-
-import org.springframework.faces.webflow.FlowExecutionHolderUtils;
-
-/**
- * Custom variable resolver that resolves the current FlowExecution object for binding expressions prefixed with
- * {@link #FLOW_SCOPE_VARIABLE}. For instance "flowScope.myBean.myProperty". Designed to be used in conjunction with
- * {@link FlowPropertyResolver} only.
- *
- * This class is the original flow execution variable resolver implementation introduced in Spring Web Flow's JSF
- * support available since 1.0. In general, prefer use of {@link DelegatingFlowVariableResolver} or
- * {@link FlowExecutionVariableResolver} to this implementation as they are both considerably more flexible.
- *
- * This resolver should only be used with the {@link FlowPropertyResolver} which can only resolve flow-scoped variables.
- * May be deprecated in a future release of Spring Web Flow.
- *
- * @author Colin Sampaleanu
- */
-public class FlowVariableResolver extends VariableResolver {
-
- /**
- * Name of the exposed flow scope variable ("flowScope").
- */
- public static final String FLOW_SCOPE_VARIABLE = "flowScope";
-
- /**
- * The standard variable resolver to delegate to if this one doesn't apply.
- */
- private VariableResolver resolverDelegate;
-
- /**
- * Create a new FlowVariableResolver, using the given original VariableResolver.
- *
- * A JSF implementation will automatically pass its original resolver into the constructor of a configured resolver,
- * provided that there is a corresponding constructor argument.
- *
- * @param resolverDelegate the original VariableResolver
- */
- public FlowVariableResolver(VariableResolver resolverDelegate) {
- this.resolverDelegate = resolverDelegate;
- }
-
- /**
- * Return the original VariableResolver that this resolver delegates to.
- */
- protected final VariableResolver getResolverDelegate() {
- return resolverDelegate;
- }
-
- public Object resolveVariable(FacesContext context, String name) throws EvaluationException {
- if (FLOW_SCOPE_VARIABLE.equals(name)) {
- return FlowExecutionHolderUtils.getRequiredCurrentFlowExecution(context);
- } else {
- return resolverDelegate.resolveVariable(context, name);
- }
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/main/java/org/springframework/webflow/engine/builder/xml/JsfViewFactoryCreator.java b/spring-faces/src/main/java/org/springframework/webflow/engine/builder/xml/JsfViewFactoryCreator.java
new file mode 100644
index 00000000..4d7fbc9e
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/webflow/engine/builder/xml/JsfViewFactoryCreator.java
@@ -0,0 +1,32 @@
+package org.springframework.webflow.engine.builder.xml;
+
+import javax.faces.FactoryFinder;
+import javax.faces.lifecycle.LifecycleFactory;
+
+import org.springframework.binding.expression.Expression;
+import org.springframework.faces.webflow.FlowLifecycleFactory;
+import org.springframework.faces.webflow.JsfRenderFinalResponseAction;
+import org.springframework.faces.webflow.JsfViewFactory;
+import org.springframework.webflow.engine.builder.ViewFactoryCreator;
+import org.springframework.webflow.execution.Action;
+import org.springframework.webflow.execution.ViewFactory;
+
+/**
+ * A ViewFactoryCreator implementation for creating JSF ViewFactories
+ * @author Jeremy Grellex
+ *
+ */
+public class JsfViewFactoryCreator implements ViewFactoryCreator {
+
+ public Action createFinalResponseAction(Expression viewName) {
+ return new JsfRenderFinalResponseAction(new JsfViewFactory(((LifecycleFactory) FactoryFinder
+ .getFactory(FactoryFinder.LIFECYCLE_FACTORY)).getLifecycle(FlowLifecycleFactory.FLOW_LIFECYCLE_ID),
+ viewName));
+ }
+
+ public ViewFactory createViewFactory(Expression viewName) {
+ return new JsfViewFactory(((LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY))
+ .getLifecycle(FlowLifecycleFactory.FLOW_LIFECYCLE_ID), viewName);
+ }
+
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/ui/resource/FlowResourceHelperTests.java b/spring-faces/src/test/java/org/springframework/faces/ui/resource/FlowResourceHelperTests.java
new file mode 100644
index 00000000..5633fe2b
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/faces/ui/resource/FlowResourceHelperTests.java
@@ -0,0 +1,92 @@
+package org.springframework.faces.ui.resource;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import java.io.IOException;
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+import org.apache.shale.test.mock.MockResponseWriter;
+import org.easymock.EasyMock;
+import org.springframework.faces.webflow.JSFMockHelper;
+import org.springframework.webflow.context.ExternalContext;
+import org.springframework.webflow.context.FlowDefinitionRequestInfo;
+import org.springframework.webflow.context.RequestPath;
+import org.springframework.webflow.execution.RequestContext;
+import org.springframework.webflow.execution.RequestContextHolder;
+
+public class FlowResourceHelperTests extends TestCase {
+
+ RequestContext requestContext = createMock(RequestContext.class);
+ ExternalContext externalContext = createMock(ExternalContext.class);
+ FlowResourceHelper resourceHelper = new FlowResourceHelper();
+
+ StringWriter writer = new StringWriter();
+
+ JSFMockHelper jsf = new JSFMockHelper();
+
+ protected void setUp() throws Exception {
+ jsf.setUp();
+ jsf.facesContext().setResponseWriter(new MockResponseWriter(writer, "text/html", "UTF-8"));
+ expect(requestContext.getExternalContext()).andStubReturn(externalContext);
+ RequestContextHolder.setRequestContext(requestContext);
+ }
+
+ protected void tearDown() throws Exception {
+ jsf.tearDown();
+ }
+
+ public final void testRenderScriptLink() throws IOException {
+
+ String scriptPath = "/dojo/dojo.js";
+ String expectedUrl = "/context/spring/resources/dojo/dojo.js";
+
+ FlowDefinitionRequestInfo expectedRequest = new FlowDefinitionRequestInfo("resources", new RequestPath(
+ scriptPath), null, null);
+
+ expect(externalContext.buildFlowDefinitionUrl(requestInfoMatches(expectedRequest))).andReturn(expectedUrl);
+
+ replay(new Object[] { requestContext, externalContext });
+
+ resourceHelper.renderScriptLink(jsf.facesContext(), scriptPath);
+ resourceHelper.renderScriptLink(jsf.facesContext(), scriptPath);
+
+ verify(new Object[] { externalContext });
+
+ String expectedOutput = "";
+
+ assertEquals(expectedOutput, writer.toString());
+
+ }
+
+ public final void testRenderStyleLink() throws IOException {
+
+ String scriptPath = "/dijit/themes/dijit.css";
+ String expectedUrl = "/context/spring/resources/dijit/themes/dijit.css";
+
+ FlowDefinitionRequestInfo expectedRequest = new FlowDefinitionRequestInfo("resources", new RequestPath(
+ scriptPath), null, null);
+
+ expect(externalContext.buildFlowDefinitionUrl(requestInfoMatches(expectedRequest))).andReturn(expectedUrl);
+
+ replay(new Object[] { requestContext, externalContext });
+
+ resourceHelper.renderStyleLink(jsf.facesContext(), scriptPath);
+ resourceHelper.renderStyleLink(jsf.facesContext(), scriptPath);
+
+ verify(new Object[] { externalContext });
+
+ String expectedOutput = "";
+
+ assertEquals(expectedOutput, writer.toString());
+ }
+
+ static FlowDefinitionRequestInfo requestInfoMatches(FlowDefinitionRequestInfo info) {
+ EasyMock.reportMatcher(new RequestInfoMatcher(info));
+ return null;
+ }
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/ui/resource/RequestInfoMatcher.java b/spring-faces/src/test/java/org/springframework/faces/ui/resource/RequestInfoMatcher.java
new file mode 100644
index 00000000..24a4935a
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/faces/ui/resource/RequestInfoMatcher.java
@@ -0,0 +1,23 @@
+package org.springframework.faces.ui.resource;
+
+import org.easymock.IArgumentMatcher;
+import org.springframework.webflow.context.FlowDefinitionRequestInfo;
+
+class RequestInfoMatcher implements IArgumentMatcher {
+
+ private FlowDefinitionRequestInfo expected;
+
+ public RequestInfoMatcher(FlowDefinitionRequestInfo expected) {
+ this.expected = expected;
+ }
+
+ public void appendTo(StringBuffer buffer) {
+ buffer.append("/" + expected.getFlowDefinitionId() + expected.getRequestPath());
+ }
+
+ public boolean matches(Object actual) {
+ FlowDefinitionRequestInfo actualRequest = (FlowDefinitionRequestInfo) actual;
+ return expected.getFlowDefinitionId().equals(actualRequest.getFlowDefinitionId())
+ && expected.getRequestPath().equals(actualRequest.getRequestPath());
+ }
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceActionTests.java b/spring-faces/src/test/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceActionTests.java
new file mode 100644
index 00000000..ddb0814c
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceActionTests.java
@@ -0,0 +1,61 @@
+package org.springframework.faces.ui.resource;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import javax.servlet.ServletContext;
+
+import junit.framework.TestCase;
+
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.mock.web.MockServletContext;
+import org.springframework.webflow.context.ExternalContext;
+import org.springframework.webflow.context.RequestPath;
+import org.springframework.webflow.execution.RequestContext;
+
+public class ResolveAndRenderResourceActionTests extends TestCase {
+
+ ExternalContext externalContext = createMock(ExternalContext.class);
+ RequestContext requestContext = createMock(RequestContext.class);
+ ServletContext servletContext = new MimeAwareMockServletContext();
+ MockHttpServletResponse response = new MockHttpServletResponse();
+ MockHttpServletRequest request = new MockHttpServletRequest();
+
+ RequestPath requestPath;
+ String[] requestElements;
+
+ ResolveAndRenderResourceAction action;
+
+ protected void setUp() throws Exception {
+ action = new ResolveAndRenderResourceAction();
+
+ expect(requestContext.getExternalContext()).andStubReturn(externalContext);
+ expect(externalContext.getContext()).andStubReturn(servletContext);
+ expect(externalContext.getResponse()).andStubReturn(response);
+ expect(externalContext.getRequest()).andStubReturn(request);
+ expect(externalContext.getResponseWriter()).andStubReturn(new PrintWriter(new StringWriter()));
+ }
+
+ public final void testExecute() throws Exception {
+
+ requestPath = new RequestPath("/ext/ext.js");
+
+ expect(externalContext.getRequestPath()).andStubReturn(requestPath);
+
+ replay(new Object[] { requestContext, externalContext });
+
+ action.execute(requestContext);
+ }
+
+ private class MimeAwareMockServletContext extends MockServletContext {
+
+ public String getMimeType(String filePath) {
+ return null;
+ }
+ }
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/FlowActionListenerTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/FlowActionListenerTests.java
new file mode 100644
index 00000000..be142898
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/FlowActionListenerTests.java
@@ -0,0 +1,73 @@
+package org.springframework.faces.webflow;
+
+import javax.faces.component.UICommand;
+import javax.faces.context.FacesContext;
+import javax.faces.el.EvaluationException;
+import javax.faces.el.MethodBinding;
+import javax.faces.el.MethodNotFoundException;
+import javax.faces.event.ActionEvent;
+
+import junit.framework.TestCase;
+
+public class FlowActionListenerTests extends TestCase {
+
+ FlowActionListener listener = new FlowActionListener();
+
+ JSFMockHelper jsfMock = new JSFMockHelper();
+
+ protected void setUp() throws Exception {
+ jsfMock.setUp();
+ }
+
+ protected void tearDown() throws Exception {
+ jsfMock.tearDown();
+ }
+
+ public final void testProcessAction() {
+
+ String outcome = "foo";
+ MethodBinding binding = new MethodBindingStub(outcome);
+ UICommand commandButton = new UICommand();
+ commandButton.setAction(binding);
+ ActionEvent event = new ActionEvent(commandButton);
+
+ listener.processAction(event);
+
+ assertTrue("The event was not signaled", jsfMock.externalContext().getRequestMap().containsKey(
+ JsfView.EVENT_KEY));
+ assertEquals("The event should be " + outcome, outcome, jsfMock.externalContext().getRequestMap().get(
+ JsfView.EVENT_KEY));
+ }
+
+ public final void testProcessAction_NullOutcome() {
+
+ String outcome = null;
+ MethodBinding binding = new MethodBindingStub(outcome);
+ UICommand commandButton = new UICommand();
+ commandButton.setAction(binding);
+ ActionEvent event = new ActionEvent(commandButton);
+
+ listener.processAction(event);
+
+ assertFalse("An unexpected event was signaled", jsfMock.externalContext().getRequestMap().containsKey(
+ JsfView.EVENT_KEY));
+ }
+
+ private class MethodBindingStub extends MethodBinding {
+
+ String result;
+
+ public MethodBindingStub(String result) {
+ this.result = result;
+ }
+
+ public Class getType(FacesContext context) throws MethodNotFoundException {
+ return String.class;
+ }
+
+ public Object invoke(FacesContext context, Object[] args) throws EvaluationException, MethodNotFoundException {
+ return this.result;
+ }
+
+ }
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/FlowFacesContextTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/FlowFacesContextTests.java
new file mode 100644
index 00000000..b0dc6fc6
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/FlowFacesContextTests.java
@@ -0,0 +1,158 @@
+package org.springframework.faces.webflow;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+import java.util.Iterator;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.context.FacesContext;
+
+import junit.framework.TestCase;
+
+import org.springframework.binding.message.Message;
+import org.springframework.binding.message.MessageContext;
+import org.springframework.binding.message.MessageResolver;
+import org.springframework.binding.message.Severity;
+import org.springframework.webflow.execution.RequestContext;
+import org.springframework.webflow.execution.RequestContextHolder;
+
+public class FlowFacesContextTests extends TestCase {
+
+ JSFMockHelper jsf = new JSFMockHelper();
+
+ FacesContext facesContext;
+
+ RequestContext requestContext = createMock(RequestContext.class);
+
+ MessageContext messageContext;
+
+ protected void setUp() throws Exception {
+ jsf.setUp();
+ facesContext = new FlowFacesContext(jsf.facesContext());
+ RequestContextHolder.setRequestContext(requestContext);
+ }
+
+ protected void tearDown() throws Exception {
+ jsf.tearDown();
+ }
+
+ public final void testCurrentInstance() {
+ assertSame(FacesContext.getCurrentInstance(), facesContext);
+ }
+
+ public final void testAddMessage() {
+ messageContext = new TestAddMessageContext();
+ expect(requestContext.getMessageContext()).andStubReturn(messageContext);
+ replay(new Object[] { requestContext });
+
+ facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "foo", "foo"));
+
+ assertEquals("Message count is incorrect", 1, ((TestAddMessageContext) messageContext).messageCount);
+ }
+
+ public final void testGetMessages() {
+ messageContext = new TestGetMessagesContext();
+ expect(requestContext.getMessageContext()).andStubReturn(messageContext);
+ replay(new Object[] { requestContext });
+
+ int iterationCount = 0;
+ Iterator i = facesContext.getMessages();
+ while (i.hasNext()) {
+ assertNotNull(i.next());
+ iterationCount++;
+ }
+ assertEquals(3, iterationCount);
+ }
+
+ public final void testGetMessagesByClientId() {
+ messageContext = new TestGetMessagesContext();
+ expect(requestContext.getMessageContext()).andStubReturn(messageContext);
+ replay(new Object[] { requestContext });
+
+ int iterationCount = 0;
+ Iterator i = facesContext.getMessages("componentId");
+ while (i.hasNext()) {
+ assertNotNull(i.next());
+ iterationCount++;
+ }
+ assertEquals(1, iterationCount);
+ }
+
+ public final void testGetClientIdsWithMessages() {
+ messageContext = new TestGetMessagesContext();
+ expect(requestContext.getMessageContext()).andStubReturn(messageContext);
+ replay(new Object[] { requestContext });
+
+ int iterationCount = 0;
+ Iterator i = facesContext.getClientIdsWithMessages();
+ while (i.hasNext()) {
+ String id = i.next();
+ assertEquals("componentId", id);
+ iterationCount++;
+ }
+ assertEquals(1, iterationCount);
+ }
+
+ public final void testGetMaximumSeverity() {
+ messageContext = new TestGetMessagesContext();
+ expect(requestContext.getMessageContext()).andStubReturn(messageContext);
+ replay(new Object[] { requestContext });
+
+ assertEquals(FacesMessage.SEVERITY_ERROR, facesContext.getMaximumSeverity());
+ }
+
+ private class TestAddMessageContext implements MessageContext {
+ int messageCount = 0;
+
+ public void addMessage(MessageResolver messageResolver) {
+ messageCount++;
+ }
+
+ public Message[] getMessages() {
+ return null;
+ }
+
+ public Message[] getMessages(Object source) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ public void clearMessages() {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+ }
+
+ private class TestGetMessagesContext implements MessageContext {
+
+ Message[] messages;
+
+ TestGetMessagesContext() {
+ messages = new Message[3];
+ messages[0] = new Message(null, "foo", Severity.INFO);
+ messages[1] = new Message("componentId", "bar", Severity.WARNING);
+ messages[2] = new Message(null, "baz", Severity.ERROR);
+ }
+
+ public void addMessage(MessageResolver messageResolver) {
+
+ }
+
+ public Message[] getMessages() {
+ return messages;
+ }
+
+ public Message[] getMessages(Object source) {
+ return new Message[] { messages[1] };
+ }
+
+ public void clearMessages() {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ }
+
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/FlowNavigationHandlerArgumentExtractorTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/FlowNavigationHandlerArgumentExtractorTests.java
deleted file mode 100644
index ac7b42f1..00000000
--- a/spring-faces/src/test/java/org/springframework/faces/webflow/FlowNavigationHandlerArgumentExtractorTests.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import junit.framework.TestCase;
-
-import org.springframework.faces.webflow.FlowNavigationHandlerArgumentExtractor;
-import org.springframework.faces.webflow.JsfExternalContext;
-import org.springframework.webflow.executor.support.FlowExecutorArgumentExtractionException;
-
-public class FlowNavigationHandlerArgumentExtractorTests extends TestCase {
-
- private FlowNavigationHandlerArgumentExtractor extractor;
-
- private MockFacesContext facesContext;
-
- protected void setUp() throws Exception {
- extractor = new FlowNavigationHandlerArgumentExtractor();
- facesContext = new MockFacesContext();
- facesContext.setExternalContext(new MockJsfExternalContext());
- }
-
- public void testExtractFlowId() {
- JsfExternalContext context = new JsfExternalContext(facesContext);
- context.handleNavigationCalled("action", "flowId:foo");
- String flowId = extractor.extractFlowId(context);
- assertEquals("Wrong flow id", "foo", flowId);
- }
-
- public void testExtractFlowIdWrongFormat() {
- JsfExternalContext context = new JsfExternalContext(facesContext);
- context.handleNavigationCalled("action", "bogus:foo");
- try {
- extractor.extractFlowId(context);
- fail();
- } catch (FlowExecutorArgumentExtractionException e) {
- // expected
- }
- }
-
- public void testExtractEventId() {
- JsfExternalContext context = new JsfExternalContext(facesContext);
- context.handleNavigationCalled("action", "submit");
- String eventId = extractor.extractEventId(context);
- assertEquals("Wrong event id", "submit", eventId);
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/FlowPropertyResolverTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/FlowPropertyResolverTests.java
deleted file mode 100644
index 49ba20c6..00000000
--- a/spring-faces/src/test/java/org/springframework/faces/webflow/FlowPropertyResolverTests.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import javax.faces.el.EvaluationException;
-import javax.faces.el.PropertyNotFoundException;
-import javax.faces.el.PropertyResolver;
-import javax.faces.el.ReferenceSyntaxException;
-
-import junit.framework.TestCase;
-
-import org.easymock.EasyMock;
-import org.springframework.faces.webflow.el.FlowPropertyResolver;
-import org.springframework.webflow.execution.FlowExecution;
-import org.springframework.webflow.test.MockFlowSession;
-
-/**
- * @author Colin Sampaleanu
- * @since 1.0
- */
-public class FlowPropertyResolverTests extends TestCase {
-
- private FlowPropertyResolver resolver;
-
- private FlowExecution flowEx;
-
- protected void setUp() throws Exception {
- resolver = new FlowPropertyResolver(new OriginalPropertyResolver());
- flowEx = (FlowExecution) EasyMock.createMock(FlowExecution.class);
- }
-
- protected void tearDown() throws Exception {
- resolver = null;
- }
-
- public void testGetTypeBaseIndex() {
- Class type = resolver.getType(flowEx, 22);
- assertNull("can't get property from flow via index", type);
- }
-
- public void testGetTypeBaseProperty() {
- MockFlowSession flowSession = new MockFlowSession();
- flowSession.getScope().put("name", "joe");
- flowEx.getActiveSession();
- EasyMock.expectLastCall().andReturn(flowSession);
- EasyMock.replay(new Object[] { flowEx });
- Class type = resolver.getType(flowEx, "name");
- assertTrue("returned type must match property type", type.equals(String.class));
- }
-
- public void testGetValueBaseIndex() {
- try {
- resolver.getValue(flowEx, 2);
- fail("not legal to get flow property by index");
- } catch (ReferenceSyntaxException e) {
- // expected
- }
- }
-
- public void testGetValueBaseProperty() {
- MockFlowSession flowSession = new MockFlowSession();
- flowSession.getScope().put("name", "joe");
- flowEx.getActiveSession();
- EasyMock.expectLastCall().andReturn(flowSession);
- EasyMock.replay(new Object[] { flowEx });
- Object value = resolver.getValue(flowEx, "name");
- assertTrue("must return expected property", value.equals("joe"));
- }
-
- public void testSetValueBaseIndex() {
- try {
- resolver.setValue(flowEx, 2, "whatever");
- fail("not legal to set flow property by index");
- } catch (ReferenceSyntaxException e) {
- // expected
- }
- }
-
- public void testSetValueBaseProperty() {
- MockFlowSession flowSession = new MockFlowSession();
- flowEx.getActiveSession();
- EasyMock.expectLastCall().andReturn(flowSession);
- EasyMock.replay(new Object[] { flowEx });
- resolver.setValue(flowEx, "name", "joe");
- assertTrue(flowSession.getScope().get("name").equals("joe"));
- }
-
- private static class OriginalPropertyResolver extends PropertyResolver {
-
- public Class getType(Object base, int index) throws EvaluationException, PropertyNotFoundException {
- return Object.class;
- }
-
- public Class getType(Object base, Object property) throws EvaluationException, PropertyNotFoundException {
- return Object.class;
- }
-
- public Object getValue(Object base, int index) throws EvaluationException, PropertyNotFoundException {
- return new String("Some value");
- }
-
- public Object getValue(Object base, Object property) throws EvaluationException, PropertyNotFoundException {
- return new String("Some value");
- }
-
- public boolean isReadOnly(Object base, int index) throws EvaluationException, PropertyNotFoundException {
- return false;
- }
-
- public boolean isReadOnly(Object base, Object property) throws EvaluationException, PropertyNotFoundException {
- return false;
- }
-
- public void setValue(Object base, int index, Object value) throws EvaluationException,
- PropertyNotFoundException {
- }
-
- public void setValue(Object base, Object property, Object value) throws EvaluationException,
- PropertyNotFoundException {
- }
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/FlowSystemCleanupFilterTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/FlowSystemCleanupFilterTests.java
deleted file mode 100644
index d9fbdee7..00000000
--- a/spring-faces/src/test/java/org/springframework/faces/webflow/FlowSystemCleanupFilterTests.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import java.io.IOException;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-import junit.framework.TestCase;
-
-import org.springframework.faces.webflow.FlowExecutionHolder;
-import org.springframework.faces.webflow.FlowSystemCleanupFilter;
-import org.springframework.mock.web.MockFilterChain;
-import org.springframework.mock.web.MockHttpServletRequest;
-import org.springframework.mock.web.MockHttpServletResponse;
-import org.springframework.webflow.context.ExternalContextHolder;
-import org.springframework.webflow.engine.impl.FlowExecutionImpl;
-import org.springframework.webflow.execution.FlowExecutionContextHolder;
-import org.springframework.webflow.test.MockExternalContext;
-
-public class FlowSystemCleanupFilterTests extends TestCase {
-
- private FlowSystemCleanupFilter filter;
-
- private ServletRequest request;
-
- private ServletResponse response;
-
- private FilterChain chain;
-
- protected void setUp() throws Exception {
- filter = new FlowSystemCleanupFilter();
- request = new MockHttpServletRequest();
- request.setAttribute(getFlowExecutionHolderKey(), new FlowExecutionHolder(new FlowExecutionImpl()));
- response = new MockHttpServletResponse();
- chain = new MockFilterChain();
- FlowExecutionContextHolder.setFlowExecutionContext(new FlowExecutionImpl());
- ExternalContextHolder.setExternalContext(new MockExternalContext());
- }
-
- public void testCleanup() throws ServletException, IOException {
- filter.doFilter(request, response, chain);
-
- assertNull("Should have cleaned up the flow execution", request.getAttribute(getFlowExecutionHolderKey()));
- try {
- FlowExecutionContextHolder.getFlowExecutionContext();
- fail("Should have an empty holder");
- } catch (IllegalStateException e) {
- }
- try {
- ExternalContextHolder.getExternalContext();
- fail("Should have an empty holder");
- } catch (IllegalStateException e) {
- }
- }
-
- public void testExceptionThrown() throws ServletException, IOException {
- try {
- filter.doFilter(request, response, new ExceptionThrowingMockFilterChain());
- } catch (RuntimeException e) {
- assertNull("Should have cleaned up the flow execution", request.getAttribute(getFlowExecutionHolderKey()));
- try {
- FlowExecutionContextHolder.getFlowExecutionContext();
- fail("Should have an empty holder");
- } catch (IllegalStateException e1) {
- }
- try {
- ExternalContextHolder.getExternalContext();
- fail("Should have an empty holder");
- } catch (IllegalStateException e1) {
- }
- }
- }
-
- private static String getFlowExecutionHolderKey() {
- return FlowExecutionHolder.class.getName();
- }
-
- private class ExceptionThrowingMockFilterChain extends MockFilterChain {
-
- public void doFilter(ServletRequest request, ServletResponse response) {
- throw new RuntimeException();
- }
-
- }
-}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/FlowVariableResolverTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/FlowVariableResolverTests.java
deleted file mode 100644
index 35978c1c..00000000
--- a/spring-faces/src/test/java/org/springframework/faces/webflow/FlowVariableResolverTests.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.faces.webflow;
-
-import javax.faces.context.FacesContext;
-import javax.faces.el.EvaluationException;
-import javax.faces.el.VariableResolver;
-
-import junit.framework.TestCase;
-
-import org.easymock.EasyMock;
-import org.springframework.faces.webflow.FlowExecutionHolder;
-import org.springframework.faces.webflow.FlowExecutionHolderUtils;
-import org.springframework.faces.webflow.el.FlowVariableResolver;
-import org.springframework.webflow.execution.FlowExecution;
-import org.springframework.webflow.execution.repository.FlowExecutionKey;
-
-/**
- * Unit tests for the FlowVariableResolver class.
- *
- * @author Ulrik Sandberg
- */
-public class FlowVariableResolverTests extends TestCase {
-
- private FlowVariableResolver tested;
-
- private TestableVariableResolver variableResolver;
-
- private MockFacesContext mockFacesContext;
-
- private MockJsfExternalContext mockJsfExternalContext;
-
- protected void setUp() throws Exception {
- super.setUp();
- mockFacesContext = new MockFacesContext();
- mockJsfExternalContext = new MockJsfExternalContext();
- mockFacesContext.setExternalContext(mockJsfExternalContext);
- variableResolver = new TestableVariableResolver();
- tested = new FlowVariableResolver(variableResolver);
- }
-
- public void testResolveVariableNotFlowScope() {
- Object result = tested.resolveVariable(mockFacesContext, "some name");
- assertTrue("not resolved using delegate", variableResolver.resolvedUsingDelegate);
- assertSame(variableResolver.expected, result);
- }
-
- public void testResolveVariableFlowScopeWithNoThreadLocal() {
- try {
- tested.resolveVariable(mockFacesContext, "flowScope");
- fail("EvaluationException expected");
- } catch (EvaluationException expected) {
-
- }
- assertFalse("resolved using delegate", variableResolver.resolvedUsingDelegate);
- }
-
- public void testResolveVariableFlowScopeWithThreadLocal() {
- FlowExecution flowExecutionMock = (FlowExecution) EasyMock.createMock(FlowExecution.class);
- FlowExecutionKey key = null;
- FlowExecutionHolder holder = new FlowExecutionHolder(key, flowExecutionMock, null);
- FlowExecutionHolderUtils.setFlowExecutionHolder(holder, mockFacesContext);
- EasyMock.replay(new Object[] { flowExecutionMock });
-
- Object result = tested.resolveVariable(mockFacesContext, "flowScope");
-
- EasyMock.verify(new Object[] { flowExecutionMock });
- assertFalse("resolved using delegate", variableResolver.resolvedUsingDelegate);
- assertSame(flowExecutionMock, result);
- }
-
- private static class TestableVariableResolver extends VariableResolver {
- private boolean resolvedUsingDelegate;
-
- private Object expected = new Object();
-
- public Object resolveVariable(FacesContext arg0, String arg1) throws EvaluationException {
- resolvedUsingDelegate = true;
- return expected;
- }
- }
-}
\ No newline at end of file
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JSF11ManagedBeanAccessTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JSF11ManagedBeanAccessTests.java
deleted file mode 100644
index 6ca7f091..00000000
--- a/spring-faces/src/test/java/org/springframework/faces/webflow/JSF11ManagedBeanAccessTests.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package org.springframework.faces.webflow;
-
-import java.io.FileNotFoundException;
-
-import javax.faces.el.ValueBinding;
-
-import org.easymock.EasyMock;
-import org.jboss.el.ExpressionFactoryImpl;
-import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
-import org.springframework.core.io.ClassPathResource;
-import org.springframework.faces.el.Jsf11ELExpressionParser;
-import org.springframework.faces.webflow.el.DelegatingFlowVariableResolver;
-import org.springframework.faces.webflow.el.FlowPropertyResolver;
-import org.springframework.faces.webflow.el.FlowVariableResolver;
-import org.springframework.util.ResourceUtils;
-import org.springframework.web.context.support.GenericWebApplicationContext;
-import org.springframework.web.jsf.DelegatingVariableResolver;
-import org.springframework.webflow.definition.registry.FlowDefinitionResource;
-import org.springframework.webflow.execution.FlowExecutionException;
-import org.springframework.webflow.execution.ViewSelection;
-import org.springframework.webflow.test.MockFlowServiceLocator;
-import org.springframework.webflow.test.execution.AbstractXmlFlowExecutionTests;
-
-public class JSF11ManagedBeanAccessTests extends AbstractXmlFlowExecutionTests {
-
- JSFMockHelper jsf;
- JSFManagedBean jsfBean;
- JSFModel jsfModel;
- FlowPhaseListener flowPhaseListener;
- FlowNavigationHandler flowNavigationHandler;
- MockService service;
- GenericWebApplicationContext ctx;
-
- protected void setUp() throws Exception {
- super.setUp();
- service = (MockService) EasyMock.createMock(MockService.class);
- jsf = new JSFMockHelper();
- jsf.setUp();
- configureJSFForSWF();
- }
-
- private void configureJSFForSWF() {
- DelegatingVariableResolver dvr = new DelegatingVariableResolver(jsf.application().getVariableResolver());
- DelegatingFlowVariableResolver dfvr = new DelegatingFlowVariableResolver(dvr);
- FlowVariableResolver fvr = new FlowVariableResolver(dfvr);
- jsf.application().setVariableResolver(fvr);
- FlowPropertyResolver fpr = new FlowPropertyResolver(jsf.application().getPropertyResolver());
- jsf.application().setPropertyResolver(fpr);
-
- flowNavigationHandler = new FlowNavigationHandler(jsf.application().getNavigationHandler());
- jsf.application().setNavigationHandler(flowNavigationHandler);
-
- jsf.externalContext().getRequestMap().put("JsfBean", new JSFManagedBean());
- }
-
- protected void tearDown() throws Exception {
- super.tearDown();
- jsf.tearDown();
- }
-
- public void testManagedBeanExpression() {
- ValueBinding vb = jsf.application().createValueBinding("#{JsfBean}");
- jsfBean = (JSFManagedBean) vb.getValue(jsf.facesContext());
- assertNotNull(jsfBean);
- }
-
- public void testSWFExplicitlyScopedPropertyInjection() {
- testManagedBeanExpression();
- startFlow();
-
- ValueBinding propBinding = jsf.application().createValueBinding("#{flowScope.jsfModel}");
- jsfModel = (JSFModel) propBinding.getValue(jsf.facesContext());
- assertNotNull(jsfModel);
- }
-
- public void testManagedBeanPropertyAsArgument() {
- testManagedBeanExpression();
- jsfBean.setProp1("arg");
- service.doSomething(jsfBean.getProp1());
- EasyMock.replay(new Object[] { service });
-
- startFlow();
- signalEvent("event1");
- EasyMock.verify(new Object[] { service });
- assertCurrentStateEquals("viewState2");
- }
-
- public void testEvalManagedBeanMethod() {
- testManagedBeanExpression();
- startFlow();
-
- ValueBinding propBinding = jsf.application().createValueBinding("#{flowScope.jsfModel}");
- jsfModel = (JSFModel) propBinding.getValue(jsf.facesContext());
- assertNotNull(jsfModel);
- jsfModel.setValue("foo");
-
- signalEvent("event2");
- assertFalse(jsfBean.getValues().isEmpty());
- String addedValue = jsfBean.getValues().get(0).toString();
- assertEquals(jsfModel.getValue(), addedValue);
- assertCurrentStateEquals("viewState2");
- }
-
- public void testSWFScopedPropertyInjection() {
- startFlow();
-
- ValueBinding propBinding = jsf.application().createValueBinding("#{flowScopedModel}");
- jsfModel = (JSFModel) propBinding.getValue(jsf.facesContext());
- assertNotNull("This test won't pass until custom scopes are implemented.", jsfModel);
- }
-
- protected ViewSelection startFlow() throws FlowExecutionException {
- ViewSelection view = super.startFlow();
- FlowExecutionHolder holder = new FlowExecutionHolder(getFlowExecution());
- FlowExecutionHolderUtils.setFlowExecutionHolder(holder, jsf.facesContext());
- holder.setViewSelection(view);
- return view;
- }
-
- protected FlowDefinitionResource getFlowDefinitionResource() {
- try {
- return createFlowDefinitionResource(ResourceUtils.getFile(
- "classpath:org/springframework/faces/webflow/jsf-flow.xml").getPath());
- } catch (FileNotFoundException e) {
- fail(e.getMessage());
- return null;
- }
- }
-
- protected void registerMockServices(MockFlowServiceLocator serviceRegistry) {
- serviceRegistry.setExpressionParser(new Jsf11ELExpressionParser(new ExpressionFactoryImpl()));
- serviceRegistry.registerBean("serviceBean", service);
-
- ctx = new GenericWebApplicationContext();
- XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
- xmlReader.loadBeanDefinitions(new ClassPathResource("org/springframework/faces/webflow/jsf-flow-beans.xml"));
- ctx.refresh();
-
- jsf.externalContext().getApplicationMap().put(
- GenericWebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ctx);
- }
-}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JSF12ManagedBeanAccessTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JSF12ManagedBeanAccessTests.java
deleted file mode 100644
index dbb90dec..00000000
--- a/spring-faces/src/test/java/org/springframework/faces/webflow/JSF12ManagedBeanAccessTests.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.springframework.faces.webflow;
-
-import org.jboss.el.ExpressionFactoryImpl;
-import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
-import org.springframework.core.io.ClassPathResource;
-import org.springframework.faces.el.Jsf12ELExpressionParser;
-import org.springframework.web.context.support.GenericWebApplicationContext;
-import org.springframework.webflow.test.MockFlowServiceLocator;
-
-public class JSF12ManagedBeanAccessTests extends JSF11ManagedBeanAccessTests {
-
- protected void registerMockServices(MockFlowServiceLocator serviceRegistry) {
- serviceRegistry.setExpressionParser(new Jsf12ELExpressionParser(new ExpressionFactoryImpl()));
- serviceRegistry.registerBean("serviceBean", service);
-
- ctx = new GenericWebApplicationContext();
- XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
- xmlReader.loadBeanDefinitions(new ClassPathResource("org/springframework/faces/webflow/jsf-flow-beans.xml"));
- ctx.refresh();
-
- jsf.externalContext().getApplicationMap().put(
- GenericWebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ctx);
- }
-
-}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JSFFlowExecutionTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JSFFlowExecutionTests.java
new file mode 100644
index 00000000..9069d801
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JSFFlowExecutionTests.java
@@ -0,0 +1,302 @@
+package org.springframework.faces.webflow;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.el.CompositeELResolver;
+import javax.faces.FacesException;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.FacesContext;
+import javax.faces.el.ValueBinding;
+import javax.faces.event.PhaseEvent;
+import javax.faces.event.PhaseId;
+import javax.faces.event.PhaseListener;
+import javax.faces.lifecycle.Lifecycle;
+
+import junit.framework.TestCase;
+
+import org.easymock.EasyMock;
+import org.jboss.el.ExpressionFactoryImpl;
+import org.springframework.binding.expression.ExpressionParser;
+import org.springframework.binding.method.MethodSignature;
+import org.springframework.binding.method.Parameter;
+import org.springframework.web.context.support.GenericWebApplicationContext;
+import org.springframework.webflow.action.AbstractBeanInvokingAction;
+import org.springframework.webflow.action.EvaluateAction;
+import org.springframework.webflow.action.SetAction;
+import org.springframework.webflow.context.ExternalContext;
+import org.springframework.webflow.context.ExternalContextHolder;
+import org.springframework.webflow.context.servlet.ServletExternalContext;
+import org.springframework.webflow.core.expression.el.RequestContextELResolver;
+import org.springframework.webflow.core.expression.el.ScopeSearchingELResolver;
+import org.springframework.webflow.core.expression.el.WebFlowELExpressionParser;
+import org.springframework.webflow.engine.ActionState;
+import org.springframework.webflow.engine.EndState;
+import org.springframework.webflow.engine.Flow;
+import org.springframework.webflow.engine.TargetStateResolver;
+import org.springframework.webflow.engine.Transition;
+import org.springframework.webflow.engine.TransitionCriteria;
+import org.springframework.webflow.engine.ViewState;
+import org.springframework.webflow.engine.impl.FlowExecutionImplFactory;
+import org.springframework.webflow.engine.support.DefaultTargetStateResolver;
+import org.springframework.webflow.engine.support.EventIdTransitionCriteria;
+import org.springframework.webflow.execution.Action;
+import org.springframework.webflow.execution.Event;
+import org.springframework.webflow.execution.FlowExecution;
+import org.springframework.webflow.execution.FlowExecutionKey;
+import org.springframework.webflow.execution.FlowExecutionKeyFactory;
+import org.springframework.webflow.execution.RequestContext;
+import org.springframework.webflow.execution.ScopeType;
+
+public class JSFFlowExecutionTests extends TestCase {
+
+ JSFMockHelper jsf;
+ JSFManagedBean jsfBean;
+ JSFModel jsfModel;
+ MockViewHandler viewHandler;
+ MockService service;
+ GenericWebApplicationContext ctx;
+ TrackingPhaseListener trackingListener;
+
+ Flow flow;
+ FlowExecution execution;
+
+ ExpressionParser parser = new WebFlowELExpressionParser(new ExpressionFactoryImpl());
+
+ /**
+ * TODO - The management of the JSF mocks has gotten rather convoluted now that we are tearing down and rebuilding
+ * the FacesContext multiple times per request. Consider enhancing JSFMockHelper to manage things more appropriately
+ * for SWF usage.
+ */
+ protected void setUp() throws Exception {
+ service = EasyMock.createMock(MockService.class);
+
+ trackingListener = new TrackingPhaseListener();
+ jsfRequestSetup();
+
+ flow = Flow.create("jsf-flow", null);
+
+ ViewState view1 = new ViewState(flow, "viewState1", new JsfViewFactory(new TestLifecycle(jsf.lifecycle()),
+ parser.parseExpression("view1", RequestContext.class, String.class, null)));
+ view1.getTransitionSet().add(new Transition(on("event1"), to("doSomething")));
+ view1.getTransitionSet().add(new Transition(on("event2"), to("evalSomething")));
+
+ ActionState doSomething = new ActionState(flow, "doSomething");
+ doSomething.getActionList().add(
+ new StubBeanAction(new MethodSignature("doSomething", new Parameter(String.class, parser
+ .parseExpression("#{JsfBean.prop1}", RequestContext.class, String.class, null)))));
+ doSomething.getTransitionSet().add(new Transition(on("success"), to("viewState2")));
+
+ ActionState evalSomething = new ActionState(flow, "evalSomething");
+ evalSomething.getEntryActionList().add(
+ new SetAction(parser.parseExpression("#{requestContext.flowScope.jsfModel}", RequestContext.class,
+ String.class, null), ScopeType.FLOW, parser.parseExpression("#{'foo'}", RequestContext.class,
+ String.class, null)));
+ evalSomething.getActionList().add(
+ new EvaluateAction(parser.parseExpression("#{JsfBean.addValue(jsfModel)}", RequestContext.class,
+ String.class, null)));
+ evalSomething.getTransitionSet().add(new Transition(on("success"), to("viewState2")));
+
+ ViewState viewState2 = new ViewState(flow, "viewState2", new JsfViewFactory(new TestLifecycle(jsf.lifecycle()),
+ parser.parseExpression("view2", RequestContext.class, String.class, null)));
+ viewState2.getEntryActionList().add(new ViewState2SetupAction());
+ viewState2.getTransitionSet().add(new Transition(on("event1"), to("endState1")));
+
+ new EndState(flow, "endState1");
+
+ FlowExecutionImplFactory factory = new FlowExecutionImplFactory();
+ factory.setExecutionKeyFactory(new SimpleFlowExecutionKeyFactory());
+ execution = factory.createFlowExecution(flow);
+ }
+
+ private void jsfRequestSetup() throws Exception {
+ jsf = new JSFMockHelper();
+ jsf.tearDown();
+ jsf.setUp();
+ FacesContext flowContext = new FlowFacesContext(jsf.facesContext());
+ org.apache.shale.test.mock.MockFacesContext.setCurrentInstance(flowContext);
+
+ viewHandler = new NoRenderViewHandler();
+ jsf.application().setViewHandler(viewHandler);
+ trackingListener.reset();
+ jsf.lifecycle().addPhaseListener(trackingListener);
+
+ CompositeELResolver baseResolver = (CompositeELResolver) jsf.facesContext().getELContext().getELResolver();
+ baseResolver.add(new RequestContextELResolver());
+ baseResolver.add(new ScopeSearchingELResolver());
+
+ jsf.externalContext().getRequestMap().put("JsfBean", new JSFManagedBean());
+ }
+
+ protected void tearDown() throws Exception {
+ jsf.tearDown();
+ }
+
+ public void testManagedBeanExpression() {
+ ValueBinding vb = jsf.application().createValueBinding("#{JsfBean}");
+ jsfBean = (JSFManagedBean) vb.getValue(jsf.facesContext());
+ assertNotNull(jsfBean);
+ }
+
+ /*
+ * public void testBeanAction() throws Exception { startFlow();
+ *
+ * jsfRequestSetup();
+ *
+ * testManagedBeanExpression(); jsfBean.setProp1("arg"); service.doSomething(jsfBean.getProp1());
+ * EasyMock.replay(new Object[] { service });
+ *
+ * jsf.externalContext().getRequestMap().put(JsfView.EVENT_KEY, "event1");
+ *
+ * UIViewRoot existingRoot = new UIViewRoot(); existingRoot.setViewId("view1");
+ * viewHandler.setRestoreView(existingRoot);
+ *
+ * execution.resume(getExternalContext());
+ *
+ * EasyMock.verify(new Object[] { service });
+ *
+ * ViewState currentState = (ViewState) execution.getActiveSession().getState(); assertEquals("viewState2",
+ * currentState.getId()); }
+ *
+ * public void testEvalAction() throws Exception { startFlow();
+ *
+ * jsfRequestSetup();
+ *
+ * testManagedBeanExpression();
+ *
+ * jsf.externalContext().getRequestMap().put(JsfView.EVENT_KEY, "event2");
+ *
+ * UIViewRoot existingRoot = new UIViewRoot(); existingRoot.setViewId("view1");
+ * viewHandler.setRestoreView(existingRoot);
+ *
+ * execution.resume(getExternalContext());
+ *
+ * assertFalse(jsfBean.getValues().isEmpty()); String addedValue = jsfBean.getValues().get(0).toString();
+ * assertEquals(addedValue, "foo");
+ *
+ * ViewState currentState = (ViewState) execution.getActiveSession().getState(); assertEquals("viewState2",
+ * currentState.getId()); }
+ */
+ private static TransitionCriteria on(String event) {
+ return new EventIdTransitionCriteria(event);
+ }
+
+ private static TargetStateResolver to(String stateId) {
+ return new DefaultTargetStateResolver(stateId);
+ }
+
+ private void startFlow() {
+ UIViewRoot view = new UIViewRoot();
+ view.setViewId("view1");
+ viewHandler.setCreateView(view);
+ execution.start(getExternalContext());
+ }
+
+ private ExternalContext getExternalContext() {
+ jsf.request().setPathElements("myApp", "", "/flow", null);
+ ExternalContext ext = new ServletExternalContext(jsf.servletContext(), jsf.request(), jsf.response());
+ ExternalContextHolder.setExternalContext(ext);
+ return ext;
+ }
+
+ private class TestLifecycle extends FlowLifecycle {
+
+ boolean executed = false;
+
+ public TestLifecycle(Lifecycle delegate) {
+ super(delegate);
+ }
+
+ public void execute(FacesContext context) throws FacesException {
+ assertFalse("Lifecycle executed more than once", executed);
+ super.execute(context);
+ executed = true;
+ }
+
+ public void reset() {
+ executed = false;
+ }
+
+ }
+
+ private class StubBeanAction extends AbstractBeanInvokingAction {
+
+ protected StubBeanAction(MethodSignature methodSignature) {
+ super(methodSignature);
+ }
+
+ protected Object getBean(RequestContext context) throws Exception {
+ return service;
+ }
+
+ }
+
+ private static class SimpleFlowExecutionKeyFactory implements FlowExecutionKeyFactory {
+ public FlowExecutionKey getKey(FlowExecution execution) {
+ return new FlowExecutionKey() {
+ public String toString() {
+ return "key";
+ }
+
+ public boolean equals(Object o) {
+ return true;
+ }
+
+ public int hashCode() {
+ return 0;
+ }
+ };
+ }
+ }
+
+ private class NoRenderViewHandler extends MockViewHandler {
+
+ public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException {
+ // do nothing
+ }
+ }
+
+ private class TrackingPhaseListener implements PhaseListener {
+
+ private List phaseCallbacks = new ArrayList();
+
+ public void afterPhase(PhaseEvent event) {
+ String phaseCallback = "AFTER_" + event.getPhaseId();
+ assertFalse("Phase callback " + phaseCallback + " already executed.", phaseCallbacks
+ .contains(phaseCallback));
+ phaseCallbacks.add(phaseCallback);
+ }
+
+ public void beforePhase(PhaseEvent event) {
+ String phaseCallback = "BEFORE_" + event.getPhaseId();
+ assertFalse("Phase callback " + phaseCallback + " already executed.", phaseCallbacks
+ .contains(phaseCallback));
+ phaseCallbacks.add(phaseCallback);
+ }
+
+ public PhaseId getPhaseId() {
+ return PhaseId.ANY_PHASE;
+ }
+
+ public List getPhaseCallbacks() {
+ return phaseCallbacks;
+ }
+
+ public void reset() {
+ phaseCallbacks.clear();
+ }
+
+ }
+
+ private class ViewState2SetupAction implements Action {
+
+ public Event execute(RequestContext context) throws Exception {
+ jsfRequestSetup();
+ UIViewRoot newRoot = new UIViewRoot();
+ newRoot.setViewId("view2");
+ viewHandler.setCreateView(newRoot);
+ return new Event(this, "success");
+ }
+ }
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JSFMockHelper.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JSFMockHelper.java
index 82aa35ec..cb641944 100644
--- a/spring-faces/src/test/java/org/springframework/faces/webflow/JSFMockHelper.java
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JSFMockHelper.java
@@ -1,9 +1,14 @@
package org.springframework.faces.webflow;
+import javax.faces.FactoryFinder;
+import javax.faces.application.Application;
+import javax.faces.component.UIViewRoot;
+import javax.faces.lifecycle.LifecycleFactory;
+import javax.faces.render.RenderKitFactory;
+
import org.apache.shale.test.base.AbstractJsfTestCase;
import org.apache.shale.test.mock.MockApplication;
import org.apache.shale.test.mock.MockExternalContext;
-import org.apache.shale.test.mock.MockFacesContextFactory;
import org.apache.shale.test.mock.MockHttpServletRequest;
import org.apache.shale.test.mock.MockHttpServletResponse;
import org.apache.shale.test.mock.MockHttpSession;
@@ -11,7 +16,6 @@ import org.apache.shale.test.mock.MockLifecycle;
import org.apache.shale.test.mock.MockLifecycleFactory;
import org.apache.shale.test.mock.MockRenderKit;
import org.apache.shale.test.mock.MockServletConfig;
-import org.apache.shale.test.mock.MockFacesContext;
import org.apache.shale.test.mock.MockServletContext;
/**
@@ -24,7 +28,10 @@ public class JSFMockHelper {
private JSFMock mock = new JSFMock();
- public MockApplication application() {
+ public Application application() {
+ if (mock.application() == null) {
+ return mock.facesContext.getApplication();
+ }
return mock.application();
}
@@ -36,11 +43,11 @@ public class JSFMockHelper {
return mock.externalContext();
}
- public MockFacesContext facesContext() {
+ public FlowFacesContext facesContext() {
return mock.facesContext();
}
- public MockFacesContextFactory facesContextFactory() {
+ public FlowFacesContextFactory facesContextFactory() {
return mock.facesContextFactory();
}
@@ -86,12 +93,70 @@ public class JSFMockHelper {
super("JSFMock");
}
+ FlowFacesContextFactory facesContextFactory;
+ FlowFacesContext facesContext;
+
public void setUp() throws Exception {
- super.setUp();
+
+ // Thread.currentThread().setContextClassLoader(
+ // new URLClassLoader(new URL[0], this.getClass().getClassLoader()));
+
+ // Set up Servlet API Objects
+ servletContext = new MockServletContext();
+ config = new MockServletConfig(servletContext);
+ session = new MockHttpSession();
+ session.setServletContext(servletContext);
+ request = new MockHttpServletRequest(session);
+ request.setServletContext(servletContext);
+ response = new MockHttpServletResponse();
+
+ // Set up JSF API Objects
+ FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY,
+ "org.apache.shale.test.mock.MockApplicationFactory");
+ FactoryFinder.setFactory(FactoryFinder.FACES_CONTEXT_FACTORY,
+ "org.springframework.faces.webflow.MockBaseFacesContextFactory");
+ FactoryFinder.setFactory(FactoryFinder.FACES_CONTEXT_FACTORY,
+ "org.springframework.faces.webflow.FlowFacesContextFactory");
+ FactoryFinder
+ .setFactory(FactoryFinder.LIFECYCLE_FACTORY, "org.apache.shale.test.mock.MockLifecycleFactory");
+ FactoryFinder.setFactory(FactoryFinder.RENDER_KIT_FACTORY,
+ "org.apache.shale.test.mock.MockRenderKitFactory");
+
+ externalContext = new MockExternalContext(servletContext, request, response);
+ lifecycleFactory = (MockLifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
+ lifecycle = (MockLifecycle) lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
+ facesContextFactory = (FlowFacesContextFactory) FactoryFinder
+ .getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
+ facesContext = (FlowFacesContext) facesContextFactory.getFacesContext(servletContext, request, response,
+ lifecycle);
+ externalContext = (MockExternalContext) facesContext.getExternalContext();
+ UIViewRoot root = new UIViewRoot();
+ root.setViewId("/viewId");
+ root.setRenderKitId(RenderKitFactory.HTML_BASIC_RENDER_KIT);
+ facesContext.setViewRoot(root);
+ RenderKitFactory renderKitFactory = (RenderKitFactory) FactoryFinder
+ .getFactory(FactoryFinder.RENDER_KIT_FACTORY);
+ renderKit = new MockRenderKit();
+ renderKitFactory.addRenderKit(RenderKitFactory.HTML_BASIC_RENDER_KIT, renderKit);
}
public void tearDown() throws Exception {
- super.tearDown();
+ application = null;
+ config = null;
+ externalContext = null;
+ if (facesContext != null) {
+ facesContext.release();
+ }
+ facesContext = null;
+ lifecycle = null;
+ lifecycleFactory = null;
+ renderKit = null;
+ request = null;
+ response = null;
+ servletContext = null;
+ session = null;
+ FactoryFinder.releaseFactories();
+
}
public MockApplication application() {
@@ -106,11 +171,11 @@ public class JSFMockHelper {
return externalContext;
}
- public MockFacesContext facesContext() {
+ public FlowFacesContext facesContext() {
return facesContext;
}
- public MockFacesContextFactory facesContextFactory() {
+ public FlowFacesContextFactory facesContextFactory() {
return facesContextFactory;
}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JsfRenderFinalResponseActionTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfRenderFinalResponseActionTests.java
new file mode 100644
index 00000000..75597e3e
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfRenderFinalResponseActionTests.java
@@ -0,0 +1,147 @@
+package org.springframework.faces.webflow;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.faces.FacesException;
+import javax.faces.application.ViewHandler;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.FacesContext;
+import javax.faces.event.PhaseEvent;
+import javax.faces.event.PhaseId;
+import javax.faces.event.PhaseListener;
+import javax.faces.lifecycle.Lifecycle;
+
+import junit.framework.TestCase;
+
+import org.easymock.EasyMock;
+import org.jboss.el.ExpressionFactoryImpl;
+import org.springframework.binding.expression.ExpressionParser;
+import org.springframework.webflow.context.ExternalContext;
+import org.springframework.webflow.core.collection.AttributeMap;
+import org.springframework.webflow.core.collection.LocalAttributeMap;
+import org.springframework.webflow.core.expression.el.WebFlowELExpressionParser;
+import org.springframework.webflow.execution.RequestContext;
+import org.springframework.webflow.execution.RequestContextHolder;
+import org.springframework.webflow.execution.ViewFactory;
+import org.springframework.webflow.test.MockExternalContext;
+
+public class JsfRenderFinalResponseActionTests extends TestCase {
+
+ private static final String VIEW_ID = "testView.xhtml";
+
+ private ViewFactory factory;
+
+ private JsfRenderFinalResponseAction finalResponseAction;
+
+ private JSFMockHelper jsfMock = new JSFMockHelper();
+
+ private RequestContext context = EasyMock.createMock(RequestContext.class);
+
+ private ViewHandler viewHandler = new NoRenderViewHandler();
+
+ private TestLifecycle lifecycle;
+
+ private PhaseListener trackingListener;
+
+ private StringWriter output = new StringWriter();
+
+ ExpressionParser parser = new WebFlowELExpressionParser(new ExpressionFactoryImpl());
+
+ protected void setUp() throws Exception {
+ configureJsf();
+ }
+
+ protected void tearDown() throws Exception {
+ jsfMock.tearDown();
+ }
+
+ private void configureJsf() throws Exception {
+
+ jsfMock.setUp();
+
+ trackingListener = new TrackingPhaseListener();
+ jsfMock.lifecycle().addPhaseListener(trackingListener);
+ jsfMock.facesContext().setViewRoot(null);
+ jsfMock.application().setViewHandler(viewHandler);
+ lifecycle = new TestLifecycle(jsfMock.lifecycle());
+ factory = new JsfViewFactory(lifecycle, parser.parseExpression("#{'" + VIEW_ID + "'}", RequestContext.class,
+ String.class, null));
+ finalResponseAction = new JsfRenderFinalResponseAction(factory);
+ RequestContextHolder.setRequestContext(context);
+ ExternalContext ext = new MockExternalContext();
+ EasyMock.expect(context.getExternalContext()).andStubReturn(ext);
+ AttributeMap flash = new LocalAttributeMap();
+ EasyMock.expect(context.getFlashScope()).andStubReturn(flash);
+ }
+
+ public void testRender() throws Exception {
+
+ UIViewRoot newRoot = new UIViewRoot();
+ newRoot.setViewId(VIEW_ID);
+ newRoot.setRenderKitId("TEST_KIT");
+ ((MockViewHandler) viewHandler).setCreateView(newRoot);
+
+ EasyMock.replay(new Object[] { context });
+
+ finalResponseAction.execute(context);
+
+ assertTrue(newRoot.isTransient());
+ assertTrue(((NoRenderViewHandler) viewHandler).rendered);
+ }
+
+ private class TestLifecycle extends FlowLifecycle {
+
+ boolean executed = false;
+
+ public TestLifecycle(Lifecycle delegate) {
+ super(delegate);
+ }
+
+ public void execute(FacesContext context) throws FacesException {
+ assertFalse("Lifecycle executed more than once", executed);
+ super.execute(context);
+ executed = true;
+ }
+
+ }
+
+ private class TrackingPhaseListener implements PhaseListener {
+
+ private List phaseCallbacks = new ArrayList();
+
+ public void afterPhase(PhaseEvent event) {
+ String phaseCallback = "AFTER_" + event.getPhaseId();
+ assertFalse("Phase callback " + phaseCallback + " already executed.", phaseCallbacks
+ .contains(phaseCallback));
+ phaseCallbacks.add(phaseCallback);
+ }
+
+ public void beforePhase(PhaseEvent event) {
+ String phaseCallback = "BEFORE_" + event.getPhaseId();
+ assertFalse("Phase callback " + phaseCallback + " already executed.", phaseCallbacks
+ .contains(phaseCallback));
+ phaseCallbacks.add(phaseCallback);
+ }
+
+ public PhaseId getPhaseId() {
+ return PhaseId.ANY_PHASE;
+ }
+
+ public List getPhaseCallbacks() {
+ return phaseCallbacks;
+ }
+
+ }
+
+ private class NoRenderViewHandler extends MockViewHandler {
+ boolean rendered = false;
+
+ public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException {
+ rendered = true;
+ }
+ }
+
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewFactoryTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewFactoryTests.java
new file mode 100644
index 00000000..2da1ca04
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewFactoryTests.java
@@ -0,0 +1,254 @@
+package org.springframework.faces.webflow;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.faces.FacesException;
+import javax.faces.application.ViewHandler;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.FacesContext;
+import javax.faces.event.PhaseEvent;
+import javax.faces.event.PhaseId;
+import javax.faces.event.PhaseListener;
+import javax.faces.lifecycle.Lifecycle;
+
+import junit.framework.TestCase;
+
+import org.easymock.EasyMock;
+import org.jboss.el.ExpressionFactoryImpl;
+import org.springframework.binding.expression.ExpressionParser;
+import org.springframework.webflow.context.ExternalContext;
+import org.springframework.webflow.core.collection.AttributeMap;
+import org.springframework.webflow.core.collection.LocalAttributeMap;
+import org.springframework.webflow.core.expression.el.WebFlowELExpressionParser;
+import org.springframework.webflow.execution.RequestContext;
+import org.springframework.webflow.execution.RequestContextHolder;
+import org.springframework.webflow.execution.View;
+import org.springframework.webflow.execution.ViewFactory;
+import org.springframework.webflow.test.MockExternalContext;
+
+public class JsfViewFactoryTests extends TestCase {
+
+ private static final String VIEW_ID = "testView.xhtml";
+
+ private ViewFactory factory;
+
+ private JSFMockHelper jsfMock = new JSFMockHelper();
+
+ private RequestContext context = EasyMock.createMock(RequestContext.class);
+
+ private AttributeMap flashMap = new LocalAttributeMap();
+
+ private ViewHandler viewHandler = new MockViewHandler();
+
+ private Lifecycle lifecycle;
+
+ private PhaseListener trackingListener;
+
+ private ExpressionParser parser = new WebFlowELExpressionParser(new ExpressionFactoryImpl());
+
+ private ExternalContext extContext = new MockExternalContext();
+
+ private String event = "foo";
+
+ protected void setUp() throws Exception {
+ configureJsf();
+ RequestContextHolder.setRequestContext(context);
+ EasyMock.expect(context.getFlashScope()).andStubReturn(flashMap);
+ EasyMock.expect(context.getExternalContext()).andStubReturn(extContext);
+ EasyMock.replay(new Object[] { context });
+ }
+
+ protected void tearDown() throws Exception {
+ jsfMock.tearDown();
+ }
+
+ private void configureJsf() throws Exception {
+ jsfMock.setUp();
+ trackingListener = new TrackingPhaseListener();
+ jsfMock.lifecycle().addPhaseListener(trackingListener);
+ jsfMock.facesContext().setViewRoot(null);
+ jsfMock.application().setViewHandler(viewHandler);
+ }
+
+ /**
+ * View has not yet been created
+ */
+ public final void testGetView_Create() {
+
+ lifecycle = new NoEventLifecycle(jsfMock.lifecycle());
+ factory = new JsfViewFactory(lifecycle, parser.parseExpression(VIEW_ID, RequestContext.class, String.class,
+ null));
+
+ UIViewRoot newRoot = new UIViewRoot();
+ newRoot.setViewId(VIEW_ID);
+ ((MockViewHandler) viewHandler).setCreateView(newRoot);
+
+ View newView = factory.getView(context);
+
+ assertNotNull("A View was not created", newView);
+ assertTrue("A JsfView was expected", newView instanceof JsfView);
+ assertEquals("View name did not match", VIEW_ID, ((JsfView) newView).getViewRoot().getViewId());
+ assertFalse("An unexpected event was signaled,", newView.eventSignaled());
+ assertFalse("The lifecycle should not have been invoked", ((NoEventLifecycle) lifecycle).executed);
+ }
+
+ /**
+ * View already exists in flash scope and must be restored and the lifecycle executed, no event signaled
+ */
+ public final void testGetView_Restore_NoEvent() {
+
+ lifecycle = new NoEventLifecycle(jsfMock.lifecycle());
+ factory = new JsfViewFactory(lifecycle, parser.parseExpression(VIEW_ID, RequestContext.class, String.class,
+ null));
+
+ UIViewRoot existingRoot = new UIViewRoot();
+ existingRoot.setViewId(VIEW_ID);
+ ((MockViewHandler) viewHandler).setRestoreView(existingRoot);
+
+ View restoredView = factory.getView(context);
+
+ assertNotNull("A View was not restored", restoredView);
+ assertTrue("A JsfView was expected", restoredView instanceof JsfView);
+ assertEquals("View name did not match", VIEW_ID, ((JsfView) restoredView).getViewRoot().getViewId());
+ assertFalse("An unexpected event was signaled,", restoredView.eventSignaled());
+ assertTrue("The lifecycle should have been invoked", ((NoEventLifecycle) lifecycle).executed);
+ }
+
+ /**
+ * View already exists in flowscope and must be restored and the lifecycle executed, an event is signaled
+ */
+ public final void testGetView_Restore_EventSignaled() {
+
+ lifecycle = new EventSignalingLifecycle(jsfMock.lifecycle());
+ factory = new JsfViewFactory(lifecycle, parser.parseExpression(VIEW_ID, RequestContext.class, String.class,
+ null));
+
+ UIViewRoot existingRoot = new UIViewRoot();
+ existingRoot.setViewId(VIEW_ID);
+ ((MockViewHandler) viewHandler).setRestoreView(existingRoot);
+
+ View restoredView = factory.getView(context);
+
+ assertNotNull("A View was not restored", restoredView);
+ assertTrue("A JsfView was expected", restoredView instanceof JsfView);
+ assertEquals("View name did not match", VIEW_ID, ((JsfView) restoredView).getViewRoot().getViewId());
+ assertTrue("No event was signaled,", restoredView.eventSignaled());
+ assertEquals("Event should be " + event, event, restoredView.getEvent().getId());
+ assertTrue("The lifecycle should have been invoked", ((EventSignalingLifecycle) lifecycle).executed);
+ }
+
+ /**
+ * View is restored, and then the same view-state is re-entered at the end of the request
+ * @throws Exception
+ */
+ /*
+ * public final void testGetView_RestoreTwice() throws Exception {
+ *
+ * lifecycle = new EventSignalingLifecycle(jsfMock.lifecycle()); factory = new JsfViewFactory(lifecycle,
+ * parser.parseExpression(VIEW_ID));
+ *
+ * UIViewRoot existingRoot = new UIViewRoot(); existingRoot.setViewId(VIEW_ID); ((MockViewHandler)
+ * viewHandler).setRestoreView(existingRoot);
+ *
+ * View restoredView = factory.getView(context);
+ *
+ * assertNull("FacesContext was not released", FacesContext.getCurrentInstance());
+ *
+ * configureJsf();
+ *
+ * View recursiveView = factory.getView(context);
+ *
+ * assertNotNull("A View was not restored", restoredView); assertTrue("A JsfView was expected", restoredView
+ * instanceof JsfView); assertEquals("View name did not match", VIEW_ID, ((JsfView)
+ * restoredView).getViewRoot().getViewId()); assertSame("Re-entered view should be the same instance", ((JsfView)
+ * restoredView).getViewRoot(), ((JsfView) recursiveView).getViewRoot()); assertTrue("No event was signaled,",
+ * restoredView.eventSignaled()); assertEquals("Event should be " + event, event, restoredView.getEvent().getId());
+ * assertTrue("The lifecycle should have been invoked", lifecycle.executed); }
+ */
+
+ /**
+ * Third party sets the view root before RESTORE_VIEW
+ */
+ public final void testGetView_ExternalViewRoot() {
+
+ lifecycle = new NoEventLifecycle(jsfMock.lifecycle());
+ factory = new JsfViewFactory(lifecycle, parser.parseExpression(VIEW_ID, RequestContext.class, String.class,
+ null));
+
+ UIViewRoot newRoot = new UIViewRoot();
+ newRoot.setViewId(VIEW_ID);
+ jsfMock.facesContext().setViewRoot(newRoot);
+ jsfMock.facesContext().renderResponse();
+
+ View newView = factory.getView(context);
+
+ assertNotNull("A View was not created", newView);
+ assertTrue("A JsfView was expected", newView instanceof JsfView);
+ assertEquals("View name did not match", VIEW_ID, ((JsfView) newView).getViewRoot().getViewId());
+ assertSame("View root was not the third party instance", newRoot, ((JsfView) newView).getViewRoot());
+ assertFalse("An unexpected event was signaled,", newView.eventSignaled());
+ assertFalse("The lifecycle should not have been invoked", ((NoEventLifecycle) lifecycle).executed);
+ }
+
+ private class NoEventLifecycle extends FlowLifecycle {
+
+ boolean executed = false;
+
+ public NoEventLifecycle(Lifecycle delegate) {
+ super(delegate);
+ }
+
+ public void execute(FacesContext context) throws FacesException {
+ assertFalse("Lifecycle executed more than once", executed);
+ super.execute(context);
+ executed = true;
+ }
+
+ }
+
+ private class EventSignalingLifecycle extends FlowLifecycle {
+ boolean executed = false;
+
+ public EventSignalingLifecycle(Lifecycle delegate) {
+ super(delegate);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void execute(FacesContext context) throws FacesException {
+ assertFalse("Lifecycle executed more than once", executed);
+ super.execute(context);
+ extContext.getRequestMap().put(JsfView.EVENT_KEY, event);
+ executed = true;
+ }
+ }
+
+ private class TrackingPhaseListener implements PhaseListener {
+
+ private List phaseCallbacks = new ArrayList();
+
+ public void afterPhase(PhaseEvent event) {
+ String phaseCallback = "AFTER_" + event.getPhaseId();
+ assertFalse("Phase callback " + phaseCallback + " already executed.", phaseCallbacks
+ .contains(phaseCallback));
+ phaseCallbacks.add(phaseCallback);
+ }
+
+ public void beforePhase(PhaseEvent event) {
+ String phaseCallback = "BEFORE_" + event.getPhaseId();
+ assertFalse("Phase callback " + phaseCallback + " already executed.", phaseCallbacks
+ .contains(phaseCallback));
+ phaseCallbacks.add(phaseCallback);
+ }
+
+ public PhaseId getPhaseId() {
+ return PhaseId.ANY_PHASE;
+ }
+
+ public List getPhaseCallbacks() {
+ return phaseCallbacks;
+ }
+
+ }
+
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewTests.java
new file mode 100644
index 00000000..8915fdbc
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/JsfViewTests.java
@@ -0,0 +1,153 @@
+package org.springframework.faces.webflow;
+
+import java.io.IOException;
+import java.io.StringWriter;
+
+import javax.faces.FacesException;
+import javax.faces.FactoryFinder;
+import javax.faces.component.UIForm;
+import javax.faces.component.UIInput;
+import javax.faces.component.UIViewRoot;
+import javax.faces.component.html.HtmlForm;
+import javax.faces.component.html.HtmlInputText;
+import javax.faces.context.FacesContext;
+import javax.faces.render.RenderKitFactory;
+import javax.faces.render.Renderer;
+import javax.faces.render.ResponseStateManager;
+
+import junit.framework.TestCase;
+
+import org.apache.shale.test.mock.MockRenderKit;
+import org.apache.shale.test.mock.MockResponseWriter;
+import org.apache.shale.test.mock.MockStateManager;
+import org.easymock.EasyMock;
+import org.springframework.webflow.core.collection.MutableAttributeMap;
+import org.springframework.webflow.execution.FlowExecutionContext;
+import org.springframework.webflow.execution.FlowExecutionKey;
+import org.springframework.webflow.execution.RequestContext;
+import org.springframework.webflow.execution.RequestContextHolder;
+
+public class JsfViewTests extends TestCase {
+
+ private static final String VIEW_ID = "testView.xhtml";
+
+ private JsfView view;
+
+ private JSFMockHelper jsfMock = new JSFMockHelper();
+
+ private StringWriter output = new StringWriter();
+
+ private RequestContext requestContext = EasyMock.createMock(RequestContext.class);
+ private FlowExecutionContext flowExecutionContext = EasyMock.createMock(FlowExecutionContext.class);
+ private MutableAttributeMap flashMap = EasyMock.createMock(MutableAttributeMap.class);
+
+ private FlowExecutionKey key = new FlowExecutionKey() {
+
+ public String toString() {
+ return "MOCK_KEY";
+ }
+
+ public boolean equals(Object o) {
+ return true;
+ }
+
+ public int hashCode() {
+ return 0;
+ }
+ };
+
+ protected void setUp() throws Exception {
+
+ jsfMock.setUp();
+ jsfMock.application().setViewHandler(new MockViewHandler());
+ jsfMock.application().setStateManager(new TestStateManager());
+ jsfMock.facesContext().setResponseWriter(new MockResponseWriter(output, null, null));
+
+ RenderKitFactory rkf = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
+ rkf.addRenderKit("TEST_KIT", new TestRenderKit());
+
+ UIViewRoot viewToRender = new UIViewRoot();
+ viewToRender.setRenderKitId("TEST_KIT");
+ viewToRender.setViewId(VIEW_ID);
+ jsfMock.facesContext().setViewRoot(viewToRender);
+
+ UIForm form = new HtmlForm();
+ form.setId("myForm");
+
+ UIInput input = new HtmlInputText();
+ input.setId("foo");
+
+ form.getChildren().add(input);
+ viewToRender.getChildren().add(form);
+
+ view = new JsfView(viewToRender, jsfMock.lifecycle());
+
+ RequestContextHolder.setRequestContext(requestContext);
+ }
+
+ protected void tearDown() throws Exception {
+ jsfMock.tearDown();
+ }
+
+ public final void testRender() {
+
+ EasyMock.expect(requestContext.getFlashScope()).andStubReturn(flashMap);
+ EasyMock.expect(requestContext.getFlowExecutionContext()).andStubReturn(flowExecutionContext);
+ EasyMock.expect(flowExecutionContext.getKey()).andStubReturn(key);
+ EasyMock.expect(flashMap.put(EasyMock.matches(JsfView.STATE_KEY), EasyMock.anyObject())).andStubReturn(null);
+ EasyMock.expect(flashMap.put(EasyMock.matches("renderResponse"), EasyMock.anyObject())).andStubReturn(null);
+ EasyMock.expect(flashMap.put(EasyMock.matches("responseComplete"), EasyMock.anyObject())).andStubReturn(null);
+
+ EasyMock.replay(new Object[] { requestContext, flowExecutionContext, flashMap });
+
+ view.render();
+
+ EasyMock.verify(new Object[] { requestContext, flowExecutionContext, flashMap });
+ assertNull("The FacesContext was not released", FacesContext.getCurrentInstance());
+ assertTrue(output.getBuffer().toString().contains(key.toString()));
+ }
+
+ public final void testRenderException() {
+
+ EasyMock.expect(requestContext.getFlashScope()).andStubReturn(flashMap);
+ EasyMock.expect(flashMap.put(EasyMock.matches("renderResponse"), EasyMock.anyObject())).andStubReturn(null);
+ EasyMock.expect(flashMap.put(EasyMock.matches("responseComplete"), EasyMock.anyObject())).andStubReturn(null);
+
+ EasyMock.replay(new Object[] { requestContext, flowExecutionContext, flashMap });
+
+ jsfMock.application().setViewHandler(new ExceptionalViewHandler());
+
+ try {
+ view.render();
+ } catch (FacesException ex) {
+ assertNull("The FacesContext was not released", FacesContext.getCurrentInstance());
+ }
+
+ }
+
+ private class ExceptionalViewHandler extends MockViewHandler {
+ public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException {
+ throw new IOException("Rendering blew up");
+ }
+ }
+
+ private class TestStateManager extends MockStateManager {
+ public SerializedView saveSerializedView(FacesContext context) {
+ SerializedView state = new SerializedView(new Object[] { "tree_state" }, new Object[] { "component_state" });
+ return state;
+ }
+ }
+
+ private class TestRenderKit extends MockRenderKit {
+ Renderer renderer = new Renderer() {
+ };
+
+ public Renderer getRenderer(String family, String rendererType) {
+ return renderer;
+ }
+
+ public ResponseStateManager getResponseStateManager() {
+ return new FlowResponseStateManager();
+ }
+ }
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/MockBaseFacesContext.java b/spring-faces/src/test/java/org/springframework/faces/webflow/MockBaseFacesContext.java
new file mode 100644
index 00000000..23c76725
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/MockBaseFacesContext.java
@@ -0,0 +1,35 @@
+package org.springframework.faces.webflow;
+
+import javax.faces.FactoryFinder;
+import javax.faces.application.Application;
+import javax.faces.application.ApplicationFactory;
+import javax.faces.context.ExternalContext;
+import javax.faces.lifecycle.Lifecycle;
+
+import org.apache.shale.test.mock.MockFacesContext12;
+
+public class MockBaseFacesContext extends MockFacesContext12 {
+
+ private Application application;
+
+ public MockBaseFacesContext() {
+ super();
+ }
+
+ public MockBaseFacesContext(ExternalContext externalContext) {
+ super(externalContext);
+ }
+
+ public MockBaseFacesContext(ExternalContext externalContext, Lifecycle lifecycle) {
+ super(externalContext, lifecycle);
+ }
+
+ public Application getApplication() {
+ if (application == null) {
+ ApplicationFactory applicationFactory = (ApplicationFactory) FactoryFinder
+ .getFactory(FactoryFinder.APPLICATION_FACTORY);
+ application = applicationFactory.getApplication();
+ }
+ return application;
+ }
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/MockBaseFacesContextFactory.java b/spring-faces/src/test/java/org/springframework/faces/webflow/MockBaseFacesContextFactory.java
new file mode 100644
index 00000000..ad0f1b17
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/MockBaseFacesContextFactory.java
@@ -0,0 +1,25 @@
+package org.springframework.faces.webflow;
+
+import javax.faces.FacesException;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import javax.faces.context.FacesContextFactory;
+import javax.faces.lifecycle.Lifecycle;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.shale.test.mock.MockExternalContext;
+
+public class MockBaseFacesContextFactory extends FacesContextFactory {
+
+ public FacesContext getFacesContext(Object context, Object request, Object response, Lifecycle lifecycle)
+ throws FacesException {
+
+ ExternalContext ext = new MockExternalContext((ServletContext) context, (HttpServletRequest) request,
+ (HttpServletResponse) response);
+
+ return new MockBaseFacesContext(ext, lifecycle);
+ }
+
+}
diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/MockViewHandler.java b/spring-faces/src/test/java/org/springframework/faces/webflow/MockViewHandler.java
index 8589448a..a289bd7b 100644
--- a/spring-faces/src/test/java/org/springframework/faces/webflow/MockViewHandler.java
+++ b/spring-faces/src/test/java/org/springframework/faces/webflow/MockViewHandler.java
@@ -20,11 +20,14 @@ import java.util.Locale;
import javax.faces.FacesException;
import javax.faces.application.ViewHandler;
+import javax.faces.application.StateManager.SerializedView;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
public class MockViewHandler extends ViewHandler {
- private UIViewRoot viewRoot;
+ private UIViewRoot createViewRoot;
+
+ private UIViewRoot restoreViewRoot;
public Locale calculateLocale(FacesContext context) {
return null;
@@ -35,15 +38,23 @@ public class MockViewHandler extends ViewHandler {
}
public UIViewRoot createView(FacesContext context, String viewId) {
- return viewRoot;
+ return createViewRoot;
}
/**
- * Set the view root that this mpck is supposed to create.
- * @param viewRoot the view to set.
+ * Set the view root that this mock is supposed to create
+ * @param createViewRoot the view to set.
*/
- public void setCreateView(UIViewRoot viewRoot) {
- this.viewRoot = viewRoot;
+ public void setCreateView(UIViewRoot createViewRoot) {
+ this.createViewRoot = createViewRoot;
+ }
+
+ /**
+ * Set the view root that this mock is supposed to restore
+ * @param restoreViewRoot the view to set.
+ */
+ public void setRestoreView(UIViewRoot restoreViewRoot) {
+ this.restoreViewRoot = restoreViewRoot;
}
public String getActionURL(FacesContext context, String viewId) {
@@ -54,11 +65,17 @@ public class MockViewHandler extends ViewHandler {
return null;
}
+ /**
+ * Really simple implementation to exercise rendering and state saving
+ */
public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException {
+ context.getViewRoot().encodeAll(context);
+ SerializedView state = context.getApplication().getStateManager().saveSerializedView(context);
+ context.getRenderKit().getResponseStateManager().writeState(context, state);
}
public UIViewRoot restoreView(FacesContext context, String viewId) {
- return null;
+ return restoreViewRoot;
}
public void writeState(FacesContext context) throws IOException {
diff --git a/spring-faces/src/test/java/org/springframework/webflow/engine/builder/xml/JsfXmlFlowBuilderTests.java b/spring-faces/src/test/java/org/springframework/webflow/engine/builder/xml/JsfXmlFlowBuilderTests.java
new file mode 100644
index 00000000..bf458179
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/webflow/engine/builder/xml/JsfXmlFlowBuilderTests.java
@@ -0,0 +1,37 @@
+package org.springframework.webflow.engine.builder.xml;
+
+import junit.framework.TestCase;
+
+import org.springframework.beans.factory.support.StaticListableBeanFactory;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.faces.webflow.JSFMockHelper;
+import org.springframework.webflow.engine.Flow;
+import org.springframework.webflow.engine.builder.FlowAssembler;
+import org.springframework.webflow.test.MockFlowBuilderContext;
+
+public class JsfXmlFlowBuilderTests extends TestCase {
+
+ private XmlFlowBuilder builder;
+ private JSFMockHelper jsf = new JSFMockHelper();
+
+ protected void setUp() throws Exception {
+ jsf.setUp();
+ StaticListableBeanFactory beanFactory = new StaticListableBeanFactory();
+ beanFactory.addBean("bean", new Object());
+ }
+
+ protected void tearDown() throws Exception {
+ jsf.tearDown();
+ }
+
+ public final void testBuildJsfFlow() {
+ ClassPathResource resource = new ClassPathResource("jsf-flow.xml", getClass());
+ builder = new XmlFlowBuilder(resource);
+ MockFlowBuilderContext builderContext = new MockFlowBuilderContext("jsf-flow");
+ builderContext.getFlowBuilderServices().setViewFactoryCreator(new JsfViewFactoryCreator());
+ FlowAssembler assembler = new FlowAssembler(builder, builderContext);
+ Flow flow = assembler.assembleFlow();
+ assertEquals("jsf-flow", flow.getId());
+ assertEquals("viewState1", flow.getStartState().getId());
+ }
+}
diff --git a/spring-faces/src/test/java/org/springframework/webflow/engine/builder/xml/jsf-flow.xml b/spring-faces/src/test/java/org/springframework/webflow/engine/builder/xml/jsf-flow.xml
new file mode 100644
index 00000000..183b28c6
--- /dev/null
+++ b/spring-faces/src/test/java/org/springframework/webflow/engine/builder/xml/jsf-flow.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-webflow-samples/birthdate/.classpath b/spring-webflow-samples/birthdate/.classpath
deleted file mode 100644
index 1ff9d14b..00000000
--- a/spring-webflow-samples/birthdate/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/spring-webflow-samples/birthdate/.project b/spring-webflow-samples/birthdate/.project
deleted file mode 100644
index 5c7bd5a9..00000000
--- a/spring-webflow-samples/birthdate/.project
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
- swf-birthdate
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.wst.common.project.facet.core.builder
-
-
-
-
- org.eclipse.wst.validation.validationbuilder
-
-
-
-
- org.springframework.ide.eclipse.core.springbuilder
-
-
-
-
-
- org.springframework.ide.eclipse.core.springnature
- org.eclipse.wst.common.project.facet.core.nature
- org.eclipse.jdt.core.javanature
- org.eclipse.wst.common.modulecore.ModuleCoreNature
- org.eclipse.jem.workbench.JavaEMFNature
-
-
diff --git a/spring-webflow-samples/birthdate/.settings/org.eclipse.jdt.core.prefs b/spring-webflow-samples/birthdate/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 284e07be..00000000
--- a/spring-webflow-samples/birthdate/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,270 +0,0 @@
-#Wed Aug 15 08:35:31 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=do not insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
-org.eclipse.jdt.core.formatter.comment.line_length=120
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=8
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=120
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/spring-webflow-samples/birthdate/.settings/org.eclipse.jdt.ui.prefs b/spring-webflow-samples/birthdate/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index cfc7006d..00000000
--- a/spring-webflow-samples/birthdate/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,58 +0,0 @@
-#Wed Aug 15 08:39:18 EDT 2007
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_Spring Java Conventions
-formatter_settings_version=11
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=false
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=/**\n * @return the ${bare_field_name}\n *//**\n * @param ${param} the ${bare_field_name} to set\n *//**\n * ${tags}\n *//*\n * Copyright 2004-2007 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http\://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *//**\n * @author ${user}\n *\n * ${tags}\n *//**\n * \n *//**\n * ${tags}\n *//* (non-Javadoc)\n * ${see_to_overridden}\n *//**\n * ${tags}\n * ${see_to_target}\n */${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}\n\n\n\n// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();// ${todo} Auto-generated method stub\nthrow new UnsupportedOperationException("Auto-generated method stub");${body_statement}\n// ${todo} Auto-generated constructor stubreturn ${field};${field} \= ${param};
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.format_source_code=true
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/spring-webflow-samples/birthdate/.settings/org.eclipse.jst.common.project.facet.core.prefs b/spring-webflow-samples/birthdate/.settings/org.eclipse.jst.common.project.facet.core.prefs
deleted file mode 100755
index 1973f017..00000000
--- a/spring-webflow-samples/birthdate/.settings/org.eclipse.jst.common.project.facet.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Nov 13 17:23:47 PST 2006
-classpath.helper/org.eclipse.jdt.launching.JRE_CONTAINER/owners=jst.java\:5.0
-classpath.helper/org.eclipse.jst.server.core.container\:\:org.eclipse.jst.server.tomcat.runtimeTarget\:\:Apache\ Tomcat\ v5.5/owners=jst.web\:2.4
-eclipse.preferences.version=1
diff --git a/spring-webflow-samples/birthdate/.settings/org.eclipse.wst.common.component b/spring-webflow-samples/birthdate/.settings/org.eclipse.wst.common.component
deleted file mode 100755
index 8c8a88a6..00000000
--- a/spring-webflow-samples/birthdate/.settings/org.eclipse.wst.common.component
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-
-
-
diff --git a/spring-webflow-samples/birthdate/.settings/org.eclipse.wst.common.project.facet.core.xml b/spring-webflow-samples/birthdate/.settings/org.eclipse.wst.common.project.facet.core.xml
deleted file mode 100755
index b7687079..00000000
--- a/spring-webflow-samples/birthdate/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/spring-webflow-samples/birthdate/.settings/org.eclipse.wst.validation.prefs b/spring-webflow-samples/birthdate/.settings/org.eclipse.wst.validation.prefs
deleted file mode 100644
index 1c7d6317..00000000
--- a/spring-webflow-samples/birthdate/.settings/org.eclipse.wst.validation.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Mon Nov 13 17:29:33 PST 2006
-DELEGATES_PREFERENCE=delegateValidatorListorg.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator\=org.eclipse.wst.wsdl.validation.internal.eclipse.Validator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator\=org.eclipse.wst.xsd.core.internal.validation.eclipse.Validator;
-USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;org.eclipse.jst.j2ee.internal.web.validation.UIWarValidator;org.eclipse.jst.jsp.core.internal.validation.JSPELValidator;org.eclipse.jst.jsp.core.internal.validation.JSPJavaValidator;org.eclipse.jst.jsp.core.internal.validation.JSPDirectiveValidator;org.eclipse.wst.common.componentcore.internal.ModuleCoreValidator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator;
-USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;org.eclipse.jst.j2ee.internal.web.validation.UIWarValidator;org.eclipse.jst.jsp.core.internal.validation.JSPELValidator;org.eclipse.jst.jsp.core.internal.validation.JSPJavaValidator;org.eclipse.jst.jsp.core.internal.validation.JSPDirectiveValidator;org.eclipse.wst.common.componentcore.internal.ModuleCoreValidator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator;
-USER_PREFERENCE=overrideGlobalPreferencesfalse
-eclipse.preferences.version=1
diff --git a/spring-webflow-samples/birthdate/.springBeans b/spring-webflow-samples/birthdate/.springBeans
deleted file mode 100644
index 3abf8f21..00000000
--- a/spring-webflow-samples/birthdate/.springBeans
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- xml
-
-
- src/main/webapp/WEB-INF/webflow-config.xml
-
-
-
-
diff --git a/spring-webflow-samples/birthdate/.springWebflow b/spring-webflow-samples/birthdate/.springWebflow
deleted file mode 100644
index d065c996..00000000
--- a/spring-webflow-samples/birthdate/.springWebflow
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
- src/main/webapp/WEB-INF/birthdate-alternate.xml
- birthdate-alternate
- 1:BeansModel|2:swf-birthdate|3:src/main/webapp/WEB-INF/webflow-config.xml
-
-
- src/main/webapp/WEB-INF/birthdate.xml
- birthdate
- 1:BeansModel|2:swf-birthdate|3:src/main/webapp/WEB-INF/webflow-config.xml
-
-
-
diff --git a/spring-webflow-samples/birthdate/build.xml b/spring-webflow-samples/birthdate/build.xml
deleted file mode 100644
index 0b63534d..00000000
--- a/spring-webflow-samples/birthdate/build.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/spring-webflow-samples/birthdate/ivy.xml b/spring-webflow-samples/birthdate/ivy.xml
deleted file mode 100644
index d1710dfc..00000000
--- a/spring-webflow-samples/birthdate/ivy.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-webflow-samples/birthdate/project.properties b/spring-webflow-samples/birthdate/project.properties
deleted file mode 100644
index 7d989e52..00000000
--- a/spring-webflow-samples/birthdate/project.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-# properties defined in this file are overridable by a local build.properties in this project dir
-
-# The location of the common build system
-common.build.dir=${basedir}/../../common-build
-
-javac.source=1.3
-javac.target=1.3
-
-# Do not publish built artifacts to the integration repository
-do.publish=false
\ No newline at end of file
diff --git a/spring-webflow-samples/birthdate/src/etc/filter.properties b/spring-webflow-samples/birthdate/src/etc/filter.properties
deleted file mode 100644
index c54e5880..00000000
--- a/spring-webflow-samples/birthdate/src/etc/filter.properties
+++ /dev/null
@@ -1,33 +0,0 @@
-# $Header$
-
-# Contains filterable project settings. Setting placeholders in filterable project text
-# files will be replaced with these values when the 'statics' build target is run.
-#
-# You may add static settings directly to this source file in the format:
-# setting=value e.g MY_SETTING=myvalue
-# This is appropriate usage if you know the setting value will never change.
-#
-# At build time this source file is copied to the ${target.dir} where additional
-# dynamic settings may be appended using the task. Use this approach
-# when a setting value depends on the build or the local user's environment.
-#
-# An example of this approach is shown below:
-#
-# build.xml
-#
-#
-#
-#
-#
-#
-#
-#
-# This allows for dynamic replacement values that are sourced from local properties files to facilitate
-# local user settings.
-#
-# To refer to filterable settings within project source files like config files, JSPs, or
-# other text files use the standard ant placeholder format:
-# @SETTING_NAME@ e.g, @MY_SETTING@ and @MY_LOCAL_SETTING@
-#
-# Your settings:
diff --git a/spring-webflow-samples/birthdate/src/etc/test-resources/log4j.properties b/spring-webflow-samples/birthdate/src/etc/test-resources/log4j.properties
deleted file mode 100644
index 37618f3a..00000000
--- a/spring-webflow-samples/birthdate/src/etc/test-resources/log4j.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-log4j.rootCategory=DEBUG, stdout, logfile
-
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
-
-log4j.appender.logfile=org.apache.log4j.RollingFileAppender
-log4j.appender.logfile.File=@TEST_RESULTS_DIR@/@PROJECT_NAME@.log
-log4j.appender.logfile.MaxFileSize=512KB
-
-# Keep three backup files
-log4j.appender.logfile.MaxBackupIndex=3
-log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
-#Pattern to output : date priority [category] - line_separator
-log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - <%m>%n
diff --git a/spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/BirthDate.java b/spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/BirthDate.java
deleted file mode 100644
index da1856cd..00000000
--- a/spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/BirthDate.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.webflow.samples.birthdate;
-
-import java.io.Serializable;
-import java.util.Date;
-
-public class BirthDate implements Serializable {
-
- private String name;
-
- private Date date;
-
- private boolean sendCard;
-
- private String emailAddress;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Date getDate() {
- return date;
- }
-
- public void setDate(Date date) {
- this.date = date;
- }
-
- public boolean isSendCard() {
- return sendCard;
- }
-
- public void setSendCard(boolean sendCard) {
- this.sendCard = sendCard;
- }
-
- public String getEmailAddress() {
- return emailAddress;
- }
-
- public void setEmailAddress(String emailAddress) {
- this.emailAddress = emailAddress;
- }
-}
\ No newline at end of file
diff --git a/spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/BirthDateFormAction.java b/spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/BirthDateFormAction.java
deleted file mode 100644
index 137dd22c..00000000
--- a/spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/BirthDateFormAction.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.webflow.samples.birthdate;
-
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-
-import org.springframework.beans.PropertyEditorRegistry;
-import org.springframework.beans.propertyeditors.CustomDateEditor;
-import org.springframework.webflow.action.FormAction;
-import org.springframework.webflow.execution.Event;
-import org.springframework.webflow.execution.RequestContext;
-import org.springframework.webflow.execution.ScopeType;
-
-public class BirthDateFormAction extends FormAction {
-
- // standard European format
- private static final String BIRTH_DATE_PATTERN = "dd-MM-yyyy";
-
- private static final String AGE_NAME = "age";
-
- public BirthDateFormAction() {
- // tell the superclass about the form object and validator we want to use
- // you could also do this in the application context XML ofcourse
- setFormObjectName("birthDate");
- setFormObjectClass(BirthDate.class);
- setFormObjectScope(ScopeType.FLOW);
- setValidator(new BirthDateValidator());
- }
-
- protected void registerPropertyEditors(PropertyEditorRegistry registry) {
- // register a custom property editor to handle the date input
- SimpleDateFormat dateFormat = new SimpleDateFormat(BIRTH_DATE_PATTERN);
- registry.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
- }
-
- /*
- * Our "onSubmit" hook: an action execute method.
- */
- public Event calculateAge(RequestContext context) throws Exception {
- // pull the date from the model
- BirthDate birthDate = (BirthDate) getFormObject(context);
-
- // calculate the age (quick & dirty)
- // in a real application you would delegate to the business layer for
- // this kind of logic
- Calendar calBirthDate = new GregorianCalendar();
- calBirthDate.setTime(birthDate.getDate());
- Calendar calNow = new GregorianCalendar();
-
- int ageYears = calNow.get(Calendar.YEAR) - calBirthDate.get(Calendar.YEAR);
- long ageMonths = calNow.get(Calendar.MONTH) - calBirthDate.get(Calendar.MONTH);
- long ageDays = calNow.get(Calendar.DAY_OF_MONTH) - calBirthDate.get(Calendar.DAY_OF_MONTH);
-
- if (ageDays < 0) {
- ageMonths--;
- ageDays += calBirthDate.getActualMaximum(Calendar.DAY_OF_MONTH);
- }
-
- if (ageMonths < 0) {
- ageYears--;
- ageMonths += 12;
- }
-
- // create a nice age string
- StringBuffer ageStr = new StringBuffer();
- ageStr.append(ageYears).append(" years, ");
- ageStr.append(ageMonths).append(" months and ");
- ageStr.append(ageDays).append(" days");
-
- // put it in the model for display by the view
- context.getRequestScope().put(AGE_NAME, ageStr);
-
- return success();
- }
-}
\ No newline at end of file
diff --git a/spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/BirthDateValidator.java b/spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/BirthDateValidator.java
deleted file mode 100644
index 49f50170..00000000
--- a/spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/BirthDateValidator.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.webflow.samples.birthdate;
-
-import java.util.Calendar;
-
-import org.springframework.validation.Errors;
-import org.springframework.validation.ValidationUtils;
-import org.springframework.validation.Validator;
-
-public class BirthDateValidator implements Validator {
-
- public boolean supports(Class clazz) {
- return clazz.equals(BirthDate.class);
- }
-
- public void validate(Object obj, Errors errors) {
- BirthDate birthDate = (BirthDate) obj;
- validateBirthdateForm(birthDate, errors);
- validateCardForm(birthDate, errors);
- }
-
- public void validateBirthdateForm(BirthDate birthDate, Errors errors) {
- ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "noName", "Please specify your name.");
- ValidationUtils.rejectIfEmpty(errors, "date", "noDate", "Please specify your birth date.");
- }
-
- public void validateCardForm(BirthDate birthDate, Errors errors) {
- if (birthDate.isSendCard()) {
- Calendar cal = Calendar.getInstance();
- cal.setTime(birthDate.getDate());
- if (cal.get(Calendar.MONTH) == 11) {
- errors.reject("tooGoodForCards", "You're born in December--you're too good for a silly card!");
- } else {
- ValidationUtils.rejectIfEmptyOrWhitespace(errors, "emailAddress", "noEmail",
- "Please specify your email address.");
- }
- }
-
- }
-}
\ No newline at end of file
diff --git a/spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/MessageResources.properties b/spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/MessageResources.properties
deleted file mode 100644
index 8af848e1..00000000
--- a/spring-webflow-samples/birthdate/src/main/java/org/springframework/webflow/samples/birthdate/MessageResources.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-errors.header=
-errors.footer=
-errors.prefix=
-errors.suffix=
-
-noName=Your name is required
-noDate=Your birth date is required
-noEmail=Your email address is required
-typeMismatch.java.util.Date=You entered an invalid date format
-
-tooGoodForCards=You're born in December--you're too good for a silly card!
diff --git a/spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/birthdate-alternate.xml b/spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/birthdate-alternate.xml
deleted file mode 100644
index a9764f38..00000000
--- a/spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/birthdate-alternate.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/birthdate.xml b/spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/birthdate.xml
deleted file mode 100644
index 47f80b76..00000000
--- a/spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/birthdate.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/classes/log4j.properties b/spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/classes/log4j.properties
deleted file mode 100644
index 5ba9222c..00000000
--- a/spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/classes/log4j.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-log4j.rootCategory=WARN, stdout
-
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
-
-# Enable web flow logging
-log4j.category.org.springframework.webflow=DEBUG
-log4j.category.org.springframework.binding=DEBUG
\ No newline at end of file
diff --git a/spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/jsp/birthdateForm.jsp b/spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/jsp/birthdateForm.jsp
deleted file mode 100644
index 73303a4a..00000000
--- a/spring-webflow-samples/birthdate/src/main/webapp/WEB-INF/jsp/birthdateForm.jsp
+++ /dev/null
@@ -1,54 +0,0 @@
-<%@ page contentType="text/html" %>
-<%@ page session="false" %>
-<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
-
-
-
-Enter your Birthdate
-
-
-
-
-
-
- This sample application demonstrates the use of the FormAction: a multi-action.
- It also shows you how to use a multi-action to group all actions executed by a flow
- in a single class.
-
-
- This sample also demonstrates Spring Web Flow's Struts integration.
-
- Finally, the sample also uses JSTL in conjunction with flows.
-
-
-
-
-
-
-
-
-
diff --git a/spring-webflow-samples/birthdate/src/main/webapp/style.css b/spring-webflow-samples/birthdate/src/main/webapp/style.css
deleted file mode 100644
index f4b0a64e..00000000
--- a/spring-webflow-samples/birthdate/src/main/webapp/style.css
+++ /dev/null
@@ -1,58 +0,0 @@
-body {
- width: 720px;
- margin: 0px;
- padding: 0px;
-}
-
-div#logo {
- width: 720px;
- height: 73px;
- background: #86AEA5;
-}
-
-div#navigation {
- width: 720px;
- height: 15px;
- background: #E2F3B8;
- text-align: right;
-}
-
-div#content {
- width: 720px;
- padding: 5px;
-}
-
-div#insert {
- width: 120;
- float: right;
- text-align: right;
-}
-
-.buttonBar {
- height: 1.5em;
- text-align: right;
-}
-
-div#copyright {
- width: 720px;
-}
-
-div#copyright p {
- text-align: center;
- font-family: Tahoma, sans-serif;
- font-size: 75%;
- color: div#336633;
- margin-left: 5px;
- font-weight: bold;
- clear: both;
-}
-
-.readOnly {
- color: rgb(192, 192, 192);
-}
-
-.error {
- color: red;
- font-weight: bold;
- font-family: Arial, sans-serif;
-}
\ No newline at end of file
diff --git a/spring-webflow-samples/birthdate/src/test/java/log4j.properties b/spring-webflow-samples/birthdate/src/test/java/log4j.properties
deleted file mode 100644
index 5ba9222c..00000000
--- a/spring-webflow-samples/birthdate/src/test/java/log4j.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-log4j.rootCategory=WARN, stdout
-
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
-
-# Enable web flow logging
-log4j.category.org.springframework.webflow=DEBUG
-log4j.category.org.springframework.binding=DEBUG
\ No newline at end of file
diff --git a/spring-webflow-samples/birthdate/src/test/java/org/springframework/webflow/samples/birthdate/BirthdateValidatorTests.java b/spring-webflow-samples/birthdate/src/test/java/org/springframework/webflow/samples/birthdate/BirthdateValidatorTests.java
deleted file mode 100644
index f3933a0d..00000000
--- a/spring-webflow-samples/birthdate/src/test/java/org/springframework/webflow/samples/birthdate/BirthdateValidatorTests.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.webflow.samples.birthdate;
-
-import java.text.SimpleDateFormat;
-
-import junit.framework.TestCase;
-
-import org.springframework.validation.BindException;
-
-public class BirthdateValidatorTests extends TestCase {
-
- public void testValidateCardForm() throws Exception {
- BirthDateValidator validator = new BirthDateValidator();
- BirthDate birthDate = new BirthDate();
- birthDate.setName("Keith");
- SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
- birthDate.setSendCard(true);
- birthDate.setDate(format.parse("29/12/1977"));
- BindException errors = new BindException(birthDate, "birthDate");
- validator.validateCardForm(birthDate, errors);
- assertEquals(1, errors.getAllErrors().size());
- }
-}
diff --git a/spring-webflow-samples/booking-jsf/ivy.xml b/spring-webflow-samples/booking-jsf/ivy.xml
index dacb44b9..d395b27f 100755
--- a/spring-webflow-samples/booking-jsf/ivy.xml
+++ b/spring-webflow-samples/booking-jsf/ivy.xml
@@ -16,6 +16,7 @@
+
diff --git a/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/flow/booking/BookingActions.java b/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/flow/booking/BookingActions.java
index 18d28b16..e0966ed0 100644
--- a/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/flow/booking/BookingActions.java
+++ b/spring-webflow-samples/booking-jsf/src/main/java/org/springframework/webflow/samples/booking/flow/booking/BookingActions.java
@@ -2,10 +2,10 @@ package org.springframework.webflow.samples.booking.flow.booking;
import java.util.Calendar;
-import javax.faces.application.FacesMessage;
-import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
+import org.springframework.binding.message.Messages;
+import org.springframework.binding.message.Severity;
import org.springframework.webflow.action.MultiAction;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;
@@ -54,15 +54,12 @@ public class BookingActions extends MultiAction {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -1);
if (booking.getCheckinDate().before(calendar.getTime())) {
- FacesContext.getCurrentInstance().addMessage("checkinDate",
- new FacesMessage(FacesMessage.SEVERITY_ERROR, "Check in date must be a future date", ""));
+ context.getMessageContext().addMessage(
+ Messages.text("checkinDate", "Check in date must be a future date", Severity.ERROR));
return error();
} else if (!booking.getCheckinDate().before(booking.getCheckoutDate())) {
- FacesContext.getCurrentInstance()
- .addMessage(
- "checkoutDate",
- new FacesMessage(FacesMessage.SEVERITY_ERROR,
- "Check out date must be later than check in date", ""));
+ context.getMessageContext().addMessage(
+ Messages.text("checkoutDate", "Check out date must be later than check in date", Severity.ERROR));
return error();
}
return success();
diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/WEB-INF/config/web-application-config.xml b/spring-webflow-samples/booking-jsf/src/main/webapp/WEB-INF/config/web-application-config.xml
index 6e6eae4b..8a8ed9d4 100755
--- a/spring-webflow-samples/booking-jsf/src/main/webapp/WEB-INF/config/web-application-config.xml
+++ b/spring-webflow-samples/booking-jsf/src/main/webapp/WEB-INF/config/web-application-config.xml
@@ -1,7 +1,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- /flow/main/main.xml
- /flow/booking/booking.xml
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/WEB-INF/web.xml b/spring-webflow-samples/booking-jsf/src/main/webapp/WEB-INF/web.xml
index bbcef705..e25c30f6 100755
--- a/spring-webflow-samples/booking-jsf/src/main/webapp/WEB-INF/web.xml
+++ b/spring-webflow-samples/booking-jsf/src/main/webapp/WEB-INF/web.xml
@@ -4,53 +4,40 @@
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
-
-
- contextConfigLocation
-
- /WEB-INF/config/web-application-config.xml
-
-
-
javax.faces.DEFAULT_SUFFIX.xhtml
-
-
-
- org.springframework.web.context.ContextLoaderListener
-
-
-
-
-
- Flow System Cleanup Filter
-
- org.springframework.faces.webflow.FlowSystemCleanupFilter
-
-
-
-
-
- Flow System Cleanup Filter
- *.spring
-
-
-
+
Faces Servletjavax.faces.webapp.FacesServlet1
-
+
Faces Servlet
- *.spring
+ *.faces
+
+
+
+
+ Spring Web Servlet
+ org.springframework.webflow.servlet.SpringWebServlet
+
+ configLocations
+ /WEB-INF/config/web-application-config.xml
+
+ 1
+
+
+
+
+ Spring Web Servlet
+ /spring/*
diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/flow/booking/booking.xml b/spring-webflow-samples/booking-jsf/src/main/webapp/flow/booking/booking.xml
index 8201a85e..cb9d0219 100755
--- a/spring-webflow-samples/booking-jsf/src/main/webapp/flow/booking/booking.xml
+++ b/spring-webflow-samples/booking-jsf/src/main/webapp/flow/booking/booking.xml
@@ -18,7 +18,7 @@
-
+
@@ -36,14 +36,14 @@
-
+
-
+
diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/flow/main/main.xml b/spring-webflow-samples/booking-jsf/src/main/webapp/flow/main/main.xml
index 3363d94b..cb3b1348 100755
--- a/spring-webflow-samples/booking-jsf/src/main/webapp/flow/main/main.xml
+++ b/spring-webflow-samples/booking-jsf/src/main/webapp/flow/main/main.xml
@@ -15,7 +15,7 @@
-
+
@@ -29,7 +29,7 @@
-
+
@@ -39,7 +39,7 @@
-
+
diff --git a/spring-webflow-samples/booking-jsf/src/main/webapp/index.html b/spring-webflow-samples/booking-jsf/src/main/webapp/index.html
index 7d0ad05e..4b8dc35b 100755
--- a/spring-webflow-samples/booking-jsf/src/main/webapp/index.html
+++ b/spring-webflow-samples/booking-jsf/src/main/webapp/index.html
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/spring-webflow-samples/fileupload/.classpath b/spring-webflow-samples/fileupload/.classpath
deleted file mode 100644
index 731cc472..00000000
--- a/spring-webflow-samples/fileupload/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/spring-webflow-samples/fileupload/.project b/spring-webflow-samples/fileupload/.project
deleted file mode 100644
index b23192d7..00000000
--- a/spring-webflow-samples/fileupload/.project
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
- swf-fileupload
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.wst.common.project.facet.core.builder
-
-
-
-
- org.eclipse.wst.validation.validationbuilder
-
-
-
-
- org.springframework.ide.eclipse.core.springbuilder
-
-
-
-
-
- org.springframework.ide.eclipse.core.springnature
- org.eclipse.wst.common.project.facet.core.nature
- org.eclipse.jdt.core.javanature
- org.eclipse.wst.common.modulecore.ModuleCoreNature
- org.eclipse.jem.workbench.JavaEMFNature
-
-
diff --git a/spring-webflow-samples/fileupload/.settings/org.eclipse.jdt.core.prefs b/spring-webflow-samples/fileupload/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 6e0f2bf2..00000000
--- a/spring-webflow-samples/fileupload/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,270 +0,0 @@
-#Wed Aug 15 08:35:37 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=do not insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
-org.eclipse.jdt.core.formatter.comment.line_length=120
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=8
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=120
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/spring-webflow-samples/fileupload/.settings/org.eclipse.jdt.ui.prefs b/spring-webflow-samples/fileupload/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index be32349a..00000000
--- a/spring-webflow-samples/fileupload/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,58 +0,0 @@
-#Wed Aug 15 08:39:25 EDT 2007
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_Spring Java Conventions
-formatter_settings_version=11
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=false
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=/**\n * @return the ${bare_field_name}\n *//**\n * @param ${param} the ${bare_field_name} to set\n *//**\n * ${tags}\n *//*\n * Copyright 2004-2007 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http\://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *//**\n * @author ${user}\n *\n * ${tags}\n *//**\n * \n *//**\n * ${tags}\n *//* (non-Javadoc)\n * ${see_to_overridden}\n *//**\n * ${tags}\n * ${see_to_target}\n */${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}\n\n\n\n// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();// ${todo} Auto-generated method stub\nthrow new UnsupportedOperationException("Auto-generated method stub");${body_statement}\n// ${todo} Auto-generated constructor stubreturn ${field};${field} \= ${param};
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.format_source_code=true
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/spring-webflow-samples/fileupload/.settings/org.eclipse.jst.common.project.facet.core.prefs b/spring-webflow-samples/fileupload/.settings/org.eclipse.jst.common.project.facet.core.prefs
deleted file mode 100755
index eca444d7..00000000
--- a/spring-webflow-samples/fileupload/.settings/org.eclipse.jst.common.project.facet.core.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Thu Nov 23 20:59:37 CET 2006
-classpath.helper/org.eclipse.jdt.launching.JRE_CONTAINER\:\:org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType\:\:jdk1.5.0_08/owners=jst.java\:5.0
-eclipse.preferences.version=1
diff --git a/spring-webflow-samples/fileupload/.settings/org.eclipse.wst.common.component b/spring-webflow-samples/fileupload/.settings/org.eclipse.wst.common.component
deleted file mode 100755
index bad147c4..00000000
--- a/spring-webflow-samples/fileupload/.settings/org.eclipse.wst.common.component
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-uses
-
-
-
-
-
diff --git a/spring-webflow-samples/fileupload/.settings/org.eclipse.wst.common.project.facet.core.xml b/spring-webflow-samples/fileupload/.settings/org.eclipse.wst.common.project.facet.core.xml
deleted file mode 100755
index 2f339010..00000000
--- a/spring-webflow-samples/fileupload/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/spring-webflow-samples/fileupload/.settings/org.eclipse.wst.validation.prefs b/spring-webflow-samples/fileupload/.settings/org.eclipse.wst.validation.prefs
deleted file mode 100644
index 1c7d6317..00000000
--- a/spring-webflow-samples/fileupload/.settings/org.eclipse.wst.validation.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Mon Nov 13 17:29:33 PST 2006
-DELEGATES_PREFERENCE=delegateValidatorListorg.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator\=org.eclipse.wst.wsdl.validation.internal.eclipse.Validator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator\=org.eclipse.wst.xsd.core.internal.validation.eclipse.Validator;
-USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;org.eclipse.jst.j2ee.internal.web.validation.UIWarValidator;org.eclipse.jst.jsp.core.internal.validation.JSPELValidator;org.eclipse.jst.jsp.core.internal.validation.JSPJavaValidator;org.eclipse.jst.jsp.core.internal.validation.JSPDirectiveValidator;org.eclipse.wst.common.componentcore.internal.ModuleCoreValidator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator;
-USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;org.eclipse.jst.j2ee.internal.web.validation.UIWarValidator;org.eclipse.jst.jsp.core.internal.validation.JSPELValidator;org.eclipse.jst.jsp.core.internal.validation.JSPJavaValidator;org.eclipse.jst.jsp.core.internal.validation.JSPDirectiveValidator;org.eclipse.wst.common.componentcore.internal.ModuleCoreValidator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator;
-USER_PREFERENCE=overrideGlobalPreferencesfalse
-eclipse.preferences.version=1
diff --git a/spring-webflow-samples/fileupload/.springBeans b/spring-webflow-samples/fileupload/.springBeans
deleted file mode 100644
index eaaa3efc..00000000
--- a/spring-webflow-samples/fileupload/.springBeans
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
- src/main/webapp/WEB-INF/fileupload-servlet.xml
-
-
-
-
diff --git a/spring-webflow-samples/fileupload/.springWebflow b/spring-webflow-samples/fileupload/.springWebflow
deleted file mode 100644
index 89e80050..00000000
--- a/spring-webflow-samples/fileupload/.springWebflow
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- src/main/webapp/WEB-INF/fileupload.xml
- fileupload
- 1:BeansModel|2:swf-fileupload|3:src/main/webapp/WEB-INF/fileupload-servlet.xml
-
-
-
diff --git a/spring-webflow-samples/fileupload/build.xml b/spring-webflow-samples/fileupload/build.xml
deleted file mode 100644
index 3074408b..00000000
--- a/spring-webflow-samples/fileupload/build.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/spring-webflow-samples/fileupload/ivy.xml b/spring-webflow-samples/fileupload/ivy.xml
deleted file mode 100644
index 1641257a..00000000
--- a/spring-webflow-samples/fileupload/ivy.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-webflow-samples/fileupload/project.properties b/spring-webflow-samples/fileupload/project.properties
deleted file mode 100644
index 7d989e52..00000000
--- a/spring-webflow-samples/fileupload/project.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-# properties defined in this file are overridable by a local build.properties in this project dir
-
-# The location of the common build system
-common.build.dir=${basedir}/../../common-build
-
-javac.source=1.3
-javac.target=1.3
-
-# Do not publish built artifacts to the integration repository
-do.publish=false
\ No newline at end of file
diff --git a/spring-webflow-samples/fileupload/src/etc/filter.properties b/spring-webflow-samples/fileupload/src/etc/filter.properties
deleted file mode 100644
index c54e5880..00000000
--- a/spring-webflow-samples/fileupload/src/etc/filter.properties
+++ /dev/null
@@ -1,33 +0,0 @@
-# $Header$
-
-# Contains filterable project settings. Setting placeholders in filterable project text
-# files will be replaced with these values when the 'statics' build target is run.
-#
-# You may add static settings directly to this source file in the format:
-# setting=value e.g MY_SETTING=myvalue
-# This is appropriate usage if you know the setting value will never change.
-#
-# At build time this source file is copied to the ${target.dir} where additional
-# dynamic settings may be appended using the task. Use this approach
-# when a setting value depends on the build or the local user's environment.
-#
-# An example of this approach is shown below:
-#
-# build.xml
-#
-#
-#
-#
-#
-#
-#
-#
-# This allows for dynamic replacement values that are sourced from local properties files to facilitate
-# local user settings.
-#
-# To refer to filterable settings within project source files like config files, JSPs, or
-# other text files use the standard ant placeholder format:
-# @SETTING_NAME@ e.g, @MY_SETTING@ and @MY_LOCAL_SETTING@
-#
-# Your settings:
diff --git a/spring-webflow-samples/fileupload/src/etc/test-resources/log4j.properties b/spring-webflow-samples/fileupload/src/etc/test-resources/log4j.properties
deleted file mode 100644
index 37618f3a..00000000
--- a/spring-webflow-samples/fileupload/src/etc/test-resources/log4j.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-log4j.rootCategory=DEBUG, stdout, logfile
-
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
-
-log4j.appender.logfile=org.apache.log4j.RollingFileAppender
-log4j.appender.logfile.File=@TEST_RESULTS_DIR@/@PROJECT_NAME@.log
-log4j.appender.logfile.MaxFileSize=512KB
-
-# Keep three backup files
-log4j.appender.logfile.MaxBackupIndex=3
-log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
-#Pattern to output : date priority [category] - line_separator
-log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - <%m>%n
diff --git a/spring-webflow-samples/fileupload/src/main/java/org/springframework/webflow/samples/fileupload/FileUploadAction.java b/spring-webflow-samples/fileupload/src/main/java/org/springframework/webflow/samples/fileupload/FileUploadAction.java
deleted file mode 100644
index 20ada647..00000000
--- a/spring-webflow-samples/fileupload/src/main/java/org/springframework/webflow/samples/fileupload/FileUploadAction.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2004-2007 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.webflow.samples.fileupload;
-
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.webflow.action.AbstractAction;
-import org.springframework.webflow.execution.Event;
-import org.springframework.webflow.execution.RequestContext;
-
-public class FileUploadAction extends AbstractAction {
-
- protected Event doExecute(RequestContext context) throws Exception {
- MultipartFile file = context.getRequestParameters().getRequiredMultipartFile("file");
- if (file.getSize() > 0) {
- // data was uploaded
- context.getFlashScope().put("file", new String(file.getBytes()));
- return success();
- } else {
- return error();
- }
- }
-}
diff --git a/spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/classes/log4j.properties b/spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/classes/log4j.properties
deleted file mode 100644
index 5ba9222c..00000000
--- a/spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/classes/log4j.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-log4j.rootCategory=WARN, stdout
-
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
-
-# Enable web flow logging
-log4j.category.org.springframework.webflow=DEBUG
-log4j.category.org.springframework.binding=DEBUG
\ No newline at end of file
diff --git a/spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/fileupload-servlet.xml b/spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/fileupload-servlet.xml
deleted file mode 100644
index c3e304eb..00000000
--- a/spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/fileupload-servlet.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/fileupload.xml b/spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/fileupload.xml
deleted file mode 100644
index 9a007f55..00000000
--- a/spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/fileupload.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/jsp/fileForm.jsp b/spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/jsp/fileForm.jsp
deleted file mode 100644
index e96cb3ef..00000000
--- a/spring-webflow-samples/fileupload/src/main/webapp/WEB-INF/jsp/fileForm.jsp
+++ /dev/null
@@ -1,58 +0,0 @@
-<%@ page contentType="text/html" %>
-<%@ page session="false" %>
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
-
-
- Upload a File
-
-
-
-
-
-
-