Compare commits
No commits in common. "0.17" and "0.11" have entirely different histories.
110 changed files with 1479 additions and 3017 deletions
20
.classpath
20
.classpath
|
@ -2,7 +2,7 @@
|
||||||
<classpath>
|
<classpath>
|
||||||
<classpathentry kind="src" path="src"/>
|
<classpathentry kind="src" path="src"/>
|
||||||
<classpathentry kind="src" path="test"/>
|
<classpathentry kind="src" path="test"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="module" value="true"/>
|
<attribute name="module" value="true"/>
|
||||||
<attribute name="owner.project.facets" value="java"/>
|
<attribute name="owner.project.facets" value="java"/>
|
||||||
|
@ -11,19 +11,21 @@
|
||||||
<classpathentry kind="lib" path="lib/commons-codec-1.8.jar" sourcepath="lib/commons-codec-1.8-sources.jar"/>
|
<classpathentry kind="lib" path="lib/commons-codec-1.8.jar" sourcepath="lib/commons-codec-1.8-sources.jar"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
|
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
|
||||||
<classpathentry kind="lib" path="lib/commons-fileupload-1.3.jar" sourcepath="lib/commons-fileupload-1.3-sources.jar"/>
|
<classpathentry kind="lib" path="lib/commons-fileupload-1.3.jar" sourcepath="lib/commons-fileupload-1.3-sources.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/commons-lang3-3.1.jar" sourcepath="lib/commons-lang3-3.1-sources.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/UnitTesting/hamcrest-core-1.3.jar" sourcepath="lib/UnitTesting/hamcrest-core-1.3-sources.jar"/>
|
<classpathentry kind="lib" path="lib/UnitTesting/hamcrest-core-1.3.jar" sourcepath="lib/UnitTesting/hamcrest-core-1.3-sources.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/UnitTesting/junit-4.12.jar" sourcepath="lib/UnitTesting/junit-4.12-sources.jar"/>
|
<classpathentry kind="lib" path="lib/UnitTesting/junit-4.12.jar" sourcepath="lib/UnitTesting/junit-4.12-sources.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/commons-io-2.7.jar" sourcepath="lib/commons-io-2.7-sources.jar"/>
|
<classpathentry kind="lib" path="lib/devinsy-strings-0.11.4.jar" sourcepath="lib/devinsy-strings-0.11.4-sources.zip"/>
|
||||||
<classpathentry kind="lib" path="lib/commons-lang3-3.13.0.jar" sourcepath="lib/commons-lang3-3.13.0-sources.jar"/>
|
<classpathentry kind="lib" path="lib/tomcat9-servlet-api-9.0.31.jar" sourcepath="lib/tomcat9-servlet-api-9.0.31-sources.jar"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/apache-tomcat-10.1.12">
|
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v9.0.46">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="owner.project.facets" value="jst.utility"/>
|
<attribute name="owner.project.facets" value="jst.utility"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry kind="lib" path="lib/devinsy-strings-0.17.0.jar" sourcepath="lib/devinsy-strings-0.17.0-sources.zip"/>
|
<classpathentry kind="lib" path="lib/xidyn-1.11.2.jar" sourcepath="lib/xidyn-1.11.2-sources.zip"/>
|
||||||
<classpathentry kind="lib" path="lib/Logs/log4j-api-2.23.1.jar" sourcepath="lib/Logs/log4j-api-2.23.1-sources.jar"/>
|
<classpathentry kind="lib" path="lib/commons-io-2.7.jar" sourcepath="lib/commons-io-2.7-sources.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/Logs/log4j-core-2.23.1.jar" sourcepath="lib/Logs/log4j-core-2.23.1-sources.jar"/>
|
<classpathentry kind="lib" path="lib/Logs/log4j-api-2.17.0.jar" sourcepath="lib/Logs/log4j-api-2.17.0-sources.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/Logs/log4j-slf4j2-impl-2.23.1.jar" sourcepath="lib/Logs/log4j-slf4j2-impl-2.32.1-sources.jar"/>
|
<classpathentry kind="lib" path="lib/Logs/log4j-core-2.17.0.jar" sourcepath="lib/Logs/log4j-core-2.17.0-sources.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/Logs/slf4j-api-2.0.16.jar" sourcepath="lib/Logs/slf4j-api-2.0.16-sources.jar"/>
|
<classpathentry kind="lib" path="lib/Logs/log4j-slf4j-impl-2.17.0.jar" sourcepath="lib/Logs/log4j-slf4j-impl-2.17.0-sources.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/Logs/slf4j-api-1.7.32.jar" sourcepath="lib/Logs/slf4j-api-1.7.32-sources.jar"/>
|
||||||
<classpathentry kind="output" path="bin"/>
|
<classpathentry kind="output" path="bin"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
eclipse.preferences.version=1
|
|
||||||
filter_fields=false
|
|
||||||
project_specific_settings=true
|
|
||||||
replacements=<?xml version\="1.0" standalone\="yes"?>\n\n<replacements>\n<replacement key\="get" scope\="1" mode\="0">Gets the</replacement>\n<replacement key\="set" scope\="1" mode\="0">Sets the</replacement>\n<replacement key\="add" scope\="1" mode\="0">Adds the</replacement>\n<replacement key\="edit" scope\="1" mode\="0">Edits the</replacement>\n<replacement key\="remove" scope\="1" mode\="0">Removes the</replacement>\n<replacement key\="init" scope\="1" mode\="0">Inits the</replacement>\n<replacement key\="parse" scope\="1" mode\="0">Parses the</replacement>\n<replacement key\="create" scope\="1" mode\="0">Creates the</replacement>\n<replacement key\="build" scope\="1" mode\="0">Builds the</replacement>\n<replacement key\="is" scope\="1" mode\="0">Checks if is</replacement>\n<replacement key\="print" scope\="1" mode\="0">Prints the</replacement>\n<replacement key\="has" scope\="1" mode\="0">Checks for</replacement>\n</replacements>\n\n
|
|
|
@ -1,2 +0,0 @@
|
||||||
eclipse.preferences.version=1
|
|
||||||
encoding/<project>=UTF-8
|
|
|
@ -1,9 +1,9 @@
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
|
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
|
||||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||||
org.eclipse.jdt.core.compiler.compliance=17
|
org.eclipse.jdt.core.compiler.compliance=11
|
||||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
|
@ -12,10 +12,9 @@ org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
|
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
|
||||||
org.eclipse.jdt.core.compiler.release=enabled
|
org.eclipse.jdt.core.compiler.release=enabled
|
||||||
org.eclipse.jdt.core.compiler.source=17
|
org.eclipse.jdt.core.compiler.source=11
|
||||||
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
|
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
|
||||||
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
|
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
|
||||||
org.eclipse.jdt.core.formatter.align_selector_in_method_invocation_on_expression_first_line=false
|
|
||||||
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
|
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
|
||||||
org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
|
org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
|
||||||
org.eclipse.jdt.core.formatter.align_with_spaces=false
|
org.eclipse.jdt.core.formatter.align_with_spaces=false
|
||||||
|
@ -43,8 +42,6 @@ org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49
|
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
|
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
|
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_arrow=0
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_colon=0
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
|
org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
|
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
|
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
|
||||||
|
@ -53,7 +50,6 @@ org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
|
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=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_parameters_in_method_declaration=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_permitted_types_in_type_declaration=16
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_record_components=16
|
org.eclipse.jdt.core.formatter.alignment_for_record_components=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
|
org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
|
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
|
||||||
|
@ -64,7 +60,6 @@ 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_enum_declaration=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=16
|
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
|
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_switch_case_with_arrow=0
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_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.alignment_for_throws_clause_in_method_declaration=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_type_annotations=0
|
org.eclipse.jdt.core.formatter.alignment_for_type_annotations=0
|
||||||
|
@ -116,7 +111,6 @@ org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
|
||||||
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
|
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
|
||||||
org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert
|
org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert
|
||||||
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
|
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
|
||||||
org.eclipse.jdt.core.formatter.comment.javadoc_do_not_separate_block_tags=false
|
|
||||||
org.eclipse.jdt.core.formatter.comment.line_length=80
|
org.eclipse.jdt.core.formatter.comment.line_length=80
|
||||||
org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
|
org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
|
||||||
org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
|
org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
|
||||||
|
@ -196,7 +190,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arg
|
||||||
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_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_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_parameterized_type_reference=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_permitted_types=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert
|
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
|
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert
|
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert
|
||||||
|
@ -288,7 +281,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_ar
|
||||||
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_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_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_parameterized_type_reference=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_permitted_types=do not insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=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_superinterfaces=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert
|
||||||
|
@ -372,8 +364,6 @@ org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
|
||||||
org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
|
org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
|
||||||
org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
|
org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
|
||||||
org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
|
org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
|
||||||
org.eclipse.jdt.core.formatter.keep_switch_body_block_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_switch_case_with_arrow_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
|
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
|
||||||
org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
|
org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
|
||||||
org.eclipse.jdt.core.formatter.lineSplit=150
|
org.eclipse.jdt.core.formatter.lineSplit=150
|
||||||
|
@ -414,6 +404,5 @@ org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
|
org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
|
org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
|
org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_switch_case_arrow_operator=false
|
|
||||||
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
|
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
|
||||||
org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
|
org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
|
||||||
|
|
|
@ -8,7 +8,6 @@ cleanup.add_missing_nls_tags=false
|
||||||
cleanup.add_missing_override_annotations=true
|
cleanup.add_missing_override_annotations=true
|
||||||
cleanup.add_missing_override_annotations_interface_methods=true
|
cleanup.add_missing_override_annotations_interface_methods=true
|
||||||
cleanup.add_serial_version_id=true
|
cleanup.add_serial_version_id=true
|
||||||
cleanup.also_simplify_lambda=true
|
|
||||||
cleanup.always_use_blocks=true
|
cleanup.always_use_blocks=true
|
||||||
cleanup.always_use_parentheses_in_expressions=false
|
cleanup.always_use_parentheses_in_expressions=false
|
||||||
cleanup.always_use_this_for_non_static_field_access=true
|
cleanup.always_use_this_for_non_static_field_access=true
|
||||||
|
@ -28,7 +27,6 @@ cleanup.convert_to_enhanced_for_loop=false
|
||||||
cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
|
cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
|
||||||
cleanup.convert_to_switch_expressions=false
|
cleanup.convert_to_switch_expressions=false
|
||||||
cleanup.correct_indentation=false
|
cleanup.correct_indentation=false
|
||||||
cleanup.do_while_rather_than_while=true
|
|
||||||
cleanup.double_negation=false
|
cleanup.double_negation=false
|
||||||
cleanup.else_if=false
|
cleanup.else_if=false
|
||||||
cleanup.embedded_if=false
|
cleanup.embedded_if=false
|
||||||
|
@ -62,7 +60,6 @@ cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=true
|
||||||
cleanup.operand_factorization=false
|
cleanup.operand_factorization=false
|
||||||
cleanup.organize_imports=false
|
cleanup.organize_imports=false
|
||||||
cleanup.overridden_assignment=false
|
cleanup.overridden_assignment=false
|
||||||
cleanup.overridden_assignment_move_decl=true
|
|
||||||
cleanup.plain_replacement=false
|
cleanup.plain_replacement=false
|
||||||
cleanup.precompile_regex=false
|
cleanup.precompile_regex=false
|
||||||
cleanup.primitive_comparison=false
|
cleanup.primitive_comparison=false
|
||||||
|
@ -92,7 +89,6 @@ cleanup.remove_unnecessary_casts=true
|
||||||
cleanup.remove_unnecessary_nls_tags=true
|
cleanup.remove_unnecessary_nls_tags=true
|
||||||
cleanup.remove_unused_imports=true
|
cleanup.remove_unused_imports=true
|
||||||
cleanup.remove_unused_local_variables=false
|
cleanup.remove_unused_local_variables=false
|
||||||
cleanup.remove_unused_method_parameters=false
|
|
||||||
cleanup.remove_unused_private_fields=true
|
cleanup.remove_unused_private_fields=true
|
||||||
cleanup.remove_unused_private_members=false
|
cleanup.remove_unused_private_members=false
|
||||||
cleanup.remove_unused_private_methods=true
|
cleanup.remove_unused_private_methods=true
|
||||||
|
@ -105,11 +101,7 @@ cleanup.sort_members_all=false
|
||||||
cleanup.standard_comparison=false
|
cleanup.standard_comparison=false
|
||||||
cleanup.static_inner_class=false
|
cleanup.static_inner_class=false
|
||||||
cleanup.strictly_equal_or_different=false
|
cleanup.strictly_equal_or_different=false
|
||||||
cleanup.stringbuffer_to_stringbuilder=false
|
|
||||||
cleanup.stringbuilder=false
|
cleanup.stringbuilder=false
|
||||||
cleanup.stringbuilder_for_local_vars=true
|
|
||||||
cleanup.stringconcat_stringbuffer_stringbuilder=false
|
|
||||||
cleanup.stringconcat_to_textblock=false
|
|
||||||
cleanup.substring=false
|
cleanup.substring=false
|
||||||
cleanup.switch=false
|
cleanup.switch=false
|
||||||
cleanup.system_property=false
|
cleanup.system_property=false
|
||||||
|
@ -144,11 +136,10 @@ cleanup_settings_version=2
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
|
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
|
||||||
formatter_profile=_Kiss4web
|
formatter_profile=_Kiss4web
|
||||||
formatter_settings_version=23
|
formatter_settings_version=21
|
||||||
jautodoc.cleanup.add_header=false
|
jautodoc.cleanup.add_header=false
|
||||||
jautodoc.cleanup.javadoc=false
|
jautodoc.cleanup.javadoc=false
|
||||||
jautodoc.cleanup.replace_header=false
|
jautodoc.cleanup.replace_header=false
|
||||||
org.eclipse.jdt.ui.text.custom_code_templates=
|
|
||||||
sp_cleanup.add_default_serial_version_id=true
|
sp_cleanup.add_default_serial_version_id=true
|
||||||
sp_cleanup.add_generated_serial_version_id=false
|
sp_cleanup.add_generated_serial_version_id=false
|
||||||
sp_cleanup.add_missing_annotations=true
|
sp_cleanup.add_missing_annotations=true
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<faceted-project>
|
<faceted-project>
|
||||||
<runtime name="apache-tomcat-10.1.12"/>
|
<runtime name="Apache Tomcat v9.0.46"/>
|
||||||
<fixed facet="java"/>
|
<fixed facet="java"/>
|
||||||
<fixed facet="jst.utility"/>
|
<fixed facet="jst.utility"/>
|
||||||
<installed facet="jst.utility" version="1.0"/>
|
<installed facet="jst.utility" version="1.0"/>
|
||||||
<installed facet="java" version="17"/>
|
<installed facet="java" version="11"/>
|
||||||
</faceted-project>
|
</faceted-project>
|
||||||
|
|
116
README.md
116
README.md
|
@ -13,17 +13,9 @@ Kiss4web builds on:
|
||||||
- KissDispatcher: call the good Java Servlet for each HTTP request,
|
- KissDispatcher: call the good Java Servlet for each HTTP request,
|
||||||
- Xidyn: a template solution to dynamize HTML sources.
|
- Xidyn: a template solution to dynamize HTML sources.
|
||||||
|
|
||||||
## Author
|
|
||||||
|
|
||||||
Lead developer: Christian Pierre MOMON <christian.momon@devinsy.fr>
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Kiss4web is released under the GNU LGPL license.
|
|
||||||
|
|
||||||
## Developing environment
|
## Developing environment
|
||||||
|
|
||||||
Kiss4web project uses strictly Eclipse 4.29, Java 17, tomcat 10.1 and Git.
|
Kiss4web-demo project uses strictly Eclipse Kepler, Java 6, GIT.
|
||||||
|
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
@ -34,109 +26,7 @@ Kiss4web uses Ant and generates a kiss4web-x.y.z folder which contains:
|
||||||
- x-core.jar : only compiled class without any library.
|
- x-core.jar : only compiled class without any library.
|
||||||
- x-core-source.jar : sources.
|
- x-core-source.jar : sources.
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
The kiss4web jar requires:
|
# License
|
||||||
- commons-io
|
|
||||||
- commons-lang3
|
|
||||||
- devinsy-strings
|
|
||||||
|
|
||||||
## Usages
|
Kiss4web is released under the GNU LGPL license.
|
||||||
|
|
||||||
```
|
|
||||||
B --> FooAppLauncher -------------------------> FooApp
|
|
||||||
[ServletContextListener] [Singleton]
|
|
||||||
|
|
|
||||||
| setMode(Mode.OPEN)
|
|
||||||
\ /
|
|
||||||
A --> Kiss4webLauncher ----setMode(Mode.OPEN)---> Kiss4web <Mode.APP_INIT>
|
|
||||||
[ServletContextListener] [Singleton]
|
|
||||||
```
|
|
||||||
|
|
||||||
KissDispatcher is initialized with Mode.APP_INIT.
|
|
||||||
|
|
||||||
### Usage A: default
|
|
||||||
|
|
||||||
The easier way, in case you have no application initialization step. The Kiss4webLauncher set a default log4j2 configuration and set the KissDispatcher to Mode.OPEN state with a default set of hooks.
|
|
||||||
|
|
||||||
Edit `…/WebContent/WEB-INF/web.xml` :
|
|
||||||
```
|
|
||||||
<listener>
|
|
||||||
<listener-class>fr.devinsy.kiss4web.Kiss4webLauncher</listener-class>
|
|
||||||
</listener>
|
|
||||||
<servlet>
|
|
||||||
<servlet-name>Application dispatcher</servlet-name>
|
|
||||||
<servlet-class>fr.devinsy.kiss4web.dispatcher.KissDispatcher</servlet-class>
|
|
||||||
<init-param>
|
|
||||||
<param-name>webClassesRootPackage</param-name>
|
|
||||||
<param-value>website</param-value>
|
|
||||||
</init-param>
|
|
||||||
<load-on-startup>1</load-on-startup>
|
|
||||||
</servlet>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>Application dispatcher</servlet-name>
|
|
||||||
<url-pattern>/*</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
```
|
|
||||||
|
|
||||||
You can create …/WebContent/WEB-INF/log4j2.properties:
|
|
||||||
```
|
|
||||||
# Log configuration
|
|
||||||
# #################
|
|
||||||
|
|
||||||
# priority setting: DEBUG < INFO < WARN < ERROR
|
|
||||||
name = Log4j2 Properties Config
|
|
||||||
status = ERROR
|
|
||||||
dest = err
|
|
||||||
|
|
||||||
# Logger settings.
|
|
||||||
rootLogger.level = INFO
|
|
||||||
rootLogger.appenderRefs = a, b
|
|
||||||
rootLogger.appenderRef.a.ref = CONSOLE
|
|
||||||
rootLogger.appenderRef.b.ref = LOGFILE
|
|
||||||
|
|
||||||
logger.statoolinfos.name = fr.devinsy.statoolinfos
|
|
||||||
logger.statoolinfos.level = INFO
|
|
||||||
|
|
||||||
logger.xidyn.name = fr.devinsy.xidyn
|
|
||||||
logger.xidyn.level = WARN
|
|
||||||
|
|
||||||
# Appenders settings.
|
|
||||||
appenders = CONSOLE, LOGFILE
|
|
||||||
|
|
||||||
appender.CONSOLE.type = Console
|
|
||||||
appender.CONSOLE.name = CONSOLE
|
|
||||||
appender.CONSOLE.layout.type = PatternLayout
|
|
||||||
appender.CONSOLE.layout.pattern = %d{ISO8601} - FooApp [%-5p] %34.34c.%25M - %m%n
|
|
||||||
|
|
||||||
appender.LOGFILE.type = File
|
|
||||||
appender.LOGFILE.name = LOGFILE
|
|
||||||
appender.LOGFILE.filename = /srv/fooapp/rslisi.log
|
|
||||||
appender.LOGFILE.layout.type = PatternLayout
|
|
||||||
appender.LOGFILE.layout.pattern = %d{ISO8601} - FooApp [%-5p] %34.34c.%25M - %m%n
|
|
||||||
```
|
|
||||||
|
|
||||||
### Usage B: custom init
|
|
||||||
|
|
||||||
If you want manage an application initialization step, do not use the Kiss4webLauncher as class listener. Create your own FooAppLauncher and make it calls `Kiss4web.instance().setMode(Mode.OPEN)` when the init step is over.
|
|
||||||
|
|
||||||
|
|
||||||
Edit `…/WebContent/WEB-INF/web.xml` :
|
|
||||||
```
|
|
||||||
<listener>
|
|
||||||
<listener-class>org.foo.app.FooAppLauncher</listener-class>
|
|
||||||
</listener>
|
|
||||||
<servlet>
|
|
||||||
<servlet-name>Application dispatcher</servlet-name>
|
|
||||||
<servlet-class>fr.devinsy.kiss4web.dispatcher.KissDispatcher</servlet-class>
|
|
||||||
<init-param>
|
|
||||||
<param-name>webClassesRootPackage</param-name>
|
|
||||||
<param-value>website</param-value>
|
|
||||||
</init-param>
|
|
||||||
<load-on-startup>1</load-on-startup>
|
|
||||||
</servlet>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>Application dispatcher</servlet-name>
|
|
||||||
<url-pattern>/*</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
```
|
|
|
@ -110,7 +110,6 @@
|
||||||
<attribute name="Built-By" value="${user.name} using ant" />
|
<attribute name="Built-By" value="${user.name} using ant" />
|
||||||
<attribute name="Built-Date" value="${dist.time}" />
|
<attribute name="Built-Date" value="${dist.time}" />
|
||||||
</manifest>
|
</manifest>
|
||||||
<service type="javax.annotation.processing.Processor" provider="fr.devinsy.kiss4web.dispatcher.annotation.KissServletProcessor" />
|
|
||||||
<fileset dir="${build.classes}" />
|
<fileset dir="${build.classes}" />
|
||||||
</jar>
|
</jar>
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
#Build Number for ANT. Do not edit!
|
#Build Number for ANT. Do not edit!
|
||||||
#Fri Dec 01 05:27:08 CET 2023
|
#Wed Sep 21 14:25:05 CEST 2016
|
||||||
build.number=2
|
build.number=1
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
product.name=kiss4web
|
product.name=kiss4web
|
||||||
product.revision.major=0
|
product.revision.major=0
|
||||||
product.revision.minor=17
|
product.revision.minor=3
|
||||||
|
|
BIN
lib/Logs/log4j-api-2.17.0-sources.jar
Normal file
BIN
lib/Logs/log4j-api-2.17.0-sources.jar
Normal file
Binary file not shown.
BIN
lib/Logs/log4j-api-2.17.0.jar
Normal file
BIN
lib/Logs/log4j-api-2.17.0.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/Logs/log4j-core-2.17.0-sources.jar
Normal file
BIN
lib/Logs/log4j-core-2.17.0-sources.jar
Normal file
Binary file not shown.
BIN
lib/Logs/log4j-core-2.17.0.jar
Normal file
BIN
lib/Logs/log4j-core-2.17.0.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/Logs/log4j-slf4j-impl-2.17.0-sources.jar
Normal file
BIN
lib/Logs/log4j-slf4j-impl-2.17.0-sources.jar
Normal file
Binary file not shown.
BIN
lib/Logs/log4j-slf4j-impl-2.17.0.jar
Normal file
BIN
lib/Logs/log4j-slf4j-impl-2.17.0.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/Logs/slf4j-api-1.7.32-sources.jar
Normal file
BIN
lib/Logs/slf4j-api-1.7.32-sources.jar
Normal file
Binary file not shown.
BIN
lib/Logs/slf4j-api-1.7.32.jar
Normal file
BIN
lib/Logs/slf4j-api-1.7.32.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/commons-lang3-3.1.jar
Normal file
BIN
lib/commons-lang3-3.1.jar
Normal file
Binary file not shown.
BIN
lib/commons-lang3-3.11-sources.jar
Normal file
BIN
lib/commons-lang3-3.11-sources.jar
Normal file
Binary file not shown.
BIN
lib/commons-lang3-3.11.jar
Normal file
BIN
lib/commons-lang3-3.11.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/devinsy-xml-0.11.0-sources.zip
Normal file
BIN
lib/devinsy-xml-0.11.0-sources.zip
Normal file
Binary file not shown.
BIN
lib/devinsy-xml-0.11.0.jar
Normal file
BIN
lib/devinsy-xml-0.11.0.jar
Normal file
Binary file not shown.
BIN
lib/servlet-api.jar
Normal file
BIN
lib/servlet-api.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/tomcat9-servlet-api-9.0.31-sources.jar
Normal file
BIN
lib/tomcat9-servlet-api-9.0.31-sources.jar
Normal file
Binary file not shown.
BIN
lib/tomcat9-servlet-api-9.0.31.jar
Normal file
BIN
lib/tomcat9-servlet-api-9.0.31.jar
Normal file
Binary file not shown.
BIN
lib/xidyn-1.11.2-sources.zip
Normal file
BIN
lib/xidyn-1.11.2-sources.zip
Normal file
Binary file not shown.
BIN
lib/xidyn-1.11.2.jar
Normal file
BIN
lib/xidyn-1.11.2.jar
Normal file
Binary file not shown.
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* Copyright (C) 2013-2023 Christian Pierre MOMON
|
* Copyright (C) 2013-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -74,80 +74,43 @@ public class BuildInformation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Author.
|
|
||||||
*
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public String author()
|
public String author()
|
||||||
{
|
{
|
||||||
return this.author;
|
return this.author;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Builds the date.
|
|
||||||
*
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public String buildDate()
|
public String buildDate()
|
||||||
{
|
{
|
||||||
return this.buildDate;
|
return this.buildDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Builds the number.
|
|
||||||
*
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public String buildNumber()
|
public String buildNumber()
|
||||||
{
|
{
|
||||||
return this.buildNumber;
|
return this.buildNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Generator.
|
|
||||||
*
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public String generator()
|
public String generator()
|
||||||
{
|
{
|
||||||
return this.generator;
|
return this.generator;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Major revision.
|
|
||||||
*
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public String majorRevision()
|
public String majorRevision()
|
||||||
{
|
{
|
||||||
return this.majorRevision;
|
return this.majorRevision;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Minor revision.
|
|
||||||
*
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public String minorRevision()
|
public String minorRevision()
|
||||||
{
|
{
|
||||||
return this.minorRevision;
|
return this.minorRevision;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Product name.
|
|
||||||
*
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public String productName()
|
public String productName()
|
||||||
{
|
{
|
||||||
return this.productName;
|
return this.productName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To string.
|
*
|
||||||
*
|
|
||||||
* @return the string
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
|
@ -162,9 +125,8 @@ public class BuildInformation
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Version.
|
*
|
||||||
*
|
* @return
|
||||||
* @return the string
|
|
||||||
*/
|
*/
|
||||||
public String version()
|
public String version()
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -20,13 +20,13 @@ package fr.devinsy.kiss4web;
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
|
||||||
|
import javax.servlet.http.Cookie;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import jakarta.servlet.http.Cookie;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class CookieHelper.
|
* The Class CookieHelper.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -80,11 +80,11 @@ public class EnvironmentInformation
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
result = (String) this.environment.lookup("kiss4web.log4j2.path");
|
result = (String) this.environment.lookup("kiss4web.log4j.path");
|
||||||
}
|
}
|
||||||
catch (NamingException exception)
|
catch (NamingException exception)
|
||||||
{
|
{
|
||||||
throw new ConfigurationException("Context configuration error on log4j2 path.");
|
throw new ConfigurationException("Context configuration error on log4j path.");
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -1,200 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import fr.devinsy.strings.StringList;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class HtmlCache.
|
|
||||||
*/
|
|
||||||
public class HtmlCache extends HashMap<String, String>
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = -310354977854681838L;
|
|
||||||
private static Logger logger = LoggerFactory.getLogger(HtmlCache.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new html cache.
|
|
||||||
*/
|
|
||||||
public HtmlCache()
|
|
||||||
{
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Builds the key.
|
|
||||||
*
|
|
||||||
* @param object
|
|
||||||
* the object
|
|
||||||
* @param strings
|
|
||||||
* the strings
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public String buildKey(final Object object, final String... strings)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
if (object == null)
|
|
||||||
{
|
|
||||||
result = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result = buildKey(object.getClass().getCanonicalName(), strings);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Builds the key.
|
|
||||||
*
|
|
||||||
* @param main
|
|
||||||
* the main
|
|
||||||
* @param strings
|
|
||||||
* the strings
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public String buildKey(final String main, final String... strings)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
if (main == null)
|
|
||||||
{
|
|
||||||
result = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int capacity = strings.length * 2 + 1;
|
|
||||||
StringList buffer = new StringList(capacity);
|
|
||||||
|
|
||||||
buffer.add(main);
|
|
||||||
for (int index = 0; index < strings.length; index++)
|
|
||||||
{
|
|
||||||
buffer.append('#');
|
|
||||||
buffer.append(index);
|
|
||||||
buffer.append(strings[index]);
|
|
||||||
}
|
|
||||||
result = buffer.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the HTML code using a GET request.
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* the request
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public String get(final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
if (request == null)
|
|
||||||
{
|
|
||||||
result = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
String key = request.getPathInfo();
|
|
||||||
if (request.getQueryString() != null)
|
|
||||||
{
|
|
||||||
key = key + "?" + request.getQueryString();
|
|
||||||
}
|
|
||||||
result = super.get(key);
|
|
||||||
|
|
||||||
if (result != null)
|
|
||||||
{
|
|
||||||
logger.info("HTML CACHE MATCHED: [{}]", key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the.
|
|
||||||
*
|
|
||||||
* @param key
|
|
||||||
* the key
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public String get(final String key)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
if (key == null)
|
|
||||||
{
|
|
||||||
result = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result = super.get(key);
|
|
||||||
|
|
||||||
if (result != null)
|
|
||||||
{
|
|
||||||
logger.info("HTML Cache matched: [{}]", key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Put HTML code using a GET request.
|
|
||||||
*
|
|
||||||
* @param html
|
|
||||||
* the html
|
|
||||||
* @param request
|
|
||||||
* the request
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public String put(final HttpServletRequest request, final String html)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
if ((request == null) || (html == null))
|
|
||||||
{
|
|
||||||
result = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
String key = request.getPathInfo();
|
|
||||||
if (request.getQueryString() != null)
|
|
||||||
{
|
|
||||||
key = key + "?" + request.getQueryString();
|
|
||||||
}
|
|
||||||
result = super.put(key, html);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2013-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2013-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -23,6 +23,7 @@ import java.util.Date;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.KissDispatcher;
|
import fr.devinsy.kiss4web.dispatcher.KissDispatcher;
|
||||||
|
import fr.devinsy.kiss4web.dispatcher.KissDispatcherFactory;
|
||||||
import fr.devinsy.kiss4web.dispatcher.hooks.ApplicationInitFailedHook;
|
import fr.devinsy.kiss4web.dispatcher.hooks.ApplicationInitFailedHook;
|
||||||
import fr.devinsy.kiss4web.dispatcher.hooks.ApplicationInitHook;
|
import fr.devinsy.kiss4web.dispatcher.hooks.ApplicationInitHook;
|
||||||
import fr.devinsy.kiss4web.dispatcher.hooks.BlankHook;
|
import fr.devinsy.kiss4web.dispatcher.hooks.BlankHook;
|
||||||
|
@ -52,8 +53,8 @@ public class Kiss4web
|
||||||
{
|
{
|
||||||
INIT,
|
INIT,
|
||||||
INIT_FAILED,
|
INIT_FAILED,
|
||||||
APP_INIT,
|
APPLICATION_INIT,
|
||||||
APP_INIT_FAILED,
|
APPLICATION_INIT_FAILED,
|
||||||
OPEN,
|
OPEN,
|
||||||
MAINTENANCE,
|
MAINTENANCE,
|
||||||
FATAL,
|
FATAL,
|
||||||
|
@ -78,7 +79,7 @@ public class Kiss4web
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
setMode(Mode.INIT);
|
this.mode = Mode.INIT;
|
||||||
|
|
||||||
//
|
//
|
||||||
currentLog = "Kiss4web";
|
currentLog = "Kiss4web";
|
||||||
|
@ -96,8 +97,8 @@ public class Kiss4web
|
||||||
//
|
//
|
||||||
|
|
||||||
//
|
//
|
||||||
setMode(Mode.APP_INIT);
|
setMode(Mode.APPLICATION_INIT);
|
||||||
logInit("set APP INIT mode", "PASSED");
|
logInit("set APPLICATION INIT mode", "PASSED");
|
||||||
|
|
||||||
//
|
//
|
||||||
currentLog = "Kiss4web";
|
currentLog = "Kiss4web";
|
||||||
|
@ -145,12 +146,6 @@ public class Kiss4web
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case INIT:
|
case INIT:
|
||||||
{
|
|
||||||
if (this.mode == null)
|
|
||||||
{
|
|
||||||
this.mode = Mode.INIT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INIT_FAILED:
|
case INIT_FAILED:
|
||||||
|
@ -160,53 +155,50 @@ public class Kiss4web
|
||||||
this.mode = mode;
|
this.mode = mode;
|
||||||
HookRegister hooks = new HookRegister("Init failed");
|
HookRegister hooks = new HookRegister("Init failed");
|
||||||
hooks.register(new InitFailedHook());
|
hooks.register(new InitFailedHook());
|
||||||
KissDispatcher.instance().setHookRegister(hooks);
|
KissDispatcher.setHookRegister(hooks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case APP_INIT:
|
case APPLICATION_INIT:
|
||||||
{
|
{
|
||||||
if (this.mode == Mode.INIT)
|
if (this.mode == Mode.INIT)
|
||||||
{
|
{
|
||||||
this.mode = mode;
|
this.mode = mode;
|
||||||
HookRegister hooks = new HookRegister("Application Init");
|
HookRegister hooks = new HookRegister("Application Init");
|
||||||
hooks.register(new ApplicationInitHook());
|
hooks.register(new ApplicationInitHook());
|
||||||
KissDispatcher.instance().setHookRegister(hooks);
|
KissDispatcher.setHookRegister(hooks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case APP_INIT_FAILED:
|
case APPLICATION_INIT_FAILED:
|
||||||
{
|
{
|
||||||
if (this.mode == Mode.APP_INIT)
|
if (this.mode == Mode.APPLICATION_INIT_FAILED)
|
||||||
{
|
{
|
||||||
this.mode = mode;
|
this.mode = mode;
|
||||||
HookRegister hooks = new HookRegister("Application Init failed");
|
HookRegister hooks = new HookRegister("Application Init failed");
|
||||||
hooks.register(new ApplicationInitFailedHook());
|
hooks.register(new ApplicationInitFailedHook());
|
||||||
KissDispatcher.instance().setHookRegister(hooks);
|
KissDispatcher.setHookRegister(hooks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPEN:
|
case OPEN:
|
||||||
{
|
{
|
||||||
if ((this.mode == Mode.APP_INIT) || (this.mode == Mode.MAINTENANCE))
|
this.mode = mode;
|
||||||
{
|
|
||||||
this.mode = mode;
|
|
||||||
|
|
||||||
HookRegister hooks = new HookRegister("Open");
|
HookRegister hooks = new HookRegister("Open");
|
||||||
hooks.register(new BlankHook());
|
hooks.register(new BlankHook());
|
||||||
hooks.register(new RootHook());
|
hooks.register(new RootHook());
|
||||||
hooks.register(new LongURLHook());
|
hooks.register(new LongURLHook());
|
||||||
hooks.register(new FolderHook());
|
hooks.register(new FolderHook());
|
||||||
hooks.register(new ShortURLHook());
|
hooks.register(new ShortURLHook());
|
||||||
hooks.register(new XHTMLHook());
|
hooks.register(new XHTMLHook());
|
||||||
hooks.register(new WebContentHook());
|
hooks.register(new WebContentHook());
|
||||||
hooks.register(new WebInfHook());
|
hooks.register(new WebInfHook());
|
||||||
|
|
||||||
KissDispatcher.instance().setHookRegister(hooks);
|
KissDispatcher.setHookRegister(hooks);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -217,7 +209,7 @@ public class Kiss4web
|
||||||
HookRegister hooks = new HookRegister("Maintenance");
|
HookRegister hooks = new HookRegister("Maintenance");
|
||||||
hooks.register(new MaintenanceHook());
|
hooks.register(new MaintenanceHook());
|
||||||
|
|
||||||
KissDispatcher.instance().setHookRegister(hooks);
|
KissDispatcher.setHookRegister(hooks);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -228,25 +220,19 @@ public class Kiss4web
|
||||||
HookRegister hooks = new HookRegister("Fatal");
|
HookRegister hooks = new HookRegister("Fatal");
|
||||||
hooks.register(new FatalHook());
|
hooks.register(new FatalHook());
|
||||||
|
|
||||||
KissDispatcher.instance().setHookRegister(hooks);
|
KissDispatcher.setHookRegister(hooks);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CUSTOM:
|
case CUSTOM:
|
||||||
if ((this.mode == Mode.APP_INIT) || (this.mode == Mode.MAINTENANCE) || (this.mode == Mode.OPEN))
|
|
||||||
{
|
|
||||||
this.mode = mode;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the mode custom.
|
* Sets the mode custom.
|
||||||
*
|
*
|
||||||
* @param hooks
|
* @param register
|
||||||
* the new mode custom
|
* the new mode custom
|
||||||
*/
|
*/
|
||||||
public void setModeCustom(final HookRegister hooks)
|
public void setModeCustom(final HookRegister hooks)
|
||||||
|
@ -254,7 +240,7 @@ public class Kiss4web
|
||||||
if (hooks != null)
|
if (hooks != null)
|
||||||
{
|
{
|
||||||
this.mode = Mode.CUSTOM;
|
this.mode = Mode.CUSTOM;
|
||||||
KissDispatcher.instance().setHookRegister(hooks);
|
KissDispatcher.setHookRegister(hooks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,71 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
|
|
||||||
package fr.devinsy.kiss4web;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class Kiss4webException.
|
|
||||||
*/
|
|
||||||
public class Kiss4webException extends Exception
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = -6018571288000296858L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new kiss 4 web exception.
|
|
||||||
*/
|
|
||||||
public Kiss4webException()
|
|
||||||
{
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new kiss 4 web exception.
|
|
||||||
*
|
|
||||||
* @param message
|
|
||||||
* the message
|
|
||||||
*/
|
|
||||||
public Kiss4webException(final String message)
|
|
||||||
{
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new kiss 4 web exception.
|
|
||||||
*
|
|
||||||
* @param message
|
|
||||||
* the message
|
|
||||||
* @param cause
|
|
||||||
* the cause
|
|
||||||
*/
|
|
||||||
public Kiss4webException(final String message, final Throwable cause)
|
|
||||||
{
|
|
||||||
super(message, cause);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new kiss 4 web exception.
|
|
||||||
*
|
|
||||||
* @param cause
|
|
||||||
* the cause
|
|
||||||
*/
|
|
||||||
public Kiss4webException(final Throwable cause)
|
|
||||||
{
|
|
||||||
super(cause);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +1,28 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2013-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
|
* Copyright (C) 2021 Christian Pierre MOMON <christian.momon@devinsy.fr>
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Juga, simple key value database.
|
||||||
*
|
*
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
* Juga is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
* it under the terms of the GNU Affero General Public License as
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
* (at your option) any later version.
|
* License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
* Juga is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU Lesser General Public License for more details.
|
* GNU Affero General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
* along with Juga. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web;
|
package fr.devinsy.kiss4web;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
import javax.naming.ConfigurationException;
|
import javax.naming.ConfigurationException;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletContextEvent;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.logging.log4j.core.config.Configurator;
|
import org.apache.logging.log4j.core.config.Configurator;
|
||||||
|
@ -28,48 +30,24 @@ import org.apache.logging.log4j.core.config.DefaultConfiguration;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.Kiss4web.Mode;
|
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.ServletContextEvent;
|
|
||||||
import jakarta.servlet.ServletContextListener;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class Kiss4WebLauncher.
|
* The Class JugaWebLauncher.
|
||||||
*
|
|
||||||
* The Context element represents a web application. If you have implemented a
|
|
||||||
* Java object that needs to know when this Context is started or stopped, you
|
|
||||||
* can declare it by nesting a Listener element inside this element.
|
|
||||||
*/
|
*/
|
||||||
public class Kiss4webLauncher implements ServletContextListener
|
public class Kiss4webLauncher implements javax.servlet.ServletContextListener
|
||||||
{
|
{
|
||||||
private static Logger logger = LoggerFactory.getLogger(Kiss4webLauncher.class);
|
private static Logger logger = LoggerFactory.getLogger(Kiss4webLauncher.class);
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* {@inheritDoc}
|
* @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void contextDestroyed(final ServletContextEvent sce)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void contextInitialized(final ServletContextEvent event)
|
public void contextInitialized(final ServletContextEvent event)
|
||||||
{
|
{
|
||||||
System.out.println("========= KISS4WEB WEBAPP LAUNCHING… ==========");
|
launch(event.getServletContext());
|
||||||
ServletContext context = event.getServletContext();
|
|
||||||
initLogger(context.getRealPath("/"));
|
|
||||||
Kiss4web.instance().setMode(Mode.OPEN);
|
|
||||||
System.out.println("========= KISS4WEB WEBAPP LAUNCHED ==========");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inits the logger.
|
* Inits the logger.
|
||||||
*
|
|
||||||
* @param webappRoot
|
|
||||||
* the webapp root
|
|
||||||
*/
|
*/
|
||||||
public void initLogger(final String webappRoot)
|
public void initLogger(final String webappRoot)
|
||||||
{
|
{
|
||||||
|
@ -115,4 +93,19 @@ public class Kiss4webLauncher implements ServletContextListener
|
||||||
logger.info("Log initialization done.");
|
logger.info("Log initialization done.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Launch.
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* the context
|
||||||
|
*/
|
||||||
|
public void launch(final ServletContext context)
|
||||||
|
{
|
||||||
|
System.out.println("========= KISS4WEB WEBAPP LAUNCHING… ==========");
|
||||||
|
|
||||||
|
initLogger(context.getRealPath("/"));
|
||||||
|
Kiss4web.instance();
|
||||||
|
System.out.println("========= KISS4WEB WEBAPP LAUNCHED ==========");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,28 +1,43 @@
|
||||||
/**
|
/**
|
||||||
* Copyright (C) 2021-2023 Christian Pierre MOMON
|
* Copyright 2021 Christian Pierre MOMON, DEVINSY, UMR 7186 LESC.
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* christian.momon@devinsy.fr
|
||||||
*
|
*
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
* This file is part of Kiwa. This software (Kiwa) is a computer program whose
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
* purpose is to be the Kinsources Web Application, an open interactive platform
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* for archiving, sharing, analyzing and comparing kinship data used in
|
||||||
* (at your option) any later version.
|
* scientific inquiry.
|
||||||
*
|
*
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
* This software is governed by the CeCILL license under French law and abiding
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* by the rules of distribution of free software. You can use, modify and/ or
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* redistribute the software under the terms of the CeCILL license as circulated
|
||||||
* GNU Lesser General Public License for more details.
|
* by CEA, CNRS and INRIA at the following URL "http://www.cecill.info".
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
* As a counterpart to the access to the source code and rights to copy, modify
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
* and redistribute granted by the license, users are provided only with a
|
||||||
|
* limited warranty and the software's author, the holder of the economic
|
||||||
|
* rights, and the successive licensors have only limited liability.
|
||||||
|
*
|
||||||
|
* In this respect, the user's attention is drawn to the risks associated with
|
||||||
|
* loading, using, modifying and/or developing or reproducing the software by
|
||||||
|
* the user in light of its specific status of free software, that may mean that
|
||||||
|
* it is complicated to manipulate, and that also therefore means that it is
|
||||||
|
* reserved for developers and experienced professionals having in-depth
|
||||||
|
* computer knowledge. Users are therefore encouraged to load and test the
|
||||||
|
* software's suitability as regards their requirements in conditions enabling
|
||||||
|
* the security of their systems and/or data to be ensured and, more generally,
|
||||||
|
* to use and operate it in the same conditions as regards security.
|
||||||
|
*
|
||||||
|
* The fact that you are presently reading this means that you have had
|
||||||
|
* knowledge of the CeCILL license and that you accept its terms.
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web;
|
package fr.devinsy.kiss4web;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import jakarta.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class Page.
|
* The Class Page.
|
||||||
|
@ -35,46 +50,22 @@ public abstract class Page
|
||||||
private HttpServletRequest request;
|
private HttpServletRequest request;
|
||||||
private HttpServletResponse response;
|
private HttpServletResponse response;
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new page.
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* the request
|
|
||||||
* @param response
|
|
||||||
* the response
|
|
||||||
* @throws ServletException
|
|
||||||
* the servlet exception
|
|
||||||
* @throws IOException
|
|
||||||
* Signals that an I/O exception has occurred.
|
|
||||||
*/
|
|
||||||
public Page(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
|
public Page(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
|
||||||
{
|
{
|
||||||
this.request = request;
|
this.request = request;
|
||||||
this.response = response;
|
this.response = response;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Do get.
|
|
||||||
*/
|
|
||||||
public void doGet()
|
public void doGet()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Do post.
|
|
||||||
*/
|
|
||||||
public void doPost()
|
public void doPost()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Redirect.
|
|
||||||
*
|
|
||||||
* @param urlPath
|
|
||||||
* the url path
|
|
||||||
*/
|
|
||||||
public void redirect(final String urlPath)
|
public void redirect(final String urlPath)
|
||||||
{
|
{
|
||||||
Redirector.redirect(this.response, urlPath);
|
Redirector.redirect(this.response, urlPath);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,11 +18,11 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web;
|
package fr.devinsy.kiss4web;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class Redirector.
|
* The Class Redirector.
|
||||||
*/
|
*/
|
||||||
|
@ -42,11 +42,6 @@ public class Redirector
|
||||||
this.statusCode = value;
|
this.statusCode = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Status code.
|
|
||||||
*
|
|
||||||
* @return the int
|
|
||||||
*/
|
|
||||||
public int statusCode()
|
public int statusCode()
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
@ -68,6 +63,8 @@ public class Redirector
|
||||||
*/
|
*/
|
||||||
public static void redirect(final HttpServletResponse response, final String destination)
|
public static void redirect(final HttpServletResponse response, final String destination)
|
||||||
{
|
{
|
||||||
|
logger.info("Redirect to <" + destination + ">");
|
||||||
|
|
||||||
redirect(response, destination, Type.MOVED_TEMPORARILY);
|
redirect(response, destination, Type.MOVED_TEMPORARILY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* Copyright (C) 2006-2023 Christian Pierre MOMON
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,13 +18,14 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web;
|
package fr.devinsy.kiss4web;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import fr.devinsy.strings.StringList;
|
import fr.devinsy.strings.StringList;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class SimpleSecurityAgent.
|
* The Class SimpleSecurityAgent.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,120 +18,186 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher;
|
package fr.devinsy.kiss4web.dispatcher;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.annotation.AnnotationHooks;
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.annotation.AnnotationUtils;
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.hooks.ErrorServlet;
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.hooks.Hook;
|
import fr.devinsy.kiss4web.dispatcher.hooks.Hook;
|
||||||
import fr.devinsy.kiss4web.dispatcher.hooks.HookRegister;
|
import fr.devinsy.kiss4web.dispatcher.hooks.HookRegister;
|
||||||
import fr.devinsy.kiss4web.dispatcher.hooks.InitHook;
|
import fr.devinsy.kiss4web.dispatcher.hooks.InitHook;
|
||||||
import jakarta.servlet.ServletConfig;
|
|
||||||
import jakarta.servlet.ServletException;
|
|
||||||
import jakarta.servlet.http.HttpServlet;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class KissDispatcher.
|
* The Class KissDispatcher.
|
||||||
*
|
*
|
||||||
* According that URL is under UTF-8 format. Set Tomcat connector if needs
|
* According that URL is under UTF-8 format. Set Tomcat connector if needs
|
||||||
|
* (<connector … URIEncoding="UTF-8" … />).
|
||||||
*
|
*
|
||||||
* <pre>
|
|
||||||
* <connector … URIEncoding="UTF-8" … />.
|
|
||||||
* </pre>
|
|
||||||
*/
|
*/
|
||||||
public class KissDispatcher
|
public class KissDispatcher extends HttpServlet
|
||||||
{
|
{
|
||||||
|
private static final long serialVersionUID = -3471226305721330069L;
|
||||||
private static final Logger logger = LoggerFactory.getLogger(KissDispatcher.class);
|
private static final Logger logger = LoggerFactory.getLogger(KissDispatcher.class);
|
||||||
|
|
||||||
public static final int DEFAULT_CACHE_AGE = 2 * 60 * 60;
|
public static final int DEFAULT_CACHE_AGE = 2 * 60 * 60;
|
||||||
|
|
||||||
private static KissDispatcher instance = new KissDispatcher();
|
private static HookRegister hookRegister = new HookRegister("Init").register(new InitHook());
|
||||||
|
|
||||||
private HookRegister hookRegister;
|
|
||||||
|
|
||||||
// Pathinfo -> Servlet.
|
|
||||||
private ServletCache cache;
|
|
||||||
private AnnotationHooks annotationHooks;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new kiss dispatcher.
|
* Instantiates a new kiss dispatcher.
|
||||||
*/
|
*/
|
||||||
private KissDispatcher()
|
public KissDispatcher()
|
||||||
{
|
{
|
||||||
this.cache = new ServletCache();
|
|
||||||
this.hookRegister = new HookRegister("Init").register(new InitHook());
|
|
||||||
this.annotationHooks = AnnotationUtils.getAnnotationHooks();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear.
|
* <pre>
|
||||||
|
* "/" => "Index_xhtml"
|
||||||
|
* "/good/" => "good.Good_xhtml"
|
||||||
|
* "/good/morning.xhtml" => "good.Morning_xhtml"
|
||||||
|
* "/good/morning_girl.xhtml" => "good.Morning_girl_xhtml"
|
||||||
|
* "/good/morning-123.xhtml" => "good.Morning_xhtml" ('123' is detected as a parameter, it will be
|
||||||
|
* decoded in the class called later).
|
||||||
|
* "/good/morning-/12/toto.jpg" => "good.Morning" ('12' and 'toto.jpg" are detected as a parameter, they
|
||||||
|
* will be decoded in the class called later).
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
public void clear()
|
public void dispatch(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
||||||
{
|
{
|
||||||
this.cache.clear();
|
long startTime = new Date().getTime();
|
||||||
logger.info("KissDispatcher PATHINFO Cache: CLEARED");
|
|
||||||
KissDispatcherFactory.instance().clearCache();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
request.setCharacterEncoding("UTF-8");
|
||||||
* Gets the annotation hooks.
|
|
||||||
*
|
|
||||||
* @return the annotation hooks
|
|
||||||
*/
|
|
||||||
public AnnotationHooks getAnnotationHooks()
|
|
||||||
{
|
|
||||||
return this.annotationHooks;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
logger.info("==================================================");
|
||||||
* Provide servlet.
|
logger.info("getContextPath=[" + request.getContextPath() + "]");
|
||||||
*
|
logger.info("getPathInfo=[" + request.getPathInfo() + "]");
|
||||||
* @param config
|
logger.info("getPathTranslated=[" + request.getPathTranslated() + "]");
|
||||||
* the config
|
logger.info("getQueryString=[" + request.getQueryString() + "]");
|
||||||
* @param request
|
logger.info("getRequestURI=[" + request.getRequestURI() + "]");
|
||||||
* the request
|
logger.info("getRequestURL=[" + request.getRequestURL() + "]");
|
||||||
* @return the http servlet
|
logger.info("getServletPath=[" + request.getServletPath() + "]");
|
||||||
*/
|
|
||||||
public HttpServlet provideServlet(final ServletConfig config, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
HttpServlet result;
|
|
||||||
|
|
||||||
try
|
//
|
||||||
|
/*
|
||||||
|
* In past, possibility to use the servlet path was enable. It is too
|
||||||
|
* complexe, not kiss mind.
|
||||||
|
*
|
||||||
|
* String path;
|
||||||
|
* if (request.getPathInfo() == null)
|
||||||
|
* {
|
||||||
|
* // web.xml url-pattern= *.xhtml
|
||||||
|
* path = request.getServletPath();
|
||||||
|
* }
|
||||||
|
* else
|
||||||
|
* {
|
||||||
|
* // web.xml url-pattern =
|
||||||
|
* path = request.getPathInfo();
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* https://issues.apache.org/bugzilla/show_bug.cgi?id=11318
|
||||||
|
* A number of features have been introduced in later versions of Tomcat
|
||||||
|
* that relate to URI encoding. This includes a URIEncoding attribute
|
||||||
|
* on the Coyote HTTP/1.1 connector which defaults to ISO-8859-1.
|
||||||
|
*
|
||||||
|
* According to the servlet specification:
|
||||||
|
* HttpServletRequest.getPathInfo() should be decoded by the web container;
|
||||||
|
* HttpServletRequest.getRequestURI() should not be decoded by the web container.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* http://stackoverflow.com/questions/15278512/safe-html-form-accept-charset/15587140#15587140
|
||||||
|
* The standard URL encoding must use UTF-8 yet servlets not only default to ISO-8859-1 but don't offer
|
||||||
|
* any way to change that with code.
|
||||||
|
* Sure you can req.setRequestEncoding("UTF-8") before you read anything, but for some ungodly reason this only affects request body,
|
||||||
|
* not query string parameters. There is nothing in the servlet request interface to specify the encoding used for query string parameters.
|
||||||
|
* Using ISO-8859-1 in your form is a hack. Using this ancient encoding will cause more problems than solve for sure.
|
||||||
|
* Especially since browsers do not support ISO-8859-1 and always treat it as Windows-1252. Whereas servlets treat ISO-8859-1 as ISO-8859-1,
|
||||||
|
* so you will be screwed beyond belief if you go with this.
|
||||||
|
* To change this in Tomcat for example, you can use the URIEncoding attribute in your <connector> element:
|
||||||
|
* <connector ... URIEncoding="UTF-8" ... />
|
||||||
|
*
|
||||||
|
* If you don't use a container that has these settings, can't change its settings or some other issue,
|
||||||
|
* you can still make it work because ISO-8859-1 decoding retains full information from the original binary.
|
||||||
|
* String correct = new String(request.getParameter("test").getBytes("ISO-8859-1"), "UTF-8")
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* http://tomcat.apache.org/tomcat-5.5-doc/config/http.html
|
||||||
|
* URIEncoding
|
||||||
|
* This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL.
|
||||||
|
* If not specified, ISO-8859-1 will be used.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
// String urlPath = request.getPathInfo();
|
||||||
|
|
||||||
|
// Search a matching catcher.
|
||||||
|
Hook hook = hookRegister.getMatching(this.getServletContext(), request);
|
||||||
|
if (hook == null)
|
||||||
{
|
{
|
||||||
result = this.cache.get(request.getPathInfo());
|
logger.info("Request not satisfied [" + request.getPathInfo() + "]");
|
||||||
if (result == null)
|
response.sendError(HttpServletResponse.SC_NOT_FOUND);
|
||||||
{
|
|
||||||
logger.debug("PathInfo is NOT matching servlet cache.");
|
|
||||||
Hook hook = this.hookRegister.getMatching(config.getServletContext(), request);
|
|
||||||
if (hook == null)
|
|
||||||
{
|
|
||||||
result = new ErrorServlet("Hook not found.");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
logger.debug("Hook matching: {}", hook.getClass().getCanonicalName());
|
|
||||||
String servletClassName = hook.getServletClassName(config, request);
|
|
||||||
|
|
||||||
Class<HttpServlet> servletClass = KissDispatcherUtils.pickServletClass(servletClassName);
|
|
||||||
|
|
||||||
result = KissDispatcherFactory.instance().provideServlet(config, servletClass);
|
|
||||||
this.cache.put(request.getPathInfo(), result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
logger.debug("PathInfo is matching servlet cache [{}]", result.getClass().getCanonicalName());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (IllegalArgumentException | SecurityException | ServletException exception)
|
else
|
||||||
{
|
{
|
||||||
result = new ErrorServlet("Error instanciating servlet.", exception);
|
logger.info("Catch found for {}", hook.getClass().getSimpleName());
|
||||||
|
hook.process(this.getServletConfig(), this.getServletContext(), request, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
long endTime = new Date().getTime();
|
||||||
|
logger.debug("TIME: {}ms {}", endTime - startTime, request.getPathInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see javax.servlet.http.HttpServlet#doDelete(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doDelete(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
dispatch(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
dispatch(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doPost(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
dispatch(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see javax.servlet.http.HttpServlet#doPut(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doPut(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
dispatch(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see javax.servlet.GenericServlet#init()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void init() throws ServletException
|
||||||
|
{
|
||||||
|
super.init();
|
||||||
|
|
||||||
|
System.out.println("KissDispatcher INIT.");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -140,24 +206,14 @@ public class KissDispatcher
|
||||||
* @param register
|
* @param register
|
||||||
* the new hook register
|
* the new hook register
|
||||||
*/
|
*/
|
||||||
public void setHookRegister(final HookRegister register)
|
public static void setHookRegister(final HookRegister register)
|
||||||
{
|
{
|
||||||
if ((register != null) && (!register.isEmpty()))
|
if ((register != null) && (!register.isEmpty()))
|
||||||
{
|
{
|
||||||
HookRegister target = new HookRegister(register.getName());
|
HookRegister target = new HookRegister(register.getName());
|
||||||
target.registerAll(register);
|
target.registerAll(register);
|
||||||
this.hookRegister = target;
|
hookRegister = target;
|
||||||
KissDispatcherFactory.instance().clearCache();
|
KissDispatcherFactory.instance().clearCache();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Instance.
|
|
||||||
*
|
|
||||||
* @return the kiss dispatcher
|
|
||||||
*/
|
|
||||||
public static KissDispatcher instance()
|
|
||||||
{
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -20,23 +20,23 @@ package fr.devinsy.kiss4web.dispatcher;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import jakarta.servlet.http.HttpServlet;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class ServletCache.
|
* The Class KissDispatcherCache.
|
||||||
*/
|
*/
|
||||||
public class ServletCache extends HashMap<String, HttpServlet>
|
public class KissDispatcherCache extends HashMap<String, HttpServlet>
|
||||||
{
|
{
|
||||||
private static final long serialVersionUID = -7727974577347443504L;
|
private static final long serialVersionUID = -7727974577347443504L;
|
||||||
private static Logger logger = LoggerFactory.getLogger(ServletCache.class);
|
private static Logger logger = LoggerFactory.getLogger(KissDispatcherCache.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new kiss dispatcher cache.
|
* Instantiates a new kiss dispatcher cache.
|
||||||
*/
|
*/
|
||||||
public ServletCache()
|
public KissDispatcherCache()
|
||||||
{
|
{
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
@ -53,14 +53,13 @@ public class ServletCache extends HashMap<String, HttpServlet>
|
||||||
HttpServlet result;
|
HttpServlet result;
|
||||||
|
|
||||||
boolean ended = false;
|
boolean ended = false;
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
result = null;
|
result = null;
|
||||||
while (!ended)
|
while (!ended)
|
||||||
{
|
{
|
||||||
if (index < path.length)
|
if (index < path.length)
|
||||||
{
|
{
|
||||||
result = super.get(path[index]);
|
result = get(path);
|
||||||
if (result == null)
|
if (result == null)
|
||||||
{
|
{
|
||||||
index += 1;
|
index += 1;
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web;
|
package fr.devinsy.kiss4web.dispatcher;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
@ -24,17 +24,17 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class PageCache.
|
* The Class KissClassCache.
|
||||||
*/
|
*/
|
||||||
public class PageCache extends HashMap<String, String>
|
public class KissDispatcherCache2 extends HashMap<String, String>
|
||||||
{
|
{
|
||||||
private static final long serialVersionUID = 6600633944028794039L;
|
private static final long serialVersionUID = 2058060444094070931L;
|
||||||
private static Logger logger = LoggerFactory.getLogger(PageCache.class);
|
private static Logger logger = LoggerFactory.getLogger(KissDispatcherCache2.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new kiss page cache.
|
* Instantiates a new kiss class cache.
|
||||||
*/
|
*/
|
||||||
public PageCache()
|
public KissDispatcherCache2()
|
||||||
{
|
{
|
||||||
super();
|
super();
|
||||||
}
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,77 +18,169 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher;
|
package fr.devinsy.kiss4web.dispatcher;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import jakarta.servlet.ServletConfig;
|
|
||||||
import jakarta.servlet.ServletException;
|
|
||||||
import jakarta.servlet.http.HttpServlet;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A factory for creating KissDispatcher objects.
|
* A factory for creating KissDispatcher objects.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class KissDispatcherFactory
|
public class KissDispatcherFactory
|
||||||
{
|
{
|
||||||
static Logger logger = LoggerFactory.getLogger(KissDispatcherFactory.class);
|
private static Logger logger = LoggerFactory.getLogger(KissDispatcherFactory.class);
|
||||||
|
|
||||||
private static class SingletonHolder
|
private static class SingletonHolder
|
||||||
{
|
{
|
||||||
private static final KissDispatcherFactory instance = new KissDispatcherFactory();
|
private static final KissDispatcherFactory instance = new KissDispatcherFactory();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
private KissDispatcherCache cache;
|
||||||
* Need to avoid servlet duplication when more than pathinfo is matching a servlet.
|
|
||||||
* ClassPath -> Servlet.
|
|
||||||
*/
|
|
||||||
private ServletCache cache;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new kiss dispatcher factory.
|
* Instantiates a new kiss dispatcher factory.
|
||||||
*/
|
*/
|
||||||
private KissDispatcherFactory()
|
private KissDispatcherFactory()
|
||||||
{
|
{
|
||||||
this.cache = new ServletCache();
|
this.cache = new KissDispatcherCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear cache.
|
|
||||||
*/
|
|
||||||
public void clearCache()
|
public void clearCache()
|
||||||
{
|
{
|
||||||
this.cache.clear();
|
this.cache.clear();
|
||||||
logger.info("KissDispatcherFactory Servlet Cache: CLEARED");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provide servlet.
|
* Dispatch to servlet.
|
||||||
*
|
*
|
||||||
* @param config
|
* @param servletConfig
|
||||||
* the config
|
* the servlet config
|
||||||
* @param servletClass
|
* @param request
|
||||||
* the servlet class
|
* the request
|
||||||
* @return the http servlet
|
* @param response
|
||||||
|
* the response
|
||||||
|
* @param urlPath
|
||||||
|
* the url path
|
||||||
|
* @throws IOException
|
||||||
|
* Signals that an I/O exception has occurred.
|
||||||
* @throws ServletException
|
* @throws ServletException
|
||||||
* the servlet exception
|
* the servlet exception
|
||||||
*/
|
*/
|
||||||
public HttpServlet provideServlet(final ServletConfig config, final Class<HttpServlet> servletClass) throws ServletException
|
public void dispatchPathToServlet(final ServletConfig servletConfig, final HttpServletRequest request, final HttpServletResponse response,
|
||||||
|
final String urlPath) throws IOException, ServletException
|
||||||
{
|
{
|
||||||
HttpServlet result;
|
// Get the servlet.
|
||||||
|
HttpServlet servlet = this.cache.get(urlPath);
|
||||||
if ((config == null) || (servletClass == null))
|
if (servlet == null)
|
||||||
{
|
{
|
||||||
throw new ServletException("Null parameter detected calling KDF.provideServlet method.");
|
String className = translateToClassName(urlPath);
|
||||||
|
logger.info("className=[" + className + "]");
|
||||||
|
|
||||||
|
servlet = KissDispatcherUtils.instanciateServlet("website." + className);
|
||||||
|
|
||||||
|
if (servlet == null)
|
||||||
|
{
|
||||||
|
logger.info("Trying with Page suffix.");
|
||||||
|
servlet = KissDispatcherUtils.instanciateServlet("website." + className.replaceAll("Xhtml$", "Page"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (servlet != null)
|
||||||
|
{
|
||||||
|
servlet.init(servletConfig);
|
||||||
|
this.cache.put(urlPath, servlet);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
String className = servletClass.getCanonicalName();
|
logger.info("Class cache MATCHED.");
|
||||||
result = this.cache.get(className);
|
}
|
||||||
if (result == null)
|
|
||||||
|
// Serve the servlet.
|
||||||
|
if (servlet == null)
|
||||||
|
{
|
||||||
|
response.setContentType("text/html");
|
||||||
|
PrintWriter out = response.getWriter();
|
||||||
|
|
||||||
|
out.println("<html><head></head><body>");
|
||||||
|
out.println("Unknown page.");
|
||||||
|
out.println("</body></html>");
|
||||||
|
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
servlet.service(request, response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if is available class.
|
||||||
|
*
|
||||||
|
* @param className
|
||||||
|
* the class name
|
||||||
|
* @return true, if is available class
|
||||||
|
*/
|
||||||
|
private boolean isAvailableClass(final String className)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Class<HttpServlet> servletClass = (Class<HttpServlet>) Class.forName(className);
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
catch (java.lang.ClassNotFoundException exception)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if is availableget path.
|
||||||
|
*
|
||||||
|
* @param servletConfig
|
||||||
|
* the servlet config
|
||||||
|
* @param request
|
||||||
|
* the request
|
||||||
|
* @param response
|
||||||
|
* the response
|
||||||
|
* @param urlPath
|
||||||
|
* the url path
|
||||||
|
* @return true, if is availableget path
|
||||||
|
* @throws IOException
|
||||||
|
* Signals that an I/O exception has occurred.
|
||||||
|
* @throws ServletException
|
||||||
|
* the servlet exception
|
||||||
|
*/
|
||||||
|
public boolean isAvailablePath(final String urlPath)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (this.cache.containsKey(urlPath))
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
String className = "website." + translateToClassName(urlPath);
|
||||||
|
if (isAvailableClass(className) || isAvailableClass(className.replaceAll("Xhtml$", "Page")))
|
||||||
{
|
{
|
||||||
result = KissDispatcherUtils.instanciateServlet(className);
|
result = true;
|
||||||
result.init(config);
|
}
|
||||||
this.cache.put(className, result);
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,4 +197,105 @@ public class KissDispatcherFactory
|
||||||
{
|
{
|
||||||
return SingletonHolder.instance;
|
return SingletonHolder.instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translate to class name.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* "/" => "IndexXhtml"
|
||||||
|
* "/good/" => "good.IndexXhtml"
|
||||||
|
* "/good/morning.xhtml" => "good.MorningXhtml"
|
||||||
|
* "/good/morning_girl.xhtml" => "good.MorningGirlXhtml"
|
||||||
|
* "/good/morning-girl.xhtml" => "good.MorningGirlXhtml"
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @param urlPath
|
||||||
|
* the url path
|
||||||
|
* @return the string
|
||||||
|
*/
|
||||||
|
public static String translateToClassName(final String urlPath)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (urlPath == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (urlPath.length() == 1)
|
||||||
|
{
|
||||||
|
result = "IndexXhtml";
|
||||||
|
}
|
||||||
|
else if (urlPath.endsWith("/"))
|
||||||
|
{
|
||||||
|
StringBuffer buffer = new StringBuffer(urlPath.length() + 50);
|
||||||
|
for (int index = 1; index < urlPath.length(); index++)
|
||||||
|
{
|
||||||
|
char letter = urlPath.charAt(index);
|
||||||
|
|
||||||
|
if (letter == '/')
|
||||||
|
{
|
||||||
|
buffer.append('.');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buffer.append(letter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buffer.append(".IndexXhtml");
|
||||||
|
|
||||||
|
result = buffer.toString();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int lastToken = urlPath.lastIndexOf('/');
|
||||||
|
|
||||||
|
StringBuffer buffer = new StringBuffer(urlPath.length());
|
||||||
|
for (int index = 1; index <= lastToken; index++)
|
||||||
|
{
|
||||||
|
char letter = urlPath.charAt(index);
|
||||||
|
|
||||||
|
if (letter == '/')
|
||||||
|
{
|
||||||
|
buffer.append('.');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buffer.append(letter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean capitalizedNext = true;
|
||||||
|
for (int index = lastToken + 1; index < urlPath.length(); index++)
|
||||||
|
{
|
||||||
|
char letter = urlPath.charAt(index);
|
||||||
|
|
||||||
|
if ((letter == '_') || (letter == '-') || (letter == '.'))
|
||||||
|
{
|
||||||
|
capitalizedNext = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (capitalizedNext)
|
||||||
|
{
|
||||||
|
buffer.append(Character.toUpperCase(letter));
|
||||||
|
capitalizedNext = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buffer.append(letter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = buffer.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info(urlPath + " -> " + result);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,135 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import jakarta.servlet.ServletException;
|
|
||||||
import jakarta.servlet.http.HttpServlet;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class KissDispatcher.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class KissDispatcherServlet extends HttpServlet
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = -7278690604864844533L;
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(KissDispatcherServlet.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new kiss dispatcher.
|
|
||||||
*/
|
|
||||||
public KissDispatcherServlet()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void init() throws ServletException
|
|
||||||
{
|
|
||||||
super.init();
|
|
||||||
|
|
||||||
System.out.println("KissDispatcher INIT.");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void service(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
long startTime = new Date().getTime();
|
|
||||||
|
|
||||||
request.setCharacterEncoding("UTF-8");
|
|
||||||
|
|
||||||
logger.info("==================================================");
|
|
||||||
logger.info("getContextPath=[" + request.getContextPath() + "]");
|
|
||||||
logger.info("getPathInfo=[" + request.getPathInfo() + "]");
|
|
||||||
logger.info("getPathTranslated=[" + request.getPathTranslated() + "]");
|
|
||||||
logger.info("getQueryString=[" + request.getQueryString() + "]");
|
|
||||||
logger.info("getRequestURI=[" + request.getRequestURI() + "]");
|
|
||||||
logger.info("getRequestURL=[" + request.getRequestURL() + "]");
|
|
||||||
logger.info("getServletPath=[" + request.getServletPath() + "]");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* In past, possibility to use the servlet path was enable. It is too
|
|
||||||
* complexe, not kiss mind.
|
|
||||||
*
|
|
||||||
* String path;
|
|
||||||
* if (request.getPathInfo() == null)
|
|
||||||
* {
|
|
||||||
* // web.xml url-pattern= *.xhtml
|
|
||||||
* path = request.getServletPath();
|
|
||||||
* }
|
|
||||||
* else
|
|
||||||
* {
|
|
||||||
* // web.xml url-pattern =
|
|
||||||
* path = request.getPathInfo();
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* https://issues.apache.org/bugzilla/show_bug.cgi?id=11318
|
|
||||||
* A number of features have been introduced in later versions of Tomcat
|
|
||||||
* that relate to URI encoding. This includes a URIEncoding attribute
|
|
||||||
* on the Coyote HTTP/1.1 connector which defaults to ISO-8859-1.
|
|
||||||
*
|
|
||||||
* According to the servlet specification:
|
|
||||||
* HttpServletRequest.getPathInfo() should be decoded by the web container;
|
|
||||||
* HttpServletRequest.getRequestURI() should not be decoded by the web container.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* http://stackoverflow.com/questions/15278512/safe-html-form-accept-charset/15587140#15587140
|
|
||||||
* The standard URL encoding must use UTF-8 yet servlets not only default to ISO-8859-1 but don't offer
|
|
||||||
* any way to change that with code.
|
|
||||||
* Sure you can req.setRequestEncoding("UTF-8") before you read anything, but for some ungodly reason this only affects request body,
|
|
||||||
* not query string parameters. There is nothing in the servlet request interface to specify the encoding used for query string parameters.
|
|
||||||
* Using ISO-8859-1 in your form is a hack. Using this ancient encoding will cause more problems than solve for sure.
|
|
||||||
* Especially since browsers do not support ISO-8859-1 and always treat it as Windows-1252. Whereas servlets treat ISO-8859-1 as ISO-8859-1,
|
|
||||||
* so you will be screwed beyond belief if you go with this.
|
|
||||||
* To change this in Tomcat for example, you can use the URIEncoding attribute in your <connector> element:
|
|
||||||
* <connector ... URIEncoding="UTF-8" ... />
|
|
||||||
*
|
|
||||||
* If you don't use a container that has these settings, can't change its settings or some other issue,
|
|
||||||
* you can still make it work because ISO-8859-1 decoding retains full information from the original binary.
|
|
||||||
* String correct = new String(request.getParameter("test").getBytes("ISO-8859-1"), "UTF-8")
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* http://tomcat.apache.org/tomcat-5.5-doc/config/http.html
|
|
||||||
* URIEncoding
|
|
||||||
* This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL.
|
|
||||||
* If not specified, ISO-8859-1 will be used.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
// String urlPath = request.getPathInfo();
|
|
||||||
|
|
||||||
HttpServlet servlet = KissDispatcher.instance().provideServlet(this.getServletConfig(), request);
|
|
||||||
servlet.service(request, response);
|
|
||||||
|
|
||||||
//
|
|
||||||
long endTime = new Date().getTime();
|
|
||||||
logger.debug("TIME: {}ms {}", endTime - startTime, request.getPathInfo());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -25,26 +25,26 @@ import java.io.PrintWriter;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
import java.util.Objects;
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.ServletOutputStream;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.hooks.ShortURLRewriter;
|
import fr.devinsy.kiss4web.dispatcher.hooks.ShortURLRewriter;
|
||||||
import fr.devinsy.strings.StringList;
|
import fr.devinsy.strings.StringList;
|
||||||
import jakarta.servlet.ServletConfig;
|
|
||||||
import jakarta.servlet.ServletException;
|
|
||||||
import jakarta.servlet.ServletOutputStream;
|
|
||||||
import jakarta.servlet.http.HttpServlet;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class KissDispatcherUtils.
|
* The Class KissDispatcherUtils.
|
||||||
*/
|
*/
|
||||||
public class KissDispatcherUtils
|
public class KissDispatcherUtils
|
||||||
{
|
{
|
||||||
static Logger logger = LoggerFactory.getLogger(KissDispatcherUtils.class);
|
private static Logger logger = LoggerFactory.getLogger(KissDispatcherUtils.class);
|
||||||
|
|
||||||
public enum ContentDispositionType
|
public enum ContentDispositionType
|
||||||
{
|
{
|
||||||
|
@ -142,7 +142,6 @@ public class KissDispatcherUtils
|
||||||
* @throws ServletException
|
* @throws ServletException
|
||||||
* the servlet exception
|
* the servlet exception
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
|
||||||
public static void dispatchToServlet(final ServletConfig servletConfig, final HttpServletRequest request, final HttpServletResponse response,
|
public static void dispatchToServlet(final ServletConfig servletConfig, final HttpServletRequest request, final HttpServletResponse response,
|
||||||
final String className) throws IOException, ServletException
|
final String className) throws IOException, ServletException
|
||||||
{
|
{
|
||||||
|
@ -206,17 +205,17 @@ public class KissDispatcherUtils
|
||||||
* Instanciate servlet.
|
* Instanciate servlet.
|
||||||
*
|
*
|
||||||
* @param className
|
* @param className
|
||||||
* the class pathname
|
* the class name
|
||||||
* @return the http servlet
|
* @return the http servlet or null if no one found.
|
||||||
*/
|
*/
|
||||||
public static HttpServlet instanciateServlet(final String className)
|
public static HttpServlet instanciateServlet(final String classPathname)
|
||||||
{
|
{
|
||||||
HttpServlet result;
|
HttpServlet result;
|
||||||
|
|
||||||
Class<HttpServlet> servletClass = null;
|
Class<HttpServlet> servletClass = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
servletClass = (Class<HttpServlet>) Class.forName(className);
|
servletClass = (Class<HttpServlet>) Class.forName(classPathname);
|
||||||
}
|
}
|
||||||
catch (java.lang.ClassNotFoundException exception)
|
catch (java.lang.ClassNotFoundException exception)
|
||||||
{
|
{
|
||||||
|
@ -226,7 +225,7 @@ public class KissDispatcherUtils
|
||||||
if (servletClass == null)
|
if (servletClass == null)
|
||||||
{
|
{
|
||||||
result = null;
|
result = null;
|
||||||
logger.warn("unknown page: [{}]", className);
|
logger.warn("unknown page: [{}]", classPathname);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -237,17 +236,17 @@ public class KissDispatcherUtils
|
||||||
}
|
}
|
||||||
catch (java.lang.InstantiationException exception)
|
catch (java.lang.InstantiationException exception)
|
||||||
{
|
{
|
||||||
logger.error("Can't instanciate servlet (" + className + ")", exception);
|
logger.error("Can't instanciate servlet (" + classPathname + ")", exception);
|
||||||
result = null;
|
result = null;
|
||||||
}
|
}
|
||||||
catch (java.lang.IllegalAccessException exception)
|
catch (java.lang.IllegalAccessException exception)
|
||||||
{
|
{
|
||||||
logger.error("(2) Can't instanciate servlet (" + className + ")", exception);
|
logger.error("(2) Can't instanciate servlet (" + classPathname + ")", exception);
|
||||||
result = null;
|
result = null;
|
||||||
}
|
}
|
||||||
catch (IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException exception)
|
catch (IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException exception)
|
||||||
{
|
{
|
||||||
logger.error("(3) Can't instanciate servlet (" + className + ")", exception);
|
logger.error("(3) Can't instanciate servlet (" + classPathname + ")", exception);
|
||||||
result = null;
|
result = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -256,54 +255,6 @@ public class KissDispatcherUtils
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if is available path.
|
|
||||||
*
|
|
||||||
* @param path
|
|
||||||
* the path
|
|
||||||
* @return true, if is available path
|
|
||||||
*/
|
|
||||||
public static boolean isAvailablePath(final String path)
|
|
||||||
{
|
|
||||||
boolean result;
|
|
||||||
|
|
||||||
if (pickServletClass(path) == null)
|
|
||||||
{
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Path to class.
|
|
||||||
*
|
|
||||||
* @param className
|
|
||||||
* the class pathname
|
|
||||||
* @return the class
|
|
||||||
*/
|
|
||||||
public static Class nameToClass(final String className)
|
|
||||||
{
|
|
||||||
Class result;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
result = Class.forName(className);
|
|
||||||
}
|
|
||||||
catch (java.lang.ClassNotFoundException exception)
|
|
||||||
{
|
|
||||||
result = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a path in a class name, using kiss conventions.
|
* Convert a path in a class name, using kiss conventions.
|
||||||
*
|
*
|
||||||
|
@ -432,39 +383,6 @@ public class KissDispatcherUtils
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Path to servlet class.
|
|
||||||
*
|
|
||||||
* @param className
|
|
||||||
* the class pathname
|
|
||||||
* @return the class
|
|
||||||
*/
|
|
||||||
public static Class<HttpServlet> pickServletClass(final String className)
|
|
||||||
{
|
|
||||||
Class<HttpServlet> result;
|
|
||||||
|
|
||||||
// String className = KissDispatcherUtils.translateToClassName(path);
|
|
||||||
logger.info("className=[{}]", className);
|
|
||||||
|
|
||||||
result = nameToClass(className);
|
|
||||||
if (result == null)
|
|
||||||
{
|
|
||||||
logger.info("Trying with Page suffix.");
|
|
||||||
result = nameToClass(className.replaceAll("Xhtml$", "Page"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result == null)
|
|
||||||
{
|
|
||||||
logger.info("Trying with Do suffix.");
|
|
||||||
result = nameToClass(className.replaceAll("Xhtml$", "Do"));
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.debug("servletClass={}", result);
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return attachment file.
|
* Return attachment file.
|
||||||
*
|
*
|
||||||
|
@ -499,29 +417,6 @@ public class KissDispatcherUtils
|
||||||
public static void returnFile(final HttpServletResponse response, final File file, final String mimeType,
|
public static void returnFile(final HttpServletResponse response, final File file, final String mimeType,
|
||||||
final ContentDispositionType contentDisposition) throws IOException
|
final ContentDispositionType contentDisposition) throws IOException
|
||||||
{
|
{
|
||||||
returnFile(response, file, null, mimeType, contentDisposition);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return file.
|
|
||||||
*
|
|
||||||
* @param response
|
|
||||||
* the response
|
|
||||||
* @param file
|
|
||||||
* the file
|
|
||||||
* @param targetFilename
|
|
||||||
* the target filename, in case the name of file is not the one
|
|
||||||
* intended, if null then the file name is used
|
|
||||||
* @param mimeType
|
|
||||||
* the mime type
|
|
||||||
* @param contentDisposition
|
|
||||||
* the content disposition
|
|
||||||
* @throws IOException
|
|
||||||
* Signals that an I/O exception has occurred.
|
|
||||||
*/
|
|
||||||
public static void returnFile(final HttpServletResponse response, final File file, final String targetFilename, final String mimeType,
|
|
||||||
final ContentDispositionType contentDisposition) throws IOException
|
|
||||||
{
|
|
||||||
|
|
||||||
if ((file == null) || (!file.exists()))
|
if ((file == null) || (!file.exists()))
|
||||||
{
|
{
|
||||||
|
@ -549,9 +444,7 @@ public class KissDispatcherUtils
|
||||||
{
|
{
|
||||||
contentDispositionToken = "inline";
|
contentDispositionToken = "inline";
|
||||||
}
|
}
|
||||||
|
response.setHeader("Content-Disposition", contentDispositionToken + "; filename=\"" + file.getName() + "\"");
|
||||||
response.setHeader("Content-Disposition",
|
|
||||||
contentDispositionToken + "; filename=\"" + Objects.toString(targetFilename, file.getName()) + "\"");
|
|
||||||
|
|
||||||
response.setDateHeader("Expires", new Date().getTime() + KissDispatcher.DEFAULT_CACHE_AGE * 1000);
|
response.setDateHeader("Expires", new Date().getTime() + KissDispatcher.DEFAULT_CACHE_AGE * 1000);
|
||||||
response.setHeader("Cache-Control", "max-age=" + KissDispatcher.DEFAULT_CACHE_AGE);
|
response.setHeader("Cache-Control", "max-age=" + KissDispatcher.DEFAULT_CACHE_AGE);
|
||||||
|
@ -586,10 +479,6 @@ public class KissDispatcherUtils
|
||||||
}
|
}
|
||||||
catch (IOException exception)
|
catch (IOException exception)
|
||||||
{
|
{
|
||||||
System.out.println("/!\\/!\\/!\\/!\\/!\\/!\\/!\\/!\\/!\\/!\\/!\\/!\\/!\\/!\\/!\\");
|
|
||||||
exception.printStackTrace();
|
|
||||||
// TODO As sendError cannot be send because partial content has
|
|
||||||
// been send, we have to replace this with a better way.
|
|
||||||
response.sendError(HttpServletResponse.SC_PARTIAL_CONTENT);
|
response.sendError(HttpServletResponse.SC_PARTIAL_CONTENT);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
|
@ -697,26 +586,6 @@ public class KissDispatcherUtils
|
||||||
returnFile(response, file, mimeType, ContentDispositionType.INLINE);
|
returnFile(response, file, mimeType, ContentDispositionType.INLINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Return inline file.
|
|
||||||
*
|
|
||||||
* @param response
|
|
||||||
* the response
|
|
||||||
* @param file
|
|
||||||
* the file
|
|
||||||
* @param targetFilename
|
|
||||||
* the target filename
|
|
||||||
* @param mimeType
|
|
||||||
* the mime type
|
|
||||||
* @throws IOException
|
|
||||||
* Signals that an I/O exception has occurred.
|
|
||||||
*/
|
|
||||||
public static void returnInlineFile(final HttpServletResponse response, final File file, final String targetFilename, final String mimeType)
|
|
||||||
throws IOException
|
|
||||||
{
|
|
||||||
returnFile(response, file, targetFilename, mimeType, ContentDispositionType.INLINE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show parameters.
|
* Show parameters.
|
||||||
*
|
*
|
||||||
|
@ -754,202 +623,4 @@ public class KissDispatcherUtils
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Translate to class name.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* "/" => "IndexXhtml"
|
|
||||||
* "/good/" => "good.IndexXhtml"
|
|
||||||
* "/good/morning.xhtml" => "good.MorningXhtml"
|
|
||||||
* "/good/morning_girl.xhtml" => "good.MorningGirlXhtml"
|
|
||||||
* "/good/morning-girl.xhtml" => "good.MorningGirlXhtml"
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* @param urlPath
|
|
||||||
* the url path
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public static String translateToClassName(final String urlPath)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
if (urlPath == null)
|
|
||||||
{
|
|
||||||
result = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (urlPath.length() == 1)
|
|
||||||
{
|
|
||||||
result = "IndexXhtml";
|
|
||||||
}
|
|
||||||
else if (urlPath.endsWith("/"))
|
|
||||||
{
|
|
||||||
StringBuffer buffer = new StringBuffer(urlPath.length() + 50);
|
|
||||||
for (int index = 1; index < urlPath.length(); index++)
|
|
||||||
{
|
|
||||||
char letter = urlPath.charAt(index);
|
|
||||||
|
|
||||||
if (letter == '/')
|
|
||||||
{
|
|
||||||
buffer.append('.');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
buffer.append(letter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buffer.append("IndexXhtml");
|
|
||||||
|
|
||||||
result = buffer.toString();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int lastToken = urlPath.lastIndexOf('/');
|
|
||||||
|
|
||||||
StringBuffer buffer = new StringBuffer(urlPath.length());
|
|
||||||
for (int index = 1; index <= lastToken; index++)
|
|
||||||
{
|
|
||||||
char letter = urlPath.charAt(index);
|
|
||||||
|
|
||||||
if (letter == '/')
|
|
||||||
{
|
|
||||||
buffer.append('.');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
buffer.append(letter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean capitalizedNext = true;
|
|
||||||
for (int index = lastToken + 1; index < urlPath.length(); index++)
|
|
||||||
{
|
|
||||||
char letter = urlPath.charAt(index);
|
|
||||||
|
|
||||||
if ((letter == '_') || (letter == '-') || (letter == '.'))
|
|
||||||
{
|
|
||||||
capitalizedNext = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (capitalizedNext)
|
|
||||||
{
|
|
||||||
buffer.append(Character.toUpperCase(letter));
|
|
||||||
capitalizedNext = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
buffer.append(letter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result = buffer.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
KissDispatcherFactory.logger.info(urlPath + " -> " + result);
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Translate to class name.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* "/" => "Index_xhtml"
|
|
||||||
* "/good/" => "good.Index_xhtml"
|
|
||||||
* "/good/morning.xhtml" => "good.MorningXhtml"
|
|
||||||
* "/good/morning_girl.xhtml" => "good.Morning-Girl_xhtml"
|
|
||||||
* "/good/morning-girl.xhtml" => "good.Morning_Girl_xhtml"
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* @param urlPath
|
|
||||||
* the url path
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
public static String translateToClassNameAlternative(final String urlPath)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
if (urlPath == null)
|
|
||||||
{
|
|
||||||
result = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (urlPath.length() == 1)
|
|
||||||
{
|
|
||||||
result = "IndexXhtml";
|
|
||||||
}
|
|
||||||
else if (urlPath.endsWith("/"))
|
|
||||||
{
|
|
||||||
StringBuffer buffer = new StringBuffer(urlPath.length() + 50);
|
|
||||||
for (int index = 1; index < urlPath.length(); index++)
|
|
||||||
{
|
|
||||||
char letter = urlPath.charAt(index);
|
|
||||||
|
|
||||||
if (letter == '/')
|
|
||||||
{
|
|
||||||
buffer.append('.');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
buffer.append(letter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buffer.append(".Index_xhtml");
|
|
||||||
|
|
||||||
result = buffer.toString();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int lastToken = urlPath.lastIndexOf('/');
|
|
||||||
|
|
||||||
StringBuffer buffer = new StringBuffer(urlPath.length());
|
|
||||||
for (int index = 1; index <= lastToken; index++)
|
|
||||||
{
|
|
||||||
char letter = urlPath.charAt(index);
|
|
||||||
|
|
||||||
if (letter == '/')
|
|
||||||
{
|
|
||||||
buffer.append('.');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
buffer.append(letter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lastToken + 1 < urlPath.length())
|
|
||||||
{
|
|
||||||
buffer.append(Character.toUpperCase(urlPath.charAt(lastToken + 1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int index = lastToken + 2; index < urlPath.length(); index++)
|
|
||||||
{
|
|
||||||
char letter = urlPath.charAt(index);
|
|
||||||
|
|
||||||
if (letter == '.')
|
|
||||||
{
|
|
||||||
buffer.append('_');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
buffer.append(letter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result = buffer.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
KissDispatcherFactory.logger.info(urlPath + " -> " + result);
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* Copyright (C) 2021-2023 Christian Pierre MOMON
|
* Copyright (C) 2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -20,12 +20,13 @@ package fr.devinsy.kiss4web.dispatcher;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import fr.devinsy.strings.StringList;
|
import fr.devinsy.strings.StringList;
|
||||||
import jakarta.servlet.http.HttpServlet;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class WebsiteClasspaths.
|
* The Class WebsiteClasspaths.
|
||||||
|
@ -44,8 +45,8 @@ public class WebsiteClasspaths extends StringList
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* {@inheritDoc}
|
* @see java.util.ArrayList#add(java.lang.Object)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean add(final String classpath)
|
public boolean add(final String classpath)
|
||||||
|
@ -75,8 +76,8 @@ public class WebsiteClasspaths extends StringList
|
||||||
/**
|
/**
|
||||||
* Instanciate servlet.
|
* Instanciate servlet.
|
||||||
*
|
*
|
||||||
* @param className
|
* @param subClasspath
|
||||||
* the class name
|
* the sub classpath
|
||||||
* @return the http servlet
|
* @return the http servlet
|
||||||
*/
|
*/
|
||||||
public HttpServlet instanciateServlet(final String className)
|
public HttpServlet instanciateServlet(final String className)
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.annotation;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.hooks.RewriteHook;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class AnnotationHook.
|
|
||||||
*/
|
|
||||||
public class AnnotationHook extends RewriteHook
|
|
||||||
{
|
|
||||||
private static Logger logger = LoggerFactory.getLogger(AnnotationHook.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new annotation hook.
|
|
||||||
*
|
|
||||||
* @param regex
|
|
||||||
* the regex
|
|
||||||
* @param targetClassName
|
|
||||||
* the target class name
|
|
||||||
*/
|
|
||||||
public AnnotationHook(final String regex, final String targetClassName)
|
|
||||||
{
|
|
||||||
super(regex, targetClassName);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.annotation;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class AnnotationHooks.
|
|
||||||
*/
|
|
||||||
public class AnnotationHooks extends ArrayList<AnnotationHook>
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = 1979896054785066359L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new hook list.
|
|
||||||
*/
|
|
||||||
public AnnotationHooks()
|
|
||||||
{
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,152 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.annotation;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Enumeration;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import jakarta.servlet.http.HttpServlet;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class AnnotationUtils.
|
|
||||||
*/
|
|
||||||
public class AnnotationUtils
|
|
||||||
{
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(AnnotationUtils.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Recursive method used to find all classes in a given directory and
|
|
||||||
* subdirs.
|
|
||||||
*
|
|
||||||
* @param directory
|
|
||||||
* The base directory
|
|
||||||
* @param packageName
|
|
||||||
* The package name for classes found inside the base directory
|
|
||||||
* @return The classes
|
|
||||||
* @throws ClassNotFoundException
|
|
||||||
*/
|
|
||||||
private static List<Class> findClasses(final File directory, final String packageName) throws ClassNotFoundException
|
|
||||||
{
|
|
||||||
List<Class> result;
|
|
||||||
|
|
||||||
result = new ArrayList<Class>();
|
|
||||||
if (directory.exists())
|
|
||||||
{
|
|
||||||
File[] files = directory.listFiles();
|
|
||||||
for (File file : files)
|
|
||||||
{
|
|
||||||
if (file.isDirectory())
|
|
||||||
{
|
|
||||||
assert !file.getName().contains(".");
|
|
||||||
result.addAll(findClasses(file, packageName + "." + file.getName()));
|
|
||||||
}
|
|
||||||
else if (file.getName().endsWith(".class"))
|
|
||||||
{
|
|
||||||
result.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the annotation hooks.
|
|
||||||
*
|
|
||||||
* @return the annotation hooks
|
|
||||||
*/
|
|
||||||
public static AnnotationHooks getAnnotationHooks()
|
|
||||||
{
|
|
||||||
AnnotationHooks result;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
result = new AnnotationHooks();
|
|
||||||
Class[] classes = getClasses("website");
|
|
||||||
for (Class clazz : classes)
|
|
||||||
{
|
|
||||||
if (clazz.isAnnotationPresent(KissServlet.class))
|
|
||||||
{
|
|
||||||
// System.out.println("==> " + clazz.getName() + " " +
|
|
||||||
// clazz.getCanonicalName());
|
|
||||||
// System.out.println("==> " + ((Class<HttpServlet>)
|
|
||||||
// clazz).getAnnotation(KissServlet.class).value());
|
|
||||||
|
|
||||||
String className = clazz.getCanonicalName();
|
|
||||||
String regexPathInfo = ((Class<HttpServlet>) clazz).getAnnotation(KissServlet.class).value();
|
|
||||||
|
|
||||||
AnnotationHook hook = new AnnotationHook(regexPathInfo, className);
|
|
||||||
result.add(hook);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (ClassNotFoundException | IOException exception)
|
|
||||||
{
|
|
||||||
logger.error("Package website undefined, KissServlet annotations ignored.", exception);
|
|
||||||
result = new AnnotationHooks();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the classes.
|
|
||||||
*
|
|
||||||
* @param packageName
|
|
||||||
* the package name
|
|
||||||
* @return the classes
|
|
||||||
* @throws ClassNotFoundException
|
|
||||||
* the class not found exception
|
|
||||||
* @throws IOException
|
|
||||||
* Signals that an I/O exception has occurred.
|
|
||||||
*/
|
|
||||||
private static Class[] getClasses(final String packageName) throws ClassNotFoundException, IOException
|
|
||||||
{
|
|
||||||
Class[] result;
|
|
||||||
|
|
||||||
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
|
||||||
assert classLoader != null;
|
|
||||||
String path = packageName.replace('.', '/');
|
|
||||||
Enumeration<URL> resources = classLoader.getResources(path);
|
|
||||||
List<File> dirs = new ArrayList<File>();
|
|
||||||
while (resources.hasMoreElements())
|
|
||||||
{
|
|
||||||
URL resource = resources.nextElement();
|
|
||||||
dirs.add(new File(resource.getFile()));
|
|
||||||
}
|
|
||||||
ArrayList<Class> classes = new ArrayList<Class>();
|
|
||||||
for (File directory : dirs)
|
|
||||||
{
|
|
||||||
classes.addAll(findClasses(directory, packageName));
|
|
||||||
}
|
|
||||||
result = classes.toArray(new Class[classes.size()]);
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.annotation;
|
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Interface KissServlet.
|
|
||||||
*/
|
|
||||||
@Target(ElementType.TYPE)
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
public @interface KissServlet
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Value of the pathInfo regex to map on the annoted class..
|
|
||||||
*
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
String value();
|
|
||||||
}
|
|
|
@ -1,70 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.annotation;
|
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import javax.annotation.processing.AbstractProcessor;
|
|
||||||
import javax.annotation.processing.ProcessingEnvironment;
|
|
||||||
import javax.annotation.processing.RoundEnvironment;
|
|
||||||
import javax.lang.model.element.Element;
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.tools.Diagnostic;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class KissServletProcessor.
|
|
||||||
*/
|
|
||||||
@javax.annotation.processing.SupportedAnnotationTypes("fr.devinsy.kiss4web.dispatcher.annotation.KissServlet")
|
|
||||||
@javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion.RELEASE_17)
|
|
||||||
public class KissServletProcessor extends AbstractProcessor
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public synchronized void init(final ProcessingEnvironment processingEnv)
|
|
||||||
{
|
|
||||||
super.init(processingEnv);
|
|
||||||
// Initialization code, if needed
|
|
||||||
// System.out.println("=============== @INIT");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv)
|
|
||||||
{
|
|
||||||
for (TypeElement annotation : annotations)
|
|
||||||
{
|
|
||||||
// Find elements annotated with MyCustomAnnotation
|
|
||||||
for (Element element : roundEnv.getElementsAnnotatedWith(annotation))
|
|
||||||
{
|
|
||||||
// Process each element
|
|
||||||
this.processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Processing: " + element.getSimpleName());
|
|
||||||
|
|
||||||
// Your processing logic here
|
|
||||||
System.out.println("=============== YOOOOOOOOOOP");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return true; // No further processing of this annotation type
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2018-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2018-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,21 +18,75 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import fr.devinsy.xidyn.XidynException;
|
||||||
|
import fr.devinsy.xidyn.presenters.URLPresenter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class ApplicationInitFailedHook.
|
* The Class InitHook.
|
||||||
*/
|
*/
|
||||||
public class ApplicationInitFailedHook extends DirectHook
|
public class ApplicationInitFailedHook extends HookCore
|
||||||
{
|
{
|
||||||
private static Logger logger = LoggerFactory.getLogger(ApplicationInitFailedHook.class);
|
private static Logger logger = LoggerFactory.getLogger(ApplicationInitFailedHook.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new application init failed hook.
|
* Instantiates a new inits the hook.
|
||||||
*/
|
*/
|
||||||
public ApplicationInitFailedHook()
|
public ApplicationInitFailedHook()
|
||||||
{
|
{
|
||||||
super("/fr/devinsy/kiss4web/dispatcher/hooks/ApplicationInitFailedServlet");
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.kernel.dispatcher.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = true;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.dispatcher.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch {}.", this.getClass().getName());
|
||||||
|
|
||||||
|
String path = servletContext.getRealPath("/") + request.getPathInfo();
|
||||||
|
logger.info("path=[{}]", path);
|
||||||
|
|
||||||
|
StringBuffer html = new URLPresenter("/fr/devinsy/kiss4web/dispatcher/hooks/applicationInitFailed.xhtml").dynamize();
|
||||||
|
|
||||||
|
// Display page.
|
||||||
|
response.setContentType("application/xhtml+xml; charset=UTF-8");
|
||||||
|
response.getWriter().println(html);
|
||||||
|
|
||||||
|
logger.info("Application Init Failed page returned.");
|
||||||
|
}
|
||||||
|
catch (XidynException exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace();
|
||||||
|
new FatalHook().process(servletConfig, servletContext, request, response);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class ApplicationInitFailedServlet.
|
|
||||||
*/
|
|
||||||
public class ApplicationInitFailedServlet extends DirectServlet
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = 3354542049753884236L;
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ApplicationInitFailedServlet.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new application init failed servlet.
|
|
||||||
*/
|
|
||||||
public ApplicationInitFailedServlet()
|
|
||||||
{
|
|
||||||
super("/fr/devinsy/kiss4web/dispatcher/hooks/applicationInitFailed.xhtml");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2018-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2018-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,13 +18,24 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import fr.devinsy.xidyn.XidynException;
|
||||||
|
import fr.devinsy.xidyn.presenters.URLPresenter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class InitHook.
|
* The Class InitHook.
|
||||||
*/
|
*/
|
||||||
public class ApplicationInitHook extends DirectHook
|
public class ApplicationInitHook extends HookCore
|
||||||
{
|
{
|
||||||
private static Logger logger = LoggerFactory.getLogger(ApplicationInitHook.class);
|
private static Logger logger = LoggerFactory.getLogger(ApplicationInitHook.class);
|
||||||
|
|
||||||
|
@ -33,6 +44,49 @@ public class ApplicationInitHook extends DirectHook
|
||||||
*/
|
*/
|
||||||
public ApplicationInitHook()
|
public ApplicationInitHook()
|
||||||
{
|
{
|
||||||
super("/fr/devinsy/kiss4web/dispatcher/hooks/ApplicationInitServlet");
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.kernel.dispatcher.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = true;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.dispatcher.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch {}.", this.getClass().getName());
|
||||||
|
|
||||||
|
String path = servletContext.getRealPath("/") + request.getPathInfo();
|
||||||
|
logger.info("path=[{}]", path);
|
||||||
|
|
||||||
|
StringBuffer html = new URLPresenter("/fr/devinsy/kiss4web/dispatcher/hooks/applicationInit.xhtml").dynamize();
|
||||||
|
|
||||||
|
// Display page.
|
||||||
|
response.setContentType("application/xhtml+xml; charset=UTF-8");
|
||||||
|
response.getWriter().println(html);
|
||||||
|
|
||||||
|
logger.info("Application Init page returned.");
|
||||||
|
}
|
||||||
|
catch (XidynException exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace();
|
||||||
|
new FatalHook().process(servletConfig, servletContext, request, response);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class ApplicationInitServlet.
|
|
||||||
*/
|
|
||||||
public class ApplicationInitServlet extends DirectServlet
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = 6515114898805106148L;
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ApplicationInitServlet.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new application init servlet.
|
|
||||||
*/
|
|
||||||
public ApplicationInitServlet()
|
|
||||||
{
|
|
||||||
super("/fr/devinsy/kiss4web/dispatcher/hooks/applicationInitServlet.xhtml");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,13 +18,17 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import jakarta.servlet.ServletConfig;
|
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class BlankHook.
|
* The Class BlankHook.
|
||||||
*/
|
*/
|
||||||
|
@ -40,22 +44,8 @@ public class BlankHook extends HookCore
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* {@inheritDoc}
|
* @see fr.devinsy.kiss4web.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getServletClassName(final ServletConfig config, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
result = "/fr/devinsy/kiss4web/dispatcher/hooks/BlankServlet";
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
@ -76,4 +66,23 @@ public class BlankHook extends HookCore
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch.");
|
||||||
|
|
||||||
|
response.setContentType("text/html");
|
||||||
|
PrintWriter out = response.getWriter();
|
||||||
|
|
||||||
|
out.println("<html><head></head><body>");
|
||||||
|
out.println("Null path.");
|
||||||
|
out.println("</body></html>");
|
||||||
|
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class BlankSerlvet.
|
|
||||||
*/
|
|
||||||
public class BlankSerlvet extends DirectServlet
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = -3751754076316971589L;
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(BlankSerlvet.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new blank serlvet.
|
|
||||||
*/
|
|
||||||
public BlankSerlvet()
|
|
||||||
{
|
|
||||||
super("/fr/devinsy/kiss4web/dispatcher/hooks/blank.xhtml");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,76 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import jakarta.servlet.ServletConfig;
|
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class DirectHook.
|
|
||||||
*/
|
|
||||||
public class DirectHook extends HookCore
|
|
||||||
{
|
|
||||||
private static Logger logger = LoggerFactory.getLogger(DirectHook.class);
|
|
||||||
|
|
||||||
private String targetClassName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new direct hook.
|
|
||||||
*
|
|
||||||
* @param targetClassName
|
|
||||||
* the target class name
|
|
||||||
*/
|
|
||||||
public DirectHook(final String targetClassName)
|
|
||||||
{
|
|
||||||
super();
|
|
||||||
this.targetClassName = targetClassName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getServletClassName(final ServletConfig config, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
result = this.targetClassName;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
boolean result;
|
|
||||||
|
|
||||||
result = true;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,96 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import jakarta.servlet.ServletException;
|
|
||||||
import jakarta.servlet.http.HttpServlet;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class DirectServlet.
|
|
||||||
*/
|
|
||||||
public class DirectServlet extends HttpServlet
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = 3433035754728880755L;
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(DirectServlet.class);
|
|
||||||
|
|
||||||
private String path;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new direct servlet.
|
|
||||||
*
|
|
||||||
* @param path
|
|
||||||
* the path
|
|
||||||
*/
|
|
||||||
public DirectServlet(final String path)
|
|
||||||
{
|
|
||||||
super();
|
|
||||||
this.path = path;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dispatch.
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* the request
|
|
||||||
* @param response
|
|
||||||
* the response
|
|
||||||
* @throws IOException
|
|
||||||
* Signals that an I/O exception has occurred.
|
|
||||||
* @throws ServletException
|
|
||||||
* the servlet exception
|
|
||||||
*/
|
|
||||||
public void dispatch(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
// Get page.
|
|
||||||
URL url = Hook.class.getResource(this.path);
|
|
||||||
String xhtml = IOUtils.toString(url, StandardCharsets.UTF_8);
|
|
||||||
|
|
||||||
// Display page.
|
|
||||||
response.setContentType("application/xhtml+xml; charset=UTF-8");
|
|
||||||
response.getWriter().println(xhtml);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
dispatch(request, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void doPost(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
dispatch(request, response);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2018-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2018-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,13 +18,25 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import fr.devinsy.xidyn.XidynException;
|
||||||
|
import fr.devinsy.xidyn.presenters.URLPresenter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class ErrorHook.
|
* The Class ErrorHook.
|
||||||
*/
|
*/
|
||||||
public class ErrorHook extends RewriteHook
|
public class ErrorHook extends HookCore
|
||||||
{
|
{
|
||||||
private static Logger logger = LoggerFactory.getLogger(ErrorHook.class);
|
private static Logger logger = LoggerFactory.getLogger(ErrorHook.class);
|
||||||
|
|
||||||
|
@ -33,6 +45,55 @@ public class ErrorHook extends RewriteHook
|
||||||
*/
|
*/
|
||||||
public ErrorHook()
|
public ErrorHook()
|
||||||
{
|
{
|
||||||
super(".*", "/fr/devinsy/kiss4web/dispatcher/hooks/ErrorServlet");
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.kernel.dispatcher.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (new File(servletContext.getRealPath("/") + request.getPathInfo()).exists())
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.dispatcher.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch.");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String path = servletContext.getRealPath("/") + request.getPathInfo();
|
||||||
|
logger.info("path=[{}]", path);
|
||||||
|
|
||||||
|
StringBuffer html = new URLPresenter("/fr/devinsy/kiss4web/dispatcher/hooks/error.xhtml").dynamize();
|
||||||
|
// Display page.
|
||||||
|
response.setContentType("application/xhtml+xml; charset=UTF-8");
|
||||||
|
response.getWriter().println(html);
|
||||||
|
|
||||||
|
logger.info("Error page returned for [{}].", path);
|
||||||
|
}
|
||||||
|
catch (XidynException exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace();
|
||||||
|
new FatalHook().process(servletConfig, servletContext, request, response);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,117 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.ServletException;
|
|
||||||
import jakarta.servlet.http.HttpServlet;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class ErrorServlet.
|
|
||||||
*/
|
|
||||||
public class ErrorServlet extends HttpServlet
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = -4906221802965761187L;
|
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ErrorServlet.class);
|
|
||||||
|
|
||||||
private String message;
|
|
||||||
private Exception exception;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new error servlet.
|
|
||||||
*
|
|
||||||
* @param message
|
|
||||||
* the message
|
|
||||||
*/
|
|
||||||
public ErrorServlet(final String message)
|
|
||||||
{
|
|
||||||
this(message, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new error servlet.
|
|
||||||
*
|
|
||||||
* @param message
|
|
||||||
* the message
|
|
||||||
* @param exception
|
|
||||||
* the exception
|
|
||||||
*/
|
|
||||||
public ErrorServlet(final String message, final Exception exception)
|
|
||||||
{
|
|
||||||
this.message = message;
|
|
||||||
this.exception = exception;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dispatch.
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* the request
|
|
||||||
* @param response
|
|
||||||
* the response
|
|
||||||
* @throws IOException
|
|
||||||
* Signals that an I/O exception has occurred.
|
|
||||||
* @throws ServletException
|
|
||||||
* the servlet exception
|
|
||||||
*/
|
|
||||||
public void dispatch(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
ServletContext context = this.getServletContext();
|
|
||||||
|
|
||||||
// Get page.
|
|
||||||
|
|
||||||
// TODO dynamize!!!
|
|
||||||
|
|
||||||
URL url = Hook.class.getResource("/fr/devinsy/kiss4web/dispatcher/hooks/error.xhtml");
|
|
||||||
String xhtml = IOUtils.toString(url, StandardCharsets.UTF_8);
|
|
||||||
|
|
||||||
// Display page.
|
|
||||||
response.setContentType("application/xhtml+xml; charset=UTF-8");
|
|
||||||
response.getWriter().println(xhtml);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
dispatch(request, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void doPost(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
dispatch(request, response);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2018-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2018-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,13 +18,23 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class FatalHook.
|
* The Class FatalHook.
|
||||||
*/
|
*/
|
||||||
public class FatalHook extends DirectHook
|
public class FatalHook extends HookCore
|
||||||
{
|
{
|
||||||
private static Logger logger = LoggerFactory.getLogger(FatalHook.class);
|
private static Logger logger = LoggerFactory.getLogger(FatalHook.class);
|
||||||
|
|
||||||
|
@ -33,6 +43,61 @@ public class FatalHook extends DirectHook
|
||||||
*/
|
*/
|
||||||
public FatalHook()
|
public FatalHook()
|
||||||
{
|
{
|
||||||
super("/fr/devinsy/kiss4web/dispatcher/hooks/FatalServlet");
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.kernel.dispatcher.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (new File(servletContext.getRealPath("/") + request.getPathInfo()).exists())
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.dispatcher.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch.");
|
||||||
|
|
||||||
|
String path = servletContext.getRealPath("/") + request.getPathInfo();
|
||||||
|
logger.info("path=[{}]", path);
|
||||||
|
|
||||||
|
// Display fatal error page.
|
||||||
|
response.setContentType("text/html; charset=UTF-8");
|
||||||
|
PrintWriter out = response.getWriter();
|
||||||
|
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
|
||||||
|
out.println("<!DOCTYPE html >");
|
||||||
|
out.println("<html><header></header><body>");
|
||||||
|
out.println("A fatal error occured:<br/>");
|
||||||
|
out.println("<pre>");
|
||||||
|
// out.println(source.getMessage());
|
||||||
|
out.println("</pre>");
|
||||||
|
out.println("<hr />");
|
||||||
|
// if (source.getMessage() != null)
|
||||||
|
// {
|
||||||
|
// out.println("<pre>" + XidynUtils.restoreEntities(new
|
||||||
|
// StringBuffer(source.getMessage())) + "</pre>");
|
||||||
|
// }
|
||||||
|
out.println("<hr />");
|
||||||
|
out.println("</body></html>");
|
||||||
|
|
||||||
|
logger.info("File returned directly [{}] with mimetype [{}].", path, servletContext.getMimeType(path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class FatalServlet.
|
|
||||||
*/
|
|
||||||
public class FatalServlet extends DirectServlet
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = 634762859496474527L;
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(FatalServlet.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new fatal servlet.
|
|
||||||
*/
|
|
||||||
public FatalServlet()
|
|
||||||
{
|
|
||||||
super("/fr/devinsy/kiss4web/dispatcher/hooks/fatal.xhtml");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,13 +18,18 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.KissDispatcherUtils;
|
import fr.devinsy.kiss4web.dispatcher.KissDispatcherUtils;
|
||||||
import jakarta.servlet.ServletConfig;
|
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class FolderHook.
|
* The Class FolderHook.
|
||||||
|
@ -41,22 +46,8 @@ public class FolderHook extends HookCore
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* {@inheritDoc}
|
* @see fr.devinsy.kiss4web.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getServletClassName(final ServletConfig config, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
result = "website." + KissDispatcherUtils.translateToClassName(request.getPathInfo());
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
@ -77,4 +68,17 @@ public class FolderHook extends HookCore
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch.");
|
||||||
|
|
||||||
|
String urlPath = request.getPathInfo();
|
||||||
|
KissDispatcherUtils.dispatchToServlet(servletConfig, request, response, urlPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,9 +18,13 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
import jakarta.servlet.ServletConfig;
|
import java.io.IOException;
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Interface Hook.
|
* The Interface Hook.
|
||||||
|
@ -28,15 +32,11 @@ import jakarta.servlet.http.HttpServletRequest;
|
||||||
public interface Hook
|
public interface Hook
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Gets the servlet.
|
* Checks if is terminal.
|
||||||
*
|
*
|
||||||
* @param config
|
* @return true if it is a final hook, false otherwise.
|
||||||
* the config
|
|
||||||
* @param request
|
|
||||||
* the request
|
|
||||||
* @return the servlet
|
|
||||||
*/
|
*/
|
||||||
String getServletClassName(ServletConfig config, HttpServletRequest request);
|
boolean isTerminal();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Matches.
|
* Matches.
|
||||||
|
@ -48,4 +48,23 @@ public interface Hook
|
||||||
* @return true, if successful
|
* @return true, if successful
|
||||||
*/
|
*/
|
||||||
boolean matches(final ServletContext servletContext, final HttpServletRequest request);
|
boolean matches(final ServletContext servletContext, final HttpServletRequest request);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process.
|
||||||
|
*
|
||||||
|
* @param servletConfig
|
||||||
|
* the servlet config
|
||||||
|
* @param servletContext
|
||||||
|
* the servlet context
|
||||||
|
* @param request
|
||||||
|
* the request
|
||||||
|
* @param response
|
||||||
|
* the response
|
||||||
|
* @throws IOException
|
||||||
|
* Signals that an I/O exception has occurred.
|
||||||
|
* @throws ServletException
|
||||||
|
* the servlet exception
|
||||||
|
*/
|
||||||
|
void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -23,11 +23,35 @@ package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
*/
|
*/
|
||||||
public abstract class HookCore implements Hook
|
public abstract class HookCore implements Hook
|
||||||
{
|
{
|
||||||
|
private boolean terminal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new hook core.
|
* Instantiates a new hook core.
|
||||||
*/
|
*/
|
||||||
public HookCore()
|
public HookCore()
|
||||||
{
|
{
|
||||||
super();
|
super();
|
||||||
|
|
||||||
|
this.terminal = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.hooks.Hook#isTerminal()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isTerminal()
|
||||||
|
{
|
||||||
|
return this.terminal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the terminal.
|
||||||
|
*
|
||||||
|
* @param terminal
|
||||||
|
* the new terminal
|
||||||
|
*/
|
||||||
|
public void setTerminal(final boolean terminal)
|
||||||
|
{
|
||||||
|
this.terminal = terminal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,11 +18,10 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import jakarta.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class HookRegister.
|
* The Class HookRegister.
|
||||||
|
@ -34,9 +33,6 @@ public class HookRegister
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new hook register.
|
* Instantiates a new hook register.
|
||||||
*
|
|
||||||
* @param name
|
|
||||||
* the name
|
|
||||||
*/
|
*/
|
||||||
public HookRegister(final String name)
|
public HookRegister(final String name)
|
||||||
{
|
{
|
||||||
|
@ -95,11 +91,6 @@ public class HookRegister
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the name.
|
|
||||||
*
|
|
||||||
* @return the name
|
|
||||||
*/
|
|
||||||
public String getName()
|
public String getName()
|
||||||
{
|
{
|
||||||
return this.name;
|
return this.name;
|
||||||
|
@ -120,31 +111,11 @@ public class HookRegister
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Register.
|
|
||||||
*
|
|
||||||
* @param hooks
|
|
||||||
* the hooks
|
|
||||||
* @return the hook register
|
|
||||||
*/
|
|
||||||
public HookRegister register(final Collection<? extends Hook> hooks)
|
|
||||||
{
|
|
||||||
HookRegister result;
|
|
||||||
|
|
||||||
this.hooks.addAll(hooks);
|
|
||||||
|
|
||||||
result = this;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register.
|
* Register.
|
||||||
*
|
*
|
||||||
* @param hook
|
* @param hook
|
||||||
* the hook
|
* the hook
|
||||||
* @return the hook register
|
|
||||||
*/
|
*/
|
||||||
public HookRegister register(final Hook hook)
|
public HookRegister register(final Hook hook)
|
||||||
{
|
{
|
||||||
|
@ -158,12 +129,6 @@ public class HookRegister
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Register all.
|
|
||||||
*
|
|
||||||
* @param register
|
|
||||||
* the register
|
|
||||||
*/
|
|
||||||
public void registerAll(final HookRegister register)
|
public void registerAll(final HookRegister register)
|
||||||
{
|
{
|
||||||
this.hooks.addAll(register.getHooks());
|
this.hooks.addAll(register.getHooks());
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* Copyright (C) 2018-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2018-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,21 +18,71 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import fr.devinsy.kiss4web.dispatcher.KissDispatcherUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class InitFailedHook.
|
* The Class InitFailedHook.
|
||||||
*/
|
*/
|
||||||
public class InitFailedHook extends DirectHook
|
public class InitFailedHook extends HookCore
|
||||||
{
|
{
|
||||||
private static Logger logger = LoggerFactory.getLogger(InitFailedHook.class);
|
private static Logger logger = LoggerFactory.getLogger(InitFailedHook.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new init failed hook.
|
* Instantiates a new inits the failed hook.
|
||||||
*/
|
*/
|
||||||
public InitFailedHook()
|
public InitFailedHook()
|
||||||
{
|
{
|
||||||
super("/fr/devinsy/kiss4web/dispatcher/hooks/initFailedServlet.xhtml");
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.kernel.dispatcher.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (new File(servletContext.getRealPath("/") + request.getPathInfo()).exists())
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.dispatcher.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch.");
|
||||||
|
|
||||||
|
String path = servletContext.getRealPath("/") + request.getPathInfo();
|
||||||
|
logger.info("path=[{}]", path);
|
||||||
|
|
||||||
|
String mimeType = servletContext.getMimeType(path);
|
||||||
|
KissDispatcherUtils.returnInlineFile(response, new File(path), mimeType);
|
||||||
|
|
||||||
|
logger.info("File returned directly [{}] with mimetype [{}].", path, servletContext.getMimeType(path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class InitFailedServlet.
|
|
||||||
*/
|
|
||||||
public class InitFailedServlet extends DirectServlet
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = -8117673535638021417L;
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(InitFailedServlet.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new inits the failed servlet.
|
|
||||||
*/
|
|
||||||
public InitFailedServlet()
|
|
||||||
{
|
|
||||||
super("/fr/devinsy/kiss4web/dispatcher/hooks/maintenance.xhtml");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2018-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2018-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,21 +18,75 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import fr.devinsy.xidyn.XidynException;
|
||||||
|
import fr.devinsy.xidyn.presenters.URLPresenter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class InitHook.
|
* The Class InitHook.
|
||||||
*/
|
*/
|
||||||
public class InitHook extends DirectHook
|
public class InitHook extends HookCore
|
||||||
{
|
{
|
||||||
private static Logger logger = LoggerFactory.getLogger(InitHook.class);
|
private static Logger logger = LoggerFactory.getLogger(InitHook.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new init the hook.
|
* Instantiates a new inits the hook.
|
||||||
*/
|
*/
|
||||||
public InitHook()
|
public InitHook()
|
||||||
{
|
{
|
||||||
super("/fr/devinsy/kiss4web/dispatcher/hooks/InitServlet");
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.kernel.dispatcher.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = true;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.dispatcher.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch {}.", this.getClass().getName());
|
||||||
|
|
||||||
|
String path = servletContext.getRealPath("/") + request.getPathInfo();
|
||||||
|
logger.info("path=[{}]", path);
|
||||||
|
|
||||||
|
StringBuffer html = new URLPresenter("/fr/devinsy/kiss4web/dispatcher/hooks/init.xhtml").dynamize();
|
||||||
|
|
||||||
|
// Display page.
|
||||||
|
response.setContentType("application/xhtml+xml; charset=UTF-8");
|
||||||
|
response.getWriter().println(html);
|
||||||
|
|
||||||
|
logger.info("Init page returned.");
|
||||||
|
}
|
||||||
|
catch (XidynException exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace();
|
||||||
|
new FatalHook().process(servletConfig, servletContext, request, response);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class InitServlet.
|
|
||||||
*/
|
|
||||||
public class InitServlet extends DirectServlet
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = -6057469263221296444L;
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(InitServlet.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new inits the servlet.
|
|
||||||
*/
|
|
||||||
public InitServlet()
|
|
||||||
{
|
|
||||||
super("/fr/devinsy/kiss4web/dispatcher/hooks/maintenance.xhtml");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,13 +18,18 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.KissDispatcherUtils;
|
import fr.devinsy.kiss4web.dispatcher.KissDispatcherFactory;
|
||||||
import jakarta.servlet.ServletConfig;
|
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class LongURLHook.
|
* The Class LongURLHook.
|
||||||
|
@ -41,23 +46,8 @@ public class LongURLHook extends HookCore
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* {@inheritDoc}
|
* @see fr.devinsy.kiss4web.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getServletClassName(final ServletConfig config, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
String urlPath = request.getPathInfo();
|
|
||||||
result = "website." + KissDispatcherUtils.translateToClassName(LongURLRewriter.unrewrite(urlPath));
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
@ -66,17 +56,25 @@ public class LongURLHook extends HookCore
|
||||||
|
|
||||||
String urlPath = request.getPathInfo();
|
String urlPath = request.getPathInfo();
|
||||||
|
|
||||||
if (LongURLRewriter.matches(urlPath))
|
result = LongURLRewriter.matches(urlPath);
|
||||||
{
|
|
||||||
urlPath = ShortURLRewriter.unrewrite(urlPath);
|
|
||||||
result = KissDispatcherUtils.isAvailablePath(urlPath);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch.");
|
||||||
|
|
||||||
|
String urlPath = request.getPathInfo();
|
||||||
|
|
||||||
|
String rewritedURLPath = LongURLRewriter.unrewrite(urlPath);
|
||||||
|
|
||||||
|
KissDispatcherFactory.instance().dispatchPathToServlet(servletConfig, request, response, rewritedURLPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -21,11 +21,12 @@ package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import fr.devinsy.strings.StringList;
|
import fr.devinsy.strings.StringList;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class LongURLRewriter.
|
* The Class LongURLRewriter.
|
||||||
|
@ -73,12 +74,7 @@ public class LongURLRewriter
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Note: "-/" is used to indicate the beginning of parameters.
|
* Note: "-/" is used to indicate the beginning of parameters.
|
||||||
*
|
*
|
||||||
* @param path
|
|
||||||
* the path
|
|
||||||
* @param parameters
|
|
||||||
* the parameters
|
|
||||||
* @return the string
|
|
||||||
*/
|
*/
|
||||||
public static String rewrite(final String path, final String... parameters)
|
public static String rewrite(final String path, final String... parameters)
|
||||||
{
|
{
|
||||||
|
@ -106,8 +102,6 @@ public class LongURLRewriter
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This methods unrewrite a pathinfo.
|
|
||||||
*
|
|
||||||
* /catalog/article-/123/2016/12/14/resume.xhtml -> /catalog/article.xhtml
|
* /catalog/article-/123/2016/12/14/resume.xhtml -> /catalog/article.xhtml
|
||||||
*
|
*
|
||||||
* @param source
|
* @param source
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2018-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2018-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -19,13 +19,19 @@
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import jakarta.servlet.ServletConfig;
|
import fr.devinsy.xidyn.XidynException;
|
||||||
import jakarta.servlet.ServletContext;
|
import fr.devinsy.xidyn.presenters.URLPresenter;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class MaintenanceHook.
|
* The Class MaintenanceHook.
|
||||||
|
@ -42,22 +48,8 @@ public class MaintenanceHook extends HookCore
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* {@inheritDoc}
|
* @see fr.devinsy.kiss4web.kernel.dispatcher.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getServletClassName(final ServletConfig config, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
result = "/fr/devinsy/kiss4web/dispatcher/hooks/MaintenanceServlet";
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
@ -76,4 +68,33 @@ public class MaintenanceHook extends HookCore
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.dispatcher.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch {}.", this.getClass().getName());
|
||||||
|
|
||||||
|
String path = servletContext.getRealPath("/") + request.getPathInfo();
|
||||||
|
logger.info("path=[{}]", path);
|
||||||
|
|
||||||
|
StringBuffer html = new URLPresenter("/fr/devinsy/kiss4web/dispatcher/hooks/maintenance.xhtml").dynamize();
|
||||||
|
|
||||||
|
// Display page.
|
||||||
|
response.setContentType("application/xhtml+xml; charset=UTF-8");
|
||||||
|
response.getWriter().println(html);
|
||||||
|
|
||||||
|
logger.info("Application Init page returned.");
|
||||||
|
}
|
||||||
|
catch (XidynException exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace();
|
||||||
|
new FatalHook().process(servletConfig, servletContext, request, response);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class MaintenanceServlet.
|
|
||||||
*/
|
|
||||||
public class MaintenanceServlet extends DirectServlet
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = 1116048013331691997L;
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(MaintenanceServlet.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new maintenance servlet.
|
|
||||||
*/
|
|
||||||
public MaintenanceServlet()
|
|
||||||
{
|
|
||||||
super("/fr/devinsy/kiss4web/dispatcher/hooks/maintenance.xhtml");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,114 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.KissDispatcherUtils;
|
|
||||||
import jakarta.servlet.ServletConfig;
|
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class RewriteHook.
|
|
||||||
*/
|
|
||||||
public class RewriteHook extends HookCore
|
|
||||||
{
|
|
||||||
private static Logger logger = LoggerFactory.getLogger(RewriteHook.class);
|
|
||||||
|
|
||||||
private Pattern pattern;
|
|
||||||
private String targetClassName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new rewrite hook.
|
|
||||||
*
|
|
||||||
* @param regex
|
|
||||||
* the regex
|
|
||||||
* @param targetClassName
|
|
||||||
* the target class name
|
|
||||||
*/
|
|
||||||
public RewriteHook(final String regex, final String targetClassName)
|
|
||||||
{
|
|
||||||
super();
|
|
||||||
this.pattern = Pattern.compile(regex);
|
|
||||||
this.targetClassName = targetClassName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the servlet class path.
|
|
||||||
*
|
|
||||||
* @param config
|
|
||||||
* the config
|
|
||||||
* @param request
|
|
||||||
* the request
|
|
||||||
* @return the servlet class path
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getServletClassName(final ServletConfig config, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
result = this.targetClassName;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
boolean result;
|
|
||||||
|
|
||||||
String urlPath = request.getPathInfo();
|
|
||||||
|
|
||||||
if (this.pattern.matcher(urlPath).matches())
|
|
||||||
{
|
|
||||||
result = KissDispatcherUtils.isAvailablePath(this.targetClassName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* To string.
|
|
||||||
*
|
|
||||||
* @return the string
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString()
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
result = this.pattern.toString() + " -> " + this.targetClassName;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,13 +18,18 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.KissDispatcherUtils;
|
import fr.devinsy.kiss4web.dispatcher.KissDispatcherFactory;
|
||||||
import jakarta.servlet.ServletConfig;
|
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class RootHook.
|
* The Class RootHook.
|
||||||
|
@ -41,28 +46,8 @@ public class RootHook extends HookCore
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* Gets the servlet class path.
|
* @see fr.devinsy.kiss4web.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
*
|
|
||||||
* @param config
|
|
||||||
* the config
|
|
||||||
* @param request
|
|
||||||
* the request
|
|
||||||
* @return the servlet class path
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getServletClassName(final ServletConfig config, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
result = "website." + KissDispatcherUtils.translateToClassName("/index.xhtml");
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
@ -83,4 +68,18 @@ public class RootHook extends HookCore
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch.");
|
||||||
|
|
||||||
|
String classPath = "index.xhtml";
|
||||||
|
|
||||||
|
KissDispatcherFactory.instance().dispatchPathToServlet(servletConfig, request, response, classPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,13 +18,18 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.KissDispatcherUtils;
|
import fr.devinsy.kiss4web.dispatcher.KissDispatcherFactory;
|
||||||
import jakarta.servlet.ServletConfig;
|
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class ShortURLHook.
|
* The Class ShortURLHook.
|
||||||
|
@ -41,27 +46,8 @@ public class ShortURLHook extends HookCore
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* {@inheritDoc}
|
* @see fr.devinsy.kiss4web.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getServletClassName(final ServletConfig config, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
logger.debug("Doing catch.");
|
|
||||||
|
|
||||||
String urlPath = request.getPathInfo();
|
|
||||||
result = "website." + KissDispatcherUtils.translateToClassName(ShortURLRewriter.unrewrite(urlPath));
|
|
||||||
|
|
||||||
logger.info("rewritedURLPath={}", result);
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
@ -70,10 +56,9 @@ public class ShortURLHook extends HookCore
|
||||||
|
|
||||||
String urlPath = request.getPathInfo();
|
String urlPath = request.getPathInfo();
|
||||||
|
|
||||||
if (ShortURLRewriter.matches(urlPath))
|
if ((ShortURLRewriter.matches(urlPath)) && (!KissDispatcherFactory.instance().isAvailablePath(urlPath)))
|
||||||
{
|
{
|
||||||
urlPath = ShortURLRewriter.unrewrite(urlPath);
|
result = true;
|
||||||
result = KissDispatcherUtils.isAvailablePath(urlPath);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -83,4 +68,21 @@ public class ShortURLHook extends HookCore
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch.");
|
||||||
|
|
||||||
|
String urlPath = request.getPathInfo();
|
||||||
|
String rewritedURLPath = ShortURLRewriter.unrewrite(urlPath);
|
||||||
|
|
||||||
|
logger.info("rewritedURLPath={}", rewritedURLPath);
|
||||||
|
|
||||||
|
KissDispatcherFactory.instance().dispatchPathToServlet(servletConfig, request, response, rewritedURLPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -21,11 +21,12 @@ package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import fr.devinsy.strings.StringList;
|
import fr.devinsy.strings.StringList;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class ShortURLRewriter.
|
* The Class ShortURLRewriter.
|
||||||
|
@ -183,8 +184,6 @@ public class ShortURLRewriter
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method unrewrite a pathInfo.
|
|
||||||
*
|
|
||||||
* article.xhtm?id=123 -> article.xhtml
|
* article.xhtm?id=123 -> article.xhtml
|
||||||
*
|
*
|
||||||
* @param source
|
* @param source
|
||||||
|
|
73
src/fr/devinsy/kiss4web/dispatcher/hooks/StatisticsHook.java
Normal file
73
src/fr/devinsy/kiss4web/dispatcher/hooks/StatisticsHook.java
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Kiss4web.
|
||||||
|
*
|
||||||
|
* Kiss4web is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Kiss4web is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Class StatisticsHook.
|
||||||
|
*/
|
||||||
|
public class StatisticsHook extends HookCore
|
||||||
|
{
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(StatisticsHook.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiates a new statistics hook.
|
||||||
|
*/
|
||||||
|
public StatisticsHook()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
setTerminal(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = true;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch.");
|
||||||
|
|
||||||
|
// TODO store statistics.
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -19,13 +19,18 @@
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import jakarta.servlet.ServletConfig;
|
import fr.devinsy.kiss4web.dispatcher.KissDispatcherUtils;
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class WebContentHook.
|
* The Class WebContentHook.
|
||||||
|
@ -42,22 +47,8 @@ public class WebContentHook extends HookCore
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* {@inheritDoc}
|
* @see fr.devinsy.kiss4web.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getServletClassName(final ServletConfig servletConfig, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
result = WebContentServlet.class.getCanonicalName();
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
@ -77,4 +68,22 @@ public class WebContentHook extends HookCore
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch.");
|
||||||
|
|
||||||
|
String path = servletContext.getRealPath("/") + request.getPathInfo();
|
||||||
|
logger.info("path=[{}]", path);
|
||||||
|
|
||||||
|
String mimeType = servletContext.getMimeType(path);
|
||||||
|
KissDispatcherUtils.returnInlineFile(response, new File(path), mimeType);
|
||||||
|
|
||||||
|
logger.info("File returned directly [{}] with mimetype [{}].", path, servletContext.getMimeType(path));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,91 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.KissDispatcherUtils;
|
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.ServletException;
|
|
||||||
import jakarta.servlet.http.HttpServlet;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class WebContentServlet.
|
|
||||||
*/
|
|
||||||
public class WebContentServlet extends HttpServlet
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = 3203080393289058696L;
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(WebContentServlet.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new web content servlet.
|
|
||||||
*/
|
|
||||||
public WebContentServlet()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dispatch.
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* the request
|
|
||||||
* @param response
|
|
||||||
* the response
|
|
||||||
* @throws IOException
|
|
||||||
* Signals that an I/O exception has occurred.
|
|
||||||
* @throws ServletException
|
|
||||||
* the servlet exception
|
|
||||||
*/
|
|
||||||
public void dispatch(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
ServletContext context = this.getServletContext();
|
|
||||||
|
|
||||||
String path = context.getRealPath("/") + request.getPathInfo();
|
|
||||||
logger.info("path=[{}]", path);
|
|
||||||
|
|
||||||
String mimeType = context.getMimeType(path);
|
|
||||||
KissDispatcherUtils.returnInlineFile(response, new File(path), mimeType);
|
|
||||||
|
|
||||||
logger.info("File returned directly [{}] with mimetype [{}].", path, mimeType);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
dispatch(request, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void doPost(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
dispatch(request, response);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -19,13 +19,18 @@
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import jakarta.servlet.ServletConfig;
|
import fr.devinsy.kiss4web.dispatcher.KissDispatcherUtils;
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class WebInfHook.
|
* The Class WebInfHook.
|
||||||
|
@ -42,21 +47,8 @@ public class WebInfHook extends HookCore
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* {@inheritDoc}
|
* @see fr.devinsy.kiss4web.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getServletClassName(final ServletConfig servletConfig, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
result = WebInfServlet.class.getCanonicalName();
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
@ -77,4 +69,22 @@ public class WebInfHook extends HookCore
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch.");
|
||||||
|
|
||||||
|
String path = servletContext.getRealPath("/") + "WEB-INF/classes/website" + request.getPathInfo();
|
||||||
|
|
||||||
|
logger.info("path=[{}]", path);
|
||||||
|
|
||||||
|
String mimeType = servletContext.getMimeType(path);
|
||||||
|
KissDispatcherUtils.returnInlineFile(response, new File(path), mimeType);
|
||||||
|
|
||||||
|
logger.info("File returned directly [{}] with mimetype [{}].", path, servletContext.getMimeType(path));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,92 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
|
||||||
*
|
|
||||||
* This file is part of Kiss4web.
|
|
||||||
*
|
|
||||||
* Kiss4web is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Kiss4web is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Kiss4web. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.KissDispatcherUtils;
|
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.ServletException;
|
|
||||||
import jakarta.servlet.http.HttpServlet;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class WebInfServlet.
|
|
||||||
*/
|
|
||||||
public class WebInfServlet extends HttpServlet
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = -6085589095239389710L;
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(WebInfServlet.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new web inf servlet.
|
|
||||||
*/
|
|
||||||
public WebInfServlet()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dispatch.
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* the request
|
|
||||||
* @param response
|
|
||||||
* the response
|
|
||||||
* @throws IOException
|
|
||||||
* Signals that an I/O exception has occurred.
|
|
||||||
* @throws ServletException
|
|
||||||
* the servlet exception
|
|
||||||
*/
|
|
||||||
public void dispatch(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
ServletContext context = this.getServletContext();
|
|
||||||
|
|
||||||
String path = context.getRealPath("/") + "WEB-INF/classes/website" + request.getPathInfo();
|
|
||||||
|
|
||||||
logger.info("path=[{}]", path);
|
|
||||||
|
|
||||||
String mimeType = context.getMimeType(path);
|
|
||||||
KissDispatcherUtils.returnInlineFile(response, new File(path), mimeType);
|
|
||||||
|
|
||||||
logger.info("File returned directly [{}] with mimetype [{}].", path, mimeType);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
dispatch(request, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void doPost(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
|
|
||||||
{
|
|
||||||
dispatch(request, response);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2006-2024 Christian Pierre MOMON <christian@momon.org>
|
* Copyright (C) 2006-2021 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Kiss4web.
|
* This file is part of Kiss4web.
|
||||||
*
|
*
|
||||||
|
@ -18,13 +18,18 @@
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.kiss4web.dispatcher.hooks;
|
package fr.devinsy.kiss4web.dispatcher.hooks;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import fr.devinsy.kiss4web.dispatcher.KissDispatcherUtils;
|
import fr.devinsy.kiss4web.dispatcher.KissDispatcherFactory;
|
||||||
import jakarta.servlet.ServletConfig;
|
|
||||||
import jakarta.servlet.ServletContext;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class XHTMLHook.
|
* The Class XHTMLHook.
|
||||||
|
@ -41,22 +46,8 @@ public class XHTMLHook extends HookCore
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* {@inheritDoc}
|
* @see fr.devinsy.kiss4web.hooks.Hook#matches(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest)
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getServletClassName(final ServletConfig servletConfig, final HttpServletRequest request)
|
|
||||||
{
|
|
||||||
String result;
|
|
||||||
|
|
||||||
result = "website." + KissDispatcherUtils.translateToClassName(request.getPathInfo());
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
public boolean matches(final ServletContext servletContext, final HttpServletRequest request)
|
||||||
|
@ -77,4 +68,18 @@ public class XHTMLHook extends HookCore
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see fr.devinsy.kiss4web.hooks.Hook#process(javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void process(final ServletConfig servletConfig, final ServletContext servletContext, final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws IOException, ServletException
|
||||||
|
{
|
||||||
|
logger.debug("Doing catch.");
|
||||||
|
|
||||||
|
String urlPath = request.getPathInfo();
|
||||||
|
|
||||||
|
KissDispatcherFactory.instance().dispatchPathToServlet(servletConfig, request, response, urlPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue