From cc0f5dedd0143e91901cbd063c3fa927a4cca6b1 Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Sun, 28 Oct 2007 18:24:50 +0000 Subject: [PATCH] mvc support - wip preparing for release --- spring-binding/ivy.xml | 6 +- .../binding/expression/ExpressionParser.java | 7 +- .../support/AbstractExpressionParser.java | 2 +- spring-faces/ivy.xml | 3 +- spring-webflow-samples/booking-jsf/.classpath | 1 - spring-webflow-samples/booking-jsf/ivy.xml | 18 +- spring-webflow-samples/booking-mvc/.classpath | 9 + spring-webflow-samples/booking-mvc/.m7project | 16 ++ spring-webflow-samples/booking-mvc/.project | 42 +++ .../.settings/org.eclipse.jdt.core.prefs | 263 +++++++++++++++++ .../.settings/org.eclipse.jdt.ui.prefs | 53 ++++ .../.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 | 8 + .../org.eclipse.wst.validation.prefs | 7 + .../org.hibernate.eclipse.console.prefs | 5 + ...org.springframework.ide.eclipse.core.prefs | 34 +++ .../booking-mvc/.springBeans | 41 +++ .../booking-mvc/.springWebflow | 15 + spring-webflow-samples/booking-mvc/build.xml | 16 ++ .../booking-mvc/hibernate.cfg.xml | 9 + spring-webflow-samples/booking-mvc/ivy.xml | 43 +++ .../booking-mvc/project.properties | 10 + .../booking-mvc/src/etc/filter.properties | 33 +++ .../src/etc/test-resources/log4j.properties | 20 ++ .../src/main/java/META-INF/persistence.xml | 18 ++ .../booking-mvc/src/main/java/import.sql | 22 ++ .../webflow/samples/booking/app/Booking.java | 176 ++++++++++++ .../samples/booking/app/BookingService.java | 39 +++ .../webflow/samples/booking/app/Hotel.java | 103 +++++++ .../booking/app/JpaBookingService.java | 58 ++++ .../webflow/samples/booking/app/User.java | 59 ++++ .../booking/flow/booking/BookingActions.java | 67 +++++ .../booking/flow/main/MainActions.java | 66 +++++ .../booking/flow/main/SearchCriteria.java | 58 ++++ .../src/main/webapp/META-INF/MANIFEST.MF | 2 + .../webapp/WEB-INF/classes/log4j.properties | 11 + .../config/application-layer-config.xml | 44 +++ .../WEB-INF/config/web-application-config.xml | 53 ++++ .../src/main/webapp/WEB-INF/web.xml | 28 ++ .../src/main/webapp/css/screen.css | 265 ++++++++++++++++++ .../webapp/flow/booking/booking-beans.xml | 10 + .../src/main/webapp/flow/booking/booking.xml | 64 +++++ .../main/webapp/flow/booking/bookingForm.jsp | 154 ++++++++++ .../webapp/flow/booking/confirmBooking.jsp | 67 +++++ .../main/webapp/flow/booking/hotelDetails.jsp | 55 ++++ .../src/main/webapp/flow/main/main-beans.xml | 12 + .../src/main/webapp/flow/main/main.jsp | 106 +++++++ .../src/main/webapp/flow/main/main.xml | 55 ++++ .../booking-mvc/src/main/webapp/images/bg.gif | Bin 0 -> 163 bytes .../src/main/webapp/images/btn.bg.gif | Bin 0 -> 70 bytes .../src/main/webapp/images/diplomat.jpg | Bin 0 -> 17957 bytes .../src/main/webapp/images/header.jpg | Bin 0 -> 24347 bytes .../src/main/webapp/images/input.bg.gif | Bin 0 -> 122 bytes .../main/webapp/images/powered-by-spring.png | Bin 0 -> 6591 bytes .../src/main/webapp/images/spring-logo.jpg | Bin 0 -> 31339 bytes .../src/main/webapp/images/th.bg.gif | Bin 0 -> 152 bytes .../src/main/webapp/images/tse.gif | Bin 0 -> 2814 bytes .../src/main/webapp/images/webflow-logo.jpg | Bin 0 -> 2383 bytes .../booking-mvc/src/main/webapp/index.html | 5 + .../booking-mvc/src/main/webapp/template.jsp | 45 +++ .../src/test/java/log4j.properties | 9 + spring-webflow/ivy.xml | 22 +- .../servlet/ServletExternalContext.java | 136 +++++---- .../engine/builder/ViewFactoryCreator.java | 5 +- 66 files changed, 2410 insertions(+), 85 deletions(-) create mode 100755 spring-webflow-samples/booking-mvc/.classpath create mode 100755 spring-webflow-samples/booking-mvc/.m7project create mode 100755 spring-webflow-samples/booking-mvc/.project create mode 100755 spring-webflow-samples/booking-mvc/.settings/org.eclipse.jdt.core.prefs create mode 100755 spring-webflow-samples/booking-mvc/.settings/org.eclipse.jdt.ui.prefs create mode 100755 spring-webflow-samples/booking-mvc/.settings/org.eclipse.jpt.core.prefs create mode 100755 spring-webflow-samples/booking-mvc/.settings/org.eclipse.jst.common.project.facet.core.prefs create mode 100755 spring-webflow-samples/booking-mvc/.settings/org.eclipse.wst.common.component create mode 100755 spring-webflow-samples/booking-mvc/.settings/org.eclipse.wst.common.project.facet.core.xml create mode 100755 spring-webflow-samples/booking-mvc/.settings/org.eclipse.wst.validation.prefs create mode 100755 spring-webflow-samples/booking-mvc/.settings/org.hibernate.eclipse.console.prefs create mode 100755 spring-webflow-samples/booking-mvc/.settings/org.springframework.ide.eclipse.core.prefs create mode 100755 spring-webflow-samples/booking-mvc/.springBeans create mode 100755 spring-webflow-samples/booking-mvc/.springWebflow create mode 100755 spring-webflow-samples/booking-mvc/build.xml create mode 100755 spring-webflow-samples/booking-mvc/hibernate.cfg.xml create mode 100755 spring-webflow-samples/booking-mvc/ivy.xml create mode 100755 spring-webflow-samples/booking-mvc/project.properties create mode 100755 spring-webflow-samples/booking-mvc/src/etc/filter.properties create mode 100755 spring-webflow-samples/booking-mvc/src/etc/test-resources/log4j.properties create mode 100755 spring-webflow-samples/booking-mvc/src/main/java/META-INF/persistence.xml create mode 100755 spring-webflow-samples/booking-mvc/src/main/java/import.sql create mode 100755 spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/Booking.java create mode 100755 spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/BookingService.java create mode 100755 spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/Hotel.java create mode 100755 spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/JpaBookingService.java create mode 100755 spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/User.java create mode 100644 spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/flow/booking/BookingActions.java create mode 100644 spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/flow/main/MainActions.java create mode 100755 spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/flow/main/SearchCriteria.java create mode 100644 spring-webflow-samples/booking-mvc/src/main/webapp/META-INF/MANIFEST.MF create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/classes/log4j.properties create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/config/application-layer-config.xml create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/config/web-application-config.xml create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/web.xml create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/css/screen.css create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/booking-beans.xml create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/booking.xml create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/bookingForm.jsp create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/confirmBooking.jsp create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/hotelDetails.jsp create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/flow/main/main-beans.xml create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/flow/main/main.jsp create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/flow/main/main.xml create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/images/bg.gif create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/images/btn.bg.gif create mode 100644 spring-webflow-samples/booking-mvc/src/main/webapp/images/diplomat.jpg create mode 100644 spring-webflow-samples/booking-mvc/src/main/webapp/images/header.jpg create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/images/input.bg.gif create mode 100644 spring-webflow-samples/booking-mvc/src/main/webapp/images/powered-by-spring.png create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/images/spring-logo.jpg create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/images/th.bg.gif create mode 100644 spring-webflow-samples/booking-mvc/src/main/webapp/images/tse.gif create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/images/webflow-logo.jpg create mode 100755 spring-webflow-samples/booking-mvc/src/main/webapp/index.html create mode 100644 spring-webflow-samples/booking-mvc/src/main/webapp/template.jsp create mode 100755 spring-webflow-samples/booking-mvc/src/test/java/log4j.properties diff --git a/spring-binding/ivy.xml b/spring-binding/ivy.xml index 4c5e44d5..1f14e08f 100644 --- a/spring-binding/ivy.xml +++ b/spring-binding/ivy.xml @@ -13,9 +13,9 @@ - - - + + + 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 0f5b3092..3e785009 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 @@ -51,8 +51,11 @@ public interface ExpressionParser { * @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. + * example, Boolean.class for an expression that is expected to get or set a boolean value. Typically + * used to facilitate type conversion by the expression evaluator; for example, if a evaluated expression equates to + * a String value 'true', with an expected Boolean result the string value could be converted to a typed Boolean + * value. + * @param expressionVariables variables providing aliases for this expression during evaluation. Optional. * @return the evaluator for the parsed expression * @throws ParserException an exception occurred during parsing */ 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 5dca7269..4ffe3d66 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 @@ -35,7 +35,7 @@ public abstract class AbstractExpressionParser implements ExpressionParser { /** * The expression prefix. */ - private static final String DEFAULT_EXPRESSION_PREFIX = "${"; + private static final String DEFAULT_EXPRESSION_PREFIX = "#{"; /** * The expression suffix. diff --git a/spring-faces/ivy.xml b/spring-faces/ivy.xml index 8eac99ed..1cb8e85b 100644 --- a/spring-faces/ivy.xml +++ b/spring-faces/ivy.xml @@ -10,7 +10,6 @@ - @@ -40,7 +39,7 @@ - + diff --git a/spring-webflow-samples/booking-jsf/.classpath b/spring-webflow-samples/booking-jsf/.classpath index 372dcaf4..e7394167 100755 --- a/spring-webflow-samples/booking-jsf/.classpath +++ b/spring-webflow-samples/booking-jsf/.classpath @@ -5,6 +5,5 @@ - diff --git a/spring-webflow-samples/booking-jsf/ivy.xml b/spring-webflow-samples/booking-jsf/ivy.xml index 9c146ef9..91fe67ce 100755 --- a/spring-webflow-samples/booking-jsf/ivy.xml +++ b/spring-webflow-samples/booking-jsf/ivy.xml @@ -14,30 +14,28 @@ + - + - - - - + + + + - - - + - - + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/.classpath b/spring-webflow-samples/booking-mvc/.classpath new file mode 100755 index 00000000..e7394167 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/spring-webflow-samples/booking-mvc/.m7project b/spring-webflow-samples/booking-mvc/.m7project new file mode 100755 index 00000000..d7fcf628 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.m7project @@ -0,0 +1,16 @@ + + + + src/webapp + com.m7.webapp.java + + + + + + + + + + + diff --git a/spring-webflow-samples/booking-mvc/.project b/spring-webflow-samples/booking-mvc/.project new file mode 100755 index 00000000..ede89928 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.project @@ -0,0 +1,42 @@ + + + swf-booking-mvc + + + + + + 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.hibernate.eclipse.console.hibernateBuilder + + + + + + 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 + org.hibernate.eclipse.console.hibernateNature + + diff --git a/spring-webflow-samples/booking-mvc/.settings/org.eclipse.jdt.core.prefs b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.jdt.core.prefs new file mode 100755 index 00000000..dc8ffbcd --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,263 @@ +#Thu Aug 09 13:12:30 EDT 2007 +eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +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=4 +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=mixed +org.eclipse.jdt.core.formatter.tabulation.size=8 +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/booking-mvc/.settings/org.eclipse.jdt.ui.prefs b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.jdt.ui.prefs new file mode 100755 index 00000000..e0d5724c --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,53 @@ +#Thu Aug 09 13:12:30 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 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +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/booking-mvc/.settings/org.eclipse.jpt.core.prefs b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.jpt.core.prefs new file mode 100755 index 00000000..102d5856 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.jpt.core.prefs @@ -0,0 +1,5 @@ +#Thu Aug 09 13:12:30 EDT 2007 +eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.jpt.core.discoverAnnotatedClasses=true +org.eclipse.jpt.core.platform=generic diff --git a/spring-webflow-samples/booking-mvc/.settings/org.eclipse.jst.common.project.facet.core.prefs b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.jst.common.project.facet.core.prefs new file mode 100755 index 00000000..7a3d18a6 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.jst.common.project.facet.core.prefs @@ -0,0 +1,5 @@ +#Thu Aug 09 13:12:30 EDT 2007 +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 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true diff --git a/spring-webflow-samples/booking-mvc/.settings/org.eclipse.wst.common.component b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.wst.common.component new file mode 100755 index 00000000..a82589ae --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.wst.common.component @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/spring-webflow-samples/booking-mvc/.settings/org.eclipse.wst.common.project.facet.core.xml b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100755 index 00000000..cddf50bf --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/spring-webflow-samples/booking-mvc/.settings/org.eclipse.wst.validation.prefs b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.wst.validation.prefs new file mode 100755 index 00000000..f5f51015 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,7 @@ +#Thu Aug 09 13:12:30 EDT 2007 +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 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true diff --git a/spring-webflow-samples/booking-mvc/.settings/org.hibernate.eclipse.console.prefs b/spring-webflow-samples/booking-mvc/.settings/org.hibernate.eclipse.console.prefs new file mode 100755 index 00000000..968ada6c --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.settings/org.hibernate.eclipse.console.prefs @@ -0,0 +1,5 @@ +#Thu Aug 09 13:12:30 EDT 2007 +default.configuration=swf-booking-jsf +eclipse.preferences.version=1 +hibernate3.enabled=true +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true diff --git a/spring-webflow-samples/booking-mvc/.settings/org.springframework.ide.eclipse.core.prefs b/spring-webflow-samples/booking-mvc/.settings/org.springframework.ide.eclipse.core.prefs new file mode 100755 index 00000000..c2d8ea59 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.settings/org.springframework.ide.eclipse.core.prefs @@ -0,0 +1,34 @@ +#Thu Aug 09 13:12:30 EDT 2007 +eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true +org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true diff --git a/spring-webflow-samples/booking-mvc/.springBeans b/spring-webflow-samples/booking-mvc/.springBeans new file mode 100755 index 00000000..7df5daff --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.springBeans @@ -0,0 +1,41 @@ + + + + xml + + + src/main/webapp/WEB-INF/config/application-layer-config.xml + src/main/webapp/WEB-INF/config/web-application-config.xml + src/main/webapp/flow/main/main-beans.xml + src/main/webapp/flow/booking/booking-beans.xml + + + + + true + false + + src/main/webapp/WEB-INF/config/application-layer-config.xml + src/main/webapp/WEB-INF/config/web-application-config.xml + + + + + true + false + + src/main/webapp/flow/booking/booking-beans.xml + src/main/webapp/WEB-INF/config/application-layer-config.xml + + + + + true + false + + src/main/webapp/flow/main/main-beans.xml + src/main/webapp/WEB-INF/config/application-layer-config.xml + + + + diff --git a/spring-webflow-samples/booking-mvc/.springWebflow b/spring-webflow-samples/booking-mvc/.springWebflow new file mode 100755 index 00000000..737a5617 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/.springWebflow @@ -0,0 +1,15 @@ + + + + + src/main/webapp/flow/booking/booking.xml + + + + + src/main/webapp/flow/main/main.xml + + + + + diff --git a/spring-webflow-samples/booking-mvc/build.xml b/spring-webflow-samples/booking-mvc/build.xml new file mode 100755 index 00000000..9b9e1520 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/build.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/hibernate.cfg.xml b/spring-webflow-samples/booking-mvc/hibernate.cfg.xml new file mode 100755 index 00000000..3d1b6a6d --- /dev/null +++ b/spring-webflow-samples/booking-mvc/hibernate.cfg.xml @@ -0,0 +1,9 @@ + + + + + org.hibernate.dialect.HSQLDialect + + diff --git a/spring-webflow-samples/booking-mvc/ivy.xml b/spring-webflow-samples/booking-mvc/ivy.xml new file mode 100755 index 00000000..7794a977 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/ivy.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/project.properties b/spring-webflow-samples/booking-mvc/project.properties new file mode 100755 index 00000000..f80ab3a7 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/project.properties @@ -0,0 +1,10 @@ +# 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.5 +javac.target=1.5 + +# Do not publish built artifacts to the integration repository +do.publish=false \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/etc/filter.properties b/spring-webflow-samples/booking-mvc/src/etc/filter.properties new file mode 100755 index 00000000..c54e5880 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/etc/filter.properties @@ -0,0 +1,33 @@ +# $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/booking-mvc/src/etc/test-resources/log4j.properties b/spring-webflow-samples/booking-mvc/src/etc/test-resources/log4j.properties new file mode 100755 index 00000000..59974077 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/etc/test-resources/log4j.properties @@ -0,0 +1,20 @@ +log4j.rootCategory=WARN, 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=${@PROJECT_WEBAPP_NAME@.root}/@PROJECT_WEBAPP_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 + +#Enable webflow debug logging +log4j.category.org.springframework.webflow=DEBUG +log4j.category.org.springframework.binding=DEBUG diff --git a/spring-webflow-samples/booking-mvc/src/main/java/META-INF/persistence.xml b/spring-webflow-samples/booking-mvc/src/main/java/META-INF/persistence.xml new file mode 100755 index 00000000..4ad486f6 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/java/META-INF/persistence.xml @@ -0,0 +1,18 @@ + + + + org.hibernate.ejb.HibernatePersistence + org.springframework.webflow.samples.booking.app.User + org.springframework.webflow.samples.booking.app.Booking + org.springframework.webflow.samples.booking.app.Hotel + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/java/import.sql b/spring-webflow-samples/booking-mvc/src/main/java/import.sql new file mode 100755 index 00000000..7c57d9d0 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/java/import.sql @@ -0,0 +1,22 @@ +insert into Customer (username, password, name) values ('springer', 'springrocks', 'Springer') +insert into Hotel (id, price, name, address, city, state, zip, country) values (1, 199, 'Westin Diplomat', '3555 S. Ocean Drive', 'Hollywood', 'FL', '33019', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (2, 120, 'Marriott Courtyard', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (3, 180, 'Doubletree', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (4, 450, 'W Hotel', 'Union Square, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (5, 450, 'W Hotel', 'Lexington Ave, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (6, 250, 'Hotel Rouge', '1315 16th Street NW', 'Washington', 'DC', '20036', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (7, 300, '70 Park Avenue Hotel', '70 Park Avenue', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (8, 300, 'Conrad Miami', '1395 Brickell Ave', 'Miami', 'FL', '33131', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (9, 80, 'Sea Horse Inn', '2106 N Clairemont Ave', 'Eau Claire', 'WI', '54703', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (10, 90, 'Super 8 Eau Claire Campus Area', '1151 W Macarthur Ave', 'Eau Claire', 'WI', '54701', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (11, 160, 'Marriot Downtown', '55 Fourth Street', 'San Francisco', 'CA', '94103', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (12, 200, 'Hilton Diagonal Mar', 'Passeig del Taulat 262-264', 'Barcelona', 'Catalunya', '08019', 'Spain') +insert into Hotel (id, price, name, address, city, state, zip, country) values (13, 210, 'Hilton Tel Aviv', 'Independence Park', 'Tel Aviv', '', '63405', 'Israel') +insert into Hotel (id, price, name, address, city, state, zip, country) values (14, 240, 'InterContinental Tokyo Bay', 'Takeshiba Pier', 'Tokyo', '', '105', 'Japan') +insert into Hotel (id, price, name, address, city, state, zip, country) values (15, 130, 'Hotel Beaulac', ' Esplanade Léopold-Robert 2', 'Neuchatel', '', '2000', 'Switzerland') +insert into Hotel (id, price, name, address, city, state, zip, country) values (16, 140, 'Conrad Treasury Place', 'William & George Streets', 'Brisbane', 'QLD', '4001', 'Australia') +insert into Hotel (id, price, name, address, city, state, zip, country) values (17, 230, 'Ritz Carlton', '1228 Sherbrooke St', 'West Montreal', 'Quebec', 'H3G1H6', 'Canada') +insert into Hotel (id, price, name, address, city, state, zip, country) values (18, 460, 'Ritz Carlton', 'Peachtree Rd, Buckhead', 'Atlanta', 'GA', '30326', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (19, 220, 'Swissotel', '68 Market Street', 'Sydney', 'NSW', '2000', 'Australia') +insert into Hotel (id, price, name, address, city, state, zip, country) values (20, 250, 'Meliá White House', 'Albany Street', 'Regents Park London', '', 'NW13UP', 'Great Britain') +insert into Hotel (id, price, name, address, city, state, zip, country) values (21, 210, 'Hotel Allegro', '171 West Randolph Street', 'Chicago', 'IL', '60601', 'USA') diff --git a/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/Booking.java b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/Booking.java new file mode 100755 index 00000000..22edfe95 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/Booking.java @@ -0,0 +1,176 @@ +package org.springframework.webflow.samples.booking.app; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.util.Calendar; +import java.util.Date; + +import javax.persistence.Basic; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; + +/** + * A Hotel Booking made by a User. + */ +@Entity +public class Booking implements Serializable { + private Long id; + + private User user; + + private Hotel hotel; + + private Date checkinDate; + + private Date checkoutDate; + + private String creditCard; + + private String creditCardName; + + private int creditCardExpiryMonth; + + private int creditCardExpiryYear; + + private boolean smoking; + + private int beds; + + public Booking() { + } + + public Booking(Hotel hotel, User user) { + this.hotel = hotel; + this.user = user; + Calendar calendar = Calendar.getInstance(); + setCheckinDate(calendar.getTime()); + calendar.add(Calendar.DAY_OF_MONTH, 1); + setCheckoutDate(calendar.getTime()); + } + + @Transient + public BigDecimal getTotal() { + return hotel.getPrice().multiply(new BigDecimal(getNights())); + } + + @Transient + public int getNights() { + return (int) (checkoutDate.getTime() - checkinDate.getTime()) / 1000 / 60 / 60 / 24; + } + + @Id + @GeneratedValue(strategy = GenerationType.TABLE) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + @Basic + @Temporal(TemporalType.DATE) + public Date getCheckinDate() { + return checkinDate; + } + + public void setCheckinDate(Date datetime) { + this.checkinDate = datetime; + } + + @ManyToOne + public Hotel getHotel() { + return hotel; + } + + public void setHotel(Hotel hotel) { + this.hotel = hotel; + } + + @ManyToOne + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + @Basic + @Temporal(TemporalType.DATE) + public Date getCheckoutDate() { + return checkoutDate; + } + + public void setCheckoutDate(Date checkoutDate) { + this.checkoutDate = checkoutDate; + } + + public String getCreditCard() { + return creditCard; + } + + public void setCreditCard(String creditCard) { + this.creditCard = creditCard; + } + + @Transient + public String getDescription() { + DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); + return hotel == null ? null : hotel.getName() + ", " + df.format(getCheckinDate()) + " to " + + df.format(getCheckoutDate()); + } + + public boolean isSmoking() { + return smoking; + } + + public void setSmoking(boolean smoking) { + this.smoking = smoking; + } + + public int getBeds() { + return beds; + } + + public void setBeds(int beds) { + this.beds = beds; + } + + public String getCreditCardName() { + return creditCardName; + } + + public void setCreditCardName(String creditCardName) { + this.creditCardName = creditCardName; + } + + public int getCreditCardExpiryMonth() { + return creditCardExpiryMonth; + } + + public void setCreditCardExpiryMonth(int creditCardExpiryMonth) { + this.creditCardExpiryMonth = creditCardExpiryMonth; + } + + public int getCreditCardExpiryYear() { + return creditCardExpiryYear; + } + + public void setCreditCardExpiryYear(int creditCardExpiryYear) { + this.creditCardExpiryYear = creditCardExpiryYear; + } + + @Override + public String toString() { + return "Booking(" + user + "," + hotel + ")"; + } + +} diff --git a/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/BookingService.java b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/BookingService.java new file mode 100755 index 00000000..80b3b023 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/BookingService.java @@ -0,0 +1,39 @@ +package org.springframework.webflow.samples.booking.app; + +import java.util.List; + +/** + * A service interface for retrieving hotels and bookings from a backing repository. Also supports the ability to cancel + * a booking. + */ +public interface BookingService { + + /** + * Find bookings made by the given user + * @param username the user's name + * @return their bookings + */ + public List findBookings(String username); + + /** + * Find hotels available for booking by some criteria. + * @param searchString the search query string to filter hotels by name + * @param pageSize the page size + * @param page the current page + * @return a list of hotels not exceeding the page size + */ + public List findHotels(String searchString, int pageSize, int page); + + /** + * Find hotels by their identifier. + * @param id the hotel id + * @return the hotel + */ + public Hotel findHotelById(Long id); + + /** + * Cancel an existing booking. + * @param id the booking id + */ + public void cancelBooking(Long id); +} diff --git a/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/Hotel.java b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/Hotel.java new file mode 100755 index 00000000..bef830c5 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/Hotel.java @@ -0,0 +1,103 @@ +package org.springframework.webflow.samples.booking.app; + +import java.io.Serializable; +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +/** + * A hotel where users may book stays. + */ +@Entity +public class Hotel implements Serializable { + private Long id; + + private String name; + + private String address; + + private String city; + + private String state; + + private String zip; + + private String country; + + private BigDecimal price; + + @Id + @GeneratedValue + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getZip() { + return zip; + } + + public void setZip(String zip) { + this.zip = zip; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + @Column(precision = 6, scale = 2) + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + @Override + public String toString() { + return "Hotel(" + name + "," + address + "," + city + "," + zip + ")"; + } +} diff --git a/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/JpaBookingService.java b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/JpaBookingService.java new file mode 100755 index 00000000..a4a92f19 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/JpaBookingService.java @@ -0,0 +1,58 @@ +package org.springframework.webflow.samples.booking.app; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +/** + * A JPA-based implementation of the Booking Service. Delegates to a JPA entity manager to issue data access calls + * against the backing repository. The EntityManager reference is provided by the managing container (Spring) + * automatically. + */ +@Repository +public class JpaBookingService implements BookingService { + + private EntityManager em; + + @PersistenceContext + public void setEntityManager(EntityManager em) { + this.em = em; + } + + @Transactional(readOnly = true) + @SuppressWarnings("unchecked") + public List findBookings(String username) { + return em.createQuery("select b from Booking b where b.user.username = :username order by b.checkinDate") + .setParameter("username", username).getResultList(); + } + + @Transactional(readOnly = true) + @SuppressWarnings("unchecked") + public List findHotels(String searchString, int pageSize, int page) { + String pattern = !StringUtils.hasText(searchString) ? "'%'" : "'%" + + searchString.toLowerCase().replace('*', '%') + "%'"; + return em.createQuery( + "select h from Hotel h where lower(h.name) like " + pattern + " or lower(h.city) like " + pattern + + " or lower(h.zip) like " + pattern + " or lower(h.address) like " + pattern).setMaxResults( + pageSize).setFirstResult(page * pageSize).getResultList(); + } + + @Transactional(readOnly = true) + public Hotel findHotelById(Long id) { + return em.find(Hotel.class, id); + } + + // this one is a read/write transaction + @Transactional + public void cancelBooking(Long id) { + Booking booking = em.find(Booking.class, id); + if (booking != null) { + em.remove(booking); + } + } +} \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/User.java b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/User.java new file mode 100755 index 00000000..ee436b92 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/app/User.java @@ -0,0 +1,59 @@ +package org.springframework.webflow.samples.booking.app; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * A user who can book hotels. + */ +@Entity +@Table(name = "Customer") +public class User implements Serializable { + private String username; + + private String password; + + private String name; + + public User() { + } + + public User(String username, String password, String name) { + this.username = username; + this.password = password; + this.name = name; + } + + @Id + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "User(" + username + ")"; + } +} diff --git a/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/flow/booking/BookingActions.java b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/flow/booking/BookingActions.java new file mode 100644 index 00000000..e0966ed0 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/flow/booking/BookingActions.java @@ -0,0 +1,67 @@ +package org.springframework.webflow.samples.booking.flow.booking; + +import java.util.Calendar; + +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; +import org.springframework.webflow.samples.booking.app.Booking; +import org.springframework.webflow.samples.booking.app.Hotel; +import org.springframework.webflow.samples.booking.app.User; + +/** + * Actions invoked by the booking flow. These actions are extensions of the flow definition, called by the flow + * definition at the appropriate points. Actions allow an externalized flow definition to delegate out to Java code to + * perform processing. + */ +public class BookingActions extends MultiAction { + + /** + * Create a new booking object and register it with the flow-managed entity manager. The booking is not actually + * flushed to the database at this time; that only occurs when the booking flow reaches its "bookingAuthorized" + * end-state, which is a "commit" state. + * + * It is expected a future milestone of Spring Web Flow 2.0 will support Flows being defined fully in Java and + * Groovy, allowing logic like this to be defined with the flow definition and without the attribute lookup code you + * see here. + * @param context the current flow execution request context + * @return success if the booking was created successfully. + */ + public Event createBooking(RequestContext context) { + Hotel hotel = (Hotel) context.getFlowScope().get("hotel"); + User user = (User) context.getConversationScope().get("user"); + Booking booking = new Booking(hotel, user); + EntityManager em = (EntityManager) context.getFlowScope().get("entityManager"); + em.persist(booking); + context.getFlowScope().put("booking", booking); + return success(); + } + + /** + * Perform some custom server-side validation on the flow-scoped Booking object updated by the booking form. + * + * It is expected a future milestone of Spring Web Flow 2.0 will add a Messages abstraction that decouples SWF + * artifacts from environment-specific constructs like the FacesContext. + * @param context the current flow execution request context + * @return success if validation was successful, error if not + */ + public Event validateBooking(RequestContext context) { + Booking booking = (Booking) context.getFlowScope().get("booking"); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, -1); + if (booking.getCheckinDate().before(calendar.getTime())) { + 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())) { + 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-mvc/src/main/java/org/springframework/webflow/samples/booking/flow/main/MainActions.java b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/flow/main/MainActions.java new file mode 100644 index 00000000..b8e77777 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/flow/main/MainActions.java @@ -0,0 +1,66 @@ +package org.springframework.webflow.samples.booking.flow.main; + +import java.util.List; + +import org.springframework.webflow.action.MultiAction; +import org.springframework.webflow.execution.Event; +import org.springframework.webflow.execution.RequestContext; +import org.springframework.webflow.samples.booking.app.Booking; +import org.springframework.webflow.samples.booking.app.BookingService; +import org.springframework.webflow.samples.booking.app.Hotel; +import org.springframework.webflow.samples.booking.app.User; + +/** + * Actions invoked by the main flow. These actions are extensions of the flow definition, called by the flow definition + * at the appropriate points. Actions allow an externalized flow definition to delegate out to Java code to perform + * processing. + */ +public class MainActions extends MultiAction { + + private BookingService bookingService; + + /** + * Constructs a new multi-action for the main flow that will delegate to the provided booking service + * @param bookingService the booking service + */ + public MainActions(BookingService bookingService) { + this.bookingService = bookingService; + } + + /** + * Simply put a dummy user in conversation scope to simulate a user login. In the future this sample may add user + * authentication support. + * @param context the current flow execution request context + * @return success + */ + public Event initCurrentUser(RequestContext context) { + User user = new User("springer", "springrocks", "Springer"); + context.getConversationScope().put("user", user); + return success(); + } + + /** + * Find all active bookings made by the current user. + * @param context the current flow execution request context + * @return success + */ + public Event findCurrentUserBookings(RequestContext context) { + User user = (User) context.getConversationScope().get("user"); + List bookings = bookingService.findBookings(user.getUsername()); + context.getFlowScope().put("bookings", bookings); + return success(); + } + + /** + * Find all hotels that meet the current search criteria in flow scope. + * @param context the current flow execution request context + * @return success + */ + public Event findHotels(RequestContext context) { + SearchCriteria search = (SearchCriteria) context.getFlowScope().get("searchCriteria"); + List hotels = bookingService + .findHotels(search.getSearchString(), search.getPageSize(), search.getPage()); + context.getFlowScope().put("hotels", hotels); + return success(); + } +} diff --git a/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/flow/main/SearchCriteria.java b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/flow/main/SearchCriteria.java new file mode 100755 index 00000000..be54bd92 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/flow/main/SearchCriteria.java @@ -0,0 +1,58 @@ +package org.springframework.webflow.samples.booking.flow.main; + +import java.io.Serializable; + +import org.springframework.webflow.samples.booking.app.BookingService; + +/** + * A backing bean for the main hotel search form. Encapsulates the criteria needed to perform a hotel search. + * + * It is expected a future milestone of Spring Web Flow 2.0 will allow flow-scoped beans like this one to hold + * references to transient services that are restored automatically when the flow is resumed on subsequent requests. + * This would allow this SearchCriteria object to delegate to the {@link BookingService} directly, for example, + * eliminating the need for the actions in {@link MainActions}. + */ +public class SearchCriteria implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * The user-provided search criteria for finding Hotels. + */ + private String searchString; + + /** + * The maximum page size of the Hotel result list + */ + private int pageSize; + + /** + * The current page of the Hotel result list. + */ + private int page; + + public String getSearchString() { + return searchString; + } + + public void setSearchString(String searchString) { + this.searchString = searchString; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + +} diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/META-INF/MANIFEST.MF b/spring-webflow-samples/booking-mvc/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 00000000..58630c02 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/classes/log4j.properties b/spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/classes/log4j.properties new file mode 100755 index 00000000..992d816d --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/classes/log4j.properties @@ -0,0 +1,11 @@ +log4j.rootCategory=INFO, 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.faces=DEBUG +log4j.category.org.springframework.binding=DEBUG +log4j.category.org.springframework.transaction=DEBUG \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/config/application-layer-config.xml b/spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/config/application-layer-config.xml new file mode 100755 index 00000000..d24018ac --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/config/application-layer-config.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/config/web-application-config.xml b/spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/config/web-application-config.xml new file mode 100755 index 00000000..9e6b1981 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/config/web-application-config.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/web.xml b/spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/web.xml new file mode 100755 index 00000000..472779f2 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,28 @@ + + + + + + Spring MVC Dispatcher Servlet + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + /WEB-INF/config/web-application-config.xml + + 1 + + + + + Spring MVC Dispatcher Servlet + /spring/* + + + + index.html + + + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/css/screen.css b/spring-webflow-samples/booking-mvc/src/main/webapp/css/screen.css new file mode 100755 index 00000000..c09ea787 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/css/screen.css @@ -0,0 +1,265 @@ +/* Setup defaults since variable in browsers +----------------------------------------------- */ +body, div, dd, dt, dl, img, ul, ol, li, p, h1, h2, h3, h4, h5, form, hr, fieldset { + margin: 0; + padding: 0; +} +/* Element Defaults +----------------------------------------------- */ +html { + height: 100%; + background-color: #9cac7c; +} +img { + border: 0; +} +body { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: small; + line-height: 1.25em; + color: #362F2D; + position: relative; + width: 760px; + height: 100%; + margin-left: auto; + margin-right: auto; +} +label { + font-weight: bold; + color: #5E5147; +} +input { + border: 1px solid #C3BBB6; + padding: 4px; + margin: 5px 0; + background: #fff url(../images/input.bg.gif) 0 0 repeat-x; +} +select { + border: 1px solid #C3BBB6; + padding: 4px; + margin: 5px 0; + background: #fff url(../images/input.bg.gif) 0 0 repeat-x; +}ol, ul { + margin: 10px 0px 10px 6px; +} +li { + margin: 10px 12px; +} +fieldset { + border: 0; +} +/* Layout +----------------------------------------------- */ +#document { + padding: 0 1px; + background: #fff url(../images/bg.gif) 0 0 repeat-y; + float: left; + border-bottom: 1px solid #C3BBB6; +} +#header { + float: left; + width: 758px; + height:36px; + background-color: #414f23; +} +#container { + float: left; + width: 758px; + background: url(../images/header.jpg) 0 0 repeat-x; +} +#sidebar { + float: left; + width: 205px; + margin-left: 5px; + margin-top: 185px; + padding-top: 5px; +} +#content { + float: left; + width: 448px; + margin-top: 195px; + padding-top: 5px; + background: #fff url(../images/cnt.bg.gif) 0 0 repeat-x; +} +#footer { + clear: both; + margin-top: 40px; + float: left; + padding: 20px; + border-top: 1px solid #C3BBB6; + background-color: #fff; + width: 718px; + text-align: right; +} +/* General +----------------------------------------------- */ +input[type="submit"], input[type="button"] { + font-weight: bold; + color: #fff; + border: 1px solid #5D1414; + height: 26px; + background: #fff url(../images/btn.bg.gif) 0 0 repeat-x; + border-style: none; +} +.center { + text-align: center; +} +.entry { + clear: both; + padding-top: 10px; +} +.entry .label { + float: left; + padding-top: 10px; + padding-right: 5px; + font-weight: bold; + width: 150px; + text-align: right; +} +.entry .output { + float: left; + width: 250px; + padding-top: 10px; + text-align: left; +} +.entry .input { + float: left; + width: 250px; + text-align: left; +} +/* Sidebar +----------------------------------------------- */ +.notes { + text-align: center; + font-size: small; +} +.errors { + font-size: small; + font-weight: bold; + text-align: center; + color: #600; +} +.errors div { + text-align: left; +} +.errors input { + border: 1px solid #600; +} +.errors ul { + list-style: none; +} +.buttonBox { + text-align: center; + padding: 5px 0; +} +#sidebar p { + font-size: small; + color: #8B7869; + line-height: 150%; + padding-top: 10px; + padding-bottom: 10px; + padding-left: 5px; + padding-right: 5px; +} +#sidebar li { + font-size: small; + color: #8B7869; +} +#sidebar h1 { + line-height: normal; + font-weight: bold; + font-size: small; +} +/* +#sidebar p:hover { + color: #362F2D; +} +*/ +/* Content +----------------------------------------------- */ +#content .section { + float: left; + width: 518px; + padding: 15px 15px 0 10px; +} +#content .section h1 { + font-family: "Trebuchet MS", Arial, sans-serif; + line-height: normal; + font-weight: normal; + font-size: large; +} +#content .section p { + line-height: 150%; + padding: 10px 0; + font-size: small; +} +#content table { + width: 100%; + border: 1px solid #D2C9C4; + border-collapse: collapse; +} +#content table caption { + padding-bottom: 6px; + text-align: left; + font-weight: bold; +} +#content table thead th { + border-left: 1px solid #D2C9C4; + background: #fff url(../images/th.bg.gif) 0 100% repeat-x; + border-bottom: 1px solid #D2C9C4; + padding: 6px; + text-align: left; + font-size: small; +} +#content table tbody td { + border-left: 1px solid #E4DBD5; + padding: 4px; + border-bottom: 1px solid #D2C9C4; + font-size: 8pt; +} +#content dt { + font-weight: bold; + float: left; + width: 33%; +} +#content dd { + padding-left: 10px; + float: left; + width: 66%; +} +#radio table { + border: 0px; +} +#radio table tr td { + border: 0px; + border-left: 0px; + border-bottom: 0px; +} +#content .section .prev { + float: left; + width: 120px; +} +#content .section .next { + float: left; +} +/* Header +----------------------------------------------- */ +#title { + float: left; + padding: 10px 0 6px 15px; + color: #e9efdb; +} +#status { + color: #e9efdb; + float: right; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-weight: bold; + font-size: x-small; + text-align: right; + padding-top: 14px; + padding-right: 15px; +} +#status a { + color: #e9efdb; + text-decoration: none; +} diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/booking-beans.xml b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/booking-beans.xml new file mode 100755 index 00000000..141de522 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/booking-beans.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/booking.xml b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/booking.xml new file mode 100755 index 00000000..78b3de0e --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/booking.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/bookingForm.jsp b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/bookingForm.jsp new file mode 100755 index 00000000..91bf8226 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/bookingForm.jsp @@ -0,0 +1,154 @@ +<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %> + + + + +
+

Book Hotel

+
+ +
+ + +
+
+
Name:
+
#{hotel.name}
+
+
+
Address:
+
#{hotel.address}
+
+
+
City, State:
+
#{hotel.city}, #{hotel.state}
+
+
+
Zip:
+
#{hotel.zip}
+
+
+
Country:
+
#{hotel.country}
+
+
+
Nightly rate:
+
+ + + +
+
+
+
+ Check In Date: +
+
+ + + + + +
+
+
+
+ Check Out Date: +
+
+ + + + + +
+
+
+
+ Room Preference: +
+
+ + + + + +
+
+
+
+ Smoking Preference: +
+
+ + + + +
+
+
+
+ Credit Card #: +
+
+ + + +
+
+
+
+ Credit Card Name: +
+
+ + + +
+
+
+
+ Credit Card Expiry: +
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
 
+
+ + +   + +
+
+
+
+
+ +
+
\ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/confirmBooking.jsp b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/confirmBooking.jsp new file mode 100755 index 00000000..1c439e80 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/confirmBooking.jsp @@ -0,0 +1,67 @@ +<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %> + + + + +
+

Confirm Hotel Booking

+
+ +
+ +
+
+
Name:
+
#{hotel.name}
+
+
+
Address:
+
#{hotel.address}
+
+
+
City, State:
+
#{hotel.city}, #{hotel.state}
+
+
+
Zip:
+
#{hotel.zip}
+
+
+
Country:
+
#{hotel.country}
+
+
+
Total payment:
+
+ + + +
+
+
+
Check In Date:
+
+
+
+
Check Out Date:
+
+
+
+
Credit Card #:
+
#{booking.creditCard}
+
+
+
 
+
+   +   + +
+
+
+
+
+ +
+
diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/hotelDetails.jsp b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/hotelDetails.jsp new file mode 100755 index 00000000..1cac7c6f --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/booking/hotelDetails.jsp @@ -0,0 +1,55 @@ +<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %> + + + + +
+

View Hotel

+
+ +
+
+
Name:
+
#{hotel.name}
+
+
+
Address:
+
#{hotel.address}
+
+
+
City:
+
#{hotel.city}
+
+
+
State:
+
#{hotel.state}
+
+
+
Zip:
+
#{hotel.zip}
+
+
+
Country:
+
#{hotel.country}
+
+
+
Nightly rate:
+
+ + + +
+
+
+ +
+ +
+   + +
+
+
+ + +
\ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/flow/main/main-beans.xml b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/main/main-beans.xml new file mode 100755 index 00000000..c7bcf493 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/main/main-beans.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/flow/main/main.jsp b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/main/main.jsp new file mode 100755 index 00000000..67f20c9a --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/main/main.jsp @@ -0,0 +1,106 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + + + + + +
+ + + +

Search Hotels

+
+ + + + + + + + + +
+
+ +
+ + No Hotels Found + + + + + + + + + + + + + + + + + + + + + +
NameAddressCity, StateZip
#{hotel.name}#{hotel.address}#{hotel.city}, #{hotel.state}, #{hotel.country}#{hotel.zip} + + + + + View Hotel +
+
+ +
+

Current Hotel Bookings

+
+ +
+ + No Bookings Found + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAddressCity, StateCheck in DateCheck out DateConfirmation NumberAction
#{booking.hotel.name}#{booking.hotel.address}#{booking.hotel.city}, #{booking.hotel.state}#{booking.checkinDate}#{booking.checkoutDate}#{booking.id} + + + + + Cancel +
+
+ +
+ +
+
\ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/flow/main/main.xml b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/main/main.xml new file mode 100755 index 00000000..b103e0e2 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/flow/main/main.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/images/bg.gif b/spring-webflow-samples/booking-mvc/src/main/webapp/images/bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..ea9200df6e3a4793cfc2574316bb7f9fd524a28c GIT binary patch literal 163 zcmV;U09^k^Nk%w1VfX?H0Du4h|NsBPyS6L<0002^0tx^C0)h;VsmtvTqnxzbi?PYP z`wxcVNS5Y_rs~S3!Pds|Ofzte=lag~{tpaVUc#agcRMPV%%<}RWfG&*>LY2*YPa03 zS2z8Njo7jIj83bg;k7$fe#__dy1mlA>pSti{|^|*)+bnqKxmk#xX3t?*I0-MIZ0VL R`DnQ(naSDdDHl)x06R9!R8If^ literal 0 HcmV?d00001 diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/images/btn.bg.gif b/spring-webflow-samples/booking-mvc/src/main/webapp/images/btn.bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..b77cc95436986ef6d571c37d6407984d283da78a GIT binary patch literal 70 zcmZ?wbhEHbWMxohXkcVWUF7ut|9{1QqRvIBi6yBi3gww4844j8sS56%z5xt63_t)< X%D}|a(!cWbTmHp!wnT+6FjxZs5JDBN literal 0 HcmV?d00001 diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/images/diplomat.jpg b/spring-webflow-samples/booking-mvc/src/main/webapp/images/diplomat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e1d0c9cd21b819bc8b90d43d849aa1b2e84e0bbe GIT binary patch literal 17957 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%0D||y-s?!IaYc77pjuz%bRgfG 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 B20Z`( literal 0 HcmV?d00001 diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/images/input.bg.gif b/spring-webflow-samples/booking-mvc/src/main/webapp/images/input.bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..8ebf87e3108dbbec8565935bb1fa42ebac04d0a3 GIT binary patch literal 122 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 literal 0 HcmV?d00001 diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/images/spring-logo.jpg b/spring-webflow-samples/booking-mvc/src/main/webapp/images/spring-logo.jpg new file mode 100755 index 0000000000000000000000000000000000000000..62be39835f2d980befae3ec961b6b10e7d1fca6f GIT binary patch literal 31339 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%0Dgs02_0)mtC0O8J0`s=@(mN;yyuh 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 HzQ6z3m$6-^ literal 0 HcmV?d00001 diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/images/th.bg.gif b/spring-webflow-samples/booking-mvc/src/main/webapp/images/th.bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..7ab7c249182230cad000f9e971057c6afe738081 GIT binary patch literal 152 zcmZ?wbhEHbWM@!j*v!E2`^&SxzrOtY^Xt!#x4%9;{Pp?qpC2Fo{r&U%>&t)t{`~v% z{XY-@S>Ip({q^zBx3`KvSr|Y-2Sk9(U|?}AIO(~1uf^-Lxk(8#WS$sKTd`oB&gwlM zq*+eIoUfQ?UGrYzz=A{v9X>f1l}(Kq7IQmRh%l~*T7M%a@$_3Uj_9TeAHCVi4AubR CKT_fV literal 0 HcmV?d00001 diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/images/tse.gif b/spring-webflow-samples/booking-mvc/src/main/webapp/images/tse.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1fa98cf57617b6c613572f4db3e70518f5ed0c9 GIT binary patch literal 2814 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 Pr%*S>8-PL?@;Cnig|{u< literal 0 HcmV?d00001 diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/index.html b/spring-webflow-samples/booking-mvc/src/main/webapp/index.html new file mode 100755 index 00000000..4b8dc35b --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/index.html @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/main/webapp/template.jsp b/spring-webflow-samples/booking-mvc/src/main/webapp/template.jsp new file mode 100644 index 00000000..4eeda536 --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/main/webapp/template.jsp @@ -0,0 +1,45 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %> + + + + + Spring Faces: Hotel Booking Sample Application + + + + + +
+ +
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/spring-webflow-samples/booking-mvc/src/test/java/log4j.properties b/spring-webflow-samples/booking-mvc/src/test/java/log4j.properties new file mode 100755 index 00000000..5ba9222c --- /dev/null +++ b/spring-webflow-samples/booking-mvc/src/test/java/log4j.properties @@ -0,0 +1,9 @@ +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/ivy.xml b/spring-webflow/ivy.xml index e7d64489..64ad8c16 100644 --- a/spring-webflow/ivy.xml +++ b/spring-webflow/ivy.xml @@ -26,32 +26,32 @@ --> - + - - - + + + - + - + - + - - + + @@ -60,8 +60,8 @@ - - + + diff --git a/spring-webflow/src/main/java/org/springframework/webflow/context/servlet/ServletExternalContext.java b/spring-webflow/src/main/java/org/springframework/webflow/context/servlet/ServletExternalContext.java index c3d42b76..cb370370 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/context/servlet/ServletExternalContext.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/context/servlet/ServletExternalContext.java @@ -90,11 +90,7 @@ public class ServletExternalContext implements ExternalContext { */ private SharedAttributeMap applicationMap; - private String flowId; - - private String flowExecutionKey; - - private RequestPath requestPath; + private FlowRequestInfo flowRequestInfo; private String encodingScheme = DEFAULT_ENCODING_SCHEME; @@ -128,25 +124,51 @@ public class ServletExternalContext implements ExternalContext { this.requestMap = new LocalAttributeMap(new HttpServletRequestMap(this.request)); this.sessionMap = new LocalSharedAttributeMap(new HttpSessionMap(this.request)); this.applicationMap = new LocalSharedAttributeMap(new HttpServletContextMap(context)); - parseRequestPathInfo(); + this.flowRequestInfo = parseFlowRequestInfo(this.request); + } + + public static class FlowRequestInfo { + private String flowId; + + private String flowExecutionKey; + + private RequestPath requestPath; + + public FlowRequestInfo(String flowId, String flowExecutionKey, RequestPath requestPath) { + this.flowId = flowId; + this.flowExecutionKey = flowExecutionKey; + this.requestPath = requestPath; + } + + public String getFlowId() { + return flowId; + } + + public String getFlowExecutionKey() { + return flowExecutionKey; + } + + public RequestPath getRequestPath() { + return requestPath; + } } public String getFlowId() { - return flowId; + return flowRequestInfo.getFlowId(); } public String getFlowExecutionKey() { - return flowExecutionKey; + return flowRequestInfo.getFlowExecutionKey(); + } + + public RequestPath getRequestPath() { + return flowRequestInfo.getRequestPath(); } public String getRequestMethod() { return request.getMethod(); } - public RequestPath getRequestPath() { - return requestPath; - } - public ParameterMap getRequestParameterMap() { return requestParameterMap; } @@ -183,8 +205,6 @@ public class ServletExternalContext implements ExternalContext { return flowExecutionRedirector != null || flowDefinitionRedirector != null || resourceUri != null; } - // response requesters - public PrintWriter getResponseWriter() { try { return response.getWriter(); @@ -194,6 +214,30 @@ public class ServletExternalContext implements ExternalContext { } } + public String encode(String string) { + try { + return URLEncoder.encode(string, encodingScheme); + } catch (UnsupportedEncodingException e) { + throw new IllegalStateException("Unsupported encoding errors should never happen", e); + } + } + + public String buildFlowDefinitionUrl(FlowDefinitionRequestInfo requestInfo) { + return getFlowExecutorPath() + "/" + requestInfo.getFlowDefinitionId() + requestPath(requestInfo) + + requestParameters(requestInfo) + fragment(requestInfo); + } + + public String buildFlowExecutionUrl(FlowExecutionRequestInfo requestInfo, boolean contextRelative) { + String contextRelativeUrl = getFlowExecutionsPath() + requestInfo.getFlowDefinitionId() + "/" + + requestInfo.getFlowExecutionKey() + requestPath(requestInfo) + requestParameters(requestInfo) + + fragment(requestInfo); + if (contextRelative) { + return contextRelativeUrl; + } else { + return request.getScheme() + request.getServerName() + contextRelativeUrl; + } + } + public void sendFlowExecutionRedirect(FlowExecutionRequestInfo request) { flowExecutionRedirector = new FlowExecutionRedirector(request); } @@ -206,32 +250,6 @@ public class ServletExternalContext implements ExternalContext { this.resourceUri = resourceUri; } - // helpers - - public String encode(String string) { - try { - return URLEncoder.encode(string, encodingScheme); - } catch (UnsupportedEncodingException e) { - throw new IllegalStateException("Unsupported encoding errors should never happen", e); - } - } - - public String buildFlowDefinitionUrl(FlowDefinitionRequestInfo requestInfo) { - return request.getContextPath() + request.getServletPath() + "/" + requestInfo.getFlowDefinitionId() - + requestPath(requestInfo) + requestParameters(requestInfo) + fragment(requestInfo); - } - - public String buildFlowExecutionUrl(FlowExecutionRequestInfo requestInfo, boolean contextRelative) { - String contextRelativeUrl = request.getContextPath() + request.getServletPath() + "/executions/" - + requestInfo.getFlowDefinitionId() + "/" + requestInfo.getFlowExecutionKey() - + requestPath(requestInfo) + requestParameters(requestInfo) + fragment(requestInfo); - if (contextRelative) { - return contextRelativeUrl; - } else { - return request.getScheme() + request.getServerName() + contextRelativeUrl; - } - } - // execution processing result setters public void setPausedResult(String flowExecutionKey) { @@ -247,7 +265,7 @@ public class ServletExternalContext implements ExternalContext { public void setExceptionResult(FlowException e) { result = 2; exception = e; - processedFlowExecutionKey = flowExecutionKey; + processedFlowExecutionKey = flowRequestInfo.getFlowExecutionKey(); } /** @@ -293,29 +311,45 @@ public class ServletExternalContext implements ExternalContext { } } - private void parseRequestPathInfo() { + // hooks subclasses may override + + protected FlowRequestInfo parseFlowRequestInfo(HttpServletRequest request) { String pathInfo = request.getPathInfo(); if (pathInfo == null) { throw new IllegalArgumentException( "The requestPathInfo is null: unable to extract flow definition id or flow execution key"); } + String flowId; + String flowExecutionKey; RequestPath path = new RequestPath(pathInfo); if (path.getElement(0).equals("executions")) { flowId = path.getElement(1); flowExecutionKey = path.getElement(2); if (path.getElementCount() > 3) { - requestPath = path.pop(3); + path = path.pop(3); } else { - requestPath = null; + path = null; } } else { flowId = path.getElement(0); + flowExecutionKey = null; if (path.getElementCount() > 1) { - requestPath = path.pop(1); + path = path.pop(1); } else { - requestPath = null; + path = null; } } + return new FlowRequestInfo(flowId, flowExecutionKey, path); + } + + // private helpers + + private String getFlowExecutorPath() { + return request.getContextPath() + request.getServletPath(); + } + + private String getFlowExecutionsPath() { + return getFlowExecutorPath() + "/executions/"; } private boolean isPausedResult() { @@ -411,9 +445,7 @@ public class ServletExternalContext implements ExternalContext { public void issueRedirect() throws IOException { FlowExecutionRequestInfo requestInfo = (FlowExecutionRequestInfo) getRequestInfo(); - String targetUrl = request.getContextPath() + request.getServletPath() + "/executions/" - + requestInfo.getFlowDefinitionId() + "/" + requestInfo.getFlowExecutionKey() - + requestPath(getRequestInfo()) + requestParameters(getRequestInfo()) + fragment(getRequestInfo()); + String targetUrl = buildFlowExecutionUrl(requestInfo, true); response.sendRedirect(response.encodeRedirectURL(targetUrl)); } } @@ -424,10 +456,8 @@ public class ServletExternalContext implements ExternalContext { } public void issueRedirect() throws IOException { - FlowDefinitionRequestInfo redirect = (FlowDefinitionRequestInfo) getRequestInfo(); - String targetUrl = request.getContextPath() + request.getServletPath() + "/" - + redirect.getFlowDefinitionId() + requestPath(getRequestInfo()) - + requestParameters(getRequestInfo()) + fragment(getRequestInfo()); + FlowDefinitionRequestInfo requestInfo = (FlowDefinitionRequestInfo) getRequestInfo(); + String targetUrl = buildFlowDefinitionUrl(requestInfo); response.sendRedirect(response.encodeRedirectURL(targetUrl)); } } diff --git a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/ViewFactoryCreator.java b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/ViewFactoryCreator.java index a939b3d9..fef563c6 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/ViewFactoryCreator.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/engine/builder/ViewFactoryCreator.java @@ -1,13 +1,14 @@ package org.springframework.webflow.engine.builder; import org.springframework.binding.expression.Expression; +import org.springframework.core.io.ResourceLoader; import org.springframework.webflow.execution.Action; import org.springframework.webflow.execution.ViewFactory; public interface ViewFactoryCreator { - public ViewFactory createViewFactory(Expression viewId); + public ViewFactory createViewFactory(Expression viewId, ResourceLoader viewResourceLoader); - public Action createFinalResponseAction(Expression viewId); + public Action createFinalResponseAction(Expression viewId, ResourceLoader viewResourceLoader); }