From bfdbd33b28255476ed26016f241f95945a9c00e0 Mon Sep 17 00:00:00 2001 From: Jeremy Grelle Date: Mon, 6 Aug 2007 23:37:18 +0000 Subject: [PATCH] Initial commit of SWF Boooking sample application --- .../swf-booking-jsf/.classpath | 13 + .../swf-booking-jsf/.m7project | 16 + .../swf-booking-jsf/.project | 42 +++ .../.settings/org.eclipse.jdt.core.prefs | 262 +++++++++++++++++ .../.settings/org.eclipse.jdt.ui.prefs | 52 ++++ .../.settings/org.eclipse.jpt.core.prefs | 4 + ...clipse.jst.common.project.facet.core.prefs | 4 + .../org.eclipse.wst.common.component | 10 + ....eclipse.wst.common.project.facet.core.xml | 8 + .../org.eclipse.wst.validation.prefs | 6 + .../org.hibernate.eclipse.console.prefs | 4 + ...org.springframework.ide.eclipse.core.prefs | 33 +++ .../swf-booking-jsf/.springBeans | 19 ++ .../swf-booking-jsf/.springWebflow | 9 + .../swf-booking-jsf/build.xml | 16 + .../swf-booking-jsf/hibernate.cfg.xml | 9 + .../swf-booking-jsf/ivy.xml | 46 +++ .../swf-booking-jsf/project.properties | 10 + .../swf-booking-jsf/src/etc/filter.properties | 33 +++ .../src/etc/test-resources/log4j.properties | 20 ++ .../src/main/java/META-INF/persistence.xml | 18 ++ .../swf-booking-jsf/src/main/java/import.sql | 22 ++ .../webflow/samples/booking/Booking.java | 176 +++++++++++ .../samples/booking/BookingService.java | 14 + .../booking/DebuggingPhaseListener.java | 32 ++ .../webflow/samples/booking/Hotel.java | 102 +++++++ .../webflow/samples/booking/HotelSearch.java | 62 ++++ .../samples/booking/JpaBookingService.java | 51 ++++ .../webflow/samples/booking/SearchAction.java | 53 ++++ .../booking/SerializableListDataModel.java | 82 ++++++ .../webflow/samples/booking/User.java | 64 ++++ .../booking/ValidateBookingAction.java | 33 +++ .../samples/booking/services-config-jpa.xml | 49 ++++ .../booking/testdb/TestDataSourceFactory.java | 276 ++++++++++++++++++ .../webapp/WEB-INF/classes/log4j.properties | 9 + .../src/main/webapp/WEB-INF/faces-config.xml | 24 ++ .../webapp/WEB-INF/flows/bookHotel-flow.xml | 66 +++++ .../main/webapp/WEB-INF/flows/login-flow.xml | 19 ++ .../main/webapp/WEB-INF/flows/main-flow.xml | 38 +++ .../src/main/webapp/WEB-INF/web.xml | 73 +++++ .../main/webapp/WEB-INF/webflow-config.xml | 54 ++++ .../src/main/webapp/book.xhtml | 201 +++++++++++++ .../src/main/webapp/confirm.xhtml | 89 ++++++ .../src/main/webapp/conversations.xhtml | 34 +++ .../src/main/webapp/css/date.css | 185 ++++++++++++ .../src/main/webapp/css/screen.css | 268 +++++++++++++++++ .../src/main/webapp/css/trailblazer_main.css | 148 ++++++++++ .../src/main/webapp/home.xhtml | 59 ++++ .../src/main/webapp/hotel.xhtml | 82 ++++++ .../src/main/webapp/images/spring-logo.jpg | Bin 0 -> 31339 bytes .../src/main/webapp/images/webflow-logo.jpg | Bin 0 -> 2383 bytes .../src/main/webapp/img/bg.gif | Bin 0 -> 163 bytes .../src/main/webapp/img/btn.bg.gif | Bin 0 -> 221 bytes .../src/main/webapp/img/cal-next.png | Bin 0 -> 202 bytes .../src/main/webapp/img/cal-prev.png | Bin 0 -> 204 bytes .../src/main/webapp/img/cnt.bg.gif | Bin 0 -> 110 bytes .../src/main/webapp/img/dtpick.gif | Bin 0 -> 127 bytes .../src/main/webapp/img/hdr.ad.jpg | Bin 0 -> 47234 bytes .../src/main/webapp/img/hdr.bar.jpg | Bin 0 -> 25326 bytes .../src/main/webapp/img/hdr.bg.gif | Bin 0 -> 218 bytes .../src/main/webapp/img/hdr.title.gif | Bin 0 -> 1601 bytes .../src/main/webapp/img/header_line.gif | Bin 0 -> 571 bytes .../src/main/webapp/img/input.bg.gif | Bin 0 -> 122 bytes .../src/main/webapp/img/sdb.bg.gif | Bin 0 -> 618 bytes .../src/main/webapp/img/spinner.gif | Bin 0 -> 1553 bytes .../src/main/webapp/img/th.bg.gif | Bin 0 -> 152 bytes .../src/main/webapp/index.html | 5 + .../src/main/webapp/intro.xhtml | 41 +++ .../src/main/webapp/main.xhtml | 140 +++++++++ .../src/main/webapp/password.xhtml | 81 +++++ .../src/main/webapp/register.xhtml | 119 ++++++++ .../swf-booking-jsf/src/main/webapp/style.css | 58 ++++ .../src/main/webapp/template.xhtml | 35 +++ .../src/test/java/log4j.properties | 9 + 74 files changed, 3487 insertions(+) create mode 100755 spring-webflow-samples /swf-booking-jsf/.classpath create mode 100755 spring-webflow-samples /swf-booking-jsf/.m7project create mode 100755 spring-webflow-samples /swf-booking-jsf/.project create mode 100755 spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jdt.core.prefs create mode 100755 spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jdt.ui.prefs create mode 100755 spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jpt.core.prefs create mode 100755 spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jst.common.project.facet.core.prefs create mode 100755 spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.wst.common.component create mode 100755 spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.wst.common.project.facet.core.xml create mode 100755 spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.wst.validation.prefs create mode 100755 spring-webflow-samples /swf-booking-jsf/.settings/org.hibernate.eclipse.console.prefs create mode 100755 spring-webflow-samples /swf-booking-jsf/.settings/org.springframework.ide.eclipse.core.prefs create mode 100755 spring-webflow-samples /swf-booking-jsf/.springBeans create mode 100755 spring-webflow-samples /swf-booking-jsf/.springWebflow create mode 100755 spring-webflow-samples /swf-booking-jsf/build.xml create mode 100755 spring-webflow-samples /swf-booking-jsf/hibernate.cfg.xml create mode 100755 spring-webflow-samples /swf-booking-jsf/ivy.xml create mode 100755 spring-webflow-samples /swf-booking-jsf/project.properties create mode 100755 spring-webflow-samples /swf-booking-jsf/src/etc/filter.properties create mode 100755 spring-webflow-samples /swf-booking-jsf/src/etc/test-resources/log4j.properties create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/java/META-INF/persistence.xml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/java/import.sql create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/Booking.java create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/BookingService.java create mode 100644 spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/DebuggingPhaseListener.java create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/Hotel.java create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/HotelSearch.java create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java create mode 100644 spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/SearchAction.java create mode 100644 spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/SerializableListDataModel.java create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/User.java create mode 100644 spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/ValidateBookingAction.java create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/services-config-jpa.xml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/testdb/TestDataSourceFactory.java create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/classes/log4j.properties create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/faces-config.xml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/flows/bookHotel-flow.xml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/flows/login-flow.xml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/flows/main-flow.xml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/web.xml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/webflow-config.xml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/book.xhtml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/confirm.xhtml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/conversations.xhtml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/css/date.css create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/css/screen.css create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/css/trailblazer_main.css create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/home.xhtml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/hotel.xhtml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/images/spring-logo.jpg create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/images/webflow-logo.jpg create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/bg.gif create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/btn.bg.gif create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/cal-next.png create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/cal-prev.png create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/cnt.bg.gif create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/dtpick.gif create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/hdr.ad.jpg create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/hdr.bar.jpg create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/hdr.bg.gif create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/hdr.title.gif create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/header_line.gif create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/input.bg.gif create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/sdb.bg.gif create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/spinner.gif create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/th.bg.gif create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/index.html create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/intro.xhtml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/main.xhtml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/password.xhtml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/register.xhtml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/style.css create mode 100755 spring-webflow-samples /swf-booking-jsf/src/main/webapp/template.xhtml create mode 100755 spring-webflow-samples /swf-booking-jsf/src/test/java/log4j.properties diff --git a/spring-webflow-samples /swf-booking-jsf/.classpath b/spring-webflow-samples /swf-booking-jsf/.classpath new file mode 100755 index 00000000..91938774 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.classpath @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/spring-webflow-samples /swf-booking-jsf/.m7project b/spring-webflow-samples /swf-booking-jsf/.m7project new file mode 100755 index 00000000..d7fcf628 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.m7project @@ -0,0 +1,16 @@ + + + + src/webapp + com.m7.webapp.java + + + + + + + + + + + diff --git a/spring-webflow-samples /swf-booking-jsf/.project b/spring-webflow-samples /swf-booking-jsf/.project new file mode 100755 index 00000000..e3243de9 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.project @@ -0,0 +1,42 @@ + + + swf-booking-jsf + + + + + + 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 /swf-booking-jsf/.settings/org.eclipse.jdt.core.prefs b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jdt.core.prefs new file mode 100755 index 00000000..63c85b13 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,262 @@ +#Tue Jul 31 15:11:23 EDT 2007 +eclipse.preferences.version=1 +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 /swf-booking-jsf/.settings/org.eclipse.jdt.ui.prefs b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jdt.ui.prefs new file mode 100755 index 00000000..64363ef0 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,52 @@ +#Tue Jul 31 15:09:12 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 +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 /swf-booking-jsf/.settings/org.eclipse.jpt.core.prefs b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jpt.core.prefs new file mode 100755 index 00000000..95837dae --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jpt.core.prefs @@ -0,0 +1,4 @@ +#Fri Aug 03 12:43:55 EDT 2007 +eclipse.preferences.version=1 +org.eclipse.jpt.core.discoverAnnotatedClasses=true +org.eclipse.jpt.core.platform=generic diff --git a/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jst.common.project.facet.core.prefs b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jst.common.project.facet.core.prefs new file mode 100755 index 00000000..1973f017 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.jst.common.project.facet.core.prefs @@ -0,0 +1,4 @@ +#Mon Nov 13 17:23:47 PST 2006 +classpath.helper/org.eclipse.jdt.launching.JRE_CONTAINER/owners=jst.java\:5.0 +classpath.helper/org.eclipse.jst.server.core.container\:\:org.eclipse.jst.server.tomcat.runtimeTarget\:\:Apache\ Tomcat\ v5.5/owners=jst.web\:2.4 +eclipse.preferences.version=1 diff --git a/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.wst.common.component b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.wst.common.component new file mode 100755 index 00000000..e35f8033 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.wst.common.component @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.wst.common.project.facet.core.xml b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100755 index 00000000..cddf50bf --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.wst.validation.prefs b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.wst.validation.prefs new file mode 100755 index 00000000..1c7d6317 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,6 @@ +#Mon Nov 13 17:29:33 PST 2006 +DELEGATES_PREFERENCE=delegateValidatorListorg.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator\=org.eclipse.wst.wsdl.validation.internal.eclipse.Validator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator\=org.eclipse.wst.xsd.core.internal.validation.eclipse.Validator; +USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;org.eclipse.jst.j2ee.internal.web.validation.UIWarValidator;org.eclipse.jst.jsp.core.internal.validation.JSPELValidator;org.eclipse.jst.jsp.core.internal.validation.JSPJavaValidator;org.eclipse.jst.jsp.core.internal.validation.JSPDirectiveValidator;org.eclipse.wst.common.componentcore.internal.ModuleCoreValidator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator; +USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;org.eclipse.jst.j2ee.internal.web.validation.UIWarValidator;org.eclipse.jst.jsp.core.internal.validation.JSPELValidator;org.eclipse.jst.jsp.core.internal.validation.JSPJavaValidator;org.eclipse.jst.jsp.core.internal.validation.JSPDirectiveValidator;org.eclipse.wst.common.componentcore.internal.ModuleCoreValidator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator; +USER_PREFERENCE=overrideGlobalPreferencesfalse +eclipse.preferences.version=1 diff --git a/spring-webflow-samples /swf-booking-jsf/.settings/org.hibernate.eclipse.console.prefs b/spring-webflow-samples /swf-booking-jsf/.settings/org.hibernate.eclipse.console.prefs new file mode 100755 index 00000000..f979d2ef --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.settings/org.hibernate.eclipse.console.prefs @@ -0,0 +1,4 @@ +#Fri Aug 03 13:03:09 EDT 2007 +default.configuration=swf-booking-jsf +eclipse.preferences.version=1 +hibernate3.enabled=true diff --git a/spring-webflow-samples /swf-booking-jsf/.settings/org.springframework.ide.eclipse.core.prefs b/spring-webflow-samples /swf-booking-jsf/.settings/org.springframework.ide.eclipse.core.prefs new file mode 100755 index 00000000..a2e2974e --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.settings/org.springframework.ide.eclipse.core.prefs @@ -0,0 +1,33 @@ +#Thu Aug 02 15:26:32 EDT 2007 +eclipse.preferences.version=1 +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 /swf-booking-jsf/.springBeans b/spring-webflow-samples /swf-booking-jsf/.springBeans new file mode 100755 index 00000000..a291fcdf --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.springBeans @@ -0,0 +1,19 @@ + + + + xml + + + src/main/webapp/WEB-INF/webflow-config.xml + + + + + true + false + + src/main/webapp/WEB-INF/webflow-config.xml + + + + diff --git a/spring-webflow-samples /swf-booking-jsf/.springWebflow b/spring-webflow-samples /swf-booking-jsf/.springWebflow new file mode 100755 index 00000000..5f10b668 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/.springWebflow @@ -0,0 +1,9 @@ + + + + + src/main/webapp/WEB-INF/flows/booking-flow.xml + + + + diff --git a/spring-webflow-samples /swf-booking-jsf/build.xml b/spring-webflow-samples /swf-booking-jsf/build.xml new file mode 100755 index 00000000..9b9e1520 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/build.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/hibernate.cfg.xml b/spring-webflow-samples /swf-booking-jsf/hibernate.cfg.xml new file mode 100755 index 00000000..3d1b6a6d --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/hibernate.cfg.xml @@ -0,0 +1,9 @@ + + + + + org.hibernate.dialect.HSQLDialect + + diff --git a/spring-webflow-samples /swf-booking-jsf/ivy.xml b/spring-webflow-samples /swf-booking-jsf/ivy.xml new file mode 100755 index 00000000..39d08464 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/ivy.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/project.properties b/spring-webflow-samples /swf-booking-jsf/project.properties new file mode 100755 index 00000000..55ed07f5 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/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 /swf-booking-jsf/src/etc/filter.properties b/spring-webflow-samples /swf-booking-jsf/src/etc/filter.properties new file mode 100755 index 00000000..c54e5880 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/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 /swf-booking-jsf/src/etc/test-resources/log4j.properties b/spring-webflow-samples /swf-booking-jsf/src/etc/test-resources/log4j.properties new file mode 100755 index 00000000..59974077 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/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 /swf-booking-jsf/src/main/java/META-INF/persistence.xml b/spring-webflow-samples /swf-booking-jsf/src/main/java/META-INF/persistence.xml new file mode 100755 index 00000000..f4e3d6a7 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/META-INF/persistence.xml @@ -0,0 +1,18 @@ + + + + org.hibernate.ejb.HibernatePersistence + org.springframework.webflow.samples.booking.User + org.springframework.webflow.samples.booking.Booking + org.springframework.webflow.samples.booking.Hotel + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/java/import.sql b/spring-webflow-samples /swf-booking-jsf/src/main/java/import.sql new file mode 100755 index 00000000..180265a4 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/import.sql @@ -0,0 +1,22 @@ +insert into Customer (username, password, name) values ('jeremy', 'barfoo', 'Jeremy Grelle') +insert into Customer (username, password, name) values ('demo', 'demo', 'Demo User') +insert into Hotel (id, price, name, address, city, state, zip, country) values (1, 120, 'Marriott Courtyard', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (2, 180, 'Doubletree', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (3, 450, 'W Hotel', 'Union Square, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (4, 450, 'W Hotel', 'Lexington Ave, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (5, 250, 'Hotel Rouge', '1315 16th Street NW', 'Washington', 'DC', '20036', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (6, 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 /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/Booking.java b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/Booking.java new file mode 100755 index 00000000..1fd33b69 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/Booking.java @@ -0,0 +1,176 @@ +package org.springframework.webflow.samples.booking; + +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.Id; +import javax.persistence.ManyToOne; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; + +//import org.hibernate.validator.Length; +//import org.hibernate.validator.NotNull; +//import org.hibernate.validator.Pattern; + +@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 + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + // @NotNull + @Basic + @Temporal(TemporalType.DATE) + public Date getCheckinDate() { + return checkinDate; + } + + public void setCheckinDate(Date datetime) { + this.checkinDate = datetime; + } + + @ManyToOne + // @NotNull + public Hotel getHotel() { + return hotel; + } + + public void setHotel(Hotel hotel) { + this.hotel = hotel; + } + + @ManyToOne + // @NotNull + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + @Basic + @Temporal(TemporalType.DATE) + // @NotNull + public Date getCheckoutDate() { + return checkoutDate; + } + + public void setCheckoutDate(Date checkoutDate) { + this.checkoutDate = checkoutDate; + } + + // @NotNull(message="Credit card number is required") + // @Length(min=16, max=16, message="Credit card number must 16 digits long") + // @Pattern(regex="^\\d*$", message="Credit card number must be numeric") + 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; + } + + // @NotNull(message="Credit card name is required") + // @Length(min=3, max=70, message="Credit card name is required") + 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 /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/BookingService.java b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/BookingService.java new file mode 100755 index 00000000..363182ec --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/BookingService.java @@ -0,0 +1,14 @@ +package org.springframework.webflow.samples.booking; + +import java.util.List; + +public interface BookingService { + + public List findBookings(User user); + + public List findHotels(String searchString, int pageSize, int page); + + public Hotel readHotelById(Long id); + + public Booking bookHotel(Hotel hotel, User user); +} diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/DebuggingPhaseListener.java b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/DebuggingPhaseListener.java new file mode 100644 index 00000000..8274d5ff --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/DebuggingPhaseListener.java @@ -0,0 +1,32 @@ +package org.springframework.webflow.samples.booking; + +import javax.faces.event.PhaseEvent; +import javax.faces.event.PhaseId; +import javax.faces.event.PhaseListener; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class DebuggingPhaseListener implements PhaseListener { + + private static final long serialVersionUID = 1L; + + Log logger = LogFactory.getLog(DebuggingPhaseListener.class); + + public void afterPhase(PhaseEvent event) { + // No-op + + } + + public void beforePhase(PhaseEvent event) { + if (logger.isDebugEnabled()) { + logger.debug("Entering JSF Phase: " + event.getPhaseId()); + } + + } + + public PhaseId getPhaseId() { + return PhaseId.ANY_PHASE; + } + +} diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/Hotel.java b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/Hotel.java new file mode 100755 index 00000000..0cd4afad --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/Hotel.java @@ -0,0 +1,102 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +//import org.hibernate.validator.Length; +//import org.hibernate.validator.NotNull; + +@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; + } + + // @Length(max=50) @NotNull + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + // @Length(max=100) @NotNull + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + // @Length(max=40) @NotNull + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + // @Length(min=4, max=6) @NotNull + public String getZip() { + return zip; + } + + public void setZip(String zip) { + this.zip = zip; + } + + // @Length(min=2, max=10) @NotNull + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + // @Length(min=2, max=40) @NotNull + 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 /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/HotelSearch.java b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/HotelSearch.java new file mode 100755 index 00000000..19a1f65a --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/HotelSearch.java @@ -0,0 +1,62 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; + +import javax.faces.event.ActionEvent; + +public class HotelSearch 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 void nextPageListener(ActionEvent event) { + page++; + } + + public void prevPageListener(ActionEvent event) { + page--; + } + + public void findHotelsListener(ActionEvent event) { + page = 0; + } + + 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 /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java new file mode 100755 index 00000000..eb59943b --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java @@ -0,0 +1,51 @@ +package org.springframework.webflow.samples.booking; + +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; + +@Repository +public class JpaBookingService implements BookingService { + + private EntityManager em; + + @Transactional(readOnly = true) + @SuppressWarnings("unchecked") + public List findBookings(User user) { + return em.createQuery("select b from Booking b where b.user.username = :username order by b.checkinDate") + .setParameter("username", user.getUsername()).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 readHotelById(Long id) { + return em.find(Hotel.class, id); + } + + @Transactional(readOnly = true) + public Booking bookHotel(Hotel hotel, User user) { + Booking booking = new Booking(hotel, user); + return booking; + } + + @PersistenceContext + public void setEntityManager(EntityManager em) { + this.em = em; + } + +} diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/SearchAction.java b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/SearchAction.java new file mode 100644 index 00000000..f83007b4 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/SearchAction.java @@ -0,0 +1,53 @@ +package org.springframework.webflow.samples.booking; + +import java.util.List; + +import javax.faces.context.FacesContext; + +import org.springframework.webflow.action.MultiAction; +import org.springframework.webflow.execution.Event; +import org.springframework.webflow.execution.RequestContext; + +public class SearchAction extends MultiAction { + + BookingService bookingService; + + public Event findHotels(RequestContext context) { + HotelSearch search = (HotelSearch) context.getFlowScope().get("hotelSearch"); + List hotels = bookingService + .findHotels(search.getSearchString(), search.getPageSize(), search.getPage()); + if (hotels != null) { + SerializableListDataModel model = new SerializableListDataModel(hotels); + int test = model.getRowCount(); + context.getFlowScope().put("hotels", new SerializableListDataModel(hotels)); + } else { + context.getFlowScope().put("hotels", null); + } + return success(); + } + + public Event findBookings(RequestContext context) { + User user = (User) context.getConversationScope().get("user"); + List bookings = bookingService.findBookings(user); + if (bookings != null) { + context.getFlowScope().put("bookings", new SerializableListDataModel(bookings)); + } else { + context.getFlowScope().put("bookings", null); + } + return success(); + } + + public String nextPage() { + HotelSearch search = (HotelSearch) FacesContext.getCurrentInstance().getApplication().getVariableResolver() + .resolveVariable(FacesContext.getCurrentInstance(), "hotelSearch"); + + search.setPage(search.getPage() + 1); + + return "findHotels"; + } + + public void setBookingService(BookingService bookingService) { + this.bookingService = bookingService; + } + +} diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/SerializableListDataModel.java b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/SerializableListDataModel.java new file mode 100644 index 00000000..00956ed2 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/SerializableListDataModel.java @@ -0,0 +1,82 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; +import java.util.List; + +import javax.faces.model.DataModel; +import javax.faces.model.DataModelEvent; +import javax.faces.model.DataModelListener; + +public class SerializableListDataModel extends DataModel implements Serializable { + + private static final long serialVersionUID = 1L; + + private int _rowIndex = -1; + + private List _data; + + public SerializableListDataModel() { + super(); + } + + public SerializableListDataModel(List list) { + if (list == null) + throw new NullPointerException("list"); + setWrappedData(list); + } + + public int getRowCount() { + if (_data == null) { + return -1; + } + return _data.size(); + } + + public Object getRowData() { + if (_data == null) { + return null; + } + if (!isRowAvailable()) { + throw new IllegalArgumentException("row is unavailable"); + } + return _data.get(_rowIndex); + } + + public int getRowIndex() { + return _rowIndex; + } + + public Object getWrappedData() { + return _data; + } + + public boolean isRowAvailable() { + if (_data == null) { + return false; + } + return _rowIndex >= 0 && _rowIndex < _data.size(); + } + + public void setRowIndex(int rowIndex) { + if (rowIndex < -1) { + throw new IllegalArgumentException("illegal rowIndex " + rowIndex); + } + int oldRowIndex = _rowIndex; + _rowIndex = rowIndex; + if (_data != null && oldRowIndex != _rowIndex) { + Object data = isRowAvailable() ? getRowData() : null; + DataModelEvent event = new DataModelEvent(this, _rowIndex, data); + DataModelListener[] listeners = getDataModelListeners(); + for (int i = 0; i < listeners.length; i++) { + listeners[i].rowSelected(event); + } + } + } + + public void setWrappedData(Object data) { + _data = (List) data; + int rowIndex = _data != null ? 0 : -1; + setRowIndex(rowIndex); + } + +} diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/User.java b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/User.java new file mode 100755 index 00000000..4a11fd90 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/User.java @@ -0,0 +1,64 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +//import org.hibernate.validator.Length; +//import org.hibernate.validator.NotNull; +//import org.hibernate.validator.Pattern; + +@Entity +@Table(name = "Customer") +public class User implements Serializable { + private String username; + private String password; + private String name; + + public User(String name, String password, String username) { + this.name = name; + this.password = password; + this.username = username; + } + + public User() { + } + + // @NotNull + // @Length(max = 100) + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + // @NotNull + // @Length(min = 5, max = 15) + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Id + // @Length(min = 5, max = 15) + // @Pattern(regex = "^\\w*$", message = "not a valid username") + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + @Override + public String toString() { + return "User(" + username + ")"; + } +} diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/ValidateBookingAction.java b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/ValidateBookingAction.java new file mode 100644 index 00000000..5b3973ab --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/ValidateBookingAction.java @@ -0,0 +1,33 @@ +package org.springframework.webflow.samples.booking; + +import java.util.Calendar; + +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; + +import org.springframework.webflow.action.AbstractAction; +import org.springframework.webflow.execution.Event; +import org.springframework.webflow.execution.RequestContext; + +public class ValidateBookingAction extends AbstractAction { + + @Override + protected Event doExecute(RequestContext context) throws Exception { + Booking booking = (Booking) context.getFlowScope().get("booking"); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, -1); + if (booking.getCheckinDate().before(calendar.getTime())) { + FacesContext.getCurrentInstance().addMessage("checkinDate", + new FacesMessage(FacesMessage.SEVERITY_ERROR, "Check in date must be a future date", "")); + return error(); + } else if (!booking.getCheckinDate().before(booking.getCheckoutDate())) { + FacesContext.getCurrentInstance() + .addMessage( + "checkoutDate", + new FacesMessage(FacesMessage.SEVERITY_ERROR, + "Check out date must be later than check in date", "")); + return error(); + } + return success(); + } +} diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/services-config-jpa.xml b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/services-config-jpa.xml new file mode 100755 index 00000000..5559dd37 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/services-config-jpa.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/testdb/TestDataSourceFactory.java b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/testdb/TestDataSourceFactory.java new file mode 100755 index 00000000..055d6c0d --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/java/org/springframework/webflow/samples/booking/testdb/TestDataSourceFactory.java @@ -0,0 +1,276 @@ +package org.springframework.webflow.samples.booking.testdb; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; + +import javax.sql.DataSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.io.Resource; +import org.springframework.jdbc.datasource.DriverManagerDataSource; + +/** + * A factory that creates a data source fit for use in a system test environment. Creates a simple data source that + * connects to an in-memory database pre-loaded with test data. + * + * This factory returns a fully-initialized DataSource implementation. When the DataSource is returned, callers are + * guaranteed that the database schema and test data will have been loaded by that time. + * + * Is a FactoryBean, for exposing the fully-initialized test DataSource as a Spring bean. See {@link #getObject()}. + * + * Is an InitializingBean, for receiving an initialization callback when deployed as a Spring bean. See + * {@link #afterPropertiesSet()}. + */ +public class TestDataSourceFactory implements FactoryBean, InitializingBean { + + private static Log logger = LogFactory.getLog(TestDataSourceFactory.class); + + // configurable properties + + private String testDatabaseName; + + private Resource schemaLocation; + + private Resource testDataLocation; + + /** + * The object created by this factory. + */ + private DataSource dataSource; + + /** + * Creates a new TestDataSourceFactory for use in "bean" style. "Bean" style means the default constructor is called + * and then properties are set to configure this object. "Bean" style usage is nice when this object is defined as a + * Spring bean, as setter-injection can be more descriptive than constructor-injection from the point of view of a + * bean definition author. + * @see {@link #setTestDatabaseName(String)} + * @see {@link #setSchemaLocation(Resource)} + * @see {@link #setTestDataLocation(Resource)} + */ + public TestDataSourceFactory() { + } + + /** + * Creates a new TestDataSourceFactory fully-initialized with what it needs to work. Fully-formed constructors are + * nice in a programmatic environment, as they result in more concise code and allow for a class to enforce its + * required properties. + * @param testDatabaseName the name of the test database to create + * @param schemaLocation the location of the file containing the schema DDL to export to the database + * @param testDataLocation the location of the file containing the test data to load into the database + */ + public TestDataSourceFactory(String testDatabaseName, Resource schemaLocation, Resource testDataLocation) { + setTestDatabaseName(testDatabaseName); + setSchemaLocation(schemaLocation); + setTestDataLocation(testDataLocation); + } + + /** + * Sets the name of the test database to create. + * @param testDatabaseName the name of the test database, i.e. "rewards" + */ + public void setTestDatabaseName(String testDatabaseName) { + this.testDatabaseName = testDatabaseName; + } + + /** + * Sets the location of the file containing the schema DDL to export to the test database. + * @param schemaLocation the location of the database schema DDL + */ + public void setSchemaLocation(Resource schemaLocation) { + this.schemaLocation = schemaLocation; + } + + /** + * Sets the location of the file containing the test data to load into the database. + * @param testDataLocation the location of the test data file + */ + public void setTestDataLocation(Resource testDataLocation) { + this.testDataLocation = testDataLocation; + } + + // implementing InitializingBean + + // this method is automatically called by Spring after configuration to perform a dependency check and init + public void afterPropertiesSet() { + if (testDatabaseName == null) { + throw new IllegalArgumentException("The name of the test database to create is required"); + } + if (schemaLocation == null) { + throw new IllegalArgumentException("The path to the database schema DDL is required"); + } + if (testDataLocation == null) { + throw new IllegalArgumentException("The path to the test data set is required"); + } + initDataSource(); + } + + // implementing FactoryBean + + // this method is automatically called by Spring to expose the DataSource as a bean + public Object getObject() throws Exception { + return getDataSource(); + } + + public Class getObjectType() { + return DataSource.class; + } + + public boolean isSingleton() { + return true; + } + + // other methods + + /** + * Factory method that returns the fully-initialized test data source. Useful when this class is used + * programatically instead of deployed as a Spring bean. + * @return the data source + */ + public DataSource getDataSource() { + if (dataSource == null) { + initDataSource(); + } + return dataSource; + } + + // static factory methods + + /** + * Static factory method that creates a DataSource that connects to a test database populated with test data. + * @param testDatabaseName the name of the test database to create + * @param schemaLocation the database schema to export + * @param testDataLocation the database test data to load + * @return the data source + */ + public static DataSource createDataSource(String testDatabaseName, Resource schemaLocation, + Resource testDataLocation) { + return new TestDataSourceFactory(testDatabaseName, schemaLocation, testDataLocation).getDataSource(); + } + + // internal helper methods + + // encapsulates the steps involved in initializing the data source: creating it, and populating it + private void initDataSource() { + // create the in-memory database source first + this.dataSource = createDataSource(); + if (logger.isDebugEnabled()) { + logger.debug("Created in-memory test database '" + testDatabaseName + "'"); + } + // now populate the database by loading the schema and test data + populateDataSource(); + if (logger.isDebugEnabled()) { + logger.debug("Exported schema in " + schemaLocation); + } + if (logger.isDebugEnabled()) { + logger.debug("Loaded test data in " + testDataLocation); + } + } + + private DataSource createDataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + // use the HsqlDB JDBC driver + dataSource.setDriverClassName("org.hsqldb.jdbcDriver"); + // have it create an in-memory database + dataSource.setUrl("jdbc:hsqldb:mem:" + testDatabaseName); + dataSource.setUsername("sa"); + dataSource.setPassword(""); + return dataSource; + } + + private void populateDataSource() { + TestDatabasePopulator populator = new TestDatabasePopulator(dataSource); + populator.populate(); + } + + /** + * Populates a in memory data source with test data. + */ + private class TestDatabasePopulator { + + private DataSource dataSource; + + /** + * Creates a new test database populator. + * @param dataSource the test data source that will be populated. + */ + public TestDatabasePopulator(DataSource dataSource) { + this.dataSource = dataSource; + } + + /** + * Populate the test database by creating the database schema from 'schema.sql' and inserting the test data in + * 'testdata.sql'. + */ + public void populate() { + Connection connection = null; + try { + connection = dataSource.getConnection(); + createDatabaseSchema(connection); + insertTestData(connection); + } catch (SQLException e) { + throw new RuntimeException("SQL exception occurred acquiring connection", e); + } finally { + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) { + } + } + } + } + + // create the application's database schema (tables, indexes, etc.) + private void createDatabaseSchema(Connection connection) { + try { + String sql = parseSqlIn(schemaLocation); + executeSql(sql, connection); + } catch (IOException e) { + throw new RuntimeException("I/O exception occurred accessing the database schema file", e); + } catch (SQLException e) { + throw new RuntimeException("SQL exception occurred exporting database schema", e); + } + } + + // populate the tables with test data + private void insertTestData(Connection connection) { + try { + String sql = parseSqlIn(testDataLocation); + executeSql(sql, connection); + } catch (IOException e) { + throw new RuntimeException("I/O exception occurred accessing the test data file", e); + } catch (SQLException e) { + throw new RuntimeException("SQL exception occurred loading test data", e); + } + } + + // utility method to read a .sql txt input stream + private String parseSqlIn(Resource resource) throws IOException { + InputStream is = null; + try { + is = resource.getInputStream(); + Reader reader = new InputStreamReader(is); + char[] cbuf = new char[4096]; + reader.read(cbuf); + return new String(cbuf).trim(); + } finally { + if (is != null) { + is.close(); + } + } + } + + // utility method to run the parsed sql + private void executeSql(String sql, Connection connection) throws SQLException { + Statement statement = connection.createStatement(); + statement.execute(sql); + } + } +} \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/classes/log4j.properties b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/classes/log4j.properties new file mode 100755 index 00000000..2eac6639 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/classes/log4j.properties @@ -0,0 +1,9 @@ +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.binding=DEBUG \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/faces-config.xml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/faces-config.xml new file mode 100755 index 00000000..36489e62 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,24 @@ + + + + + + org.springframework.webflow.executor.jsf.FlowNavigationHandler + org.springframework.webflow.executor.jsf.DelegatingFlowVariableResolver + org.springframework.web.jsf.DelegatingVariableResolver + com.sun.facelets.FaceletViewHandler + + + + org.springframework.webflow.samples.booking.DebuggingPhaseListener + org.springframework.webflow.executor.jsf.FlowPhaseListener + + + + jsfSearchAction + org.springframework.webflow.samples.booking.SearchAction + request + + \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/flows/bookHotel-flow.xml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/flows/bookHotel-flow.xml new file mode 100755 index 00000000..4a456246 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/flows/bookHotel-flow.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/flows/login-flow.xml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/flows/login-flow.xml new file mode 100755 index 00000000..a658e268 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/flows/login-flow.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/flows/main-flow.xml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/flows/main-flow.xml new file mode 100755 index 00000000..dfd76217 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/flows/main-flow.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/web.xml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/web.xml new file mode 100755 index 00000000..2b142616 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,73 @@ + + + + + contextConfigLocation + + classpath:org/springframework/webflow/samples/booking/services-config-jpa.xml + /WEB-INF/webflow-config.xml + + + + + + javax.faces.DEFAULT_SUFFIX + .xhtml + + + + + facelets.DEVELOPMENT + true + + + + + + org.springframework.web.context.ContextLoaderListener + + + + + + + org.springframework.web.context.request.RequestContextListener + + + + + + Flow System Cleanup Filter + + org.springframework.webflow.executor.jsf.FlowSystemCleanupFilter + + + + + + Flow System Cleanup Filter + *.swf + + + + + Faces Servlet + javax.faces.webapp.FacesServlet + 1 + + + Faces Servlet + *.swf + + + + + + index.html + + + \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/webflow-config.xml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/webflow-config.xml new file mode 100755 index 00000000..42b66fad --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/WEB-INF/webflow-config.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /WEB-INF/flows/login-flow.xml + /WEB-INF/flows/main-flow.xml + /WEB-INF/flows/bookHotel-flow.xml + + + + + + + + + + + \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/book.xhtml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/book.xhtml new file mode 100755 index 00000000..b3aab3be --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/book.xhtml @@ -0,0 +1,201 @@ + + + + + +
+

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:
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ +
+ +
+
 
+
+   + +
+
+
+
+
+
+ + + + +

Workspace management

+

+ As you can see, Seam makes it easy to work in multiple windows or multiple browser + tabs. But you can even switch between multiple tasks inside a single browser tab! + The "Workspaces" section showcases this advanced feature. +

+

+ + How does the workspace list work? + +

+ +
+ +
diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/confirm.xhtml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/confirm.xhtml new file mode 100755 index 00000000..ece888fd --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/confirm.xhtml @@ -0,0 +1,89 @@ + + + + + +
+

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}
+
+
+
 
+
+   +   + +
+
+
+
+
+
+ + + +

Back button navigation

+

+ When you click "Confirm", the new booking is written to the database, the + conversation ends, and state associated with the conversation is automatically + destroyed by Seam. After you confirm your booking, try hitting the back button + on your web browser and clicking "Confirm" again. Seam makes it easy implement + applications that behave elegantly in response to the back, forward and refresh + buttons. +

+

+ + What happens when the conversation ends? + +

+
+ +
diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/conversations.xhtml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/conversations.xhtml new file mode 100755 index 00000000..b4e23523 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/conversations.xhtml @@ -0,0 +1,34 @@ + +
+ +
+

+
+ +
+ + + + +   + + + + + + + - + + + + + + +
+ +
\ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/css/date.css b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/css/date.css new file mode 100755 index 00000000..39096d91 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/css/date.css @@ -0,0 +1,185 @@ +div.seam-date +{ + margin-top: 5px; + border: 1px solid #AAAAAA; + background: #fff url(../img/input.bg.gif) 0 0 repeat-x; + background-color: #FFFFFF; + color: #505050; + font-family: Tahoma, Arial, Helvetica, sans-serif; + font-size: 12px; +} + +table.seam-date td { + font-family: Tahoma, Arial, Helvetica, sans-serif; + font-weight: 11px; +} + +.seam-date-monthNames +{ + width: 70px; + border: 1px solid #dddddd; + border-right: 3px solid #444444; + border-bottom: 3px solid #444444; + background-color: #ffffff; + font-size: 12px; + cursor: pointer; + font-family: Tahoma, Arial, Helvetica, sans-serif; + font-weight: normal; +} + +a.seam-date-monthNameLink, a.seam-date-monthNameLink:visited +{ + text-align: center; + display: block; + color: #555555; +} + +a.seam-date-monthNameLink:hover +{ + background-color: #CCCCCC; + color: red; +} + +.seam-date-years +{ + height: 10em; + overflow: auto; + width: 60px; + border: 1px solid #dddddd; + border-right: 3px solid #444444; + border-bottom: 3px solid #444444; + background-color: #ffffff; + font-size: 12px; + cursor: pointer; + font-family: Tahoma, Arial, Helvetica, sans-serif; + font-weight: normal; +} + +a.seam-date-yearLink, a.seam-date-yearLink:visited +{ + text-align: center; + display: block; + color: #555555; +} + +a.seam-date-yearLink:hover +{ + background-color: #CCCCCC; + color: red; +} + +tr.seam-date-header +{ + padding: 2px 0px 2px 0px; +} + +td.seam-date-header +{ + padding: 0px 8px 0px 8px; + text-align: center; + color: gray; + font-family: Tahoma, Arial, Helvetica, sans-serif; + font-weight: bold; + font-size: 12px; +} + +td.seam-date-header-prevMonth +{ + background-image: url("../img/cal-prev.png"); + background-repeat: no-repeat; + background-position: center; + padding: 0px 2px 0px 2px; + width: 17px; + height: 16px; + margin-left: 2px; +} + +td.seam-date-header-nextMonth +{ + background-image: url("../img/cal-next.png"); + background-repeat: no-repeat; + background-position: center; + padding: 0px 2px 0px 2px; + width: 17px; + height: 16px; + margin-right: 2px; +} + +tr.seam-date-headerDays +{ + color: white; + font-weight: normal; +} + +tr.seam-date-headerDays > td +{ + background-color: #CCCCCC; + border: 1px solid #AAAAAA; + color: white; + text-align: center; + width: 26px; +} + +tr.seam-date-footer +{ + background-color: white; + color: #505050; + font-weight: bold; +} + +tr.seam-date-footer > td +{ + text-align: center; +} + +td.seam-date-inMonth +{ + background-color: white; + color: black; + font-weight: normal; + cursor: pointer; + border: 1px solid #ece9d8; +} + +td.seam-date-outMonth +{ + background-color: white; + color: #999999; + font-weight: normal; + cursor: pointer; + border: 1px solid #ece9d8; +} + +td.seam-date-selected +{ + background-color: #CCCCCC; + border: 1px solid #AAAAAA; + color: black; + font-weight: normal; +} + +td.seam-date-dayOff-inMonth +{ + background-color: #efefef; + color: black; + font-weight: normal; + cursor: pointer; + border: 1px solid #ece9d8; +} + +td.seam-date-dayOff-outMonth +{ + background-color: #efefef; + color: #999999; + font-weight: normal; + cursor: pointer; + border: 1px solid #ece9d8; +} + +td.seam-date-hover +{ + background-color: #CCCCCC; + border: 1px solid #AAAAAA; + cursor: pointer; + color: red; +} \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/css/screen.css b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/css/screen.css new file mode 100755 index 00000000..f00c7ae9 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/css/screen.css @@ -0,0 +1,268 @@ +/* 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: #DBD4C6; +} +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(../img/input.bg.gif) 0 0 repeat-x; +} +select { + border: 1px solid #C3BBB6; + padding: 4px; + margin: 5px 0; + background: #fff url(../img/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(../img/bg.gif) 0 0 repeat-y; + float: left; + border-bottom: 1px solid #C3BBB6; +} +#header { + float: left; + width: 758px; + height: 46px; + background: url(../img/hdr.bg.gif) 0 0 repeat-x; +} +#container { + float: left; + width: 758px; + background: url(../img/hdr.bar.jpg) 0 0 repeat-x; +} +#sidebar { + float: left; + width: 190px; + margin-top: 96px; + padding: 20px 10px 0 10px; + background: url(../img/sdb.bg.gif) 0 0 no-repeat; +} +#content { + float: left; + width: 548px; + margin-top: 75px; + padding-top: 5px; + background: #fff url(../img/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(../img/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-bottom: 10px; +} +#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 15px; +} +#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(../img/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: small; +} +#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; +} +/* Header +----------------------------------------------- */ +#title { + float: left; + padding: 1px 0 6px 15px; +} +#status { + color: #C7B299; + 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: #C7B299; + text-decoration: none; +} +/* Homepage Modifications +----------------------------------------------- */ +#pgHome #container { + background: url(../img/hdr.ad.jpg) 0 0 repeat-x; +} +#pgHome #sidebar { + margin-top: 207px; +} +#pgHome #content { + margin-top: 183px; +} +#pgHome input[type="submit"] { + height: 30px; +} diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/css/trailblazer_main.css b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/css/trailblazer_main.css new file mode 100755 index 00000000..8700dcb5 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/css/trailblazer_main.css @@ -0,0 +1,148 @@ +* { + margin: 0px; + padding: 0px; + border: none; +} + +body { + font: 1em verdana, arial, sans-serif; + background: #CCCCCC; +} + +div#main { + margin-left: 0px; + width: 751px; + background: #ecefdf; +} + +div#top,div#pictures{ +} + +div#pictures img { + float:left; +} + +img#head1 { + margin-right: 3px; +} + +img#head2 { + margin-right: 4px; +} + +div.trail { + clear:both; + margin-left: 50px; + margin-top: 0px; + margin-right: 50px +} + +div.foot { + margin-left: 50px; + margin-right: 50px; + margin-top: 50px; + text-align: center; + font-size: .5em; + height: 36px; +} + +div.trail h1 { + margin-top: -30px; + margin-left: -50px; + font-size: 1.2em; + font-weight: bold; + padding-left: .4em; +} + +div.trail h2 { + float: left; + font-size: 1em; + font-weight: bold; + padding-left: .4em; +} + +div.trail h3 { + float: left; + font-size: .8em; + font-weight: bold; + margin-left: -1.4em; + margin-bottom: 1em; +} + + +div.trail p { + clear: both; + margin-top: 20px; + font-size: .8em; + text-decoration: none; +} + +div#next_trail { + margin-left: 36px; +} + +div.numbox { + border: thin solid black; + margin-left: -.8em; + float: left; + background: #ffffff; + padding: .2em .35em .3em; + font-style: normal; + font-weight: bold; + font-size: 1.4em; +} + +div.figure { + text-align: center; + font-size: .6em; + margin-top: 30px; +} + +div.figure img { + display: block; + margin-right: auto; + margin-left: auto; +} + +code { + font: 1.1em "Courier New", Courier, mono; +} + +code.block { + white-space: pre; + font: 10pt "Courier New", Courier, mono; + display: block; + border-style: dashed; + border-width: thin; + padding: .5em; + background: #ffffff; + margin: 20px; +} + +div.foot_image { + float: left; + height: 86px; +} + +a:active { + color : #666666; + text-decoration: none; +} + +a:hover { + color : #000000; + background-color : #D6E0FE; + text-decoration: none; +} + +a:link { + color : #005EB6; + text-decoration: none; +} + +a:visited { + color : #888888; + text-decoration: none; +} + + diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/home.xhtml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/home.xhtml new file mode 100755 index 00000000..c17a858e --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/home.xhtml @@ -0,0 +1,59 @@ + + + + + Spring Web Stack: Spring Web Flow + JSF + + + + +
+ +
+ +
+
+ +

About this example application

+ +

+ This sample application demonstrates how easy it is to develop stateful web + applications using Spring Web Flow. Just register, login, and book a room to see + SWF in action. +

+ +

+ Note: Please do NOT enter personal information or your credit card number in + this sample application. +

+
+
+
+ +
+
+ + diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/hotel.xhtml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/hotel.xhtml new file mode 100755 index 00000000..efe8471b --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/hotel.xhtml @@ -0,0 +1,82 @@ + + + + + +
+

View Hotel

+
+
+
+
Name:
+
#{hotel.name}
+
+
+
Address:
+
#{hotel.address}
+
+
+
City:
+
#{hotel.city}
+
+
+
State:
+
#{hotel.state}
+
+
+
Zip:
+
#{hotel.zip}
+
+
+
Country:
+
#{hotel.country}
+
+
+
Nightly rate:
+
+ + + +
+
+
+
+ +
+   + +
+
+
+
+ + + + +

Don't kill your database

+

+ Keeping conversational state in memory in the middle tier is a great way to + improve your application's scalability. It saves hitting the database every + time we refresh a page, to re-read the data we were just looking at five + seconds ago. By using Seam's conversation context, we get a natural cache + of data associated with the what the user is currently doing. By nature, + this cache has a more efficient eviction policy than the MRU-type algorithms + used by a typical second-level data cache in an O/R mapping engine like + Hibernate (at least for some kinds of data). Of course, you should use + a clever combination of second-level caching and conversational data + caching to achieve the best performance for your application. +

+

+ + How does the hotel booking wizard work? + +

+ +
+ +
diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/images/spring-logo.jpg b/spring-webflow-samples /swf-booking-jsf/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 /swf-booking-jsf/src/main/webapp/images/webflow-logo.jpg b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/images/webflow-logo.jpg new file mode 100755 index 0000000000000000000000000000000000000000..ed76bae066c665b63369a970cb47b9a038ceaee0 GIT binary patch literal 2383 zcmb7^dpy$%AIE>&%vf$i9HP0cHp^1E9jRCi8&0e>WxBgbhU-}$rtMxH_EBhNY@J`7m%0P*i{_ zLKPGhp^7k=q7qyK4p&x&YpbcNXy|JH^pmc(j*h+|3aP)v)IdkaXor#Mw(S^mj2_a$ z(gJOXLSxWBN?cbAPA7W6EFY(Fc<;? z0sj>YstATCfRr|NC5-^Lm|-r{QY4@C_puhcX?@HzH?q18) zylwd|M+c_Pdov=@TH)!V^S+evc@sV_ipx69k;u}BF5E1Gx1MqU%3eSEtT*^;(7H*z zG*s7R6Y;>`AOZJSAN_MMPtT?Np2d|T;`{aP%BEt?-GXWGHLb}Tt7$?;Hkqm7iV5Gt z$MNQjJF#%51^AZKDtfuUxnv>C+P*H=>n$U}5|$a!vHmD#?BQ%p%Dh^y;%n?1i`lot z3<7W!AUnar2%9VaB4~Tz5rnN)o*eSw>hmKZ_hl7wU`VzXgA@n1{J=DAqV&xk{$HT}TK3@jYSJ=sK&Txj$ViV$uHOH>q zp~-{d2V9-%;K$P;##v!&z;KtHRgL7oqbUO;78XE zG3zDF*Rd~J`-fVQS-n%G$*PSF!t`HxOgbPrnaetrv2P6VRV#^HPWRY95GKu*z`E_# zC$Wc^Zm_g>Zh7sRFbzle^!4$GwCCfDT*}9u#DMaNBD9O;qvnsw-Qf|miq7uTV0vUf zT>lrYsM20+QhmR+J%)s|8vWZ)RJ9mRwXoH_;M$h4_tWp*9o!LQ%ojnLVL6JCK8R#q z#WY~4A5@~!yV?yxBDDAKhqT6u$T{voeC?&nS?PY|k`X+OzU6P3b$H-m2GuvcZ*uhV z>R|Ujy0h);E;(Uw4u9V8T`24>(DQo#V0fxjsFRoBGm@1EyXDh86%_OfbZ1aesz0{t z17~)e+hKjQD%kG6z29qb4H5}x3Fe9v~!sJ+6JNxd)2StCX7Zv^M@#4;GcsG!_O~SbgEQ z9s0EE)ahBF!OQ24-}7cVCY-vCk4N3QhHpU&ID0y&ww;Dr3Yux`f&_W#{;HUF7gJU&qX*P@!j#ag(n#| ziw>AktRMR@Xo+Y_w^4PRam~m&WBWXq*Cae89D8u`v-h)ryB73Xw3NGxl-aqv6I`B;XqaWC3VL3wlROcWvV@CbaB2Ax3uhKUqzy^txo3( zEP6xYwR37&Ed?oG4gVx04A_2i;A7l{afpFKesczw_QbpNndD>Z@duS+!iU_jcBCiW z%3t+OC8NEO)>~<6bWD^1+g6EIHUv7yoFeZkQ+a$x(1!<%Fc zBuT-s#y!j^$2X)fPFY;H>cNIL&Drc5#y4I4vv*S@ui>l(FKzzyNqlDlhbWkUnoir| zY#(qYwud%bx0|&Xf2lCUvffSQh>7G3-WHK~XW%0Q|MESN@$sR()?JYKu`XXGwU3aC zx31jb%JqB!Au5xvP11*VoQ|P%t;RlkA_x3xrlJp>km)|W|1feJIvkTOVH?zi7nlBe zZ0KT>{fx(?T1V_V#<=PSt_8_IG()JP%#Y|=$vFCP^y+VODY^YPA=WdqH?Gpa#Y*L7 zU|cK}ecQ10?LnEqb|$k>x+oYKnH;8lEYoMJ+ZfR4KI#Os34L=XDCu7CBJRa*MP7P7 z%F<2UEZ$GRT-Gn`<=V9C`DarWzuPf83fP0#h-I{h)oI*0TX$0sgSa#2VN;ZEW;VN4 zZ@AB#8acGpw6CLdb!J*~t=hG0xcXbFxtpthuEigpoR1{l$Sxdn_*~^otTMj@2^Ht% zm(4e&6U=anbddIVE z)yzlkU=p#>4<6RJse#h*-=uQj0Q-nYC)Do2KiQqoN*_{^+p&{jmc+9ATIX6{h2`f= z`UE+9ntSJ32fHf&iAsgq&~B8))@1`S0#W`Ek4?r)4%yW z@N7q2#?9fBN^Hqv2Xw@yN5Y(voj!R<7hK0;EY|k6#)qV}*e7S{94)zxD55kp5J`gt z?5E2a5|7!Ma;nCJ$)t Pr%*S>8-PL?@;Cnig|{u< literal 0 HcmV?d00001 diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/bg.gif b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/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 /swf-booking-jsf/src/main/webapp/img/btn.bg.gif b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/btn.bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..133e2ee9503569c708295f1181c93bd89ffbfa93 GIT binary patch literal 221 zcmZ?wbhEHbWMxohIKsftA*WCwAvr}^b&|45pQ2KWtX!9ZQjelivy5D=lvJ67!~`Xk zS}Ex^IfX`PnQEYjxJ0Rhc(J(HG-cHzX_-}$l0EWDRgzK@l$6`$6k28Frzoq{OG|gi z$+ybM7mJB0{$ybQ0UZzlvXg-|N(`J{!Zl)rQEiZDUemTL!}7VV2?Q&y~-A>8lvv}h&EmG=!X>o_#tP2g~0{OO@0 QUsvDU(%RNuugG8x0NDgVQ~&?~ literal 0 HcmV?d00001 diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/cal-next.png b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/cal-next.png new file mode 100755 index 0000000000000000000000000000000000000000..ef993543b170877f094685f6448cda7bd2414874 GIT binary patch literal 202 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 literal 0 HcmV?d00001 diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/hdr.bg.gif b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/hdr.bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..71fa194c721503d5253a84f602e3f41469c48e5f GIT binary patch literal 218 zcmZ?wbhEHbWM$A}IKseSrmt&ZsOM&D8RF#}6W|%?=jP*N>tSbQZlLFEW#(XE8szDC zeACP*e|H;WLvKeLOCxxsTL*@z5OXd zhg0O{`8S5lS{WuBu_k4AXvN;C1r|0K^>tx3jU($;76GVOCB`o|u)7b5~(nR?p4MZDwO}YG=c| zx1XDte0Fn)f`4gYT#}54OhZ6KJUQFh+2`iw^YilO;M?2O&y|pktEQv#?dNxJZM~Li zJTx)?006_lzyJOFA^8LW0012TEC2ui02%=#000I5U?+}bX`X1Ru54>=ZYNdyWenMd`_>g z1oph1j^F$LWqp8ygja%vh>1*xij6Z47a|P-Ul$HV1!WHt9}9C22Qml;2uJ}R8XXHC zUK$^iM44l*7#f#xt1_;sN01`9UX~&b070^17!!8DF1t?5V$eIsUk9Oe(klrc2}qM7 z1Rnzc86OG*Bn+n+0O%qN79SN2!wMf67$)%Y^c?~H9UKI>^{)el3acKp;Vb3>AQWz>ol526PSv`(>LUK;Z`^5)*E~_5*qpz?@9Sya}@kY!dX{2*$o8zi5LNuG}@?JgAcCw+DCfDNkRoB z21x<{6?A}rId_3*K`AEec}|9xiLfW29>Ujwl?))@C^_3@@MjAtq9Buwyy1r12U;4? zKuXuRx#b9=?r7ry>X86}ZvdbLji|t6swt-(6xj_19xRY5tpFf7!i=jFx5`;w-s!7} z-7u=@MKo$RYO|b)W2~GQiVy(*CDl^MSvdiOWB@`H6e|h0A!&FhjfG+uj!*1939h&% zzJi~vDsC61s$1u>g2a|Sh=3o^QLYKy|n zIj0~m3I_BPW2rkz009RaTugF?0k?Ikje9l#^|=ZgH*(b@0B}H&8&MEcsve|TA63w- zVt{<`qDlhS|5EL>-Q*Q#5Czo!%+Z3i0xm)Xbe2$B39bNY!r`YCBZ=RMj!+~oL;H=w zT`fR(S=uL91~ms=0UdPzhlOJ7aX6n_SxU7UCdl~-Rz5&gb7?c!vX@0dR&8EnI$c7` zcZE|*k!+RFddZjNF7pJlrz~kH16Ytj1R^Mq0X+j)j}8JcMqq&jBJt8H^&@cKf%o7y z_cHK+9S~3)gd8LS4Pe9_u#rG1BABY(!6$$v7(l_$p#e?+N+$Gk$MFay0{LK1 zJ_v#j0sc`Ad3Y%Tt@23)096_x#>f>uxt`(J6)uh-#D|b86ybb=jtJO;UGzZWJvwFr z%v}y6K3Pf!JjgD-B#|*A7)W3RDOdsrI&expp+MqqPa5hRu z95b2FB*6j}@JwjBGMd=TrZ2V0&2EZ-1KtcLHo+;*au$=E=1eCd(5X&Dga80Lmf46O literal 0 HcmV?d00001 diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/header_line.gif b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/header_line.gif new file mode 100755 index 0000000000000000000000000000000000000000..5638533e834948991e48b40b01b76cf02a2030ec GIT binary patch literal 571 zcmZ?wbhEHb%wl3>c=n&+z<~q*{{8#=_wS!Se}4b|{p;7SpFe;8`0?ZW_wV1nef#?L z>z6NIK7aoF>C>l=A3uKh@ZtUY_wU}ld;9k7n>TM>zkdDd)vK2;U%q(p;`#IE&z?Pd z`t<4J$B!R9di3z&!~6H|-@AA3&Ye5AZ{NOo^XB#I*RNi^dgaQM%a<=-ym;~a`SWMb zo;`Ky)X9@4Pn-mzoHwr$(CZr!?R)259ZH?Cj5e)a0r zD_5>uv0}y2rArqqSTJ|)+&OdR%$PA_+O%m?r%s(TX;N=*Z)ay`dwY9xb8~%tJ;M+I zia%KxK~B{H5ui9>V4u;z;NINQ+ScCD+11_C+t)u~;-tw_rcRqaW9F>cbLP&Q=C*Lr zVmDWpqwaWPR5VId(w0e(JSUY;-9++3VLIXKw={$pch5>s&4kZ_QZ WLy#-t#D;~3+nJa=rbuuwSOWlUWaEqg literal 0 HcmV?d00001 diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/input.bg.gif b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/input.bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..8ebf87e3108dbbec8565935bb1fa42ebac04d0a3 GIT binary patch literal 122 zcmZ?wbhEHbWMzM)j$~k- zXsWJk>%MR-&vb3yw?XWD@BhG{a7Zi~kI1BQ$z&P^(5Q4uty-_xtai)odcWXs*dQpI z&*-#z&2GEj@VIs;jK6uCK7Mva__cwg|Yny1Tr+zQ4f1!o$SH#>dFX$p<9O&d<=% z($me%)YsVA+S}3A+~45g;?ob~=I7|?6y@se?(fp<@bmQb8S?h|`tSJr{{P|n0USt> zT)~3~p8-h7u%U;A4kJpW0CA$lh7~VrESPblM}HmvKZ>jua->OjB~Pk6mvW^`a4lcT z%ocN|O=&f6>TK3vr%!4wr+*Ojq7tRU7dFC+RUq0rhvXb{{r4Ac<{}_hG!y9{Bi(e zn~opLj4atD<;p5AV>YRIv&hb#Jvs<|ay03YrcZxNt$HKt))!yHo=9N!#@e#*ZURuDsxa<_w=hM<{)|bL$7IV+W{xyFUfq2Z9g(Z#?;Z=FjI# zuf87p_VeDuenb99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNlopDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MRX;0+pY8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? literal 0 HcmV?d00001 diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/th.bg.gif b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/img/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 /swf-booking-jsf/src/main/webapp/index.html b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/index.html new file mode 100755 index 00000000..c1cbcbba --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/index.html @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/intro.xhtml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/intro.xhtml new file mode 100755 index 00000000..ee4bd5d1 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/intro.xhtml @@ -0,0 +1,41 @@ + + + + + + +
Booking SWF + JSF - A Spring Web Flow Sample
+
+
+
+ + + + \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/main.xhtml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/main.xhtml new file mode 100755 index 00000000..47cc453e --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/main.xhtml @@ -0,0 +1,140 @@ + + + + + + +
+ + + + + + +

Search Hotels

+
+ + +   + +   + + + + + +
+ Maximum results:  + + + + + +
+
+ +
+ + + + Name + #{hot.name} + + + Address + #{hot.address} + + + City, State + #{hot.city}, #{hot.state}, #{hot.country} + + + Zip + #{hot.zip} + + + Action + + + + + + + +
+ +
+

Current Hotel Bookings

+
+
+ + + + + Name + #{book.hotel.name} + + + Address + #{book.hotel.address} + + + City, State + #{book.hotel.city}, #{book.hotel.state} + + + Check in date + + + + Check out date + + + + Confirmation number + #{book.id} + + + Action + + + +
+ +
+ +
+ + + + +

State management in Seam

+

+ State in Seam is contextual. When you click "Find Hotels", the application + retrieves a list of hotels from the database and caches it in the session context. When you + navigate to one of the hotel records by clicking the "View Hotel" link, a conversation + begins. The conversation is attached to a particular tab, in a particular browser window. You can + navigate to multiple hotels using "open in new tab" or "open in new window" in your web browser. + Each window will execute in the context of a different conversation. The application keeps state + associated with your hotel booking in the conversation context, which ensures that the concurrent + conversations do not interfere with each other. +

+ +

+ + How does the search page work? + +

+ +
+ +
diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/password.xhtml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/password.xhtml new file mode 100755 index 00000000..793686c0 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/password.xhtml @@ -0,0 +1,81 @@ + + + + + +
+

Change Your Password

+
+
+ + + + + + + + + + + +
+ +
+
Password:
+
+ + + + + +
+
+ +
+
Verify:
+
+ + + +
+
+ +
+ +
+ +
+
 
+
+   + +
+
+ +
+ +
+
+
+ + + +

Simple things should be easy

+

+ (And so should some complex things.) You shouldn't have to write four different classes + just to change a password. Traditional J2EE architectures require that developers spend + more time writing code to make the frameworks happy, than they ever get to spend writing + code to make the user happy. Seam lets you reduce the size of your code dramatically. + And that reduces bugs. And it makes refactoring easier. And it makes delivering new + functionality quicker. Productivity matters. But with Seam, JSF, EJB 3.0 and jBPM, you + don't need to sacrifice the ability to handle complex problems just to achieve great + productivity. +

+
+ +
\ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/register.xhtml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/register.xhtml new file mode 100755 index 00000000..f40823be --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/register.xhtml @@ -0,0 +1,119 @@ + + + + + JBoss Suites: Seam Framework + + + +
+ +
+ +
+
+

Register

+
+
+ + +
+ + + + + + + + + + + + +
+
Username:
+
+ + + + + +
+
+ +
+
Real Name:
+
+ + + + + +
+
+ +
+
Password:
+
+ + + +
+
+ +
+
Verify Password:
+
+ + + +
+
+ +
+ +
+ +
+ +
+
 
+
+   + +
+
+ +
+
+ +
+
+
+ +
+ + diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/style.css b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/style.css new file mode 100755 index 00000000..f4b0a64e --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/style.css @@ -0,0 +1,58 @@ +body { + width: 720px; + margin: 0px; + padding: 0px; +} + +div#logo { + width: 720px; + height: 73px; + background: #86AEA5; +} + +div#navigation { + width: 720px; + height: 15px; + background: #E2F3B8; + text-align: right; +} + +div#content { + width: 720px; + padding: 5px; +} + +div#insert { + width: 120; + float: right; + text-align: right; +} + +.buttonBar { + height: 1.5em; + text-align: right; +} + +div#copyright { + width: 720px; +} + +div#copyright p { + text-align: center; + font-family: Tahoma, sans-serif; + font-size: 75%; + color: div#336633; + margin-left: 5px; + font-weight: bold; + clear: both; +} + +.readOnly { + color: rgb(192, 192, 192); +} + +.error { + color: red; + font-weight: bold; + font-family: Arial, sans-serif; +} \ No newline at end of file diff --git a/spring-webflow-samples /swf-booking-jsf/src/main/webapp/template.xhtml b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/template.xhtml new file mode 100755 index 00000000..78e2bf54 --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/src/main/webapp/template.xhtml @@ -0,0 +1,35 @@ + + + + + JBoss Suites: Seam Framework + + + + + +
+ +
+ +
+ +
+
+ +
+ + diff --git a/spring-webflow-samples /swf-booking-jsf/src/test/java/log4j.properties b/spring-webflow-samples /swf-booking-jsf/src/test/java/log4j.properties new file mode 100755 index 00000000..5ba9222c --- /dev/null +++ b/spring-webflow-samples /swf-booking-jsf/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
+

+ + (launch with a JSF command link) + +

+

+ Book Hotels (launch with a regular anchor tag) +

+

+ This Spring Web Flow sample application is the JSF-based version of the familiar "Sell item" sample. + It illustrates the following concepts: +

+
    +
  • Using Spring Web Flow with JSF
  • +
  • Implementing a wizard using web flows.
  • +
  • Use of conversation scope.
  • +
  • Using expressions to apply dynamic flow navigation rules
  • +
  • Using continuations to make the flow completely stable, no matter how browser navigation buttons are used.
  • +
  • "Always redirect on pause" to benefit from the POST+REDIRECT+GET pattern with no special coding.
  • +
  • + Using "conversation invalidation after completion" to prevent duplicate submits of the same sale + while taking advantage of continuations to allow back button usage while the application transaction is in process. +
  • +
+